C++ 从主CUDA声明设备变量
我是cuda的新手,所以我希望我的问题没有完全偏离主题。 我想在全局设备内存上创建一个数组,但我只知道它将在我的main函数中间(但在我访问这个设备之前)有多大。 因为我不知道在我的代码之前不能声明的大小: 设备myArr[] 所以我想在main中创建一个指针d_myArr,然后使用cudaMalloc(d_myArr,arrSize)在设备上分配内存,但我从来没有在设备上声明过变量 我不认为有理由将d_Arr发送到我的内核,因为它将只存在于该内核中(我想?),我只是希望该变量首先作为全局变量存在于我的设备上,并可由不同的内核访问 我可以在main中声明一个设备变量吗?例如:C++ 从主CUDA声明设备变量,c++,cuda,C++,Cuda,我是cuda的新手,所以我希望我的问题没有完全偏离主题。 我想在全局设备内存上创建一个数组,但我只知道它将在我的main函数中间(但在我访问这个设备之前)有多大。 因为我不知道在我的代码之前不能声明的大小: 设备myArr[] 所以我想在main中创建一个指针d_myArr,然后使用cudaMalloc(d_myArr,arrSize)在设备上分配内存,但我从来没有在设备上声明过变量 我不认为有理由将d_Arr发送到我的内核,因为它将只存在于该内核中(我想?),我只是希望该变量首先作为全局变量存
int main(){
.
.
__device__ myArr[size];
.
.
}
如果是这样的话,是因为某种原因而打折的(因为我找不到任何人这样做)。如果这是不允许的,我能做些什么?我看到有人提到cudaMemcpyToSymbol,但我不知道它是否与我想要的完全相关,如果是,我很高兴有人能确切地解释如何使用它来实现我的需要
在一个次要问题上,我还有一个常量变量,我希望它同时存在于我的设备和主机上。现在我只说了两遍,一次是用设备,一次是不用,有没有更好的方法
\uuuu设备\uuuu
变量必须在全局范围内声明\uuu设备\uu
变量关联的分配大小cudamaloc
为变量分配空间。此方法允许动态分配全局变量。\uuuu设备\uuuu
方法仅允许静态分配全局变量
大概是这样的:
int main(){
// ...
int *d_data;
cudaMalloc(&d_data, size*sizeof(int));
// ...
kernel1<<<...>>>(d_data,...);
// ...
kernel2<<<...>>>(d_data,...);
// ...
}
或
在全局范围内(即main
)将允许在主机或设备代码中平等使用此类定义,而无需声明或管理两次。最后一种方法适用于POD数据类型(例如int
,float
,double
,等等),但不适用于复杂类型,如struct
,,这不起作用
\uuuu设备\uuuu
变量必须在全局范围内声明\uuu设备\uu
变量关联的分配大小cudamaloc
为变量分配空间。此方法允许动态分配全局变量。\uuuu设备\uuuu
方法仅允许静态分配全局变量
大概是这样的:
int main(){
// ...
int *d_data;
cudaMalloc(&d_data, size*sizeof(int));
// ...
kernel1<<<...>>>(d_data,...);
// ...
kernel2<<<...>>>(d_data,...);
// ...
}
或
在全局范围内(即
main
)将允许在主机或设备代码中平等使用此类定义,而无需声明或管理两次。最后一种方法适用于POD数据类型(例如int
,float
,double
,等等),但不适用于复杂类型,如struct
,,感谢您的回复!这样我就可以确保我现在理解了,因为我在设备中分配了内存,它不会丢失,即使我不使用cudaMemcpy来回传递信息,我的第二个内核中的s_sata将与我的第一个内核结束时留下的相同,对吗?因此,只要我重新发送指向所有内核的指针,它们都有办法引用该变量,否则,如果我不重新发送该变量,它仍然存在于分配的内存中,但我没有一个访问它的引用?是的,一旦你用cudamaloc
分配设备内存,它是持久的,直到您对其调用cudaFree
操作(或者直到您的应用程序终止)。它的行为类似于任何其他内存。一旦你写了一些东西给它,后续的操作可以看到写了什么,无论是后续的内核还是后续的cudaMemcpy
操作。谢谢你的回复!这样我就可以确保我现在理解了,因为我在设备中分配了内存,它不会丢失,即使我不使用cudaMemcpy来回传递信息,我的第二个内核中的s_sata将与我的第一个内核结束时留下的相同,对吗?因此,只要我重新发送指向所有内核的指针,它们都有办法引用该变量,否则,如果我不重新发送该变量,它仍然存在于分配的内存中,但我没有一个访问它的引用?是的,一旦你用cudamaloc
分配设备内存,它是持久的,直到您对其调用cudaFree
操作(或者直到您的应用程序终止)。它的行为类似于任何其他内存。一旦您向其写入内容,后续操作就可以看到所写入的内容,无论是后续内核还是后续cudaMemcpy
操作。
constant int myconstant=123;