我有时会在 CUDA 内核中看到以下共享内存声明,但我不确定它的含义:
__extern__ shared T shmem[][SZ]
其中
SZ
是编译时常量。内核启动为:
kernel<<<grid, block, shared_memory_size>>>()
我的问题是:
shared_memory_size * SZ
吗?shared T shmem[SZ*shared_memory_size]
?__extern__ shared T shmem[][SZ]
正确的语法是
extern __shared__ T shmem[][SZ];
为什么动态和静态共享内存的混合会很有用(除了简化程序员的地址计算之外)?
我相信地址计算是唯一的原因。当然,这也影响静态分析等,但仅此而已;让您的工作更轻松。
共享内存缓冲区shmem的总大小是多少?是
吗?shared_memory_size * SZ
不,内核启动参数以字节为单位。因此沿外部尺寸的尺寸将为
shared_memory_size / (SZ * sizeof(T))
。换句话说,如果你想在运行时使用 shmem[N][SZ]
,那么 shared_memory_size = N * SZ * sizeof(T)
假设我可以在编译时计算shared_memory_size,我该如何重写共享内存声明才能使其成为静态?
?shared T shmem[SZ*shared_memory_size]
你的意思是这样吗?
__shared__ T shmem[N][SZ];