CUDAの__shared__
メモリは、コンパイル時に既知のサイズを必要とするようです。ただし、私の問題では、__shared__
メモリサイズは実行時にしかわかりません。つまり、
int size=get_size();
__shared__ mem[size];
これは「エラー: 定数値が不明です」というエラーが発生し、この問題を回避する方法がわかりません。
CUDAの__shared__
メモリは、コンパイル時に既知のサイズを必要とするようです。ただし、私の問題では、__shared__
メモリサイズは実行時にしかわかりません。つまり、
int size=get_size();
__shared__ mem[size];
これは「エラー: 定数値が不明です」というエラーが発生し、この問題を回避する方法がわかりません。
共有メモリの目的は、ブロック内のスレッドが連携できるようにすることです。配列を として宣言する__shared__
と、ブロック内の各スレッドは同じメモリを参照するため、特定のスレッドが共有メモリ内の配列に独自のサイズを設定できるのは意味がありません。
__shared__
ただし、すべてのスレッドで同じサイズの単一配列のサイズを動的に指定する特殊なケースはサポートされています。共有メモリの割り当てを参照してください。
スレッドごとにメモリを動的に割り当てる必要がある場合は、(Fermi の) カーネル内で new または malloc を使用できますが、これらはグローバル メモリを割り当てるため、遅くなる可能性があります。
extern__shared__ mem[];
(静的共有メモリ) の代わりに (動的共有メモリ)を使用する必要があります __shared__ mem[size];
。[ https://devblogs.nvidia.com/parallelforall/using-shared-memory-cuda-cc/][1]を参照