13

こんにちは、nvidia cudaカーネル内で次のことが可能かどうか知りたいだけです

__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[1000];
  ...
}

または次の

__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[size];
  ...
}
4

4 に答える 4

12

最初の例は実行できますが、2 番目の例は試していません。

ただし、それを助けることができる場合は、これを行わないようにプログラムを再設計することをお勧めします。カーネルに 4000 バイトのメモリを割り当てたくありません。すべてをレジスタに収めることができないため、これにより CUDA ローカルメモリが大量に使用されます。CUDA ローカル メモリは低速です (400 サイクルのメモリ レイテンシ)。

于 2010-02-02T22:03:08.090 に答える
11

#1を実行できますが、これはすべてのスレッドで実行されることに注意してください。

カーネルランタイムでの動的メモリ割り当てがサポートされていないため、2番目のスニペットは機能しません。

于 2010-02-10T17:04:37.740 に答える
8

カーネルの起動時に、共有メモリを動的に割り当てることができます。

__global__ void compute(long *c1, long size, ...)
 {
  ...
   extern __shared__ float shared[];
  ...
 }

compute <<< dimGrid, dimBlock, sharedMemSize >>>( blah blah );

CUDA プログラミング ガイド:

配列のサイズは起動時に決定されます (セクション 4.2.3 を参照)。

于 2010-02-08T23:57:10.877 に答える
7

カーネル ランタイムでの動的メモリ割り当てがサポートされています。sdk の例、新しい削除を確認してください。

于 2012-04-29T19:52:37.237 に答える