2011-06-24 2 views
1

Ceci est mon code, initialisant une matrice d_ref et la copiant sur le périphérique. Je ne sais pas si j'utilise cudaMallocPitch et cudaMemcpy2D correctement mais j'ai essayé d'utiliser cudaMemcpy2D et en bas de page 20 de CUDA programming guideJ'utilise cudaMallocPitch et cudaMemcpy2D dans CUDA mais je ne reçois pas de réponse correcte!

Tout ce que je reçois en sortie est 0.

Quel est le problème avec mon code? et est-ce la meilleure façon de faire ce travail?

Merci d'avance.

__host__  

float *d_ref; 

float **h_ref = new float* [width]; 
for (int i=0;i<width;i++) 
    h_ref[i]= new float [height]; 

for (int i=0;i<width;i++){ 
    for (int j=0;j<height;j++){ 
     h_ref[i][j]=ref_list[j][i]; //transpose 
    } 
} 

size_t ref_pitch; 

cudaMallocPitch(&d_ref, &ref_pitch, width * sizeof(float), height); 

cudaMemcpy2D(d_ref, ref_pitch, h_ref, width*sizeof(float),width*sizeof(float), height*sizeof(float), cudaMemcpyHostToDevice); 


lowerBound<<<grid, block>>>(d_ref, ... 




__global__ void lowerBound (float* d_ref, .... 


    float* ref = (float*)((char*)d_ref + blockIdx.x * ref_pitch); 

    cuPrintf(" %f \n",ref[threadIdx.x]); 

Répondre

1

L'appel à cudaMemcpy2D comme écrit suppose que h_ref est une 2D-ensemble d'éléments de flotteur « Largeur » x « de hauteur » stockés de façon contiguë, alors qu'en fait il est un 1D-tableau de pointeurs « largeur ». Au lieu de représenter la matrice comme un tableau de vecteurs 1D, je suggère de le stocker dans un tableau 1D de flottants 'width' x 'height', et d'utiliser des macros pour l'accès basé sur row, column.

+0

Merci! Je l'ai résolu en ajoutant une étoile à côté de h_ref dans cudaMemcpy2D. \t cudaMemcpy2D (d_ref, ref_pitch, * h_ref, largeur * sizeof (flottant), largeur * sizeof (flottant), hight, cudaMemcpyHostToDevice); – Kiarash

+0

Veuillez noter qu'il n'y a aucune garantie que les vecteurs de colonne individuels pointés par href [i] seront stockés de manière contiguë, donc même après avoir changé le code pourrait toujours échouer à tout moment. – njuffa

+0

okay! J'ai toujours un problème avec ça. Apparemment, il ne copie pas correctement. J'ai changé ma définition de tableau de dynamique à statique mais ça ne marche toujours pas. Je sais que le passage à 1D est une solution mais comment puis-je utiliser cudaMallocPitch et cudaMemcpy2D? Il devrait y avoir un moyen de le faire en 2D ... – Kiarash

3

Dans cette ligne:

cudaMemcpy2D (d_ref, ref_pitch, h_ref, largeur * sizeof (float), largeur * sizeof (float), la hauteur * sizeof (float), cudaMemcpyHostToDevice);

pourquoi se multiplient vous height par sizeof(float)? Vous transférez wayyy trop de données!

+0

True! La hauteur du paramètre n'est pas en octets mais le nombre de lignes vertical uniquement – user562529

Questions connexes