2017-07-27 62 views
1

我正在考虑以下简单代码,我将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 case)编译,后者(GPU case)不编译。这两起案件应该在原则上是对称的,所以我不明白这是错误消息的原因:

Error 1 error : no suitable conversion function from "thrust::device_ptr<int>" to "int *" exists  

的配置是:

  1. Windows 7Visual Studio 2010CUDA 7.5,编译为3.5建筑。编号为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; 
} 
+1

这只是一个非常温和的变化,不是吗? https://stackoverflow.com/q/11113485/681865 – talonmies

+1

在基于推力标签的类型模型(原始模型)中,任何设备内存均由'thrust :: device_ptr'表示。这具有指针语义,但不是一个指针,它有助于强化主机/设备指针类型的安全性。在上面的代码中,迭代器衰减到'device_ptr'而不是指针。你必须投入'device_ptr'来获得一个你可以传给设备代码的原始指针 – talonmies

+0

谢谢你,talonmies,为你提供不懈的帮助。我已经解决了这个问题。你想发表一个答案吗? – JackOLantern

回答

2

继talonmies的意见,解决办法是通过

thrust::raw_pointer_cast(&d_temp_iterator[0]) 

,而不是

&d_temp_iterator[0] 

在下文中,全工作代码

#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; 

    printf("GPU %i %i\n", i, a[i]); 
} 

void testFunction(int *a, const int N) 
{ 
    for (int i = 0; i < N; i++) { 
     a[i] = 2; 
     printf("CPU %i %i\n", i, a[i]); 
    } 
} 

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(); 

    int *temp = thrust::raw_pointer_cast(&d_temp_iterator[0]); 

    testFunction(&(h_temp_iterator[0]), N); 
    testKernel<<<1, N>>>(temp, N); 

    return 0; 
} 
相关问题