gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:53:15 27 4
gpt4 key购买 nike

我是 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/

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