2
我有這樣的代碼:的OpenMP:具有「for」循環完全進入每個線程
#pragma omp parallel
{
#pragma omp single
{
for (int i=0; i<given_number; ++i) myBuffer_1[i] = myObject_1->myFunction();
}
#pragma omp single
{
for (int i=0; i<given_number; ++i) myBuffer_2[i] = myObject_2->myFunction();
}
}
// and so on... up to 5 or 6 of myObject_x
// Then I sum up the buffers and do something with them
float result;
for (int i=0; i<given_number; ++i)
result = myBuffer_1[i] + myBuffer_2[i];
// do something with result
如果我運行此代碼,我得到了我期待,但CPU的使用率看起來相當高。相反,如果我在沒有OpenMP的情況下正常運行它,我會得到相同的結果,但CPU使用率要低得多,儘管運行在單個線程中。
我不想指定多個線程,我希望程序根據CPU能力選擇最大線程數,但我希望每個for
循環完全在其自己的線程中運行。我怎樣才能做到這一點?
而且,我的期望是,for
環路myBuffer_1運行一個線程,其他for
循環運行另一個線程,剩下的「主」線程中運行。它是否正確?
我想'single'之前'sections'嘗試過了,我使用'nowait',我永遠也嘗試得到相同的結果:我的程序運行17個線程,其中7個佔用CPU總量的12,50%,即使處理過程是「空閒」。 CPU是一個i7(8線程)。 –
發佈一個最小的可運行測試用例,該bug必須在其他地方。 – Dikei
我編輯了我的文章中的示例代碼,因爲總結緩衝區的'for'循環必須在主線程中執行。順便說一句,'myObject_x'的函數'myFunction()'只是做一系列非常複雜的計算並返回一個數字,我不認爲問題在那裏,因爲它們在沒有OpenMP的情況下運行良好。只是我不知道如何讓每個'for'循環並行運行在它自己的線程中。 –