Pergunta

Como faço para alocar e de transferência (de e para o Host) 2D matrizes em memória do dispositivo em Cuda?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top