2015-02-25 3 views
0

Que signifie by this Nvidia?Mémoire partagée allouée dynamiquement dans CUDA. Configuration d'exécution

Ns est de type size_t et spécifie le nombre d'octets dans mémoire partagée qui est allouée dynamiquement par bloc pour cet appel en plus de la mémoire allouée statiquement; cette mémoire allouée dynamiquement est utilisée par l'une quelconque des variables déclarées comme matrice externe comme mentionné dans __shared__; Ns est un argument optionnel dont la valeur par défaut est 0; La taille de la mémoire partagée dans mon GPU est de 48 Ko.

Par exemple, je veux exécuter 4 noyaux en même temps, chacun d'eux utilise 12ko de mémoire partagée.

Pour ce faire, dois-je appeler Kernek cette façon

kernel<<< gridSize, blockSize, 12 * 1024 >>>(); 

ou si le troisième argument de 48 * 1024?

+1

Le troisième argument spécifie combien de mémoire partagée dynamiquement allouée est utilisée par le noyau, donc le troisième argument doit être '12 * 1024'. Mais si vous voulez exécuter quatre noyaux en parallèle, je suppose que vous utiliserez des flux, donc il devrait y avoir aussi un quatrième argument dans vos appels au noyau. – JackOLantern

+0

Merci! En passant, je ne voulais pas dire «4 noyaux en même temps», mais «1 noyau sur 4 threads en même temps». Je suppose que j'ai encore besoin d'utiliser 'kernel <<< gridSize, blockSize, 12 * 1024 * 1024 >>>();' –

+0

Je suppose que vous voulez dire '12 * 1024', pas' 12 * 1024 * 1024'. – ArchaeaSoftware

Répondre

1

Ns dans une taille en octets. Si vous voulez réserver 12kB de mémoire partagée vous feriez 12*1024*1024.

Je doute que vous voulez faire cela. La valeur Ns est PER BLOCK. Il s'agit donc de la quantité de mémoire partagée par bloc s'exécutant sur l'appareil. Je devine que vous voulez faire quelque chose autour des lignes de 12*1024*1024/number_of_blocks;

noyau avec le lancement concurrency: Si, comme mentionné dans un commentaire, vous utilisez flux il y a une quatrième entrée dans le lancement du noyau qui est le courant de Cuda.

Si vous voulez lancer un noyau sur un autre cours d'eau sans mémoire partagée, il ressemblera à:

kernel_name<<<128, 128, 0, mystream>>>(...); 

mais est une question concurrency tout à fait différent.

+0

Oui, vous avez raison, je voulais 12 * 1024 * 1024, C'était une sorte de faute de frappe. Merci pour votre réponse. –