下記の test1 関数は、ワークキューイング・モデルを使用する並列化処理を示します。parallel taskq プラグマを持つループと task プラグマを持つループ本体の作業を付けることによって並列処理を記述できます。parallel taskq プラグマは、囲まれた task プラグマに指定された作業単位をエンキューする while ループの環境を指定します。従って、ループの制御構造とエンキューは、シングルスレッドで実行され、チーム内の他のスレッドは taskq キューからの作業をデキューし、実行します。captureprivate 構文は、各タスクがエンキューされる時点、つまり、シーケンシャル・セマンティクスが保存される時点で、リンクポインタ p の private コピーが確実に取り込まれるようにします。
void test1(LIST p) { #pragma intel omp parallel taskq shared(p) { while (p != NULL) { #pragma intel omp task captureprivate(p) { do_work1(p); } p = p->next; } } } |