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

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

A.2.2. OpenCL 1.2 Cプログラミング言語の実装

インテル® FPGA SDK for OpenCL™ は、 OpenCL Specification version 1.2 のSection 6で指定されているOpenCL Cプログラミング言語機能の多くをサポートしています。 SDKは、明確にした内容および例外をともない、OpenCL Cプログラミング言語に準拠しています。
重要: サポート状況欄の「●」はサポートされている機能であり、備考欄においてサポートされている内容を明確にしています。サポート状況欄の「○」は、備考欄で特定されている内容を除きサポートされている機能です。
表 15.  OpenCL 1.2 Cプログラミング言語機能のサポート状況
セクション 機能 サポート状況 備考
6.1.3 その他の組み込みデータ型 この機能はOpenCL Specification version 1.2に準拠していない可能性があります。
6.12.12 各種ベクトル関数 SDKは次の組み込みベクトル関数を追加しサポートしています。
  • vec_step
  • shuffle
  • shuffle2
6.12.13 printf この機能はOpenCL Specification version 1.2に準拠していない可能性があります。詳細は下記を確認ください。

OpenCLのprintf関数は一部例外をともない、C99のprintf関数に類似する構文と機能を持ちます。詳細は、OpenCL Specification version 1.2を参照ください。

printf関数の使用において、コンパイル手順、バッファーまたはフラグに対する特別な要件はありません。通常のaocコマンドで、printf命令を含むカーネルをコンパイルすることができます。

カーネルの実行中にprintfデータは、 インテル® FPGA SDK for OpenCL™オフライン・コンパイラーが自動的に割り当てるグローバルprintfバッファーに格納されます。このバッファーのサイズは64 kBであり、printf呼び出しのデータ引数の合計サイズがこのサイズを超えてはいけません。カーネルの実行が完了するとprintfバッファーのコンテンツは標準出力されます。

printfステートメントのフォーマット文字列は、256文字を超えることはできません。

バッファーのオーバーフローはシームレスに処理されます。つまり、printf命令は無制限に実行することができます。ただし、printfバッファーがオーバーフローすると、カーネルのパイプラインの実行は、ホストがバッファーを読み取りバッファー内容を出力するまでストールします。

printf関数はデータをグローバル・メモリー・バッファーに格納するため、そのような関数が含まれている場合、カーネルのパフォーマンスは低下します。

printf関数の使用上の制限はありません。printf命令は、ifelseのステートメントやループなどで使用することができます。カーネルは複数のワークアイテムで実行される複数のprintf命令を含むことができます。

printf呼び出しのフォーマット文字列引数と文字列リテラル引数は、特別なメモリー領域を使用しFPGAからホストシステムに転送されます。printf文字列引数の合計サイズが大きい場合、このメモリー領域はオーバーフローする可能性があります (一般的なOpenCLアプリケーションでは、通常3000文字以下が安全です)。オーバーフローした場合、エラーメッセージcannot parse auto-discovery string at byte offset 4096がホストプログラムの実行中に出力されます。

printfからの出力は、ワークアイテムが並行してprintf関数を実行しても混在することはありません。ただし、並行して実行されるprintfの順序は保証されていません。つまりprintf命令が並行するデータパスにある場合、printf出力はプログラム順に表示されない可能性があります。