gpt4 book ai didi

c++ - 使用内核参数在 CUDA 内核中声明数组

转载 作者:行者123 更新时间:2023-11-28 04:23:12 41 4
gpt4 key购买 nike

我正在使用 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 在每次模拟中都是相同的(常数)。换句话说,它只会从一个模拟变为另一个模拟,而不会在同一个模拟内发生变化。

最佳答案

这比我想象的要简单。使用 new 和 delete 来实现此目的,方法与在主机上执行的方法相同。

唯一的区别是需要使用运行时 API 调用来为您的目的在堆上分配内存:

cudaDeviceSetLimit(cudaLimitMallocHeapSize, heapsize);

其中堆大小用于运行 N 个内核的系统,每个内核有 3 个大小为 N_SIZE 的 int 数组:

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

关于c++ - 使用内核参数在 CUDA 内核中声明数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54992011/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com