0

開発者、

誰かが私にヒントをくれませんか?同じカーネルに一定の動的共有メモリを割り当てる方法についての情報が見つかりませんでした。または、もっと貴重な質問をしましょう。割り当てる必要のある共有メモリの量がコンパイル時に部分的にわかっているカーネルを呼び出す方法は?たとえば、共有メモリの割り当てを参照すると、動的割り当ての方法が非常に明確になります。しかし、私が次のカーネルを持っていると仮定しましょう:

__global__ void MyKernel(int Float4ArrSize, int FloatArrSize)
{
  __shared__ float Arr1[256];
  __shared__ char  Arr2[256];
  extern __shared_ float DynamArr[];
  float4* DynamArr1 = (float4*) DynamArr;
  float* DynamArr = (float*) &DynamArr1[Float4ArrSize];

  // do something
}

カーネル呼び出し:

int SharedMemorySize = Float4ArrSize + FloatArrSize;

SubstractKernel<<< numBlocks, threadsPerBlock, SharedMemorySize, stream>>>(Float4ArrSize, FloatArrSize)

コンパイラが共有メモリのサイズを動的に割り当てたい部分にのみリンクしている方法を実際に理解することはできませんでした。または、パラメータ「SharedMemeorySize」はブロックごとの共有メモリの合計量を表すので、定数メモリのサイズで計算する必要があります(int SharedMemorySize = Float4ArrSize + FloatArrSize + 256 * sizeof(float)+ 256 * sizeof(char)) ?

私に教えてください、または単にいくつかのコードスニペットを指してください。よろしくお願いします。

乾杯

4

2 に答える 2

3

プログラミングガイドを引用しSharedMemorySizeて、静的に割り当てられたメモリに加えて、この呼び出しに対してブロックごとに動的に割り当てられる共有メモリのバイト数を指定します。この動的に割り当てられたメモリは、外部配列として宣言された変数のいずれかによって使用されます。SharedMemorySizeデフォルトは0のオプションの引数です。

ですから、あなたが何をしたいのか理解できれば、おそらく次のようになります。

extern __shared_ float DynamArr[];
float*  DynamArr1 = DynamArr;
float4* DynamArr2 = (float4*) &DynamArr[DynamArr1_size];

注意してください、私はそれをテストしませんでした。

これは非常に便利な投稿です。

于 2013-03-18T17:06:11.457 に答える
1

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

[カーネルの]実行構成は、関数名と括弧で囲まれた引数リストの間に<<< Dg、Db、Ns、S >>>の形式の式を挿入することによって指定されます。ここで、

  • Nsはsize_t型であり、静的に割り当てられたメモリに加えて、この呼び出しに対してブロックごとに動的に割り当てられる共有メモリのバイト数を指定します。この動的に割り当てられたメモリは、 __shared__説明されているように外部配列として宣言された変数のいずれかによって使用されます。Nsはオプションの引数で、デフォルトは0です。

したがって、基本的に、カーネル呼び出し中に指定する共有メモリのサイズは、動的に割り当てられた共有メモリに関連しています。共有メモリに静的に割り当てられた配列のサイズを手動で追加する必要はありません。

于 2013-03-18T17:05:37.017 に答える