CUDA指针解除引用问题

时间:2010-08-19 19:03:55

标签: c cuda

我正在使用cuda sdk和9600 1 GB NVidia卡开发程序。在 这个程序

0)内核在其输入参数中传递大小为3000x6的2D int数组的指针。

1)kenel必须将其分类到3级(第1,第2和第3列)。

2)为此,内核声明了一个大小为3000的int指针数组。

3)然后内核使用指向排序顺序的输入数组位置的指针填充指针数组。

4)最后,内核通过解引用指针数组将输入数组复制到输出数组中。

这最后一步失败了它停止了PC。

Q1)在cuda中指针取消引用以获取内存内容的指导原则是什么?

,即使最小的20x2阵列也无法正常工作。相同的代码在cuda设备内存之外工作(即在标准C程序上)

Q2)它是不是应该像我们在标准C中使用'*'运算符一样工作,或者有一些cudaapi用于它。?

2 个答案:

答案 0 :(得分:1)

我刚刚开始研究cuda,但我真的只是从一本书中读出来的。听起来它直接适用于你。

“你可以将用cudaMalloc()分配的指针传递给在设备上执行的函数。(kernals,对吗?)

您可以使用cudaMalloc()分配的指针从设备上执行的代码读取或写入内存。(kernals)

您可以将使用cudaMalloc分配的指针传递给在主机上执行的函数。 (常规C代码)

您不能使用通过cudaMalloc()分配的指针来读取或写入在主机上执行的代码的内存。“

  • ^^来自“Cuda by Example”由Jason Sanders和Edward Kandrot发表,Addison-Wesley yadda yadda在这里没有抄袭。

由于您在内核中取消引用,可能与最后一条规则相反也是如此。即,您不能使用主机分配的指针从设备上执行的代码读取或写入内存。

编辑:我刚刚注意到一个名为cudaMemcpy

的函数

看起来你需要在主机代码中两次声明3000 int数组。一个叫做malloc,另一个叫cudaMalloc。将cuda one传递给kernal以及要排序的输入数组。然后在调用内核函数后:

cudaMemcpy(malloced_array, cudaMallocedArray, 3000*sizeof(int), cudaMemcpyDeviceToHost)

我真的开始研究这个,就像我说的那样,也许这是一个更好的解决方案。

答案 1 :(得分:1)

CUDA代码可以使用与主机代码完全相同的方式使用指针(例如,使用*或[]取消引用,正常指针算法等)。但是,重要的是要考虑所访问的位置(即指针指向的位置)必须对GPU可见。

如果你分配主机内存,例如使用malloc()或std :: vector,那么GPU将无法看到该内存,它是主机内存而不是设备内存。要分配设备内存,你应该使用cudaMalloc() - 使用cudaMalloc()分配的内存指针可以从设备免费访问,但不能从主机访问。

要在两者之间复制数据,请使用cudaMemcpy()。

当你获得更高级时,线条可以模糊一点,使用“映射内存”可以允许GPU访问主机内存的一部分,但必须以特定方式处理,请参阅CUDA编程指南更多信息。

我强烈建议您查看CUDA SDK示例以了解所有这些是如何工作的。可以从vectorAdd示例开始,以及任何特定于您的专业领域的示例。矩阵乘法和转置也很容易消化。

CUDA开发人员web site上提供了所有文档,工具包和代码示例(SDK)。