CUDA中的可用共享内存

CUDA中的可用共享内存,cuda,Cuda,是否有任何应用程序级API可用于释放CUDA中CTA分配的共享内存?我想将我的CTA重新用于另一个任务,在开始该任务之前,我应该清理前一个任务使用的内存。共享内存在内核启动时静态分配。您可以选择在内核中指定非大小的共享分配: __global__ void MyKernel() { __shared__ int fixedShared; extern __shared__ int extraShared[]; ... } 然后,第三个内核启动参数指定有多少共享内存对应于

是否有任何应用程序级API可用于释放CUDA中CTA分配的共享内存?我想将我的CTA重新用于另一个任务,在开始该任务之前,我应该清理前一个任务使用的内存。

共享内存在内核启动时静态分配。您可以选择在内核中指定非大小的共享分配:

__global__ void MyKernel()
{
    __shared__ int fixedShared;
    extern __shared__ int extraShared[];
    ...
}
然后,第三个内核启动参数指定有多少共享内存对应于该非大小分配

MyKernel<<<blocks, threads, numInts*sizeof(int)>>>( ... );

我不知道有哪个SDK示例使用这种习惯用法,尽管ThreadFenceReduce示例声明了一个
\uuuuuuuuuuuuuuuuuuuuuuuuooL
,并且还使用共享内存来保存缩减的部分和。

共享内存在内核调用之间不会持续存在:您的问题是什么?一般来说,启动一个新内核要比在同一个内核中完成更多(异构)任务要好得多。我想在另一个任务中使用同一个CTA,所以我计划与
\u syncThreads()
同步,并将其用于另一个任务。Stefano,内核融合是在CUDA中分摊内核启动开销的一种由来已久的方法。@archeasoftware可以,但为了让事情保持正确的角度,我们所说的同步启动大约需要10或20微秒,异步启动甚至更少。发射。很抱歉,我没有明确指出,我出于个人编程风格的偏好而避免内核融合。内核融合可以很好地工作,但要注意寄存器的使用。在整个内核启动过程中,为内核分配的寄存器数量是静态的,因此,较大内核中具有较高寄存器要求的任何部分都会相应地降低整个内核的占用率。
__global__ void MyKernel()
{
    __shared__ int fixedShared;
    extern __shared__ int extraShared[];
    ...
    __syncthreads();
    char *nowINeedChars = (char *) extraShared;
    ...
}