c++ - 从主 CUDA 声明设备变量

标签 c++ cuda

我是 cuda 的新手,所以我希望我的问题没有完全离题。 我想在全局设备内存上创建一个数组,但我只会知道它在我的主要功能中间有多大(但在我访问设备之前)。

因为我不知道尺寸我不能在我的代码前声明: 设备 myArr[]

所以我想在 main、d_myArr 中创建一个指针,然后使用 cudaMalloc(d_myArr, arrSize) 在设备上分配内存,但后来我从未真正在我的设备上声明变量。

我看不出有什么理由将 d_Arr 发送到我的内核,因为它只会存在于该内核中(我想?),我只是希望该变量首先作为全局变量存在于我的设备上,并且可以被不同的内核访问。

我可以在 main 中声明一个设备变量吗?如:

int main(){
   .
   .
   __device__ myArr[size];
   .
   .
}

如果是这样,是否出于某种原因不鼓励(因为我找不到任何人这样做)。如果不允许这样做,我该怎么办?我看到有人提到 cudaMemcpyToSymbol,但我无法弄清楚它是否与我想要的完全相关,如果是的话,我会很高兴有人能准确解释如何使用它来实现我的需要。

关于附带问题,我还有一个常量变量,我希望它同时存在于我的设备和主机上。现在我只是声明了两次,一次使用设备,一次不使用,有没有更好的方法?

最佳答案

这行不通。

  1. __device__ 变量必须在全局范围内声明。
  2. __device__ 变量关联的分配大小必须在编译时已知。

相反,只要知道所需的分配大小,就可以使用 cudaMalloc 为变量分配空间。此方法允许动态分配 全局变量。 __device__ 方法只允许静态分配 全局变量。

像这样:

int main(){
   // ...
   int *d_data;
   cudaMalloc(&d_data, size*sizeof(int));
   // ... 
   kernel1<<<...>>>(d_data,...);
   // ... 
   kernel2<<<...>>>(d_data,...);
   // ...
}

如上所示,将这样一个动态分配的全局变量传递给多个内核是完全合法的,上面的 kernel1 放置在那里的数据或修改(如果有的话)将是可见的在上面的 kernel2 中运行的代码,对于我展示的示例。

对于常量变量题,你说的做法是合理的。如果您有这样的常量数据在编译时未知,这是一种明智的方法(您可能还希望研究使用 __constant__ 而不是 __device__)。另一方面,如果您有常量数据, 在编译时已知,那么要么使用

 #define MYCONSTANT 123

 constant int myconstant=123;

在全局范围内(即 main 之外)将允许这样的定义在主机或设备代码中同等使用,而无需声明或管理它两次。最后一种方法适用于 POD 数据类型(例如 intfloatdouble 等),但不适用于复杂类型,例如结构

关于c++ - 从主 CUDA 声明设备变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42115526/

相关文章:

c++ - 打印浮点值时 printf 崩溃

c++ - 我可以将 vector 作为initial_sum和其他函数传递给std::accumulate吗?

CUDA:如何使该代码并行?

cuda - 如何获得编译器 "Cuda Fortran"的免费版本(非试用版)?

cuda - 线程 block 数与计算机上的cuda内核之间的关系(在CUDA C中)

c++ - 如何设计可用于多种客户端语言的 C/C++ 库?

c++ - 将 map 的值作为 vector 获取的最佳方法是什么?

c++ - wxWidget v2.8 软件。让它与 3.0 库一起使用?

c++ - 你如何遍历倾斜的 CUDA 数组?

c - 如何实现 NxM CUDA 矩阵乘法?