Comment allouer et transférer (vers et depuis l'hôte) des matrices 2D dans la mémoire de l'appareil dans Cuda?Affectation d'un tableau 2D dans la mémoire du périphérique dans CUDA
Répondre
J'ai trouvé une solution à ce problème. Je n'ai pas eu à aplatir le tableau.
La fonction cudaMallocPitch()
intégrée a fait le travail. Et je pourrais transférer le tableau vers et depuis l'appareil en utilisant la fonction cudaMemcpy2D()
.
Par exemple
cudaMallocPitch((void**) &array, &pitch, a*sizeof(float), b);
Cela crée un tableau 2D de taille a * b avec le pas comme passé en tant que paramètre.
Le code suivant crée un tableau 2D et boucle sur les éléments. Il 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;
}
Aplatissez-le: rendez-le unidimensionnel. Voir comment c'est fait here
Votre code de produit pourrait être plus rapide. Essayez d'utiliser les discussions plus. Ensuite, vous calculez l'allocation de blocs et de threads appropriée afin que chaque thread traite un seul élément.
Le code Gitmo posté est un exemple inutile des docs. Oui, votre version est plus rapide, mais comment faites-vous cela en parallèle pour les lignes et les colonnes? Strictement parlant, vous pourriez avoir un bordel entre vos mains parce que vous ne vérifiez pas si 'r' est inférieur au nombre réel de lignes – pelesl
est-il possible d'allouer une nouvelle ligne pour le tableau plus tard? – scatman