質問

こんにちは、私はちょうどNVIDIA CUDAカーネル

内の以下を実行することが可能であるかどうかを知りたいと思いました
__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[1000];
  ...
}

または次の

__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[size];
  ...
}
役に立ちましたか?

解決

あなたが最初の例を行うことができますが、私は2番目を試していません。

しかし、あなたはそれを助けることができれば、あなたはこれを行うにはない、あなたのプログラムを再設計することができます。あなたは、カーネルにメモリの4000バイトを割り当てる必要はありません。あなたはレジスタにすべてをフィットすることはできませんので、それは、CUDAローカルメモリの使用の多くにつながります。 CUDAローカルメモリは、(メモリレイテンシの400サイクル)遅い。

他のヒント

あなたは#1を行うが、これはすべてのスレッドで実行されます用心することができます!

あなたの第二のスニペットは動作しません、カーネルの実行時に動的メモリ割り当てがサポートされていないため。

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

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

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

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

  

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

カーネルの実行時に動的メモリ割り当ては、SDKの例を確認し、新しいサポート削除されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top