Numba CUDA运行时的共享内存大小?

7
在CUDA C++中,可以直接定义一个在运行时指定大小的共享内存。那么我该如何使用Numba/NumbaPro CUDA来实现这个呢?
到目前为止,我的尝试都只导致了错误并显示以下信息:
Argument 'shape' must be a constant

编辑:仅澄清一下,我想要的是在CUDA C++中与以下内容等效的代码(示例取自此处):

__global__ void dynamicReverse(int *d, int n)
{
  extern __shared__ int s[];
      
  // some work in the kernel with the shared memory
}
    
int main(void)
{
  const int n = 64;
  int a[n];
    
  // run dynamic shared memory version
  dynamicReverse<<<1,n,n*sizeof(int)>>>(a, n);

}

你应该询问 Continuum Analytics(这是他们的产品),不过我猜他们不支持它。 - talonmies
1个回答

11

我通过非常有帮助的Continuum Analytics用户支持找到了解决方案。我们所做的就是像通常定义共享内存一样,但将其形状设置为0。然后,要定义共享数组的大小,我们必须将其作为第四个参数(在流标识符之后)传递给内核。例如:

@cuda.autojit
def myKernel(a):
   sm = cuda.shared.array(shape=0,dtype=numba.int32)

   # do stuff

arga = np.arange(512)
grid = 1
block = 512
stream = 0
sm_size = arga.size * arga.dtype.itemsize
myKernel[grid,block,stream,sm_size](arga)

4
你能否创建两个大小不同的共享内存数组? - Ilya.K.
你应该能够创建任意数量。 - diogoaos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接