对主机代码中使用cudamaloc()返回的指针执行算术运算
我正在阅读《Cuda示例》一书,我遇到了这样一句话: 然而,程序员有责任不去引用指针 cudaMalloc()从主机上执行的代码返回。主机代码可能是 传递此指针,对其执行算术运算,甚至将其强制转换为其他指针 类型。但是你不能用它从内存中读写 具体来说,“对cudamaloc()返回的指针执行算术”将如何完成 我试着在调用内核之前和之后用两行额外的代码运行下面的加法代码,但是对输出没有任何影响(有或没有这些行都是12行)对主机代码中使用cudamaloc()返回的指针执行算术运算,cuda,Cuda,我正在阅读《Cuda示例》一书,我遇到了这样一句话: 然而,程序员有责任不去引用指针 cudaMalloc()从主机上执行的代码返回。主机代码可能是 传递此指针,对其执行算术运算,甚至将其强制转换为其他指针 类型。但是你不能用它从内存中读写 具体来说,“对cudamaloc()返回的指针执行算术”将如何完成 我试着在调用内核之前和之后用两行额外的代码运行下面的加法代码,但是对输出没有任何影响(有或没有这些行都是12行) #包括 #包括 #包括 __全球的__ 无效添加(整数a、整数b、整数*c)
#包括
#包括
#包括
__全球的__
无效添加(整数a、整数b、整数*c)
{
*c+=a+b;
}
int main()
{
int*c,d;
Cudamaloc((void**)和c,sizeof(int));
*c=10;
添加>(5,7,c);
*c+=5;
cudaMemcpy(&d,c,sizeof(int),cudaMemcpyDeviceToHost);
STD:CUT是与C和C++相关的概念,它不是CUDA的唯一或特定的。
这不是指针算法的示例:
*c = 10;
kernel<<<...>>>(data, 512);
kernel<<<...>>>(data+512, 512);
这也不是:
*c += 5;
这些都是对指针指向的内容的修改,而不是指针本身。指针算法涉及对指针值本身的调整。(顺便说一句,您显示的代码在CUDA中是非法的-在主机代码中取消对普通设备指针的引用是不合法的。*c
是取消对指针c
的引用的操作。它与指针算术不同。)
假设我的设备内存分配为1024个int
数量:
cudaMalloc(&data, 1024 * sizeof(int));
现在,假设我想让CUDA内核的第一次调用在数组的开头开始工作,而CUDA内核的第二次调用在数组的中点开始工作,但执行相同的工作
我可能会这样做,第二个内核调用有一个涉及指针算法的参数:
*c = 10;
kernel<<<...>>>(data, 512);
kernel<<<...>>>(data+512, 512);
是与C和C++相关联的概念,它不是唯一的或特定于CUDA。< /P>
这不是指针算法的示例:
*c = 10;
kernel<<<...>>>(data, 512);
kernel<<<...>>>(data+512, 512);
这也不是:
*c += 5;
这些都是对指针指向的内容的修改,而不是指针本身。指针算法涉及对指针值本身的调整。(顺便说一句,您显示的代码在CUDA中是非法的-在主机代码中取消对普通设备指针的引用是不合法的。*c
是取消对指针c
的引用的操作。它与指针算术不同。)
假设我的设备内存分配为1024个int
数量:
cudaMalloc(&data, 1024 * sizeof(int));
现在,假设我想让CUDA内核的第一次调用在数组的开头开始工作,而CUDA内核的第二次调用在数组的中点开始工作,但执行相同的工作
我可能会这样做,第二个内核调用有一个涉及指针算法的参数:
*c = 10;
kernel<<<...>>>(data, 512);
kernel<<<...>>>(data+512, 512);
解释得很好。谢谢。解释得很好。谢谢。