执行算术主机代码
问题描述:
我用实例电子书阅读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;
}
我是个初学者,感谢你的帮助。
答
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;
解释完美。谢谢。 –