Pour exécuter une section d'un code en parallèle en utilisant un nombre connu de threads, nous faisons généralement ceci: #pragma omp parallel num_threads (8) {} Cependant, comment pouvons-nous définir le nombre de cœurs au lieu de thread? Sommes ...

2
MAero2020 15 mars 2021 à 01:11

1 réponse

Meilleure réponse

TL; DR : vous ne pouvez pas spécifier directement un certain nombre de cœurs dans les directives de prétraitement OpenMP, mais vous pouvez contrôler la façon dont les threads OpenMP sont mappés sur les cœurs disponibles.

Comment ça marche:

Les threads logiciels peuvent être créés et détruits dynamiquement au moment de l'exécution par les applications. Ils sont mappés sur des ressources matérielles telles que les threads matériels et les cœurs qui sont fixés lors de l'exécution pour une plate-forme donnée. Vous ne pouvez pas contrôler les cœurs directement (dans l'espace utilisateur), uniquement les threads.

Dans OpenMP, vous pouvez contrôler le nombre de threads au moment de l'exécution en utilisant plusieurs approches:

  • la clause num_threads dans les directives de prétraitement
  • la variable d'environnement OMP_NUM_THREADS
  • la fonction d'exécution omp_set_num_threads

OpenMP fait abstraction de la hiérarchie matérielle en utilisant des emplacements . Il définit un lieu comme «un ensemble non ordonné d'unités matérielles définies par l'implémentation d'un périphérique sur lequel un ou plusieurs threads OpenMP peuvent s'exécuter». En pratique, les emplacements sont généralement un ensemble de threads matériels sur les processeurs. Des exemples d'endroit valide incluent un socket matériel donné, trois cœurs spécifiques ou un thread matériel spécifique (plusieurs emplacements peuvent partager les mêmes unités d'exécution matérielle). Les lieux peuvent être définis manuellement à l'aide de la variable d'environnement OMP_PLACES.

Le mappage / liaison des threads OpenMP à des emplacements peut être contrôlé en utilisant la variable d'environnement OMP_PROC_BIND, ou plus récemment en utilisant la clause proc_bind dans les directives parallèles de prétraitement. Par exemple, vous pouvez forcer les threads OpenMP à être liés à des emplacements ou à être répartis uniformément entre eux.

Exemple:

Si vous souhaitez utiliser 4 cœurs, vous pouvez utiliser l'environnement suivant:

OMP_PLACES="cores(4)"
OMP_PROC_BIND=close

Le runtime OpenMP sélectionnera arbitrairement 4 cœurs de votre matériel et exécutera les threads dessus afin que le premier thread s'exécute sur le premier noyau, le deuxième thread sur le deuxième noyau, etc. S'il y a 8 threads, alors chacun des 4 core exécutera deux threads OpenMP (même si vous avez un processeur avec 8 cœurs).

1
Jérôme Richard 15 mars 2021 à 00:49