From 2679cd4b692f1cb72d8215e53fe78f439b1fc2b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jules=20P=C3=A9nuchot?= Date: Wed, 28 Aug 2024 22:11:17 +0200 Subject: [PATCH] defense presentation update --- images/millefeuille-hpc.svg | 131 +++++++++++----------- soutenance.html | 214 ++++++++++++++++++++++++------------ soutenance.md | 139 +++++++++++++++++++---- 3 files changed, 326 insertions(+), 158 deletions(-) diff --git a/images/millefeuille-hpc.svg b/images/millefeuille-hpc.svg index 77bb69b..39d6698 100644 --- a/images/millefeuille-hpc.svg +++ b/images/millefeuille-hpc.svg @@ -1,11 +1,11 @@ - - - Haut niveau: Intention, plus expressif - - Bas niveau: Spécificités matérielles - - - - Bibliothèques expressives: Blaze, Eigen... - Bibliothèques HPC: BLAS, CUBS, cuDNN, EVE, Thrust, LAPACK, OpenMP... - Primitives et APIs: Fonctions intrinsèques, noyaux GPU, appels système... - Instructions CPU/GPU: ARM, x86, RISC-V, PTX... - + + Haut niveau: Intention + + Bas niveau: Matériel + + + + Bibliothèques expressives, DSELs: Blaze, Eigen... + Bibliothèques HPC: BLAS, CUBS, cuDNN, EVE, Thrust, LAPACK, OpenMP... + Primitives et APIs: Fonctions intrinsèques, noyaux GPU, appels système... + Instructions CPU/GPU: ARM, x86, RISC-V, PTX... diff --git a/soutenance.html b/soutenance.html index 0ba69ff..9d08abf 100644 --- a/soutenance.html +++ b/soutenance.html @@ -14,7 +14,7 @@ /* Images */div#\:\$p>svg>foreignObject>section img:not(.emoji){background:white;border:solid var(--cyan);border-radius:10px} -/* @theme jllufbuabo0z7a3f89at5s9vx4l37brggrmesfzqn5 */div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]{columns:initial!important;display:block!important;padding:0!important}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]:after,div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]:before,div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=content]:after,div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=content]:before{display:none!important}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]{all:initial;display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction=vertical]{flex-direction:column}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background][data-marpit-advanced-background-split]>div[data-marpit-advanced-background-container]{width:var(--marpit-advanced-background-split,50%)}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background][data-marpit-advanced-background-split=right]>div[data-marpit-advanced-background-container]{margin-left:calc(100% - var(--marpit-advanced-background-split, 50%))}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]>figure{all:initial;background-position:center;background-repeat:no-repeat;background-size:cover;flex:auto;margin:0}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]>figure>figcaption{position:absolute;border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;white-space:nowrap;width:1px}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=content],div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=pseudo]{background:transparent!important}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=pseudo],div#\:\$p>svg[data-marpit-svg]>foreignObject[data-marpit-advanced-background=pseudo]{pointer-events:none!important}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background-split]{width:100%;height:100%}
+/* @theme yvrkjl46m0tj92nztbkdemrgtfx8vy0uqm3se7062yyj */div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]{columns:initial!important;display:block!important;padding:0!important}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]:after,div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]:before,div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=content]:after,div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=content]:before{display:none!important}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]{all:initial;display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction=vertical]{flex-direction:column}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background][data-marpit-advanced-background-split]>div[data-marpit-advanced-background-container]{width:var(--marpit-advanced-background-split,50%)}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background][data-marpit-advanced-background-split=right]>div[data-marpit-advanced-background-container]{margin-left:calc(100% - var(--marpit-advanced-background-split, 50%))}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]>figure{all:initial;background-position:center;background-repeat:no-repeat;background-size:cover;flex:auto;margin:0}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]>figure>figcaption{position:absolute;border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;white-space:nowrap;width:1px}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=content],div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=pseudo]{background:transparent!important}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=pseudo],div#\:\$p>svg[data-marpit-svg]>foreignObject[data-marpit-advanced-background=pseudo]{pointer-events:none!important}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background-split]{width:100%;height:100%}

Jules Pénuchot



@@ -27,71 +27,116 @@

Jules Pénuchot

Equipe ParSys

Thèse sous la direction de Joël Falcou

-
-

Le HPC: un millefeuille d'abstractions

- +
+

Plan de la présentation

+

Introduction

