私の OpenCL カーネルには、メモリの割り当て、ループの反復回数などを管理する定数がかなりあります。グローバル __constants または #defines を使用する方が高速ですか?
2 に答える
「通常の」C コンパイラと同じ規則が OpenCL コンパイラに適用されます。Aは実際のコンパイル前#define
に値に置き換えられるため、カーネルに組み込まれます。
定義により、__constant
変数はグローバル メモリに割り当てられ、使用前に転送する必要があります。#define
これは、 d リテラルを使用するよりも遅くなります。ただし、NVIDIA および AMD の GPU アーキテクチャはこれらの値をキャッシュし、通常のグローバル メモリよりも読み取りが高速です。
話の終わりと私の個人的なアドバイス:#defines
定数値と「魔法の」数に__constant
使用し、より大きな高速だが読み取り専用のメモリ ブロック (ルックアップ テーブルなど) に使用します。
defineはCと同じように機能します。これに対する例外は、AMD APP SDK v2.8より前のすべてのバージョンです(OpenCL 1.2サポートなし)。
__Constantは、キャッシュされたメモリスペースです。OpenCLのメモリレイアウトの詳細をお読みください。
__globalは、GPUの合計メモリであり、すべてのスレッドで表示されます。
__localはGPUのローカルメモリであり、ブロック内のスレッドのみに表示されます。
__constantはキャッシュされたメモリであり、グローバルよりもはるかに高速ですが制限されているため、必要な場合にのみ使用してください。
__privateはGPUのプライベートメモリであり、個々のスレッドからのみ表示されます。
注:スレッド、つまり処理要素を意味します。