Alocar matriz 2D na memória do dispositivo em CUDA
-
20-08-2019 - |
Pergunta
Como faço para alocar e de transferência (de e para o Host) 2D matrizes em memória do dispositivo em Cuda?
Solução
Eu encontrei uma solução para este problema. Eu não tinha para achatar a matriz.
A função cudaMallocPitch()
embutido fez o trabalho. E eu poderia transferir a matriz de e para o dispositivo usando a função cudaMemcpy2D()
.
Por exemplo
cudaMallocPitch((void**) &array, &pitch, a*sizeof(float), b);
Isto cria uma matriz 2D de tamanho a * b *, com o campo, como transmitido como parâmetro.
O seguinte código cria uma matriz 2D e laços ao longo dos elementos. Ele compila prontamente, você pode usá-lo.
#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;
}
Outras dicas
Alise-: torná-lo unidimensional. Veja como é feito aqui
Seu código do dispositivo poderia ser mais rápido. Tente utilizar os tópicos mais.
__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];
}
}
Em seguida, você calcula o apropriado blocos e segmentos de alocação de modo a que cada thread lida com um único elemento.