¿Cómo puedo asignar y transferir (hacia y desde el host) matrices 2D en la memoria del dispositivo en Cuda?Asignación de matriz 2D en la memoria del dispositivo en CUDA
Respuesta
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;
}
Acoplarlo: hacerlo unidimensional. Vea cómo se hace here
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.
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
- 1. CUDA: asignación de memoria del dispositivo de empaquetado en C++
- 2. 2D memoria compartida dispuesta en CUDA
- 3. CUDA: memoria compartida en una matriz bidimensional 2D
- 4. Asignación dinámica de memoria constante en CUDA
- 5. CUDA asigna memoria en la función __device__
- 6. Memoria de asignación dinámica en la GPU
- 7. asignación dinámica de memoria para la matriz 3D
- 8. ¿Cómo usar matrices 2D en CUDA?
- 9. ¿Cómo se almacena una matriz 2D dinámica en la memoria?
- 10. Asignación de memoria dentro de un kernel CUDA
- 11. Mezcle la gestión de memoria personalizada y empuje en CUDA
- 12. memoria dinámica para matriz de caracteres 2D
- 13. asignación dinámica de la memoria
- 14. CUDA - Implementación de dispositivo Hash Map?
- 15. memoria CUDA preocupa
- 16. Usando std :: vector en el código del dispositivo CUDA
- 17. CUDA Consideraciones sobre la memoria cero copia
- 18. CUDA: ¿El acceso global a la memoria global es más rápido que la memoria compartida? Además, ¿la asignación de una gran matriz de memoria compartida ralentiza el programa?
- 19. Asignación de memoria para una matriz en C
- 20. CUDA núcleo pequeño 2d convolución - cómo hacerlo
- 21. Mejor o igual: CPU memcpy() vs dispositivo cudaMemcpy() en memoria fija, asignada en CUDA?
- 22. Asignación de memoria dinámica
- 23. Asignación de memoria en C
- 24. Asignación de memoria en C++
- 25. Comprobando la asignación de memoria en Instrumentos
- 26. ¿Cómo determino la memoria del dispositivo disponible en OpenCL?
- 27. asignación de memoria en C++
- 28. Guardando matriz 2D numérica en la imagen
- 29. Conflictos de banco de memoria compartida en CUDA: cómo se alinea la memoria con los bancos
- 30. Todas las posibilidades en la matriz 2D
¿es posible asignar una nueva fila para la matriz más adelante? – scatman