並列化できる C++ プログラムがあります。Visual Studio 2010、32 ビット コンパイルを使用しています。
要するに、プログラムの構造は次のとおりです
#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
ループを並列化しました。
私の最初の試みはboost::threadでした、
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
結果は's のものより悪かった。
次に、pplライブラリを試して使用しましたparallel_for()
:
Concurrency::parallel_for(0,num_iterations, [=](int j) {
some_computations(results+j);
})
結果は最悪でした。
私は、この振る舞いが非常に驚くべきものであることに気付きました。OpenMP と ppl は並列化用に設計されているため、boost::thread
. 私が間違っている?
boost::thread
より良い結果が得られるのはなぜですか?