Feuille de route 2020-2021 (3A)

Page principale du cours

Plan

Les cours et séances se déroulent sur 5 séances de 3h mardi après-midi.

Intervenants

Xavier Dupré, Matthieu Durut.

Notes

Liens, notebooks prévus pour les séances pratiques.

Séance 5

Parallelisation CPU

Cython

Example

Profiling

Libraires pour aller plus vite sur CPU

Stratégies d’optimisation

Demain

Liens pytorch:

Notes en vrac

Mémoire –> L3 –> L2 –> L1 –> 256o de registres - CPU1, CPU2, CPU3, CPU4 calcul –> L1 –> L2 –> L3 Mémoire

Program –> Thread principal int A = 1 –> Thread principal

–> thread secondaire

Processus

–> Traitement de texte –> 1 processus –> Python –> 1 processus –> Python –> 1 autre processus

Serialisation Données –> d’une machine à une autre Les machines ne communiquent que par réseau : une séquence d’octets.

Objet en python –> sérialise (pickle) –> zip –> communique –> dézippe –> désérialise

Produit –> 10 multiplication + 9 additions –> instructions AVX

Paralléliser avec : Thread + AVX

Paralléliser avec des processus:
  • Calculs compliqués sur des données séquentielles (indépendantes)

  • 4, 5 processus

Paralléliser avec les threads:
  • Petits calculs répétés plein de fois et pas nécessairement de manière séquentielle

  • AVX

  • Cache –> C, C++, Python –> invisible (assembleur)

  • 7, 8 threads (nombre de cœurs)

Paralléliser avec les GPU
  • GPU

  • 128 threads GPU

Cython prérequis
  • Interpréteur python (3.7+)

  • Compilateur (gcc sur linux (clang), Visual Studio Windows (Community Edition), gcc MacOs

Programme
  • 1 fichier python

  • 1 fichier cython –> cython le convertit en C ou C++ –> compilé (DLL, .pyd, .so) –> prêt à l’emploi

On veut paralléliser sous linux avec une librairie openmp sous Linux:
  • « Error: je ne trouve libomp » –> sudo apt-get install libomp (dépendance)

Plus rapide:

Matrice:

Langage sécurisé
  • Liste = [1, 4, 5, 6]

  • Liste[3] = 4 –> remplace un élément

  • Est-ce que 3 est un index admissible ? (vérification)

  • Faire une copie ? Object mutable, immutable ?

Interprétable = portable
  • Python interprète le code python –> fichier .pyc créé

  • Liste[3] = 4 –> appelle une fonction python qui modifie l’objet liste

  • Le Code peut évoluer dynamiquement –>
    • Les erreurs de syntaxe ne sont pas toujours découvertes avant l’exécution

Mémoire
  • Jamais accès en python à la mémoire directement

  • Deux fonctions qui font des calculs :
    • Transmission d’objet python

    • En python, on ne manipule que des objets pythons

    • Objet en C –> créé son double en python pour le manipuler

Matrice numpy:
  • Structure en C + Objet python qui le contient

GIL –> obstacle
  • GIL = Global Interpreter Lock

  • C++ = 1 verrou pour protéger une zone de la mémoire, 2 zones = 2 verrous, 1 thread qui visite une zone, 1 autre thread qui visite l’autre zone,
    • Verrou: incrémente

  • GIL = 1 verrou pour toutes les zones mémoires

GIT
  • Outils de suivi de source

  • Historique des modifications (utile comme documentation)

  • Revenir en arrière

  • Faire le programme de deux façons différentes
    • Branch / fork

Utilisateur –> ajouter l’extension dot1.pyx Utilisateur –> ajouter l’extension dot2.pyx

Deux versions –> dot1.pyx une autre avec dot2.pyx Git –> va fusionner les deux pour avoir une unique avec dot1.pyx + dot2.pyx

Intégration continue :
  • S’assurer qu’à chaque modification, aucun bug n’a été créé ailleurs que dans le code modifié

Cython
  • Python setup.py build_ext –inplace
    • Convertit cython en C/C++

    • Compiler le code C/C++

    • Link –> .pyd (Windows) ou .so sous MacOs

M3 est modifiée par deux threads en même temps mais pas au même endroit –> donc pas besoin de verrou

A B C -> (A B ) C ou A (B C)