Vector de empuje con tipo de datos personalizado -- uda campo con copy campo con thrust camp Relacionados El problema

Thrust vector with custom data type


1
vote

problema

Español

Estoy usando la biblioteca de empuje para mi proyecto y corrí al siguiente problema:

Tengo una estructura llamada casilla definida como

  typedef struct {     int coord[4];     float h; } box;   

y ahora estoy tratando de copiar datos de un dispositivo_vector de cajas a un host_vector de cajas:

  thrust::device_vector<box> d_boxes(100); thrust::host_vector<box> h_boxes; thrust::copy(d_boxes.begin(), d_boxes.end(), h_boxes.begin());   

Pero esto arroja el error

Terminado llamado después de lanzar una instancia de 'Empuje :: System :: System_Error' que (): argumento no válido

Si hago lo mismo con INT en lugar de caja, funciona bien. Desafortunadamente, la documentación no parece tener ningún ejemplo de vectores de tipos de datos personalizados.

¿Qué extraño?

Original en ingles

I am using the thrust library for my project and ran into the following problem:

I have a struct called box defined as

typedef struct {     int coord[4];     float h; } box; 

and am now trying to copy data from a device_vector of boxes to a host_vector of boxes:

thrust::device_vector<box> d_boxes(100); thrust::host_vector<box> h_boxes; thrust::copy(d_boxes.begin(), d_boxes.end(), h_boxes.begin()); 

But this throws the error

terminate called after throwing an instance of 'thrust::system::system_error' what(): invalid argument

If I do the same with int instead of box, it works fine. Unfortunately, the documentation does not seem to have any example of vectors of custom data types.

What did I miss?

        
 
 

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

thrust::copy no cambia automáticamente los vectores para usted (en realidad no hay algoritmos de empuje)

Así que este es un vector vacío, no lo suficientemente grande como para contener 100 objetos:

  thrust::host_vector<box> h_boxes;   

Intente esto en lugar:

  thrust::host_vector<box> h_boxes(100);   

Como lo señaló @jaredhobergock, una realización alternativa podría ser:

  thrust::device_vector<box> d_boxes(100); thrust::host_vector<box> h_boxes = d_boxes;   

En este caso, el constructor para h_boxes lo crea con un tamaño apropiado para mantener la cantidad de elementos en d_boxes (así como realizar el dispositivo - & gt; host Copia de datos.)

 

thrust::copy doesn't automatically resize vectors for you (actually no thrust algorithms do.)

So this is an empty vector, not large enough to hold 100 objects:

thrust::host_vector<box> h_boxes; 

Try this instead:

thrust::host_vector<box> h_boxes(100); 

As pointed out by @JaredHoberock, an alternate realization could be:

thrust::device_vector<box> d_boxes(100); thrust::host_vector<box> h_boxes = d_boxes; 

In this case, the constructor for h_boxes creates it with a size appropriate to hold the number of elements in d_boxes (as well as performing the device -> host data copy.)

 
 
 
 

Relacionados problema

7  Clasificación de objetos con empuje CUDA  ( Sorting objects with thrust cuda ) 
¿Es posible ordenar objetos usando la biblioteca de empuje? Tengo la siguiente estructura: struct OB{ int N; Cls *C; //CLS is another struct. } ¿Es...

0  Error de segmentación al usar empuje :: Ordenar en CUDA  ( Segmentation error when using thrustsort in cuda ) 
Estoy tratando de ordenar una matriz de objetos de clase según su tipo al pasar una función de comparación como el parámetro al tipo de empuje. la de la cl...

1  Interpretar el archivo de registro de PROFILER CUDA  ( Interpret cuda profiler log file ) 
Aquí está el archivo de registro de CUDA PROFILER (NVPROF) en algunos códigos, que tienen una mezcla de empuje, Cublas y Curand. El primero es un kernel que e...

-1  Cómo cambiar las piezas imaginarias y reales para el vector complejo de empuje  ( How to switch the imaginary and reall parts for thrust complex vector ) 
Quiero construir una estructura que devuelva un número complejo de empuje que cambie las partes imaginarias y reales. Pero mi código no puede funcionar. El er...

1  Crea kernels de CUDA regulares en tipos de vector de empuje  ( Create regular cuda kernels on thrust vector types ) 
Tengo una pregunta simple, si por ejemplo me gustaría usar un kernel de CUDA, escribí en un vector de empuje, ¿debo lanzar mi dispositivo_vector en un tipo de...

3  ¿Cómo resolver la biblioteca de empuje de CUDA - Error de sincronización FOR_ACH?  ( How to solve cuda thrust library for each synchronization error ) 
Estoy tratando de modificar un vector dinámico simple en CUDA utilizando la Biblioteca de empuje de CUDA. Pero estoy recibiendo el error "launch_close_by_valu...

7  Cómo copiar de forma asíncrona Memoria del host al dispositivo usando flujos de empuje y CUDA  ( How to asynchronously copy memory from the host to the device using thrust and c ) 
Me gustaría copiar la memoria del host al dispositivo usando empuje como en thrust::host_vector<float> h_vec(1 << 28); thrust::device_vector<float> d_vec(1...

2  Cómo usar la política de ejecución de empuje de CUDA para anular el asignador de memoria del dispositivo de bajo nivel de empuje de empuje  ( How to use cuda thrust execution policy to override thrusts low level device me ) 
Quiero anular el alocador de memoria del dispositivo CUDA de bajo nivel (implementado como empuje :: SISTEMA :: CUDA :: Detalle :: malloc ()) para que use un ...

2  Iterador para vector de estructuras en empuje  ( Iterator for vector of structures in thrust ) 
Estoy tratando de acceder a los elementos vectoriales de esta manera struct point { unsigned int x; unsigned int y; }; ... thrust::device_vector<p...

2  Forzar el empuje de CUDA :: Reducir para ejecutar sin paralelismo  ( Force cudas thrustreduce to execute with no parallelism ) 
Tengo un programa de CUDA que usa el empuje :: Reducir para paralelizar las sumas: por ejemplo, thrust::device_ptr<double> tmp(aux); double my_sum = thrust...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos