Outils pour utilisateurs

Outils du site


progc

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
progc [2018/05/15 14:17] brbachelprogc [2018/10/11 20:49] (Version actuelle) – modification externe 127.0.0.1
Ligne 5: Ligne 5:
 Depuis le C++11, manipuler des threads en C++ est devenu plus simple et totalement portable. Voici un diaporama qui présente brièvement des fonctionnalités standards du C++ actuel qui permettent de lancer des tâches sur des threads et les synchroniser: {{ :wiki:multithread_cpp.pdf |}}. Deux couches d'abstraction sont disponibles: la première est simplement une surcouche objet des threads POSIX, le développeur manipule donc explicitement des threads; alors que la seconde est plus abstraite (et donc moins flexible) pour masquer les mécanismes multithread et simplifier le code. Le code des exemples de la présentation sont également disponibles: {{ :wiki:multithread_cpp.tgz |}}. Depuis le C++11, manipuler des threads en C++ est devenu plus simple et totalement portable. Voici un diaporama qui présente brièvement des fonctionnalités standards du C++ actuel qui permettent de lancer des tâches sur des threads et les synchroniser: {{ :wiki:multithread_cpp.pdf |}}. Deux couches d'abstraction sont disponibles: la première est simplement une surcouche objet des threads POSIX, le développeur manipule donc explicitement des threads; alors que la seconde est plus abstraite (et donc moins flexible) pour masquer les mécanismes multithread et simplifier le code. Le code des exemples de la présentation sont également disponibles: {{ :wiki:multithread_cpp.tgz |}}.
  
-Par programmation, il existe plusieurs manières d'estimer le nombre de coeurs disponibles pour le processus courant, ce qui permet de déterminer combien de threads il faut créer pour les besoins d'un programme. En voici trois en C/C++: ''std::hardware_concurrency'' (à partir de C++11), ''omp_max_threads'' (OpenMP), ''sched_getaffinity'' (module standard Linux). Le code suivant teste les trois solutions: [[http://fc.isima.fr/~toussain/docWiki/cores_estimator.cpp|cores_estimator.cpp]]. Il semblerait que les approches avec OpenMP et Sched fournissent les bonnes informations, alors que celle du C++ indique le nombre de coeurs de la machine et non celui de votre réservation SLURM. +Par programmation, il existe plusieurs manières d'estimer le nombre de coeurs disponibles pour le processus courant, ce qui permet de déterminer combien de threads il faut créer pour les besoins d'un programme. En voici trois en C / C++: ''std::hardware_concurrency'' (à partir de C++11), ''omp_max_threads'' (OpenMP), ''sched_getaffinity'' (module standard Linux). Le code suivant teste les trois solutions: [[http://fc.isima.fr/~toussain/docWiki/cores_estimator.cpp|cores_estimator.cpp]]. Il semblerait que les approches avec OpenMP et Sched fournissent les bonnes informations, alors que celle du C++ indique le nombre de coeurs de la machine et non celui de votre réservation SLURM. 
  
 ===== Mesure des temps de calcul ===== ===== Mesure des temps de calcul =====
Ligne 51: Ligne 51:
 </code> </code>
  
-==== Temps d'exécution pour un thread ====+==== Temps d'exécution d'un thread ====
  
 La fonction ''getrusage'' dispose d'un paramètre ''who'' qui peut prendre trois valeurs qui affectent la manière de mesurer le temps: ''RUSAGE_SELF'' qui mesure le temps d'exécution du processus courant et de tous ces threads, ''RUSAGE_THREAD'' qui mesure le temps d'exécution du thread courant, et ''RUSAGE_CHILDREN'' qui mesure le temps d'exécution des processus fils du processus courant. Dans l'entête que nous proposons, il est possible d'indiquer l'une des trois valeurs à la fonction ''now'' (qui la transmettra à ''getrusage''). Nous avons choisi ''RUSAGE_SELF'' par défaut, ce qui signifie que si on lance une tâche de 3 secondes sur 4 threads, on obtient un temps ''user'' de 12 secondes (le cumul de tous les threads). Voici un exemple où l'on mesure le temps par thread et le temps du processus: La fonction ''getrusage'' dispose d'un paramètre ''who'' qui peut prendre trois valeurs qui affectent la manière de mesurer le temps: ''RUSAGE_SELF'' qui mesure le temps d'exécution du processus courant et de tous ces threads, ''RUSAGE_THREAD'' qui mesure le temps d'exécution du thread courant, et ''RUSAGE_CHILDREN'' qui mesure le temps d'exécution des processus fils du processus courant. Dans l'entête que nous proposons, il est possible d'indiquer l'une des trois valeurs à la fonction ''now'' (qui la transmettra à ''getrusage''). Nous avons choisi ''RUSAGE_SELF'' par défaut, ce qui signifie que si on lance une tâche de 3 secondes sur 4 threads, on obtient un temps ''user'' de 12 secondes (le cumul de tous les threads). Voici un exemple où l'on mesure le temps par thread et le temps du processus:
progc.1526393848.txt.gz · Dernière modification : 2018/10/11 20:49 (modification externe)