11

今日__local、カーネルにさらに 4 つの変数を追加して、中間結果をダンプしました。しかし、さらに 4 つの変数をカーネルの署名に追加し、対応するカーネル引数を追加するだけで、カーネルのすべての出力が「0」にレンダリングされます。どの cl 関数もエラー コードを返しません。

さらに、2 つの小さい変数の 1 つだけを追加しようとしました。1つだけ追加すると機能しますが、両方を追加すると機能しなくなります。

では、OpenCL のこの動作は、多くの__localメモリを割り当てたことを意味するのでしょうか? __local自分が使用できるメモリの量を確認するにはどうすればよいですか?

4

3 に答える 3

22

デバイスが各計算ユニットで提供するローカル メモリの量は、次の関数でCL_DEVICE_LOCAL_MEM_SIZEフラグを使用して照会できます。clGetDeviceInfo

cl_ulong size;
clGetDeviceInfo(deviceID, CL_DEVICE_LOCAL_MEM_SIZE, sizeof(cl_ulong), &size, 0);

返されるサイズはバイト単位です。各ワークグループは、この量のメモリを厳密に自分自身に割り当てることができます。ただし、最大割り当てを行うと、同じ計算ユニットで他のワークグループを同時にスケジュールできなくなる可能性があることに注意してください。

于 2011-03-08T20:39:49.800 に答える
6

もちろん、ローカルメモリは仮想ではなく物理であるため、あります。

私たちは、CPU 上の仮想アドレス空間を操作することから、理論的には必要なだけのメモリを確保するために使用されています。ページング ファイル / スワップ パーティションが不足しているために、非常に大きなサイズで失敗する可能性があります。メモリを使いすぎて、物理 RAM とディスクにマップできなくなります。

これは、実際の RAM の特定の領域にアクセスする必要があるコンピューターの OS カーネル (またはその下位レベルの部分) などには当てはまりません。

GPU のグローバル メモリとローカル メモリの場合も同様です。*メモリー・ページング (認識されたスレッド・アドレスを物理メモリー・アドレスに再マッピングすること)はありません。そしてスワップなし。特にローカル メモリに関しては、すべての計算ユニット (= GPU 上のすべての対称型マルチプロセッサ) には、ローカル メモリとして使用される RAM の束があります。ここの緑のスラブ:

ここに画像の説明を入力

そのような各スラブのサイズは、あなたが得るものです

clGetDeviceInfo( · , CL_DEVICE_LOCAL_MEM_SIZE, · , ·).

たとえば、nVIDIA Kepler GPU では、ローカル メモリ サイズは 16 KB または 48 KB です (64 KB の補数は、グローバル メモリへのアクセスをキャッシュするために使用されます)。そのため、現在、GPU ローカル メモリはグローバル デバイス メモリに比べて非常に小さいです。


1 - Pascal アーキテクチャ以降の nVIDIA GPU では、ページングがサポートされています。しかし、それはデバイス メモリを使用する一般的な方法ではありません。

于 2013-11-22T08:13:22.863 に答える
4

よくわかりませんが、これは見なければならないと感じました。

次のリンクをたどってください。それを読んで。

すばらしい読み物: OpenCL – メモリ空間

少し関連するもの:

于 2011-03-08T19:29:33.163 に答える