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
構成は以下のとおりです:
Windows 7
、Visual Studio 2010
、CUDA 7.5
、3.5
用にコンパイル私は、エラーメッセージの理由を理解していないので、2つのケースは、原則として対称にする必要があります建築。Windows 10
,Visual Studio 2013
,CUDA 8.0
、5.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;
}
これはちょっと微妙なバリエーションですね。 https://stackoverflow.com/q/11113485/681865 – talonmies
スラストタグベースの型付きモデル(元のモデル)では、任意のデバイスメモリは 'thrust :: device_ptr'で表されます。これはポインタのセマンティクスを持ちますが、ポインタではなく、ホスト/デバイスのポインタ型の安全性を強化するのに役立ちます。上のコードでは、イテレータはポインタではなく 'device_ptr'に崩壊します。 'device_ptr'をキャストして、デバイスコード – talonmies
に渡すことができる生のポインタを取得する必要があります。あなたのたゆまぬ助けに感謝します。私は問題を解決しました。あなたは答えを投稿しますか? – JackOLantern