От тяги::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

Может кто-нибудь объяснить/указать мне пример?


person madmaze    schedule 06.10.2011    source источник


Ответы (3)


Вы инициализируете и заполняете векторы тяги так же, как стандартные контейнеры, то есть через итераторы:

#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, если вы укажете размер массива.

person Kerrek SB    schedule 06.10.2011
comment
так что просто из указателя без длины нет возможности вернуться к device_vector? - person madmaze; 11.10.2011
comment
dbl2* ptrDVec = тяга::raw_pointer_cast(&d_vec[0]); есть ли способ вернуться к device_vector из этого? - person madmaze; 11.10.2011
comment
Что вы имеете в виду, чтобы вернуться - разве это уже не указатель устройства? Что именно вам нужно? - person Kerrek SB; 11.10.2011
comment
Мне нужно иметь возможность сохранить указатель/ссылку на device_vector (скажем, у меня есть dVec1 и dVec2), затем сделать несколько вещей и выполнить некоторые условия, и, в конце концов, я хочу указать либо указатель на dVec1, либо dVec2 как device_vector int dVec3 .. идея состоит в том, чтобы передавать dVec по ссылке и в какой-то момент разыгрывать их и снова использовать в качестве векторов_устройств - person madmaze; 11.10.2011

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

Thrust является хорошим примером для этого вопроса.

#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]);
person phoad    schedule 10.06.2012

dbl2* ptrDVec = тяга::raw_pointer_cast(&d_vec[0]); есть ли способ вернуться к device_vector из этого?

Нет. Хотя вы должны иметь возможность повторно использовать начальную векторную переменную.

person Slava    schedule 22.11.2011