インテル® FPGA SDK for OpenCL™プロ・エディション: プログラミング・ガイド

ID 683846
日付 4/01/2019
Public
ドキュメント目次

5.5.3.1. パイプにおけるワークアイテムのシリアル実行

ワークアイテムのシリアル実行とは、ワークアイテムのシーケンシャルIDが計算ユニットにおける実行順序を決定する、順序付けられた実行動作のことです。

カーネルにパイプを実装すると インテル® FPGA SDK for OpenCL™オフライン・コンパイラーは、カーネルの動作は、最大1つのインフライトのワークグループを保有しているのと同等であるということを強制します。オフライン・コンパイラーはまた、カーネルがワークアイテムのシリアル実行でパイプを実行するよう保証します。ここでカーネルは、小さなIDを有するワークアイテムをまず実行します。ワークアイテムは、(x、y、z、group)の識別子を持ち、xyzはローカルの3D識別子であり、groupはワークグループの識別子です。

次のいずれかの条件が当てはまる場合、ワークアイテムID (x0、y0、z0、group0) は、ID (x1、y1、z1、group1) よりも小さいとみなされます。

  • group0 < group1の場合
  • group0 = group1z0 < z1の場合
  • group0 = group1z0 = z1y0 < y1の場合
  • group0 = group1z0 = z1y0 = y1x0 < x1の場合

インクリメンタルIDを持つワークアイテムは、シーケンシャルに実行されます。例えば、ID (x0、y0、z0、group0) を持つワークアイテムは、書き込みチャネル呼び出しを最初に実行します。次に、ID (x1、y0、z0、group0) を持つワークアイテムが呼び出しを実行します。この順序を定義することで、システムを外部モデルと検証することが可能になります。

複数のワークアイテムを持つループでのパイプの実行

次に示すように、複数のワークアイテムを持つループの本体にパイプが存在する場合、各ループの反復は後続の反復の前に実行されます。これは、ワークグループの各ワークアイテムのループ反復0が、ワークグループの各ワークアイテムの反復1の前に実行されることを意味します。

__kernel void ordering (__global int * data,
                        write_only pipe int __attribute__((blocking)) req)
{
    write_pipe (req, &data[get_global_id(0)]);
}