Intel® FPGA SDK for OpenCL™: ベスト・プラクティス・ガイド

ID 683521
日付 12/08/2017
Public
ドキュメント目次

6.3. 複数のコンピューティング・ユニット

より高いスループットを達成するために、 Intel® FPGA SDK for OpenCL™オフライン・コンパイラーはカーネルごとに複数のコンピューティング・ユニットを生成できます。 オフライン・コンパイラーは、各計算単位を一意のパイプラインとして実装します。一般に、各カーネルコンピューティング・ユニットは複数のワークグループを同時に実行することができます。

全体のカーネルスループットを向上させるために、FPGAのハードウェア・スケジューラーはワークグループを追加の使用可能なコンピューティング・ユニットにディスパッチします。コンピューティング・ユニットは、フル・キャパシティーに達していない限り、ワークグループ割り当てに使用できます。

各作業グループは、実行を完了するのに同じ時間がかかるものとします。オフライン・コンパイラーが2つのコンピューティング・ユニットを実装する場合、各コンピューティング・ユニットは作業グループの半分を実行します。ハードウェア・スケジューラーがワークグループをディスパッチするため、このプロセスを独自のコードで管理する必要はありません。

オフライン・コンパイラーは、カーネルの最適な計算単位数を自動的に決定しません。カーネル実装のコンピューティング・ユニットの数を増やすには、以下のコードサンプルに示すように、 num_compute_units属性を使用してオフライン・コンパイラーが作成するコンピューティング・ユニットの数を指定する必要があります。

__attribute__((num_compute_units(2)))
__kernel void sum (__global const float * restrict a,
                   __global const float * restrict b,
                   __global float * restrict answer)
{
    size_t gid = get_global_id(0);

    answer[gid] = a[gid] + b[gid];
}

コンピューティング・ユニットの数を増やすと、スループットが向上します。ただし、以下の図に示すように、コンピューティング・ユニット間のグローバルメモリー帯域幅が増加するという犠牲を払って実行します。また、ハードウェア・リソースの使用率も向上します。

図 75. 複数の計算単位によるデータフロー