2011-10-06 13 views
13

Entiendo cómo pasar de un vector a un puntero sin formato, pero me estoy saltando el ritmo de cómo ir hacia atrás.De thrust :: device_vector a puntero sin procesar y viceversa?

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

¿Alguien me puede explicar/señalar un ejemplo?

Respuesta

9

se inicializan y rellenar vectores de empuje al igual que los contenedores estándar, es decir, a través de iteradores:

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

En el ejemplo sencillo que no hay necesidad de ir al desvío a través de punteros, ya que sólo puede copiar el otro contenedor directamente. En general, si tiene un puntero al comienzo de una matriz, puede usar la versión para v3 si proporciona el tamaño de la matriz.

+0

tan sólo de un puntero, sin que la duración no hay manera de volver a un device_vector? – madmaze

+3

dbl2 * ptrDVec = thrust :: raw_pointer_cast (& d_vec [0]); ¿hay alguna manera de volver a un dispositivo_vector? – madmaze

+0

¿Qué quiere decir "volver"? ¿No es ya un puntero de dispositivo? ¿Qué es exactamente lo que necesita? –

3

dbl2 * ptrDVec = thrust :: raw_pointer_cast (& d_vec [0]); ¿hay alguna manera de volver a un device_vector a partir de esto?

No hay. Aunque deberías poder reutilizar la variable de vector inicial.

18

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

empuje es un buen ejemplo para esta pregunta.

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

Y conseguir el puntero en bruto de contenedores de empuje es tal como ya se respondió por sí mismo ..

dbl2* ptrDVec = thrust::raw_pointer_cast(&d_vec[0]); 
Cuestiones relacionadas