Oracle® Solaris Studio 12.4: OpenMP API ユーザーズガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

4.1.2 OpenMP タスクのタイプ

OpenMP 仕様には、タスク化のオーバーヘッドを減らすためにプログラマが使用できる各種のタスクが定義されています。

非延期タスクとは、その生成元タスクに対して実行が延期されないタスクです。つまり、生成元タスク領域は非延期タスクの実行が完了するまで中断されます。非延期タスクはそれを検出したスレッドによってただちに実行されない場合があります。プールに入れられ、検出したスレッドまたはほかのスレッドによってあとで実行される場合があります。そのタスクの実行が完了したら、生成元タスクが再開できます。非延期タスクの一例は、false と評価される if 節の式を含むタスクです。この場合、非延期タスクが生成され、検出したスレッドは現在のタスク領域を中断する必要があります。現在のタスク領域の実行は、if 節を含むタスクが完了するまで再開できません。

非延期タスクとは異なり、インクルードタスクは検出したスレッドによってただちに実行されるため、あとで実行するためにプールに入れられることはありません。このタスクの実行は、生成元タスク領域に順次追加されます。非延期タスクと同様に、生成元タスクはインクルードタスクの実行が完了するまで中断され、完了した時点で再開できます。インクルードタスクの一例は、最終タスクの子孫であるタスクです。

マージタスクとは、その生成元タスク領域と同じデータ環境を持つタスクです。task ディレクティブに mergeable 節が存在し、生成されるタスクが非延期タスクまたはインクルードタスクの場合、実装では代わりにマージタスクの生成を選択できます。マージタスクが生成される場合は、task ディレクティブがまったく存在しないかのように動作します。

最終タスクとは、そのすべての子孫タスクが最終タスクおよびインクルードタスクになるように強制するタスクです。task ディレクティブに final 節が存在し、final 節の式が true と評価される場合、生成されるタスクは最終タスクになります。