Améliorations de la prise en charge d'OpenMP pour C++ dans Visual Studio 2019 version 16.10

Par:
fredericmazue

ven, 14/05/2021 - 12:29

Microsoft a amélioré la prise en charge d'Open MP pour C++ dans Visual Studio 2019 version 16.10. Notamment le commutateur -openmp:llvm, apparu dans Visual Studio 2019 version 16.9, utilisé pour la prise en charge de toutes les directives OpenMP 2.0 pour l'architecture x64 fonctionne désormais pour les architectures x86 et arm64.

Pour rappel, le commutateur -openmp:llvm est encore au stade expérimental. Il est à remarquer que les fonctionnalités d'OpenMP 3.0 qui ont été ajoutées avec le commutateur -openmp:llvm dans Visual Studio version 16.9 ne sont toujours prises en charge qu'avec l'indicateur supplémentaire -openmp:experimental dans Visual Studio version 16.10, et sont donc fournies avec certaines limitations dans Visual Studio version 16.10.

Des corrections de bugs importantes sont à remarquer dans cette mouture. Notamment les instructions return à l'intérieur des régions de code parallélisées, qui ne sont pas conformes, émettent désormais un message d'erreur. Par exemple :

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";

#pragma omp parallel for schedule(dynamic)
    for (auto i = 0; i < 100; ++i)
    {
        // should issue error C3010: 'return': jump out of OpenMP structured block not allowed
        return -1; 
   }

    return 0;
}

La clause if a désormais une résolution de portée correcte. Ainsi, avant le correctif, dans l'exemple de code ci-dessous, la clause interne if faisait référence à la variable partagée externe i qui a une valeur de 1, plutôt qu'à la variable privée interne i qui a la valeur 0, 

#include <stdio.h>
#include <omp.h>

int main(void)
{
  int i = 1;
  int retVal = 0;
  #pragma omp parallel if(retVal) default(none) private(i)
  {
    printf("hello\n");
    i = 0;
    #pragma omp parallel if(i) default(none) num_threads(4)
    {
      printf("nested\n");
    }
  }
  return 0;
}

Dans Visual Studio 2019 version 16.10, la norme prise en charge reste OpenMP 2.0. Microsoft a l'intention de prendre en charge la norme OpenMP la plus récente, et cela se fera par étape, avec de nouvelles fonctionnalités exploitant le runtime OpenMP de LLVM. Une première étape sera de prendre en charge les fonctionnalités supplémentaires ajoutées dans la norme OpenMP 3.1. Une seconde étape sera la prise en charge des pragmas et des clauses ajoutés dans la norme OpenMP 4.5 qui n'impliquent pas de déchargement (offloading).