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
}
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
blocs = N/448, threads = 448, même avec si obtenu le résultat – Mark
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