+
    +
  • Calcul haute performance
  • +
  • Les bibliothèques de calcul haute performance en C++
  • +
  • Métaprogrammation et langages dédiés pour le HPC
  • +
+

Travaux effectués

+
    +
  • Génération de noyaux de calcul SIMD
  • +
  • Langages dédiés arbitraires en C++ et application pour le HPC
  • +
  • Mesure et analyse des temps de compilation
  • +
+

Discussion

+
    +
  • Outils pour le parsing et la génération de code
  • +
  • Evolutions du langage C++
  • +
+
+
+

Le calcul haute performance

+
+

High-Performance Computing (HPC)

+
  • -

    Matériel performant (architectures multi-coeurs, SIMD, GPUs)

    +

    Matériel performant
    +processeurs multi-coeurs, SIMD, GPUs

  • -

    Abstractions performantes (langages et bibliothèques)

    +

    Abstractions performantes
    +langages, APIs, bibliothèques

- -

-
-
-

Performances: le matériel

-

Perf: le matos s'en occupe, ok.
-On a des outils (SYCL, OpenMP, Thrust)

-

Peut-on générer plus de code pour le HPC ?
-Rendre la programmation haute performance plus portable ?
-Avec quelles perfs ?

-
-

Performances: les bibliothèques "métier"

-

Expressivité, que faire ?

-

Blaze, Eigen... et au-dela ?

-

Peut-on rendre ces bibliothèques plus simples à maintenir ?

-

