2017-09-26 29 views
0

我有一個函數myFunc(),它在內部使用OMP循環,但不會消耗所有可用的內核。在更高層次上,我在一個循環內多次調用這個函數。有沒有一個簡單的方法來在這個外部循環上使用OMP,但不限制每個循環傳遞給一個單獨的線程?C++ OpenMP在每個循環中有多個線程

e.g:

// I have 24 cores 
// Would like to allow each for loop pass to have 12 cores 
for (int outIter=0; outIter<2; outIter++) { 
    x[outIter] = myFunc(...) // This function has OMP inside 
} 

回答

1

你應該先搞清楚,爲什麼myFunc不能窮盡所有的24個核心。通常你受限於內存帶寬。話雖如此,上面的循環顯然不是平行的。你將不得不嘗試這樣的:

#pragma omp parallel num_threads(2) 
{ 
    myFunc(...); 
} 

其中myFunc的輸入將是omp_get_thread_num()功能。但是,不要希望能夠實現更多的並行性。如果你的問題受限於內存帶寬,那麼加速的希望就不大。在你身上會發生什麼myFunc

+0

謝謝,是的,我知道它不是平行的。如果我在for循環的正上方放置pragma語句,我的理解是這隻會爲每個循環迭代提供一個單獨的線程(正常用例是loop_iterations >> number_of_cores)。因爲只有一個線程可用,所以循環內的任何其他OMP調用都將被取消。在函數內部,for循環遍歷少量迭代,這就是爲什麼我要這樣做。 – user2364295

+0

沒有繼續你的omp電話。這只是將外環分解爲兩個。它不會將內部操作限制爲2個內核。如果您從指定KMP_AFFINITY中另外獲得任何內容,您可能必須查看。 –