是否有任何应用程序级API可用于CUDA中CTA分配的免费共享内存?我想将我的CTA重用于另一个任务,在开始该任务之前,我应该清理以前任务使用的内存。
答案 0 :(得分:4)
共享内存在内核启动时静态分配。您可以选择在内核中指定未分配的共享分配:
__global__ void MyKernel()
{
__shared__ int fixedShared;
extern __shared__ int extraShared[];
...
}
第三个内核启动参数然后指定共享内存对应于未分配的分配。
MyKernel<<<blocks, threads, numInts*sizeof(int)>>>( ... );
为内核启动分配的共享内存总量是内核中声明的数量加上共享内存内核参数加上对齐开销的总和。你无法“释放”它 - 它会在内核启动期间保持分配状态。
对于经历多个执行阶段且需要将共享内存用于不同目的的内核,您可以做的是使用共享内存指针重用内存 - 在未实现的声明上使用指针算法
类似的东西:
__global__ void MyKernel()
{
__shared__ int fixedShared;
extern __shared__ int extraShared[];
...
__syncthreads();
char *nowINeedChars = (char *) extraShared;
...
}
我不知道任何使用此习惯用法的SDK示例,尽管threadFenceReduction示例声明了__shared__ bool
并且还使用共享内存来保存缩减的部分总和。