ワークキューイング関数例

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

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;

     }

  }

}