2011-10-06 14 views
13

私は、ベクトルから生ポインタに移動する方法を理解していますが、後ろへ移動する方法についてのビートをスキップしています。thrust :: device_vectorから生のポインタに戻って戻ってきますか?

// our host vector 
thrust::host_vector<dbl2> hVec; 

// pretend we put data in it here 

// get a device_vector 
thrust::device_vector<dbl2> dVec = hVec; 

// get the device ptr 
thrust::device_ptr devPtr = &d_vec[0]; 

// now how do i get back to device_vector? 
thrust::device_vector<dbl2> dVec2 = devPtr; // gives error 
thrust::device_vector<dbl2> dVec2(devPtr); // gives error 

私は例を説明できますか?

答えて

9

あなたは初期化し、ちょうど標準コンテナのような推力ベクトルを取り込む、すなわち経由イテレータ:

#include <thrust/device_vector.h> 
#include <thrust/device_ptr.h> 

int main() 
{ 
    thrust::device_vector<double> v1(10);     // create a vector of size 10 
    thrust::device_ptr<double> dp = v1.data();    // or &v1[0] 

    thrust::device_vector<double> v2(v1);     // from copy 
    thrust::device_vector<double> v3(dp, dp + 10);   // from iterator range 
    thrust::device_vector<double> v4(v1.begin(), v1.end()); // from iterator range 
} 

あなたの簡単な例では、あなただけの直接他のコンテナをコピーすることができますよう、ポインタ経由で迂回して行く必要はありません。一般に、配列の先頭を指すポインタがある場合は、配列サイズを指定するとv3のバージョンを使用できます。

+0

に答えているよう? – madmaze

+3

dbl2 * ptrDVec = thrust :: raw_pointer_cast(&d_vec [0]); これからdevice_vectorに戻る方法はありますか? – madmaze

+0

「戻る」とはどういう意味ですか - それはまだデバイスポインタではありませんか?正確に何が必要ですか? –

3

dbl2 * ptrDVec = thrust :: raw_pointer_cast(& d_vec [0]);これからdevice_vectorに戻る方法はありますか?

ありません。初期ベクトル変数を再利用できるはずですが。

18

http://code.google.com/p/thrust/source/browse/examples/cuda/wrap_pointer.cu

推力は、この質問のための良い例を提供します。

#include <thrust/device_ptr.h> 
#include <thrust/fill.h> 
#include <cuda.h> 

int main(void) 
{ 
    size_t N = 10; 

    // obtain raw pointer to device memory 
    int * raw_ptr; 
    cudaMalloc((void **) &raw_ptr, N * sizeof(int)); 

    // wrap raw pointer with a device_ptr 
    thrust::device_ptr<int> dev_ptr = thrust::device_pointer_cast(raw_ptr); 

    // use device_ptr in Thrust algorithms 
    thrust::fill(dev_ptr, dev_ptr + N, (int) 0);  

    // access device memory transparently through device_ptr 
    dev_ptr[0] = 1; 

    // free memory 
    cudaFree(raw_ptr); 

    return 0; 
} 

とスラストコンテナからの生のポインタを取得

は、長させずに戻ってdevice_vectorに取得する方法はありません..自分ですでにこれだけのポインタから

dbl2* ptrDVec = thrust::raw_pointer_cast(&d_vec[0]); 
関連する問題