2

私の OpenCL カーネルには、メモリの割り当て、ループの反復回数などを管理する定数がかなりあります。グローバル __constants または #defines を使用する方が高速ですか?

4

2 に答える 2

4

「通常の」C コンパイラと同じ規則が OpenCL コンパイラに適用されます。Aは実際のコンパイル#defineに値に置き換えられるため、カーネルに組み込まれます。

定義により、__constant変数はグローバル メモリに割り当てられ、使用前に転送する必要があります。#defineこれは、 d リテラルを使用するよりも遅くなります。ただし、NVIDIA および AMD の GPU アーキテクチャはこれらの値をキャッシュし、通常のグローバル メモリよりも読み取りが高速です。

話の終わりと私の個人的なアドバイス:#defines定数値と「魔法の」数に__constant使用し、より大きな高速だが読み取り専用のメモリ ブロック (ルックアップ テーブルなど) に使用します。

于 2013-02-27T16:23:02.470 に答える
1

defineはCと同じように機能します。これに対する例外は、AMD APP SDK v2.8より前のすべてのバージョンです(OpenCL 1.2サポートなし)。

__Constantは、キャッシュされたメモリスペースです。OpenCLのメモリレイアウトの詳細をお読みください。

__globalは、GPUの合計メモリであり、すべてのスレッドで表示されます。

__localはGPUのローカルメモリであり、ブロック内のスレッドのみに表示されます。

__constantはキャッシュされたメモリであり、グローバルよりもはるかに高速ですが制限されているため、必要な場合にのみ使用してください。

__privateはGPUのプライベートメモリであり、個々のスレッドからのみ表示されます。

注:スレッド、つまり処理要素を意味します。

于 2013-03-07T09:38:01.933 に答える