2012-02-21 7 views
7

Recientemente he estado usando thrust mucho. Me he dado cuenta de que para usar el empuje, uno siempre debe copiar los datos de la memoria de la CPU a la memoria de la GPU.
Veamos el siguiente ejemplo:¿existe una manera mejor y más rápida de copiar desde la memoria de la CPU a la GPU utilizando el empuje?

int foo(int *foo) 
{ 
    host_vector<int> m(foo, foo+ 100000); 
    device_vector<int> s = m; 
} 

No estoy muy seguro de cómo funciona el host_vector constructor, pero parece que estoy copiando los datos iniciales, procedentes de *foo, dos veces - una vez a la host_vector cuando se inicializa y en otro momento cuando se inicializa device_vector. ¿Existe una forma mejor de copiar de cpu a gpu sin hacer copias de datos intermedios? Sé que puedo usar device_ptr como un contenedor, pero eso aún no soluciona mi problema.
gracias!

Respuesta

14

Uno de los constructores de device_vector toma una gama de elementos especificados por dos iteradores. Es lo suficientemente inteligente como para entender el puntero del crudo en su ejemplo, por lo que se puede construir un device_vector directamente y evitar el temporal host_vector:

void my_function_taking_host_ptr(int *raw_ptr, size_t n) 
{ 
    // device_vector assumes raw_ptrs point to system memory 
    thrust::device_vector<int> vec(raw_ptr, raw_ptr + n); 

    ... 
} 

Si el puntero prima puntos a la memoria de CUDA, introducir un device_ptr:

void my_function_taking_cuda_ptr(int *raw_ptr, size_t n) 
{ 
    // wrap raw_ptr before passing to device_vector 
    thrust::device_ptr<int> d_ptr(raw_ptr); 

    thrust::device_vector<int> vec(d_ptr, d_ptr + n); 

    ... 
} 

El uso de un device_ptr no asigna ningún almacenamiento; solo codifica la ubicación del puntero en el sistema de tipos.

+0

el argumento size_t n especifica el número de elementos en el vector, y no debe estar en size_t tipo nombre, size_t generalmente especifica la longitud de los datos en bytes. – TripleS

Cuestiones relacionadas