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

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

5.2.4. ループの並列性 (max_concurrency Pragma)

max_concurrencyプラグマを使用し、コンポーネントのループの並列性を制限できます。

ループの並列性とは、そのループの反復を同時に何回進行することができるかということです。デフォルトにおいてインテル FPGA SDK for OpenCLは、ループの並列性を最大化し、コンポーネントが最大のスループットで動作するように試みます。

max_concurrencyプラグマは、ループがパイプライン化されている単一のワークアイテム・カーネル (つまりシングルスレッド・カーネル) に適用されます。ループのパイプライン化および、カーネルをシングルスレッドとして処理するかどうかの、オフライン・コンパイラーの決定を左右するカーネルのプロパティーについては、 インテル® FPGA SDK for OpenCL™ : ベスト・プラクティス・ガイドシングル・ワーク・アイテム・カーネル対NDRangeカーネルの章を参照ください。

max_concurrencyプラグマを使用すると、ループのパイプライン化に必要なオンチップ・メモリー・リソースを制御できるようになります。ループ反復の同時実行を実現するため、オフライン・コンパイラーは単一の反復に専用のメモリーコピーを作成する必要があります。このコピーはプライベート・コピーと呼ばれます。許可される並列性が高いほど、より多くのプライベート・コピーをコンパイラーは作成しなければなりません。

カーネルのHTMLレポート (report.html) は、ループの並列性に関する以下の情報を提供します。

  • オフライン・コンパイラーが選択した最大の並列性

    この情報は、ループ解析レポートとカーネル・メモリー・ビューアーで確認できます。

    • ループ解析レポートのDetailsペインのメッセージは、同時実行の最大数はNに制限されていると報告します。
      注: 符号なしのNは、0以上の値になることが可能です。N = 0は、並列性が無制限であることを意味します。
    • カーネル・メモリー・ビューアーのローカルメモリーのバンクビューは、プライベート・コピーの数を図式化し表示します。

  • メモリー使用量への影響

    この情報は、エリア解析レポートで確認可能です。Detailsペインのメッセージは、オフライン・コンパイラーがN個のループ反復を同時実行するため、N個の独立したメモリーコピーを作成したことを報告します。

パフォーマンスよりも物理メモリーの低減を優先する場合、以下のように#pragma max_concurrency <N> をループに適用します。このプラグマを適用すると、オフライン・コンパイラーは同時に実行するループの反復回数をNに制限します。ループのメモリーのプライベート・コピー数もNに減少します。

#pragma max_concurrency 1
​for (int i = 0; i < N; i++) {
  int arr[M];
  // Doing work on arr
}

ローカルメモリーに作成され、ループでアクセスされるプライベート・コピーの数も、__attribute__((max_concurrency(N))) を使用し制御することができます。属性に関する詳細は、カーネルのメモリーシステムをコンフィグレーションするメモリー属性 を参照ください。__attribute__((max_concurrency(N))) を持つローカルメモリーに、#pragma max_concurency Mをともなうループでアクセスすると、オフライン・コンパイラーは同時に実行されるループの反復数をmin(M,N) に制限します。