Une nouvelle manière d’utiliser du code CUDA sur d’autres architectures : le projet Coriander

NVIDIA CUDA est et reste la technologie de choix pour l’utilisation de processeurs graphiques pour des calculs. Pour ainsi dire, toutes les bibliothèques d’apprentissage profond utilisent CUDA pour accélérer leurs calculs (pour la plupart, exclusivement) : TensorFlow, Caffe, Torch, Theano, etc. — même si quelques rares bibliothèques s’opposent à cette hégémonie, comme DeepCL. Cependant, cela pose un gros problème à l’écosystème : CUDA est limité aux processeurs fournis par NVIDIA, ce qui limite la concurrence.

C’est notamment pour cela qu’AMD a lancé le projet de transpilateur HIP, qui vise à transformer du code source CUDA en OpenCL. L’outil est vraiment prévu pour que le code source CUDA ne soit plus utilisé, qu’OpenCL le remplace sur toutes les plateformes — malgré les possibilités d’optimisation possibles uniquement avec CUDA pour les processeurs NVIDIA. Un défaut est que toutes les possibilités du langage CUDA ne sont pas gérées. Certains projets, comme Caffe ou Torch, ont lancé une opération de conversion manuelle, qui a le même genre de défauts : le développement se produit principalement en CUDA, pas en OpenCL.

Pour améliorer la situation, certains développeurs se sont lancés dans le projet Coriander (anciennement connu sous le nom de CUDA-on-CL) : ils agissent au moment de la compilation, pas sur les sources. Ainsi, un projet peut être développé entièrement avec CUDA, mais être portable sur toutes les architectures de processeurs graphiques (et d’autres plateformes compatibles OpenCL).

Le principe est proche de HIP : le code CUDA est compilé normalement avec Clang ; ensuite, Coriander traduit le code intermédiaire LLVM en code OpenCL 1.2, qui peut alors être recompilé pour n’importe quelle cible. La partie restante est alors l’API CUDA, qui permet de gérer finement l’exécution sur les processeurs, mais ce travail est actuellement moins abouti. La force de CUDA réside non seulement dans le langage de programmation des GPU, mais aussi dans les bibliothèques de fonctions courantes déjà implémentées et optimisées : pour ce faire, des parties considérables de cuBLAS et cuDNN ont déjà été portées.

À l’exécution, le code produit est moins performant que s’il était directement exécuté sur un GPU NVIDIA. Cependant, pour des tâches d’apprentissage profond, selon le type d’opérations à effectuer, les résultats peuvent être très proches de ceux de CUDA (opérations unitaires, tangente hyperbolique) ; d’autres sont clairement en-dessous (réductions). Cela est en bonne partie dû aux optimisations effectuées par les compilateurs de NVIDIA, mais aussi au fait que le projet Coriander génère du code OpenCL pas forcément traditionnel (afin de coller au mieux à la sémantique de CUDA et éviter des problèmes de correction).

Voir le code source de Coriander.

Source : présentation à IWOCL.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s