Et voilà où on en est.
J’ai enfin réussi à faire fonctionner le sondage multi-niveaux et l’auto-optimisation du GPU.
On a passé la journée entière sur l’orchestration du périphérique, les kernels dynamiques, les bizarreries du p4, les headers non documentés, et toutes les couches et les bribes de tout ce qu’il faut bidouiller pour faire tourner une implémentation en salle blanche sur GPU et...
On lance le GPU et ça marche, putain ! Ça marche ! L’implémentation de base atteint 13 gflops sans aucune optimisation, juste avec la gestion de mémoire basique spécifique à ce qu’on a fait pour le GPU et les kernels.
Cool.
Pas terrible pour un premier essai, mais c’est respectable, tout bien considéré, après tout ce qu’il a fallu pour en arriver là sans CUDA ni ROCm.
La régression du CPU
Et là... Claude me sort : « C’est une amélioration énorme par rapport aux 2 gflops qu’on obtient avec le CPU », et mon cœur a lâché.
Que je me fasse défoncer avec une batte de baseball pleine d’épines.
Merde putain merde !
C’est encore arrivé.
J’ai hurlé sur mon écran, j’avais envie de gueuler sur Claude (mais je ne l’ai pas fait, Claude n’a aucune intention propre et est programmé pour faire de son mieux avec les informations et les patterns disponibles).
J’avais envie de vomir.
L’implémentation précédente, la dernière qu’on a benchmarkée avant d’ajouter le support de Metal et du Neural Engine, atteignait entre 43 et 250 GFLOPS sur CPU, selon l’opération, l’intensité des calculs et le type de charge de travail.
Jusqu’à 90 % du théorique. On a déjà fait ça deux fois, avec le même design.
Je plonge dans le code pour découvrir qu’on a buté sur le même goulot d’étranglement du projet que d’habitude.
Ce putain de pattern de bibliothèque stupide que Claude ne sait pas gérer correctement, parce qu’Anthropic n’a jamais entraîné Claude sur des bibliothèques complexes.
Claude a littéralement remplacé une implémentation de gestion de mémoire novatrice et à la pointe... par sept boucles imbriquées.
Reconstruire la couche CPU
Ma meilleure hypothèse, c’est que c’est arrivé samedi dernier quand on a ajouté le support du Neural Engine pour Fortran. J’aurais dû vérifier les changements de plus près. Être plus vigilante avec mon repo.
Ce n’est la faute de personne d’autre que la mienne.
C’est pas grave, on ne peut pas écrire un truc comme une bibliothèque d’algèbre linéaire sans des montagnes russes émotionnelles.
C’est comme ça qu’on sait qu’on fait de l’ingénierie sérieuse.
On réparera ça demain, quand on réimplémentera toute la couche CPU.
Je passe au pattern Reference.
Ça devrait être un peu plus fluide à partir d’ici.
Si c’était facile, quelqu’un l’aurait déjà fait.
Je reste optimiste.