web-dev-qa-db-ja.com

GPU共有メモリのサイズが非常に小さい-それについて何ができますか?

共有メモリ(OpenCL用語では「ローカルメモリ」)のサイズは、今日のほとんどのnVIDIAGPUでわずか16KiBです。
10,000個の整数を持つ配列を作成する必要があるアプリケーションがあります。したがって、10,000個の整数= 10,000 * 4b = 40kbに合わせるために必要なメモリの量。

  • どうすればこれを回避できますか?
  • 16 KiBを超える共有メモリを備えたGPUはありますか?
18
rana

共有メモリは、明示的に管理されたキャッシュと考えてください。複数のパスを作成するか、グローバルメモリとの間のロードとストアの数を最小限に抑えるその他のスキームを使用して、配列をグローバルメモリに格納し、必要に応じてその一部を共有メモリにキャッシュする必要があります。

これをどのように実装するかは、アルゴリズムによって異なります。実装しようとしていることが正確に何であるかについて詳細を説明できれば、より具体的な提案が得られる可能性があります。

最後にもう1つ、共有メモリはブロック内のすべてのスレッド間で共有であることに注意してください-スレッド内のすべてのスレッドに共通の単一のデータ構造がない限り、スレッドあたりのデータ数は16kb未満です。ブロック。

26
Paul R

すべてのコンピューティング機能2.0以降のデバイス(ほとんどが過去1〜2年)には、マルチプロセッサごとに48KBの使用可能な共有メモリがあります。そうは言っても、Paulの答えは正しいです。おそらく、すべての10K整数を単一のマルチプロセッサにロードしたくないでしょう。

9
Devin Lane

cudaFuncSetCacheConfig(nameOfKernel, cudaFuncCachePrefer{Shared, L1})関数を使用してみてください。

共有よりもL1を使用する場合は、48KBがL1に、16KBが共有になります。 L1よりも共有を希望する場合は、48KBが共有になり、16KBがL1になります。

使用法:

cudaFuncSetCacheConfig(matrix_multiplication, cudaFuncCachePreferShared);
matrix_multiplication<<<bla, bla>>>(bla, bla, bla); 
4
gon1332