今日、私はさらに4つ追加しました __local
カーネルに中間変数をダンプするための変数しかし、カーネルのシグネチャにさらに4つの変数を追加し、対応するKernel引数を追加するだけで、カーネルのすべての出力が "0"になります。cl関数はいずれもエラーコードを返しません。
私はさらに2つの小さい変数のうちの1つだけを追加しようとしました。どちらか一方だけを追加した場合は機能しますが、両方を追加した場合は機能しません。
OpenCLのこの振る舞いは、私が多くの人に割り当てたということを意味します。 __local
メモリ?どのように私は見つけるのですか、どのくらい __local
メモリは私には使えますか?
回答:
回答№1の19デバイスが各計算ユニットで提供するローカルメモリの量は、次のコマンドを使用して照会できます。 CL_DEVICE_LOCAL_MEM_SIZE
とフラグ clGetDeviceInfo
関数:
cl_ulong size;
clGetDeviceInfo(deviceID, CL_DEVICE_LOCAL_MEM_SIZE, sizeof(cl_ulong), &size, 0);
返されるサイズはバイト単位です。 各ワークグループは、この多くのメモリを自分自身に厳密に割り当てることができます。ただし、最大割り当てを行うと、同じ計算ユニットで他のワークグループを同時にスケジューリングできなくなる可能性があります。
回答№2の6
ローカルメモリがあるので、もちろんあります 物理的 のではなく、 バーチャル.
私たちは、仮想アドレスで作業することから慣れています理論的には必要なだけのメモリを確保するために、CPU上のスペースを確保します。物理RAMとディスクにマップできます。
これは、実際のRAMの特定の領域にアクセスする必要があるコンピュータのOSカーネル(またはその下位レベルの部分)のようなものには当てはまりません。
GPUのグローバルおよびローカルメモリにも当てはまりません。ありません* メモリページング(認識されたスレッドの再マッピング)物理メモリアドレスへのアドレス)。スワッピングはありません。特にローカルメモリに関しては、すべての計算ユニット(= GPU上のすべての対称型マルチプロセッサ)にローカルメモリとして使用される多数のRAMがあります。ここに緑の厚板:
そのような各スラブのサイズはあなたが得るものです
clGetDeviceInfo( · , CL_DEVICE_LOCAL_MEM_SIZE, · , ·)
.
説明するには nVIDIAケプラー GPUでは、ローカルメモリサイズは16 KBまたは48 KBのいずれかです(64 KBの補数は、グローバルメモリへのアクセスのキャッシュに使用されます)。だから、今日のように、 GPUローカルメモリは、グローバルデバイスメモリに比べて非常に小さいです。.
1 - Pascalアーキテクチャ以降のnVIDIA GPUでは、ページングがサポートされています。しかしそれはデバイスメモリの一般的な使い方ではありません。
回答№3の4
よくわからないが、これは見なければならないと感じた。
以下のリンクをたどってください。それを読んで。
素晴らしい読み物: OpenCL - メモリスペース.
ちょっと関連したもの: