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

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

5.2.6. ワークグループ・サイズの指定

最大の、または必要なワークグループ・サイズを可能な限り指定してください。 インテル® FPGA SDK for OpenCL™オフライン・コンパイラーはこの指定されたサイズに基づき、OpenCL™カーネルのハードウェア使用率を過剰なロジックをともなうことなく最適化します。
max_work_group_sizeまたはreqd_work_group_size属性をカーネルで指定しない場合、ワークグループ・サイズはコンパイル時間とランタイムの制約に応じたデフォルト値になります。
  • カーネルにバリアーが含まれる場合、オフライン・コンパイラーは、デフォルトの最大ワークグループ・サイズである256ワークアイテムを設定します。
  • カーネルが、異なるスレッドの異なる動作を可能にするOpenCL組み込み関数 (ローカルまたはグローバルスレッドID、ワークグループID) の問い合わせを行わない場合、オフライン・コンパイラーはシングルスレッド実行モードを想定し、最大ワークグループ・サイズを (1,1,1) に設定します。この場合OpenCLランタイムもまた、グローバル・エンキュー・サイズを (1,1,1) に強制するため、ループのパイプライン化の最適化がオフライン・コンパイラーで有効になります。

ワークグループ・サイズを指定するには、次のようにカーネルコードを修正します。

  • カーネルのワークグループに向けてオフライン・コンパイラーが規定するワークアイテムの最大数を指定するには、max_work_group_size(X, Y, Z) 属性をカーネルのソースコードに挿入します。
    例:
    __attribute__((max_work_group_size(512,1,1)))
    __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];
    }
  • カーネルのワークグループにオフライン・コンパイラーが規定するワークアイテムの必要数を指定するには、reqd_work_group_size(X, Y, Z) 属性をカーネルのソースコードに挿入します。
    例:
    __attribute__((reqd_work_group_size(64,1,1)))
    __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];
    }