2011-07-03 16 views
7

Programación con CUDA Me enfrenta un problema al intentar copiar algunos datos del host a gpu.¿Cómo realizar copias profundas de struct con CUDA?

tengo 3 estructura anidada como estos:

typedef struct { 
    char data[128]; 
    short length; 
} Cell; 

typedef struct { 
    Cell* elements; 
    int height; 
    int width; 
} Matrix; 

typedef struct { 
    Matrix* tables; 
    int count; 
} Container; 

Así Container "incluye" algunos Matrix elementos, que a su vez incluye algunos elementos Cell.

Supongamos que asignar dinámicamente la memoria del host de esta manera:

Container c; 
c.tables = malloc(20 * sizeof(Matrix)); 

for(int i = 0;i<20;i++){ 
    Matrix m; 
    m.elements = malloc(100 * sizeof(Cell)); 
    c.tables[i] = m; 
} 

Es decir, un contenedor de 20 Matriz de 100 celdas cada uno.

  • ¿Cómo podría ahora copiar estos datos en la memoria del dispositivo usando cudaMemCpy()?
  • ¿Hay alguna buena manera de realizar una copia profunda de "struct of struct" de host a dispositivo?

Gracias por su tiempo.

Andrea

Respuesta

3

La respuesta corta es "no hacer". Hay cuatro razones por las que digo que:

  1. No hay ninguna funcionalidad de copia profunda en la API
  2. El código resultante tendrá que writeTo configurar y copiar la estructura que usted ha descrito a la GPU será ridículamente complejo (aproximadamente 4000 API llamadas como mínimo, y probablemente un kernel intermedio para su ejemplo 20 Matrix of 100 Cells)
  3. El código GPU que utiliza tres niveles de indirección de puntero tendrá una latencia de acceso a memoria enormemente aumentada y romperá la poca coherencia de caché está disponible en la GPU
  4. Si luego desea copiar los datos al host, tiene el mismo problema en reversa

Considere utilizar la memoria lineal y la indexación en su lugar. Es portátil entre el host y la GPU, y la sobrecarga de asignación y copia es de aproximadamente el 1% de la alternativa basada en el puntero.

Si realmente quiere hacer esto, deje un comentario y voy a tratar de desenterrar algunos ejemplos de código antiguo que muestran lo que los punteros anidados completos están en la GPU.

+0

He leído mucho sobre el uso de la memoria lineal y el aplanamiento de matrices. En realidad, administro los 'elementos' del campo en la estructura' Matrix' como memoria lineal, mientras que la representación de alto nivel sería 2D. Yo trataría de linealizar/aplanar la estructura 3 también, pero ¿cómo podría hacer esto? ¿No sería demasiado difícil administrar todos los índices? De todos modos, gracias por su ayuda, ¡no se moleste en buscar un código antiguo! – Andrea

Cuestiones relacionadas