Question

Comment allouer et transférer (vers et depuis l'hôte) des tableaux 2D dans la mémoire de l'appareil dans Cuda?

Était-ce utile?

La solution

J'ai trouvé une solution à ce problème. Je n'ai pas eu à aplatir le tableau.

La fonction intégrée cudaMallocPitch() a fait le travail. Et je pourrais transférer le tableau vers et depuis le périphérique à l’aide de la cudaMemcpy2D() fonction.

Par exemple

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

Ceci crée un tableau 2D de taille a * b avec la hauteur telle que transmise en tant que paramètre.

Le code suivant crée un tableau 2D et boucle sur les éléments. Il se compile facilement, vous pouvez l’utiliser.

#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;
}

Autres conseils

Aplatissez-le: rendez-le unidimensionnel. Découvrez comment cliquez ici

Le code de votre appareil pourrait être plus rapide. Essayez d’utiliser davantage les discussions.

__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];
    }
}

Ensuite, vous calculez l'allocation de blocs et de threads appropriée pour que chaque thread traite d'un seul élément.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top