2017-03-31 45 views
0

我用实例电子书阅读Cuda的使用cudaMalloc()返回,我碰到这句话来:执行算术主机代码

然而,这是程序员的责任不取消引用指针由cudaMalloc()从主机上执行的代码返回的 。主机代码可能会通过该指针传递该指针,对其执行算术运算,甚至将其转换为其他类型的 类型。但是你不能用它来从内存中读取或写入。

具体来说,'如何完成对cudaMalloc()返回的指针的算术运算?

我试着在调用内核之前和之后运行下面的附加代码,但是它对输出没有任何影响(这是12或者没有这些行)。

#include <iostream> 
#include <cuda_runtime.h> 
#include <device_launch_parameters.h> 

__global__ 
void add(int a, int b, int *c) 
{ 
    *c += a + b; 
} 

int main() 
{ 
    int *c, d; 
    cudaMalloc((void**)&c, sizeof(int)); 
    *c = 10; 
    add << <1,1>> > (5,7,c); 
    *c += 5; 
    cudaMemcpy(&d, c, sizeof(int), cudaMemcpyDeviceToHost); 
    std::cout << d<<std::endl; 
    return 0; 
} 

我是个初学者,感谢你的帮助。

回答

2

pointer arithmetic是一个与C和C++相关的概念,它不是CUDA的唯一或特定的概念。

这不是指针算法的一个例子:

*c = 10; 

也不是这样的:

*c += 5; 

这是什么指针指向,而不是指针本身的两种修饰。指针运算涉及对指针值本身的调整。 (顺便说一句,你在CUDA中显示的代码是非法的 - 在主机代码中取消引用普通设备指针是不合法的。*c取消引用指针c的操作。它与指针算术不同。)

假设我有1024个int数量的设备内存分配:

cudaMalloc(&data, 1024 * sizeof(int)); 

现在假设我想引起CUDA内核的第一次调用启动对数组的开始工作,并且第二次调用的CUDA内核开始在阵列的中点工作,但除此之外执行s艾米工作。

我可能会做这样的事情,第二个内核调用具有涉及指针算法参数:

kernel<<<...>>>(data, 512); 
kernel<<<...>>>(data+512, 512); 

data+512参数包括指针运算。这将传递一个指向内核的指针,指向数据数组的中点,而不是数组的开始。如果我想在主机代码中携带这个指针,我可以这样做:

int *datahalf = data+512; 
+0

解释完美。谢谢。 –