Allouer un tableau 2D à la mémoire de l'appareil dans CUDA
-
20-08-2019 - |
Question
Comment allouer et transférer (vers et depuis l'hôte) des tableaux 2D dans la mémoire de l'appareil dans Cuda?
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.