Comment je peux avoir des formules en LaTeX math ou d'autres langages
-dans C++ (si c'est possible/raisonnable)..?

+
+

Le millefeuille d'abstractions du HPC

+
+

-
-

Contexte: pourquoi C++ ?

- -

C++ est la plateforme de choix pour le calcul haute performance
-et la métaprogrammation

-

Langages GPGPU

+
+

Un paysage de plus en plus complexe

+
+

Le matériel:

    -
  • CUDA, SYCL, et HIP sont basés sur C++
  • +
  • Plus de parallélisme(s)
  • +
  • Plus de spécialisation
-

Bibliothèques HPC

+

Exemples récents: Fujitsu A64FX, Cerebras WSE-3

+

Les bibliothèques et applications:

    -
  • Parllélisme: OpenMP, HPX, BLAS, FFTW
  • -
  • Squelettes algorithmiques: Thrust, rocThrust
  • +
  • Des domaines de plus en plus diversifiés
-

Bibliothèques génératives

+

Quelles abstractions pour s'adapter à l'évolution du matériel?
+Comment assurer la portabilité et la pérennité du code haute performance?

+
+
+

La génération de code pour la performance

+
+

Métaprogramme: programme prenant du code en entrée ou en sortie.

+

En C++, les bibliothèques HPC utilisent très majoritairement
+la métaprogrammation de templates
+

    -
  • CTRE, Eigen, Blaze, EVE, xSIMD, CTPG
  • +
  • Intérêt: évaluation partielle, composabilité, nouvelles abstractions
  • +
  • Exemples: Thrust, CUBS, EVE
    +
+

Peut-on aller plus loin ?
+Oui.

-
-

C++ permet de plus en plus d'évaluation partielle à la compilation

-

C++98: templates
-C++11: parameter packs

-

Ouvre le champ pour la métaprogrammation de templates

+
+

Les langages dédiés pour le calcul haute performance en C++

+

Domain Specific Embedded Language (DSEL)
+

+

Bibliothèques de référence: Blaze et Eigen

+

Langages dédiés basés sur de la surcharge d'opérateurs,
+utilisant des expression templates pour la génération de code.

+

Expression templates: représentation d'expressions algébriques
+sous forme d'arborescences de templates de types.
+

+
blaze::DynamicVector<int> vec_a({4, -2, 5}), vec_b({2, 5, -3});
+
+auto expr = vec_a + vec_b; // Add<DynamicVector<int>, DynamicVector<int>>
+blaze::DynamicVector<int> vec_c = expr; // Génération de code à l'assignation
+
-
-

C'est utilisé pour générer du code optimisé à la compilation

-

gemv, expression templates

+
+

Les langages dédiés pour le calcul haute performance en C++

+

Problèmes: difficulté d'implémentation et temps de compilation

+

Quelles techniques permettraient de résoudre ces problèmes ?
+Quel intérêt pour le HPC ?

+
    +
  • Héritent des problématiques associées aux métaprogrammes de templates
  • +
  • DSELs limités à la syntaxe C++ (sauf ctre)
  • +
-
+
+

Performances: les bibliothèques "métier"

+

Expressivité, que faire ?

+

Blaze, Eigen... et au-dela ?

+

Comment je peux avoir des formules en LaTeX math ou d'autres langages
+dans C++ (si c'est possible/raisonnable)..?

+

GEMV

SIMD auto
déroulage auto

-
+

L'évaluation directe de code C++ à la compilation

Historique:

    @@ -102,7 +147,7 @@

    L'évaluation
  • C23: #embed
-
+

Etat de l'art des DSEL

Parsing compile-time, mais avec quel niveau de passage à l'échelle?
(performances et maintenabilité)

@@ -121,7 +166,7 @@

CTRE


-> La programmation constexpr peut-elle apporter du mieux ?

-
+

Contribution


poacher

@@ -130,7 +175,7 @@

poacher

ctbench

Méthodologie et outils pour la mesure de temps de compilation des métaprogrammes, avec les données de profiling de Clang

-
+

poacher

Comment exploiter la programmation constexpr pour implémenter des DSELs ?

Contraintes sur la mémoire dynamique

@@ -138,7 +183,7 @@

poacher

Minimiser la métaprogrammation de templates

Deux langages: Brainfuck, et Tiny Math Language (TML)

-
+

poacher - un exemple simple pour commencer: Brainfuck

@@ -189,14 +234,14 @@

poacher - un exemp
  • Turing complet
  • -
    +

    poacher - le parser Brainfuck

    C++ ordinaire
    On rajoute constexpr partout
    On fait une AST classique avec std::unique_ptr

    -> C'est plié

    -
    +

    poacher - premier backend de génération de code

    Vieux réflexe: on génère des expression templates

    Problématique: comment transformer des structures qui ne passent pas en NTTP (car elles pointent vers de la mémoire dynamique) en arborescences de types?

    @@ -212,7 +257,7 @@

    poacher - pre constexpr auto get_subvec_0 = []() { return get_vector()[0]; }

    -
    +

    Perfs ???

    On peut compiler Hello World (106 noeuds):

    ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]
    @@ -221,7 +266,7 @@ 

    poacher - pre

    On ne peut pas compiler Mandelbrot (~11'000 noeuds)

    Problème: comment mesurer efficacement les temps de compilation

    -
    +

    ctbench

    Mesure de temps de compilation via le profiler de Clang

    Orienté C++: API CMake, configuration JSON, bibliothèque C++

    @@ -230,7 +275,7 @@

    ctbench

    Permet de filtrer, agréger, et analyser les évènements de compilation
    de manière configurable, puis de tracer des courbes

    -
    +

    ctbench - exemple simple

    https://github.com/jpenuchot/ctbench

      @@ -253,7 +298,7 @@

      ctbench - exemple simple

      constexpr std::size_t result = decltype(foo())::value;
    -
    +
    • Récursion
    @@ -279,22 +324,22 @@

    ctbench - exemple simple

    }
    -
    +

    -
    +

    BF - 3e tentative

    -
    +

    TML

    -
    +

    RPN & Shunting Yard

    -
    +

    Implem constexpr: parser ordinaire + generateur de code a base de lecture RPN

    -
    +

    Conclusion - 5mn:

    On a des nouvelles techniques pour écrire des métaprogrammes
    avec du C++ régulier

    @@ -307,13 +352,13 @@

    TML

    Nouvelle méthodologie pour le benchmarking des temps de compilation

    10mn

    "Abstractions performantes": qui ne pénalisent pas le temps d'exécution

    https://ivanceras.github.io/svgbob-editor/ +

    10mn

    "Abstractions performantes": qui ne pénalisent pas le temps d'exécution

    https://ivanceras.github.io/svgbob-editor/ -.------------------------------------------. -| "Haut niveau: Intention, plus expressif" | -'------------------------------------------' +.--------------------------. +| "Haut niveau: Intention" | +'--------------------------' - ^ "Bibliothèques expressives: Blaze, Eigen..." + ^ "Bibliothèques expressives, DSELs: Blaze, Eigen..." | | "Bibliothèques HPC: BLAS, CUBS, cuDNN, EVE, Thrust, LAPACK, OpenMP..." | @@ -321,7 +366,38 @@

    TML

    | v "Instructions CPU/GPU: ARM, x86, RISC-V, PTX..." -.----------------------------------------. -| "Bas niveau: Spécificités matérielles" | -'----------------------------------------'

    10mn

    20mn

    \ No newline at end of file diff --git a/soutenance.md b/soutenance.md index 4d1589f..f20b1c5 100644 --- a/soutenance.md +++ b/soutenance.md @@ -18,24 +18,59 @@ Thèse sous la direction de *Joël Falcou* --- -# Le HPC: un millefeuille d'abstractions +## Plan de la présentation + +**Introduction** + +- Calcul haute performance +- Les bibliothèques de calcul haute performance en C++ +- Métaprogrammation et langages dédiés pour le HPC + +**Travaux effectués** + +- Génération de noyaux de calcul SIMD +- Langages dédiés arbitraires en C++ et application pour le HPC +- Mesure et analyse des temps de compilation + +**Discussion** + +- Outils pour le parsing et la génération de code +- Evolutions du langage C++ + +--- + +# Le calcul haute performance -- **Matériel performant** (architectures multi-coeurs, SIMD, GPUs) +
    + +**H**igh-**P**erformance **C**omputing *(HPC)* + +
    + +- **Matériel performant** + *processeurs multi-coeurs, SIMD, GPUs* + -- **Abstractions performantes** (langages et bibliothèques) +- **Abstractions performantes** + *langages, APIs, bibliothèques* -![width:1500px](images/millefeuille-hpc.svg) +--- + +## Le millefeuille d'abstractions du HPC + +
    +![width:1700px](images/millefeuille-hpc.svg) --- -## Performances: le matériel +## Un paysage de plus en plus complexe + +
    + +**Le matériel:** + +- Plus de *parallélisme(s)* +- Plus de *spécialisation* + +*Exemples récents:* Fujitsu A64FX, Cerebras WSE-3 + +**Les bibliothèques et applications:** + +- Des domaines de plus en plus *diversifiés* + +*Quelles abstractions pour s'adapter à l'évolution du matériel?* +*Comment assurer la portabilité et la pérennité du code haute performance?* + +--- + +## La génération de code pour la performance + +
    + +**Métaprogramme:** programme prenant du code en entrée ou en sortie. -Perf: le matos s'en occupe, ok. -On a des outils (SYCL, OpenMP, Thrust) +En C++, les bibliothèques HPC utilisent très majoritairement +la *métaprogrammation de templates* +
    + +- **Intérêt:** évaluation partielle, composabilité, nouvelles abstractions +- **Exemples:** Thrust, CUBS, EVE +
    -Peut-on générer plus de code pour le HPC ? -Rendre la programmation haute performance plus portable ? -Avec quelles perfs ? +Peut-on aller plus loin ? +*Oui.* + +--- + +## Les langages dédiés pour le calcul haute performance en C++ + +**D**omain **S**pecific **E**mbedded **L**anguage *(DSEL)* +
    + +*Bibliothèques de référence: Blaze et Eigen* + +Langages dédiés basés sur de la **surcharge d'opérateurs**, +utilisant des **expression templates** pour la génération de code. + +**Expression templates:** représentation d'expressions algébriques +sous forme d'arborescences de templates de types. +
    + +```c++ +blaze::DynamicVector vec_a({4, -2, 5}), vec_b({2, 5, -3}); + +auto expr = vec_a + vec_b; // Add, DynamicVector> +blaze::DynamicVector vec_c = expr; // Génération de code à l'assignation +``` + +--- + +## Les langages dédiés pour le calcul haute performance en C++ + +**Problèmes:** difficulté d'implémentation et temps de compilation + +*Quelles techniques permettraient de résoudre ces problèmes ?* +*Quel intérêt pour le HPC ?* + + +- Héritent des problématiques associées aux métaprogrammes de templates +- DSELs limités à la syntaxe C++ (sauf ctre) --- @@ -67,15 +166,13 @@ Expressivité, que faire ? Blaze, Eigen... et au-dela ? -Peut-on rendre ces bibliothèques plus simples à maintenir ? Comment je peux avoir des formules en LaTeX math ou d'autres langages **dans C++** (si c'est possible/raisonnable)..? ---- + C++ est la plateforme de choix pour le calcul haute performance *et la métaprogrammation* @@ -108,7 +205,7 @@ C'est utilisé pour générer du code optimisé à la compilation gemv, expression templates ---- +-----> ## GEMV