2013-12-21 60 views
1

在調用多線程MKL我有一個代碼具有以下結構從OpenMP並行區域

#pragma omp parallel 
{ 
    #omp for nowait 
    { 
     // first for loop 
    } 

    #omp for nowait 
    { 
     // first for loop 
    } 

    #pragma barrier 

    <-- #pragma omp single/critical/atomic --> not sure 
    dgemm_(....) 

    #pragma omp for 
    { 
     // yet another for loop 
    } 

} 

對於dgemm_,我多線程MKL鏈接。我希望mkl使用所有可用的8個線程。最好的辦法是什麼?

回答

3

這是一個嵌套並行的情況。它由MKL支持,但只有在使用Intel C/C++編譯器構建可執行文件時纔有效。這種限制的原因是MKL使用英特爾的OpenMP運行時,並且不同的OMP運行時不能很好地相互配合。

一旦被整理出來,你應該通過設置OMP_NESTEDTRUE能嵌套並行,並通過設置MKL_DYNAMICFALSE禁用MKL的檢測嵌套並行性。如果將共享要使用dgemm_進行處理的數據,則必須從single構造中調用後者。如果每個線程都處理自己的私有數據,那麼您不需要任何同步構造,但使用多線程MKL也不會給您帶來任何好處。所以我會假設你的情況是前者。

總結:

#pragma omp single 
dgemm_(...); 

,並運行:

$ MKL_DYNAMIC=FALSE MKL_NUM_THREADS=8 OMP_NUM_THREADS=8 OMP_NESTED=TRUE ./exe 

你也可以設定適當的調用參數:

mkl_set_dynamic(0); 
mkl_set_num_threads(8); 
omp_set_nested(1); 

#pragma omp parallel num_threads(8) ... 
{ 
    ... 
} 

但我寧願使用環境而定而不是變量。

+0

在使用omp編譯指示和Intel的ICC和多線程MKL時,是否存在哲學上的不一致?你可以讓ICC的自動並行化加速for循環,讓MKL自己進行線程化。那麼你根本就沒有任何omp。 – bazza

+0

OpenMP在該場景中提供了更大的靈活性。除了自動並行器非常保守,它還爲每個循環創建獨立的並行區域和相關的開銷。 –