通常、タスクを並列化するためにOpenMPを使用するのに慣れています。しかし、私は最近、新しいプロジェクトに取り掛かったときにParallel Patterns Libraryに一発のショットを与えるかもしれないと思った。PPLで可変数タスクを使ってタスクを並列化する方法
問題は、プロセス全体を通じてさまざまなサイズのリスト構造にデータを格納する必要があるという問題です。私は、反復ごとにタスクを作成するとOpenMPのでリストを並列化でき、私は次のコード
#include <list>
#include <ppl.h>
#include <iostream>
#include <Windows.h>
using namespace std;
using namespace Concurrency;
void expo(double x){
double r = 1;
for(int i = 0 ; i<1000000 ; ++i){
r *= x;
}
cout << r << " ";
}
int wmain()
{
int begin,end;
list<int> numbers;
for(int i=1; i<11 ; ++i){
numbers.push_back(i);
}
list<int>::iterator lit;
structured_task_group tasks;
begin = GetTickCount();
for(lit=numbers.begin() ; lit!=numbers.end() ; lit++){
int k = *lit;
auto task1 = make_task([&k](){ expo(k); });
tasks.run(task1);
tasks.wait();
}
end = GetTickCount();
printf("elapsed: %d ms",end - begin);
cin.get();
return 0;
}
と同じことを達成しようとした。しかし、あなたが見ることができるように、私は内部のタスクの完了に待たなければなりませんfor-loopは、シリアル実行を意味します。 for-loopの後に "tasks.wait()"を置くとエラーが発生し、コンパイラはrunコマンドの後にwaitコマンドがないと言う。
この問題を回避するにはどうすればよいですか?
ところで、あなたはPPLに関する良いチュートリアルを知っていますか?私はこのページ(http://msdn.microsoft.com/en-us/library/dd492418.aspx)を見つけましたが、初心者のための完全なチュートリアルではないようです。
ありがとうございます!
感謝を!素晴らしい仕事を!あなたはPPLを学ぶのに良い場所を知っていますか?ところで、私の元の問題では、私は共有価値を更新する必要があります。元のアルゴリズムはリストを通過し、関数に最も低い値を生成する要素を見つけます。クリティカルな領域が必要です。 PPLでどのように達成できますか? – aristos
@aristos:PPLを学ぶのに最適な場所はわかりませんが、[Concurrency Runtime](http://msdn.microsoft.com/en-us/library/dd504870)のすべてのテキストと例を読んでいます。 .aspx)。あなたの2番目の質問については、中間結果を 'concurrent_vector'にプッシュし、最後に' std :: min_element'を使って最低値を見つけることができます。 – Blastfurnace
parallel_for_eachが機能しない場合は、wait_all()を使用することもできます。 –