13

sizeカーネル関数では、両方とも長さ(実際には)の共有メモリの2つのベクトルが必要ですsizeof(float)*size

変数が必要な場合、カーネル関数に直接メモリを割り当てることはできないため、次のように動的に割り当てる必要がありました。

    myKernel<<<numBlocks, numThreads, 2*sizeof(float)*size>>> (...);  

そして、カーネル内:

extern __shared__ float row[];
extern __shared__ float results[];    

しかし、これは機能しません。

これの代わりに、割り当てられextern __shared__ float rowresults[]たメモリを使用して、すべてのデータを含む1つのベクトルのみを作成しました。2*sizeしたがってrow、呼び出しは同じであり、results呼び出しはのようになりますrowresults[size+previousIndex]。そして、これは機能します。

とにかく期待どおりの結果が得られるので大きな問題ではありませんが、動的に割り当てられた共有メモリを2つ(またはそれ以上)の異なる変数に分割する方法はありますか?美しさのためだけに。

4

1 に答える 1

12

__shared__のCプログラミングガイドセクションには、動的に割り当てられた共有メモリから複数のアレイを割り当てる例が含まれています。

extern __shared__ float array[];
__device__ void func()      // __device__ or __global__ function
{
    short* array0 = (short*)array; 
    float* array1 = (float*)&array0[128];
    int*   array2 =   (int*)&array1[64];
}

要素へのポインタを取得して新しい配列を作成しているだけなので、例の静的オフセットの代わりに動的オフセットを使用するように調整できると思います。彼らはまた、配置は同じでなければならないと述べていますが、それはあなたの場合には問題ではないはずです。

于 2013-03-15T15:09:47.793 に答える