0

我在OpenMP的是新和 做內無需花費時間我面臨這樣的局面:對於裏面的 - 如何爲平行於創建線程

int someArray[ARRAY_SIZE]; 

//outer loop 
for(int i = 0; i < 100; ++i) { 

    //inner loop 
    for(int j = 0; i < ARRAY_SIZE; ++i) { 
     //calculaations in someArray (every cell can be calculated separately) 
    } 

    //some code that needs to be run by only one thread - for example sorting someArray 
} 

我想使內環平行,但我嘗試過的想法(下面的代碼)不是有效的(單線程可以比多線程做得更快)。我認爲一遍又一遍地創建多個線程在這裏會花費很多時間。

我不好解決:

int someArray[ARRAY_SIZE]; 

//outer loop 
for(int i = 0; i < 100; ++i) { 

    #pragma omp parallel num_threads(THREADS_NUMBER) shared(someArray) 
    { 
     //inner loop 
     #pragma omp for 
     for(int j = 0; i < ARRAY_SIZE; ++i) { 
      //calculaations in someArray (every cell can be calculated separately) 
     } 
    } 

    //some code that needs to be run by only one thread - for example sorting someArray 
} 

你有任何想法如何優化這個任務嗎?

回答

0

當你有雙重的for循環,你幾乎總是要parallize外循環。在你的情況下:

#pragma omp parallel for 
for(int i = 0; i < 100; ++i) { 

    for(int j = 0; i < ARRAY_SIZE; ++i) { 
     //calculations in someArray (every cell can be calculated separately) 
    } 

    //some code that needs to be run by only one thread - for example sorting someArray 
} 

如果你有4個CPU可用,這將在4個CPU中將100次迭代分成25次。這比你的代碼,從而結束了,對於每一個,以便在CPU的100迭代,分裂ARRAY_SIZE的(你因而具有100X的開銷)更有效。

+0

但外環需要在一個線程,因爲陣列中的循環結束(這是schared資源)排序。 ARRAY_SIZE可能在六千六百萬左右。所以我想要的只是內部循環(單獨重新計算單獨的單元格)。 –

+0

我也試圖把屏障,然後假大師 - >如果(0 = thread_number) 但其非法聲明。 –

+0

我需要更多的上下文來幫助 - 你想達到什麼目的?您能否詳細說明您的示例,以便發現性能問題? – GaspardP