我正在使用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用于它。?
答案 0 :(得分:1)
我刚刚开始研究cuda,但我真的只是从一本书中读出来的。听起来它直接适用于你。
“你可以将用cudaMalloc()分配的指针传递给在设备上执行的函数。(kernals,对吗?)
您可以使用cudaMalloc()分配的指针从设备上执行的代码读取或写入内存。(kernals)
您可以将使用cudaMalloc分配的指针传递给在主机上执行的函数。 (常规C代码)
您不能使用通过cudaMalloc()分配的指针来读取或写入在主机上执行的代码的内存。“
由于您在内核中取消引用,可能与最后一条规则相反也是如此。即,您不能使用主机分配的指针从设备上执行的代码读取或写入内存。
编辑:我刚刚注意到一个名为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)。