2010-06-14 8 views
5

Est-il possible de lancer deux noyaux qui effectuent des tâches indépendantes, simultanément. Par exemple, si je Cuda ce codeLancement simultané de plusieurs noyaux en utilisant CUDA pour un GPU

// host and device initialization 
....... 
....... 

// launch kernel1 
myMethod1 <<<.... >>> (params); 

// launch kernel2 
myMethod2 <<<.....>>> (params); 

En supposant que ces noyaux sont indépendants, est-il une possibilité de les lancer en même temps allouer quelques grilles/blocs pour chacun. Est-ce que CUDA/OpenCL a cette disposition.

+0

En même temps, voulez-vous dire leur exécution en cours de synchronisation ou simplement chevauchement? –

Répondre

6

Seuls les périphériques avec une capacité de calcul CUDA supérieure ou égale à 2.0 (c'est-à-dire Fermi) peuvent prendre en charge plusieurs exécutions simultanées du noyau. Voir la section 3.2.6.3 du guide de programmation CUDA 3.0, qui stipule:

Certains appareils de Compute 2.0 capacité peut exécuter plusieurs noyaux simultanément. Les applications peuvent interroger en appelant le cudaGetDeviceProperties() et en vérifiant la propriété concurrentKernels.

Le nombre maximal de lancements de noyau qu'un périphérique peut exécuter simultanément est de quatre.

Un noyau d'un contexte CUDA ne peut pas s'exécuter simultanément avec un noyau à partir d'un autre contexte CUDA.

Noyaux qui utilisent beaucoup de textures ou une grande quantité de mémoire locale sont moins susceptibles d'exécuter en même temps que d'autres noyaux .

6

Vous aurez besoin de SM 2.0 ou supérieur pour les noyaux concurrents.

Pour obtenir une exécution simultanée, vous devez indiquer manuellement qu'il n'y a pas de dépendance entre les deux noyaux. C'est parce que le compilateur ne peut pas déterminer qu'un noyau ne modifiera pas les données utilisées dans l'autre, cela pourrait être en lisant et en écrivant dans le même tampon qui semble assez simple, mais qui est en réalité beaucoup plus difficile à détecter. structures de données et ainsi de suite.

Pour exprimer l'indépendance, vous devez lancer les noyaux dans différents flux. Le quatrième paramètre de la syntaxe triple-chevron spécifie le flux, consultez le Guide de programmation ou l'exemple SDK concurrentKernels.

3

compatibilité CUDA 2.1 = jusqu'à 16 simultanées Noyaux