我正在考虑以下简单代码,其中我正在将 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
。
CODE
#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;
}
thrust::device_ptr
表示。它具有指针语义,但不是指针,这有助于强制执行主机/设备指针类型安全性。在上面的代码中,迭代器会衰减为device_ptr
而不是指针。您必须进行转换以获取原始指针,以便将其传递给设备代码。 - talonmies