2012-01-04 7 views
0

通常、タスクを並列化するために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)を見つけましたが、初心者のための完全なチュートリアルではないようです。

ありがとうございます!

答えて

0

次であなたのstructured_task_groupfor()ループを置き換えることができます。

parallel_for_each(numbers.begin(), numbers.end(), [](int k){ expo(k); }); 
+0

感謝を!素晴らしい仕事を!あなたはPPLを学ぶのに良い場所を知っていますか?ところで、私の元の問題では、私は共有価値を更新する必要があります。元のアルゴリズムはリストを通過し、関数に最も低い値を生成する要素を見つけます。クリティカルな領域が必要です。 PPLでどのように達成できますか? – aristos

+0

@aristos:PPLを学ぶのに最適な場所はわかりませんが、[Concurrency Runtime](http://msdn.microsoft.com/en-us/library/dd504870)のすべてのテキストと例を読んでいます。 .aspx)。あなたの2番目の質問については、中間結果を 'concurrent_vector'にプッシュし、最後に' std :: min_element'を使って最低値を見つけることができます。 – Blastfurnace

+0

parallel_for_eachが機能しない場合は、wait_all()を使用することもできます。 –

関連する問題