web-dev-qa-db-ja.com

推力::デバイスベクトルから生のポインタへ、そしてその逆へ?

ベクトルから生のポインターに移動する方法は理解していますが、逆方向に移動する方法についてはビートをスキップしています。

// 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

誰かが私に例を説明/指摘できますか?

19
madmaze

標準のコンテナと同じように、つまりイテレータを使用して、推力ベクトルを初期化して入力します。

#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のバージョンを使用できます。

12
Kerrek SB

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

推力は、この質問の良い例です。

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

そして、スラストコンテナから生のポインタを取得することは、すでにあなた自身が答えている通りです。

dbl2* ptrDVec = thrust::raw_pointer_cast(&d_vec[0]);
19
phoad

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

存在しない。ただし、初期ベクトル変数を再利用できるはずです。

3
Slava