【发布时间】:2017-07-27 12:23:57
【问题描述】:
我正在考虑以下简单代码,其中我将 thrust::host_vector<int>::iterator h_temp_iterator = h_temp.begin(); 和 thrust::device_vector<int>::iterator d_temp_iterator = d_temp.begin(); 转换为原始指针。
为此,我将&(h_temp_iterator[0]) 和&(d_temp_iterator[0]) 分别传递给函数和内核。前者(CPU 案例)编译,后者(GPU 案例)不编译。这两种情况原则上应该是对称的,所以我不明白错误消息的原因是:
Error 1 error : no suitable conversion function from "thrust::device_ptr<int>" to "int *" exists
配置如下:
-
Windows 7、Visual Studio 2010、CUDA 7.5,为3.5架构编译。 -
Windows 10、Visual Studio 2013、CUDA 8.0,为5.2架构编译。
代码
#include <thrust\host_vector.h>
#include <thrust\device_vector.h>
__global__ void testKernel(int *a, const int N)
{
int i = threadIdx.x;
if (i >= N) return;
a[i] = 2;
}
void testFunction(int *a, const int N)
{
for (int i = 0; i < N; i++) a[i] = 2;
}
int main()
{
const int N = 10;
thrust::host_vector<int> h_temp(N);
thrust::device_vector<int> d_temp(N);
thrust::host_vector<int>::iterator h_temp_iterator = h_temp.begin();
thrust::device_vector<int>::iterator d_temp_iterator = d_temp.begin();
testFunction(&(h_temp_iterator[0]), N);
testKernel<<<1, N>>>(&(d_temp_iterator[0]), N);
for (int i = 0; i < N; i++) printf("%i %i\n", i, h_temp[i]);
return 0;
}
【问题讨论】:
-
这只是一个非常温和的变化,不是吗? stackoverflow.com/q/11113485/681865
-
在基于推力标签的类型化模型(原始模型)中,任何设备内存都由
thrust::device_ptr表示。这具有指针语义,但不是指针,它有助于强制执行主机/设备指针类型安全。在上面的代码中,迭代器衰减为device_ptr而不是指针。您必须强制转换device_ptr以获得可以传递给设备代码的原始指针 -
感谢您,talonmies,您的不懈帮助。我已经解决了这个问题。您要发布答案吗?
-
如果你愿意,你可以继续写你自己的。我会赞成的。
-
谢谢。我已经上传了一个包含完整工作代码的答案。