我有一個可以並行化的C++程序。我正在使用Visual Studio 2010,32位編譯。並行任務使用boost :: thread比使用ppl或OpenMP獲得更好的性能
在節目的短的結構如下
#define num_iterations 64 //some number
struct result
{
//some stuff
}
result best_result=initial_bad_result;
for(i=0; i<many_times; i++)
{
result *results[num_iterations];
for(j=0; j<num_iterations; j++)
{
some_computations(results+j);
}
// update best_result;
}
由於每個some_computations()
是獨立的(一些全局變量讀取,但沒有全局變量修改)我並行內for
-loop。
我第一次嘗試用的boost ::線程,
thread_group group;
for(j=0; j<num_iterations; j++)
{
group.create_thread(boost::bind(&some_computation, this, result+j));
}
group.join_all();
效果還不錯,但我還是決定嘗試更多。
我試過的OpenMP庫
#pragma omp parallel for
for(j=0; j<num_iterations; j++)
{
some_computations(results+j);
}
的結果比boost::thread
的更爲惡劣。
然後我嘗試了PPL庫和使用parallel_for()
:
Concurrency::parallel_for(0,num_iterations, [=](int j) {
some_computations(results+j);
})
的結果是最差的。
我發現這種行爲相當令人驚訝。由於OpenMP和ppl是爲並行化設計的,因此我期望得到比boost::thread
更好的結果。我錯了嗎?
爲什麼boost::thread
能給我更好的結果?
您能否定量「更好」,例如提供執行時間與線程數量的比較?用'boost :: thread'你創建了64個線程。 OpenPM使用一組工作線程,其數量默認爲虛擬CPU的數量。 PPL還使用線程池,並且比OpenMP的開銷更高,因爲它還實現了工作平衡。 – 2013-03-05 09:38:29
對於每次嘗試,我都使用相同的數字(32或64),可能如您所指出的那樣,使用OpenMP和ppl我可以獲得更好的結果,將線程數設置爲等於核心數。我會盡力。 – 888 2013-03-05 10:07:40
現在回答這個問題幾乎是不可能的。什麼是'some_computations'在做什麼?我可能在某處存在爭用(這可能會以不同的方式觸發不同的庫,例如,如果openmp實際上開銷較低,但是對共享緩存線的寫入很多,導致緩存失效狂熱可能實際上會使緩慢)?每個變體 – Grizzly 2013-03-07 18:56:46