2009-06-26 18 views

Respuesta

16

Encontré una solución a este problema. No tuve que aplanar la matriz.

La función incorporada cudaMallocPitch() hizo el trabajo. Y podría transferir la matriz hacia y desde el dispositivo usando la función cudaMemcpy2D().

Por ejemplo

cudaMallocPitch((void**) &array, &pitch, a*sizeof(float), b); 

Esto crea una matriz 2D de tamaño a * b con el terreno de juego como pasa como parámetro.

El siguiente código crea una matriz 2D y recorre los elementos. Se compila fácilmente, puede usarlo.

#include<stdio.h> 
#include<cuda.h> 
#define height 50 
#define width 50 

// Device code 
__global__ void kernel(float* devPtr, int pitch) 
{ 
    for (int r = 0; r < height; ++r) { 
     float* row = (float*)((char*)devPtr + r * pitch); 
     for (int c = 0; c < width; ++c) { 
      float element = row[c]; 
     } 
    } 
} 

//Host Code 
int main() 
{ 

float* devPtr; 
size_t pitch; 
cudaMallocPitch((void**)&devPtr, &pitch, width * sizeof(float), height); 
kernel<<<100, 512>>>(devPtr, pitch); 
return 0; 
} 
+0

¿es posible asignar una nueva fila para la matriz más adelante? – scatman

3

Acoplarlo: hacerlo unidimensional. Vea cómo se hace here

2

El código de su dispositivo podría ser más rápido. Intente utilizar los hilos más.

__global__ void kernel(float* devPtr, int pitch) 
{ 
    int r = threadIdx.x; 

    float* row = (float*)((char*)devPtr + r * pitch); 
    for (int c = 0; c < width; ++c) { 
     float element = row[c]; 
    } 
} 

Luego se calcula la asignación de bloques y subprocesos adecuada para que cada subproceso trate con un solo elemento.

+0

El código que Gitmo publicó es una muestra inútil de los documentos. Sí, su versión es más rápida, pero ¿cómo hace esto en paralelo para filas y columnas? Estrictamente hablando, podría tener un lío en sus manos porque no verifica si 'r' es menor que el número real de filas – pelesl

Cuestiones relacionadas