2015-08-18 2 views
1

Lors de la compilation d'un programme CUDA qui lance des noyaux sur plusieurs périphériques, nvcc compile-t-il en interne une version du noyau pour chaque périphérique? Je demande cela parce que j'essaie d'utiliser PyCUDA et que je suis aux prises avec la raison pour laquelle je dois compiler (appelez SourceModule) le code du noyau pour chaque périphérique sur lequel je suis sur le point de lancer le noyau.CUDA Compilation de noyaux multi-GPU

Merci pour votre aide!

Répondre

0

La réponse à un mot est Non. Le compilateur ne sait pas ou n'a pas besoin de connaître le nombre de GPU pendant la compilation. L'API d'exécution chargera automagiquement le code des charges utiles binaires dans chaque contexte sans que le compilateur ou le programmeur n'ait besoin de faire quoi que ce soit. Si votre code nécessite une recompilation JIT, le pilote compilera une fois et le code machine mis en cache sera réutilisé dans les contextes suivants, si les cibles matérielles sont identiques.

Dans PyCUDA, vous utilisez l'API du pilote, la gestion du contexte est donc plus manuelle. Vous devez charger des modules dans le contexte de chaque GPU que vous utilisez. Si vous utilisez la fonction de module source, cela signifie que vous devez soumettre le code pour chaque GPU. Mais (IIRC), PyCUDA fait aussi la mise en cache de son code compilé JIT fait avec nvcc. Donc, même si vous devez appeler le module source pour chaque contexte, vous ne devriez pas avoir d'invocation du compilateur à chaque fois, si les GPU sont identiques. Si cela vous dérange et que vous ne faites pas beaucoup de méta-programmation, envisagez de passer à des cubes pré-compilés. Vous devez toujours les charger dans tous les contextes, mais il n'y a pas de surcharge de compilation lors de l'exécution.