用内核参数在CUDA内核中声明数组

Declaring arrays in CUDA kernel with kernel parameters

本文关键字:内核 声明 数组 参数 CUDA      更新时间:2023-10-16

我在C /CUDA中编程,并且遇到了问题:

__global__ void KERNEL(int max_size, double* x, double* y, double* z)
{
      double localArray_x[max_size]
      double localArray_y[max_size]
      double localArray_z[max_size]
      //do stuff here
}

现在,我唯一的解决方案就是这样预定的max_size:

#define max_size 20

这些阵列是我内核工作的主要重点。基本上,我具有全局坐标,并且仅根据模拟框中的位置将这些坐标的段添加到三个local_arrays中。然后在这些坐标上完成工作,最后将这些坐标添加回模拟末尾的全局数组(x,y,z)。因此,在数组上有某些限制:

  1. 每个称为Max_size*3个数组元素要操纵。
  2. 这些数组被广泛使用,因此内核需要能够快速(或本地)访问它们。
  3. max_size不能成为常数,因为我的坐标的数量密度是基于主机的输入而变化的。

我知道这篇文章在stackoverflow上有一些版本,但我相信我需要的是与简单的共享内存声明不同。我只是在寻找有关可以做什么以及这些选项中最快的指导。

如果相关,则每个模拟中的max_size将相同(常数)。换句话说,它仅从一个模拟变为另一个模拟,而从不在同一模拟中变化。

这比我想象的要简单。使用新的和删除来实现这一目标,就像您在主机上执行的方式一样。

唯一的区别是需要使用运行时API调用,该调用为您的目的分配内存:

cudaDeviceSetLimit(cudaLimitMallocHeapSize, heapsize);

,在运行n个内核的系统中堆积3个int阵列尺寸n_size每个:

size_t heapsize = (size_t)( N*3*N_SIZE*sizeof(int) );