2017-07-27 14 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ケース)はコン​​パイルし、後者(GPUケース)はコン​​パイルしません。

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

構成は以下のとおりです:

  1. Windows 7Visual Studio 2010CUDA 7.53.5用にコンパイル私は、エラーメッセージの理由を理解していないので、2つのケースは、原則として対称にする必要があります建築。
  2. Windows 10,Visual Studio 2013,CUDA 8.05.2アーキテクチャのためにコンパイルする。 talonmiesコメント続き

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

に渡すことができる生のポインタを取得する必要があります。あなたのたゆまぬ助けに感謝します。私は問題を解決しました。あなたは答えを投稿しますか? – JackOLantern

答えて

2

、解決策は、完全に動作するコードを以下に

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; 
} 
関連する問題