two pass multidimensional matriz make functions dimensional create bidimensional array multidimensional-array memory-management 2d cuda device

multidimensional array - pass - Asignar matriz 2D en la memoria del dispositivo en CUDA



pass multidimensional array function c (3)

¿Cómo asigno y transfiero (hacia y desde el host) las matrices 2D en la memoria del dispositivo en Cuda?


Aplanarlo: hazlo unidimensional. Mira cómo se hace here


El código de su dispositivo podría ser más rápido. Intenta 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]; } }

A continuación, calcula la asignación de bloques e hilos adecuada para que cada hilo se ocupe de un solo elemento.


He encontrado 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 tono tal como se pasa como parámetro.

El siguiente código crea una matriz 2D y se desplaza sobre los elementos. Se compila fácilmente, puedes 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; }