0

同じ CUDA カーネル内で以前に割り当てられた共有メモリの割り当てを解除する方法はありますか? たとえば、ある時点で定義したカーネル内

__shared__ unsigned char flag;
__shared__ unsigned int values [ BLOCK_DIM ];

後でコード内で、以前に定義された共有メモリを考慮して、ブロックに設定された共有メモリ制限を超える配列を定義する必要があります。以前に定義された共有メモリを再利用するという汚い作業をせずに、どうすればそれを行うことができますか? それとも、NVCC はカーネル トレースに沿って依存関係を認識し、共有変数の使用が完了するたびにその依存関係を解放するほどスマートなのでしょうか? 私のデバイスは GeForce GTX 780 (CC=3.5) です。

4

1 に答える 1

4

C/C++ では、静的に定義された配列の割り当てを解除することはできません。

次のように、最悪の場合に必要な共有メモリの量を動的に割り当てることができます。追加

extern __shared__ float foo[];

カーネル関数内で、カーネル関数を次のように起動します

myKernel<<<numBlocks, numThreads, sh_mem_size>>> (...);  

ポインターをいじることで、複数の配列を管理できることを覚えておいてください。詳細については、CUDA 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-09-17T14:06:31.563 に答える