Sur MiniWeather ils obtiennent les même performances en Fortran standard + nvFortran qu'avec OpenACC
Sur une simulation en Chimie quantique ils sont plus rapide en Fortran standard
Brent Leback : Responsable des intrinsèques Fortran, de CudaFortran et des API Cuda
Pallavi Mathew : Responssable OpenMPOpenACC pour GPU
Guray Ozen : OpenACC et Do Concurent pour GPU
Jeff Larkin : OpenMP, OpenACC specifications
Jeff Hamond : Application Use case, OpenPMI et Co-Array
La réduction en Do Concurent n'est pas encore disponible mais elle sera ajouté
Fortran, Cuda Fortran, OpenMP et OpenACC peuvent être utilisées ensembles car elles sont complémentaires
Cuda Fortran n'est pas portable
La parallélisation GPU en Fortran standard est poentiellement la plus portable mais pour le moment il n'y a que NVidia qui a un compilateur qui peut le faire. Même si Intel et Cray travaillent dessus
Il faut toujours démarer sans directive et en ajouter si besoin
Les fonctionnalités les plus utilisées sont implémentées en premier dans les compilateurs
Il n'y a pas encore les Co array mais c'est en cours
Fortran sera toujours supporté par les compilateurs NVidia. Mais préférez le Fortran moderne (F18 ou plus) (faut quand même pas pousser)
Fortran n'a pas d'atomique pour Do Concurent mais on peut utiliser OpenMP, car dans le standard c'est pour les Co-Array
Il ne faut pas appeler une fonction dans un Do Concurent car le compilateur ne sait pas ce qu'elle fait, donc il ne sait pas comment la paralléliser
On peut spécifier si on veut tourner sur le GPU et/ou en multicoeurs à la compilation avec -stdpar=multicore ou -stdpar=gpu. Apparemment on peut aussi le faire à l'exécution, mais ils ne disent pas comment
Résoudre le problème de la compilation de plusieurs fichiers tout en ayant de bonnes performances
Il faut compiler avec -dlto à la compilation et au linkage avec nvcc (depuis Cuda 11.2)
Suivant les cas présentés, l'accélération va de $5\%$
à $91\%$
(simulation, mécanique des fluides, etc)
LTO peut être utilsé sur des applications industrielles
LTO JIT (Just In Time) existe depuis Cuda 11.4 (avec nvrtc, NVidia RunTime Compiler)
Attention, la compilation est plus lente (38K LOC sur 300 fichiers, le linkage prend de 1s à 49s avec LTO, mais la compilation est 18s plus rapide). Le tout augmente de $5\%$
(en fait ça va)
Attention : il n'y a pas de compatibilité sur les versions mineures de Cuda 11.X, mais ce sera le cas pour Cuda 12.0
LTO permet d'éliminer le code mort des kernels qui ne sont pas appelés par le host (ce n'était pas le cas avant)
Experts front End, middle end et back end du compilateur nvcc
Meilleures optimisations et déduction du temps de compilation (autant que faire ce peut)
nvcc est en train de migrer sur LLVM 7
nvcc 11.7 fera du C++20 (avec des modules C++, mais pas d'appel Cuda dans ces modules)
Il y a des options pour optimiser le temps de compilation (compilation concurente, multithread -d -thread si on cible des devices (compute capabilities) différents)
Ils vont augmenter le nombre de choses que l'on peut compiler en parallèle
Il y a aussi un feedback pour dire au développeur quelles lignes de sont code prennent plus de temps à compiler
Les templates sont sensés fonctionner dans nvcc
LTO : Link Time Optimisation (déjà abordé dans une présentation juste au dessus)
À vérifier, mais apparemment il ne faut pas mélanger du C avec du C++ quand on compile avec nvc++, mais c'est louche
-d -v pour avoir le détail de l'implémentation faite par le compilateur (pour $a+b$
par exemple)
Il y a l'autodétection du GPU que l'on veut cibler (comme dans nvc++)
Les entiers 128 bits sont supportés depuis la version 11.6
Il y a besoin de plus d'information sur les GPU récents, donc les micro-instructions ont grandis
Ils ont un expert CMake pour gérer la compatibilité avec les versions récentes de CMake