2010-05-03 7 views
1

J'ai un noyau qui passe 3 tableaux, le premier tableau d_A1 n'a pas de données et est utilisé uniquement pour écrire des données, les deux autres tableaux d_D1 et d_ST1 ont des données.Comment transmettre des données à une variable partagée dans CUDA?

La taille de la première matrice est la suivante:

d_A1 [13000000]

La taille de la seconde matrice est:

d_D1 [421]

La taille de la troisième matrice est:

d_ST1 [21]

N est 13000000

Tableau de test >> (d_A1, N, d_D1, d_ST1);

Maintenant, je veux passer que les données de d_D1 [421] et d_ST1 [21] à des réseaux partagés, donc je créé les tableaux partagés comme:

__global__ void TestArray(int* A1, unsigned int N, int* D1, unsigned int* ST1) 
{ 

    unsigned int __align__(16) tid = threadIdx.x; 
    unsigned int __align__(16) idx = __umul24(blockDim.x, blockIdx.x) + threadIdx.x; 
    __shared__ unsigned int __align__(16) s_D1[441]; //Shared array for d_D1 
    __shared__ unsigned int __align__(16) s_ST1[21]; //Shared array for d_ST1 

    if (idx < N) //13000000 

    { 

Q. Comment puis-je transmettre les données de d_D1 [ 441] et d_ST1 [21] à s_D1 [441] et s_ST1 [21]? Je essayé:

 while (idx < 441) 

     s_D1[tid] = d_D1[idx] 

     __syncthreads(); 


     while (idx < 21) 

     s_ST1[tid] = d_ST1[idx] 


     __syncthreads(); 

mais l'ordinateur se bloque et je dois le redémarrer. J'ai également essayé un à la fois, à savoir, seulement le poing tandis que puis seulement la seconde, sans succès.

Si j'utilise la mémoire globale, à savoir d_D1, d_ST1 tout fonctionne. Donc la question est: Comment transmettre des données à une variable/tableau partagé lorsque la taille du tableau n'est pas N?

} //End of kernel processing 



} 
+2

Quels sont les paramètres que vous transmettez pour le nombre de blocs et de threads? De même, ne devrait-il pas s'agir de "if" et non de "while" pour la vérification des limites? – jeff7

+0

blocs = N/448, threads = 448, même avec si obtenu le résultat – Mark

+0

Hmmmm, pouvez-vous poster plus du noyau que vous utilisez. De plus, en le regardant de nouveau, si vous chargez différentes tranches de d_D1, d_ST1 dans la mémoire partagée, ne voulez-vous pas vérifier tid et pas idx dans le contrôle while/if bounds (sinon vous ne chargerez que le premières valeurs 441/21)? – jeff7

Répondre

1

Grand, vous avez raison, il doit être si (tid < 21) d_ST1 [tid] = ST1 [tid] depuis un bloc est suffisant pour ces deux dimensions. Merci beaucoup. Cependant, quand utilisez-vous si (idx < n) d_st1 [tid] = st1 [idx]?

+0

Un cas où vous utiliseriez if (idx >>.Le motif le plus probable est que n soit grand, donc vous voudrez diviser les données entre les blocs. Découvrez la multiplication de la matrice de Nvidia pour un bon exemple. – jeff7

+0

Devrait-il être <<> comme n/nombre de fils par bloc? – Mark

+0

Oui, <>. – jeff7

Questions connexes