C++ avancé : « vectorisation » automatique de fonctions scalaires

J’ai récemment eu un problème de C++ suffisamment rare et dont la solution est suffisamment élégante pour que je pense utile de la partager dans un post de blog.

Je dispose d’un certain nombre de fonctions prenant des « scalaires » (un entier, un float, etc) et renvoyant un autre scalaire.

double add(double x, double y) {
    return x + y;
}

Je dispose également d’un type vectoriel contenant un certain nombre (connu à la compilation) de ces scalaires, l’équivalent d’un std::array :

template<typename T, size_t N>
struct myvect {
    T data[N];
};

La problématique était de pouvoir appliquer la fonction scalaire sur chacune des composants de vecteurs pour renvoyer un nouveau vecteur.

La solution naïve, dans le cas présenté au dessus, serait d’ajouter une fonction :

using Vd4 = myvect<double, 4>
Vd4 vadd(const Vd4 & va, const Vd4 & vb) {
    Vd4 res;
    for(int i = 0; i < 4; ++i) {
        res.data[i] = add(va.data[i], vb.data[i]);
    }
    return res;
}

Mais pour chaque fonction scalaire, je devrai rajouter une nouvelle fonction vectorielle, ce qui est déjà long et fastidieux, et impossible si l'utilisateur peut définir ses propres fonctions scalaires.

L'idée est donc de généraliser, autant que possible, la génération de fonctions "vectorielles" à partir de fonctions "scalaires", le tout en gardant des performances optimales.

Problème : je dispose d'énormément de fonctions, elles peuvent prendre plusieurs types d'arguments, et prendre un nombre quelconque d'arguments. Les fonctions peuvent être définies par l'utilisateur (mais restent connues à la compilation).

Qui dit connu à la compilation dit template, et qui dit nombre quelconque d'arguments dit variadic templates.

Partons sur un type de vecteur simple :

template<typename T>
struct myvect {
    T data[4];
};

On voudrait maintenant pouvoir écrire quelque chose comme ça :

template<typename retS, typename... args>
myvect<retS> func_vec(myvect<args>... vecs) {
     myvect<retS> res; // initialized somehow
     for (int i = 0; i < 4; ++i) {
        res.data[i] = func_scalar(/* ?? */);
     }

     return res;
}

Le problème est qu'on a besoin d'invoquer func_scalar sur une tranche (slice) (à l'index i) des vecteurs vecs. C'est là que std::integer_sequence vient à notre secours. On peut écrire une petite structure intermédiaire et une fonction qui nous renvoie cette tranche au bon index :

template<typename... Ts>
struct slice_helper {
    template<std::size_t... I> 
    static auto inner(int index, std::tuple<myvect<Ts>...> vects, std::index_sequence<I...>)
    {
        return std::make_tuple(std::get<I>(vects).data[index]...);
    }
};

template<typename... Ts>
auto slice(int index, std::tuple<myvect<Ts>...> vectors)
{
    return slice_helper<Ts...>::template inner(index, vectors, std::index_sequence_for<Ts...>{});
}

En utilisant cette fonction, on peut alors écrire la fonction vectorize qui prend une fonction en argument. Notons qu'on fait appel à std::apply qui permet d'invoquer un pointeur de fonction sur un tuple d'arguments.

template<typename retS, typename... args> 
struct vectorize {
    template<retS(*funcptr)(args...)>
    static myvect<retS> func_vect(myvect<args>... v) {
        myvect<retS> res;
        auto tuple = std::make_tuple(v...);
        for (int i = 0; i < 4; ++i) {
            res.data[i] = std::apply(funcptr, slice(i, tuple));
        }

        return res;
    }
};

Ceci peut alors s'invoquer comme cela :

int test(int a, int b) {
    return a + b;
}

int main() {
    myvect<int> a { 1, 2, 3, 4 };
    myvect<int> b { 2, 4, 6, 8 };
    auto added = vectorize<int, int, int>::func_vect<&test>(a, b);

    for(int i = 0; i < 4; ++i) {
        printf("%d\n", added.data[i]);
    }
}

Clang 14 génère alors l'assembleur suivant (où il a tout calculé à la compilation) :


main: # @main
  pushq %rax
  movl $.L.str, %edi
  movl $3, %esi
  xorl %eax, %eax
  callq printf
  movl $.L.str, %edi
  movl $6, %esi
  xorl %eax, %eax
  callq printf
  movl $.L.str, %edi
  movl $9, %esi
  xorl %eax, %eax
  callq printf
  movl $.L.str, %edi
  movl $12, %esi
  xorl %eax, %eax
  callq printf
  xorl %eax, %eax
  popq %rcx
  retq
.L.str:
  .asciz "%d\n"

Avec quelques menues modifications, il est possible de prendre des vecteurs de longueur quelconque (mais connue à la compilation).

Toutefois, en cherchant à optimiser encore le code, il m'est apparu que la boucle sur les tranches n'est pas vectorisée (au sens des instructions avx/avx2/avx512). Je retrouvais une boucle dans l'assembleur, avec des chargements mémoires non alignés et des additions scalaires. Cela est dû à deux problèmes :

  • cette boucle est une boucle runtime et pas une boucle compile time (ce qui est possible à réaliser puisque la taille est connue à la compilation).
  • la structure myvect n'est pas alignée comme il faut

De même, pour un export vers une librairie, il s'agissait de s'abstraire du type myvect pour prendre n'importe quel type de vecteur.

Pour écrire une boucle compile-time, il me fallait d'abord des opérateurs d'accès mémoire template. De même, pour l'alignement, il fallait rajouter un attribut. Le vecteur réécrit est donc de la forme :

#ifdef _MSC_VER
#define ALIGNED(x) __declspec(align(x))
#define INLINED __forceinline inline 
#else 
#define ALIGNED(x) __attribute__((aligned(x)))
#define INLINED __attribute__((always_inline))  
#endif

template<typename T, size_t N>
struct ALIGNED(64) myvect {
    T data[N];

    template<int index>
    T get() const { 
        return data[index];
    }

    template<int index>
    void set(const T& v)  {
        data[index] = v;
    } 
};

La fonction slice peut se réécrire pour accepter n'importe quel type de vecteur avec la même signature template :

template<template <typename, size_t> class V, size_t N, typename... Ts>
struct slice_helper {
    template<size_t index, std::size_t... I> 
    static auto inner(std::tuple<const V<Ts, N>&...> vects, std::index_sequence<I...>)
    {
        return std::make_tuple(std::get<I>(vects).template get<index>()...);
    }
};

template<size_t index, template<typename, size_t> class V, size_t N, typename... Ts>
auto slice(const V<Ts, N>&... vectors)
{
    return slice_helper<V, N, Ts...>::template inner<index>(std::make_tuple(vectors...), std::index_sequence_for<Ts...>{});
}

De la même façon, nous pouvons définir une structure déroulant la boucle à la compilation :

template<size_t index, template<typename, size_t> class V, size_t N, typename retS, typename... args>
struct loop_apply_helper {
    template<retS(*funcptr)(args...)>
    struct inner {
        INLINED
        static void apply(V<retS, N>& res, const V<args, N>&... v) {
            res.template set<index>(std::apply(funcptr, slice<index>(v...)));
            loop_apply_helper<index + 1, V, N, retS, args...>::template inner<funcptr>::apply(res, v...);
        }
    };
};

// partial specialization for end of loop 
template<template<typename, size_t> class V, size_t N, typename retS, typename... args>
struct loop_apply_helper<N, V, N, retS, args...> {
    template<retS(*funcptr)(args...)>
    struct inner {
        INLINED
        static void apply(V<retS, N>& res, const V<args, N>&... v) {
        }
    };
};

Avec ces éléments, la fonction vectorize peut alors se réécrire d'une façon plus générique et performance :

template<template<typename, size_t> class V, size_t N, typename retS, typename... args> 
struct vectorize {
    template<retS(*funcptr)(args...)>
    INLINED
    static V<retS, N> func_vect(const V<args, N>&... v) {
        V<retS, N> res;
        loop_apply_helper<0, V, N, retS, args...>::template inner<funcptr>::apply(res, v...);

        return res;
    }
};

Il est temps de passer à un test :

double fmadd(double a, double b, double c) {
    // fused multiply add (should run in only one micro-op)
    return a * b + c;
}

using V = myvect<double, 32>

V vfmadd(const V& a, const V& b, const V& c) {
    return vectorize<myvect, 32, double, double, double, double>::func_vect<&fmadd>(a, b, c);
}

And now, clang 14 with appropriate options (-O3 -std=c++20 -mavx512f) generates the following assembly :

fmadd(double, double, double): # @fmadd(double, double, double)
  vfmadd213sd %xmm2, %xmm1, %xmm0 # xmm0 = (xmm1 * xmm0) + xmm2
  retq
vfmadd(...)
  movq %rdi, %rax
  vmovapd (%rdx), %zmm0
  vmovapd (%rsi), %zmm1
  vfmadd213pd (%rcx), %zmm0, %zmm1 # zmm1 = (zmm0 * zmm1) + mem
  vmovapd %zmm1, (%rdi)
  vmovapd 64(%rdx), %zmm0
  vmovapd 64(%rsi), %zmm1
  vfmadd213pd 64(%rcx), %zmm0, %zmm1 # zmm1 = (zmm0 * zmm1) + mem
  vmovapd %zmm1, 64(%rdi)
  vmovapd 128(%rdx), %zmm0
  vmovapd 128(%rsi), %zmm1
  vfmadd213pd 128(%rcx), %zmm0, %zmm1 # zmm1 = (zmm0 * zmm1) + mem
  vmovapd %zmm1, 128(%rdi)
  vmovapd 192(%rdx), %zmm0
  vmovapd 192(%rsi), %zmm1
  vfmadd213pd 192(%rcx), %zmm0, %zmm1 # zmm1 = (zmm0 * zmm1) + mem
  vmovapd %zmm1, 192(%rdi)
  vzeroupper
  retq

où nous pouvons voir les instructions vmovapd (chargement de 512 bits -- groupés en 8 flottants double précision) et vfmadd213pd (fused multiply add on 512 bits registers).

Le code complet est disponible ici :

Startdown Nation

En 2017, Emmanuel Macron était élu sur son projeeeet de « startup nation ». Nous avons vu ce dont il retournait : des « licornes » sans la moindre substance épuisant des travailleurs à vélo, de la spéculation, des grands groupes siphonnant les aides publiques avant de licencier pour délocaliser. Il fallait que tout change pour que rien ne change : un nouveau visage, une recomposition politique, un nouveau discours, mais la même spoliation capitaliste des fruits de la terre et du travail.

En 2022, le revoilà, « reborn ». Exit la startup nation, place à la grande transformation : démolition du système social, de l’enseignement public et gratuit, de l’hôpital, du chômage. Et toujours plus de transferts de valeur au capital avec la baisse des « impôts de production », nouvelle tétine que le MEDEF file tantôt à Macron, tantôt à Zemmour en passant par le catéchisme des Échos. A nouveau, rien ne changera, à moins peut-être d’un séisme législatif.

Pour autant, quel que soit le gouvernement en septembre, une fois la poussière retombée, il faudra se rendre compte que l’économie française a profondément changé. Elle n’est pas intégralement tertiarisée, n’en déplaise à Serge Tchuruk et Alain Minc. Elle n’est pas toute numérisée, n’en déplaise aux oracles des GAFAM comme l’institut Montaigne. Et elle ne le sera jamais. La politique menée nous a fait perdre nombre de compétences et de sites de production tout en omettant d’en développer d’autres, jugées trop peu rentable (c’est-à-dire moins de 8%). Il faut rompre avec cette logique absurde. La France, sans être les USA ou la Chine, est un grand pays qui doit faire autre chose que des slides à La Défense ou des crypto monnaies dans des « wework » bordelais.

Quarante années de mauvaise gestion, de croyance religieuse dans la magie du marché, de transferts au capital, de soumission à des intérêts étrangers voire de trahisons nous ont ramené à une situation d’économie de rattrapage. Partout les compétences manquent, partout le capital manque et pourtant les besoins sont là. Les désirs aussi. Mais le capital, dans sa grande sagesse, préfère allouer 600 millions à Sorare pour faire une marketplace de cartes panini virtuelles que d’investir dans « l’économie réelle ».

Je récuse pourtant ce terme « d’économie réelle », puisque précisément toute activité humaine est réelle. Je lui préfère, en contraposée, le terme « d’économie gorafisée » pour toutes ces applications qui aspirent le capital et le travail pour produire du vent. Cartes panini NFT, cotons-tiges connectés (oui), immobilier tokenisé (oui – aux USA), fusées en forme de chibre, constellations de satellites, tout ceci doit partir à la poubelle.

Notre chance, c’est que le capitalisme, pour maintenir ses rendements, a évolué jusqu’à ce niveau d’absurde. S’il était plus difficile de critiquer le capitalisme produisant (faisant produire) des ponts ou des lave-linges, il est incomparablement plus facile de démolir le capitalisme qui produit de l’inutile, du ridicule ou du nuisible. Voir ces journalistes de BFMTV s’épater de la nouvelle application de paiement en 12 fois, de telle autre permettant des avances sur salaire ou d’une autre connerie à base de NFT est particulièrement jouissif. A qui parlent-ils ? Savent-t-ils seulement de quoi ils parlent ? Ils parlent de solutions capitalistes à des problèmes capitalistes. Ils parlent de la fuite en avant du capital pour préserver ses rendements, jusqu’à l’absurde.

On pourrait regarder le capital s’enfoncer dans le dernier degré de ridicule et en tirer une sorte de jouissance (comme quand Bezos s’envoie en l’air), mais le problème c’est que tout cet argent est gâché dans des projets qui, non contents de ne rien résoudre, accélèrent la destruction de l’environnement, parfois sous couverts de label RSE ou autre fumisterie. On préférerait que cet argent serve à construire des hôpitaux, des écoles, à payer des fonctionnaires ou des ouvriers décemment à faire de belles choses.

C’est là qu’on en revient à l’éternelle impossibilité stratégique : amender le capitalisme est-t-il possible ? Peut-on lui faire construire des hôpitaux ? L’empêcher de tout détruire en le conservant, quitte à lui mettre la muselière, est-t-il envisageable ? L’exemple fordien nous est ressorti comme argument ultime de possibilité d’un capitalisme « social ». De Gaulle n’a-t-il pas fait la sécu ? – a-ton pu lire récemment. Eh bien non ! De Gaulle n’a pas fait la sécu. De Gaulle a fait le paritarisme, c’est-à-dire une attaque contre la souveraineté des travailleurs. Les patrons et actionnaires des années 60 n’étaient-ils pas plus « raisonnables » ? Eh bien non ! Ils ne l’étaient (et encore) que sous la menace du contre modèle soviétique et d’un monde ouvrier fortement syndiqué et vainqueur de la guerre dans la résistance ou les FFL.

Le capital ne cède rien que dans la peur. Mais avant il se brutalise ou se fascise. Et il est à nouveau en train de se brutaliser et de se fasciser. Fuir dans l’absurde et fuir dans la violence. L’absurde des NFT, la violence des mutilations. Ce sont les deux mêmes symptômes d’une crise profonde du capitalisme qui ne fait que survivre depuis 2008.

Mais alors que faire ? Tourner les armes contre ceux qui nous les donnent.

Certains pourront voter, d’autres s’abstenir. Il est important de mener la bataille dans les institutions, puisqu’elles existent encore. Voter pour la préemption salariale, ça c’est voter ! Voter pour le référendum révocatoire ou constituant, ça c’est voter ! C’est important d’essayer d’avoir des institutions moins pourries et pour beaucoup c’est la seule arme disponible.

D’autres pourront faire grève : contre la réforme des retraites (quelle bataille !), de l’assurance chômage (quel échec qu’elle n’ait pas eu lieu), pour défendre les camarades, pour poursuivre patrons et actionnaires rapaces et récupérer une part des profits vers les travailleurs. D’autres auront la possibilité d’écrire pour espérer convaincre. D’autres pourront se réunir en association, monter des ZAD, des fédérations, mener des enquêtes, polluer des réunions publiques, des assemblées générales, des travaux dirigés à l’école ou l’université …

Et pour les plus privilégiés d’entre nous, dont je fais partie, en plus de soutenir tout ce qui précède, voire de d’y associer dès que possible, il s’agit d’essayer de subvertir le travail pour lui rendre sa valeur. Un grand mouvement écologique s’est levé dans une partie des classes diplômées. Si Total a reculé à Polytechnique (contre toute attente), c’est qu’élèves et jeunes diplômés ont mené la bataille sans frémir pendant plus d’un an. C’était pourtant un enjeu majeur de recrutement pour la major française : il fallait capter des X à la source en leur montrant un visage vert. Mais ils n’ont pas été dupes et ont bouté Pouyanné hors du plateau.

Une journaliste, lors d’un entretien, m’a confié que les RH du CAC 40 commençaient à avoir de la peine à recruter de jeunes X, notamment pour des raisons climatiques. Ce n’est pas facile d’avoir 20 ans en 2020, disait la tomate hydroponique. Mais à 20 ans, qui voudrait travailler pour des entreprises écocidaires ? Maintenant que ce mouvement rencontre le succès, il faut l’étendre.

Il faut que plus personne, dans ces institutions-là, ne veuille travailler pour des entreprises capitalistes criminelles. Sortir de l’X et bosser pour BNP doit devenir une honte. Sortir de centrale et aller faire du trading de NFT doit vous amener au placard. Sortir de l’université pour pricer des paris sportifs ? Inenvisageable. Si c’est en train de commencer à fonctionner pour le climat, ça peut marcher pour le capitalisme gorafisé (voire le capitalisme tout court) puisque c’est la même chose : l’écosystème ne se détruit pas tout seul, ni sous la seule main des pétroliers, il est consciemment détruit par des « investisseurs » avides au sein d’un système qui nous conduit à notre perte.

Mais alors, sans travailler pour ces liquidateurs, travailler pour qui ? En posant la question « pour qui », on mesure déjà le problème du capitalisme. En régime capitaliste, on travaille pour un autre qui, lui, ne fait rien. Il s’agit alors de faire la jonction entre la grande démission (quitter le capitalisme) et la « startup nation » : l’entrepreneuriat généralisé. Entreprenons : nous le pouvons du fait de notre capital culturel, du parachute de notre diplôme, de la rareté de nos compétences sur cette chose qu’on appelle le « marché » du travail. Mais n’entreprenons pas pour faire des startups. Faisons des startdown.

Une startup, c’est l’essence du capitalisme financier poussé à l’extrême : lever des fonds auprès de prêteurs, alors qu’on ne sait encore rien faire, dilapider leur fric pour essayer de faire quelque chose, réussir peut-être et si oui rembourser (en empruntant à un autre) sur des bases de taux d’intérêts usuraires pour compenser les 9 autres boites qui auront échoué. Globalement : une pyramide de Ponzi locale qui s’épuise au moment de la faillite ou de l’IPO, de la clarification des comptes via le licenciement de 25% des salariés pour plaire aux marchés et pouvoir rembourser le dernier tour de table avant de s’enchaîner définitivement aux désiderata des « investisseurs » (aka spoliateurs). C’est un modèle parfaitement adapté (d’un point de vue capitaliste) à une époque ou les capitaux débordent, sont protégés par les politiques des banques centrales, ou les marchés mondiaux sont ouverts et les travailleurs disponibles et vulnérables. Cette époque est révolue.

Une startdown : c’est tout le contraire. Ne pas s’endetter, ou l’absolu minimum auprès d’amis et famille. Ne pas « think big », mais penser viable. Ne pas chercher la croissance ou la fortune, mais le savoir-faire et l’amélioration des procès de production, non au service du capital mais au service des produits, des travailleurs et de l’écosystème. Ne pas penser conseil d’administration, comité exécutif, CFO, CTO, CEO, mais démocratie de travailleurs souverains. Ne pas faire de slide pour investisseurs, mais des formations soudure, informatique, agroécologie, usinage, textile, maçonnerie…

On peut aussi reprendre l’imaginaire startup, mais en le renversant. Après tout, ça relève de la même logique : changer le monde. Mais au lieu de le changer au profit du capital en accélérant son pouvoir de nuisance, on le change au détriment du capital, au service de la démocratie, des travailleurs et de l’écosystème. Il faut aussi savoir sortir du placard efficacement. Aller sur LinkedIn pour dire avec fierté que ça y est, on a franchi le pas. Y aller pour allumer sans trembler les influenceurs « positifs », les traders de crypto et autre fonds d’investissement socialement responsables. On ne lèvera pas 100 millions, on achètera une belle machine, on plantera de bons légumes, on s’associera à un bon ouvrier à parts égales. Si on quitte une entreprise prédatrice ou écocidaire, sortir avec fracas. Des associations comme vous n’êtes pas seul sont là pour vous y aider. Si le monde des startups est ouvertement militant et prosélyte, celui des startdown doit l’être aussi.

Face aux crises qui sont déjà là, il faut deux choses : de la planification et des compétences. La première ne s’obtiendra que par la révolution (par les urnes ou non) à laquelle on doit œuvrer activement. Pour faire des choses complexes, il faut de grandes structures dont le contrôle ne peut se faire qu’à l’échelle nationale. Changer Vinci, Total ou BNP de l’intérieur est impossible et c’est la garantie de l’épuisement pour les individus qui s’y risqueraient. Il faut les contraindre par la préemption, et en préparation la démission, la désobéissance civile, le militantisme écologique et social. En matière de compétences, il faut les récupérer, les développer, les tisser : c’est le seul « petit geste » qui serve à quelque chose. Les grands gestes appartiennent au grand nombre, il est frustrant de les attendre alors qu’on n’y peut pas grand-chose, d’autant que le seul qui soit, c’est de tout cramer pour que rien ne crame. Alors, tout en œuvrant au grand, faisons les petits, d’autant que ceux-ci ne sont pas si petits que ça.

Faire mieux

Grèves, occupations, assemblées générales, manifestations, quoi qu’il sorte de cet affreux second tour, rien de tout cela ne nous sera plus permis s’il est question d’une portée politique conséquente. Ils le voulaient ce second tour, l’opposition entre la fasciste (qui ne le redevient qu’après le premier tour) et le fascisateur (qui essaye, entre deux scéances lunaires psychotiques d’indifférence aux gens, de racler ce qu’il peut d’électorat). Ils le voulaient, ils l’ont. Nous ne le voulions pas, nous l’avons. Même si nous nous y attendions, quelle douleur. Choisir entre un mal connu et douloureux et un autre mal inconnu mais certain. Enfin inconnu, il ne l’est que pour ceux que la haine de Macron aveugle (et qui peut leur en vouloir). On sait, à l’avance, comment se déroulerait un quinquennat Le Pen : du Macron, mais en pire. Le même libéralisme patronal, la même soumission au capital, mais (ouvertement) raciste. Faire payer aux pauvres les profits des actionnaires, c’est l’essence du capitalisme, c’est à dire du macronisme. Faire payer aux immigrés les errances du capital, c’est l’essence du capitalisme raciste d’extrême droite.

Rien ne justifie aujourd’hui de voter pour l’une ou pour l’autre. Quoi qu’il arrive, ce sera le bordel. Les vieux qui votent pour l’ordre, attachés à la « démocratie » en disant « ne vous inquiétez pas on gagnera quand même » (appréciez la conception de la démocratie) votent pour la préservation de leur ordre bourgeois, pour la préservation de leur monde : celui de Macron opposé à Le Pen. Macron, en 5 ans, a mutilé 32 personnes, en a enfermé des milliers, poursuivi des journalistes, en a convoqué d’autres à la DGSI, a livré des armes partout dans le monde qui ont servi à tuer, a réduit la parole publique au plébiscite, a tué Zineb Redouane ou Cedric Chouviat, s’est assis sur le climat, sur ses propres conventions, ses propres engagements. Et quand on les lui rappelle, ses ministres « s’en étouffent ». L’autre, ce sont les financements kazakh, les paiements de cautions de militants accusés de torture (ensuite assassins de rugbymen), les prêts russes, les rencontres avec suprémacistes polonais ou hongrois, le mensonge social (partagé avec Macron), le mensonge européen, le mensonge dans le rapport au capital.

Entre l’un et l’autre il faut ne choisir rien. Ou plutôt choisir autre chose. Le cadre, celui qui fabrique Macron, qui fabrique Le Pen, qui fabrique leur opposition, doit être radicalement remis en question. Dès lors, se poser la question du vote – à ce stade –, c’est déjà abdiquer face à ces institutions vérolées. 40 ans qu’elles nous proposent la même comédie, comme un carnaval médiéval, sévèrement encadré par l’Église, qui permet aux gens l’espace de quelques jours, de laisser libre cours à leurs pulsions pour que le pouvoir puisse mieux les canaliser. Le vote bourgeois en somme, tel qu’il nous est proposé depuis Thiers et de l’ignoble troisième république fondée dans le sang des glorieux communards. Pourtant, refuser le vote, refuser ces institutions, ce n’est pas abdiquer, ni même, bien au contraire, faire abandon.

Vouloir le meilleur, une fois qu’on a goûté au bon, c’est le principe de la démocratie qui s’enrichit de sa propre expérience et ne meurt que de son oubli. L’expérience, on nous la vole depuis longtemps, certains disent depuis 2005, je dis depuis toujours. Elle n’a vécu que de rares fenêtres historiques : 1793, 1848, 1871, 1946. Ca se compte en semaines. Entre temps, le pouvoir nous l’a fait oublier. Plus ou moins difficilement plus ou moins lentement, mais il finit toujours par racler un peu moins que ce qu’on lui a pris. Plus le pouvoir se gargarise de « démocratie » et plus il faut comprendre qu’il en est l’ennemi. Aujourd’hui, certains ont répété à l’envi qu’il y avait urgence, notamment, et avec raison, sur la question climatique et environnementale. « Il nous reste trois ans » dit le GIEC. Que fait l’appareil de EELV ? Négocier des postes qu’ils perdront. Que font certains autres, l’urgence plein la bouche il n’y a pas deux semaines ? Préparer 2027 : cinq ans sur trois. Raté. Disqualifiés.

En vérité je vous le dis : la période politique, celle de l’entre deux tours, est morte. Il n’y a rien à en tirer. Comme disent les zapatistes : « votez ou ne votez pas, mais organisez vous ». Voilà un slogan qui est plus que ça, qui ramène du politique là où il n’y en a plus. Toujours, partout, il s’agit de ramener le politique là où il n’est plus et de s’organiser là où c’est interdit ou impossible – par la force ou la force des choses. Il y a beaucoup de façons de s’organiser, associations, partis, syndicats, manifestations, toutes plus ou moins frustrantes, chacune apportant son lot de satisfaction. Toujours est-il que face au quinquennat qui viendra, quel qu’il soit, chacun avec sa nature et son degré de violence, il ne faudra pas rester seul. Rejoignez ce qui existe, créez ce qui n’existe pas. C’est l’essence de 1984, nous dit Chomsky : « Le truc, c’est de ne pas rester isolé. Si on est isolé, comme Winston Smith dans 1984, alors tôt ou tard on lâche prise, comme il le fait à la fin. Voilà en un mot ce que racontait le roman d’Orwell. En fait, toute l’histoire du contrôle sur le peuple se résume à cela : isoler les gens des uns des autres, parce que si on peut les maintenir isolés assez longtemps, on peut leur faire croire n’importe quoi. Mais quand les gens se rassemblent, alors beaucoup de choses deviennent possibles. ».

Saisir les instants, se réapproprier l’esthétique, lutter seul à sa mesure, à plusieurs, écrire, lire, marcher, dessiner, n’importe qu’elle forme d’action sera la bonne. A la fin, dit Mélenchon malgré la défaite, il s’agira de « faire mieux ». Il a raison. Ses mots sont beaux. Ils rappellent l’histoire : nous avons toujours fait mieux. L’insurrection de Spartacus s’est terminée en kilomètres de crucifiés, celle des jacques en des églises dégorgeant de sang de paysans passés au fil de l’épée, celle des communards en dizaines de milliers de fusillés, celle des gilets jaunes en dizaines de mutilés. Le pouvoir sera toujours violent, mais de moins en moins. Petit à petit, en longue période, il perd. Lentement, mais il perd. Lentement, nous gagnons. A la fin, nous gagnerons. Mais aujourd’hui, qu’est ce qu’on peut faire face à cet immense sentiment d’impuissance qui nous paralyse tous ? Nous ressaisir des armes que nous donne l’ennemi, comme le fait le gladiateur de Spartacus : refuser de mettre à mort notre camarade et tourner l’arme vers celui qui nous la donne pour son plaisir. Les armes que nous avons : ce sont le vote (si faible qu’il soit) ou le non-vote (si faible qu’il soit), mais surtout le travail. Le travail peut se subvertir, en le quittant pour ceux qui comme moi en ont le luxe. Il peut s’arrêter par la grève. Nous sommes les travailleurs, nous sommes les producteurs, nous sommes donc les souverains.

La caduta degli dei

« Il y aura des élections dans les jours qui viennent, nous devrons à tout prix les gagner pour qu’il n’y en ai plus jamais d’autres. » Les damnés, Visconti

. mise en garde supplémentaire : à quelques semaines des élections, ce texte ne saurait représenter l’opinion de l’association ni l’engager aucunement. Il n’engage que son auteur : Régis Portalez

Pour Frédéric Lordon (et Stefano Palombarini), deux options pouvaient se présenter en 2022. L’option faible : pas de front républicain du tout face au front national. L’option forte : le front républicain se reconstitue, mais contre Mélenchon. Il semble qu’une fois de plus Lordon ait eu raison, et même raison deux fois, puisque les deux options se réalisent simultanément.

En 2017, il fallait voter Macron pour faire barrage (dès le premier tour s’il vous plaît) à l’extrème droite. Cette fois, remarquez qu’il n’en est plus question. Marine Le Pen et le Front National bénéficient d’une complaisance qui laisse pantois. Rappelons quelques éléments. D’abord il y a les fondamentaux habituels : programme vide, enfin plus exactement programme économique de Macron avec le fond raciste. Mais il y a aussi du neuf. Axel Lousteau, un proche de Marine Le Pen, a payé la caution d’extremistes violents accusés de torture. Un de ces accusés, le désormais fameux Loïk Le Priol, assassine ensuite par balles le rugbyman Federico Martín Aramburú qui avait eu la mauvaise idée de s’interposer lors d’une agression raciste. Le media a révélé le financement trouble (c’est le moins qu’on puisse dire) du parti par une banque Kazakhe. Ce même media a ensuite subi des intimidations (intrusion dans leurs locaux). Le journaliste ayant enquêté sur ces fonds (Thomas Dietriech), a également subi une intrusion à son domicile. Voilà qui devrait être du pain béni pour des journalistes et des politiciens soucieux de faire barrage. Mais rien…

Le scenario est bien rôdé et il faut que rien ne vienne le contrecarrer. Macron profite de sa stature présidentielle, c’est-à-dire du réflexe légitimiste exacerbé par la peur (Covid, Russie, …), pendant que Marine Le Pen lui assure de gagner au second tour. Par chance, chacun des deux dispose de réservoirs de voix, étrangement constitués dès avant le premier tour. D’un côté, Macron siphonne le vote Pécresse pendant que les élus LR trahissent leur parti et leur candidate, poussés par Nicolas Sarkozy, et rejoignent Macron, comme avait fait le PS cinq ans plus tôt. Pour cela, il n’y a pas grand chose à faire, chaque apparition de Pécresse dans l’espace public ressemble à un numéro du gendarme de Guignol.

Le Pen, de son côté, dispose de Zemmour. C’est-à-dire d’une proposition politique authentiquement fasciste, raciste et qui ne s’en cache même pas. Celui-ci a le mérite d’ouvrir en très grand la fenêtre d’Overton jusqu’à en faire sauter les gonds. A côté, Le Pen passerait pour raisonnable, surtout depuis qu’elle a abandonné la sortie de l’euro. On sait maintenant officiellement qu’elle sera une parfaite alliée du capital et celui-ci sait très bien qu’avec elle rien ne changera pour lui et ses intérêts. Un Macron “père de la Nation”, une Le Pen raisonnable, mais dont on pourra dire que finalement elle ne l’est pas du tout dès 20h01 le soir du premier tour, voilà le tableau rếvé de la démocratie bourgeoise. Zemmour sert donc d’épouvantail, à la fois pour présenter Macron comme un brave démocrate et pour faire relativiser le vote Le Pen et s’assurer de l’avoir au second tour.

Evidemment, tout ce que le petit Paris compte d’éditorialistes décérébrés, de créatures de plateaux, de “journalistes” dont la bonne conscience s’arrête à leur intérêt de classe, de politiciens véreux se rêvant élus et d’assistants ineptes se voyant conseillers joue le jeu de façon parfaitement ostentatoire. Quand Zemmour parle de “grand remplacement”, on s’indigne à peine. Quand il parle de “remigration” et d’un ministère dédié, on trouve ça un peu fort (même s’il s’agit en fait de déporter des concitoyens). Quand il en parle devant des enfants, là c’est un peu trop, mais pas assez pour pousser plus loin la réflexion. Quand il se ridiculise sur le réchauffement climatique – enjeu majeur s’il en est – ou sur les étudiants à la soupe populaire, les machines à abrutissement politique que sont les émissions à la Ruquier tournent ça à la rigolade. Pourtant c’est à mi-chemin entre tragique et terrifiant. C’est qu’il ne s’agit pas de démonter ses thèses, il s’agit de le ridiculiser, c’est-à-dire de dépolitiser la personne mais de garder ses idées comme garantes de l’ouverture de Le Pen.

Tout est bon pour sauver le duel attendu entre le système bourgeois incarné par Macron et son “antisystème fonctionnelle”. Préserver, non pas Zemmour, mais les idées de Zemmour. Taper sur Zemmour, non pas politiquement (on risquerait de taper aussi sur Le Pen), mais sur sa personne pour permettre les reports de voix vers Le Pen. Défendre la “démocratie” dont Macron est le seul rempart face aux extrêmes. Extrêmes dont on s’assure par ailleurs qu’ils arrivent au second tour pour permettre la victoire de la “démocratie”.

Enfin il y a quand même extrêmes et extrêmes. Même si dans le discours hégémonique les extrêmes se touchent (dès qu’ils en ont l’occasion), l’extrême gauche (dans laquelle le capital classe Mélenchon — taxer les riches ? Quelle idée saugrenue) ce n’est pas l’extrême droite. On a pu voir que l’option “faible” – pas de front républicain du tout – se réalise totalement en ce qui concerne l’extrême droite. Mais l’option “forte” – un front républicain se reforme contre Mélenchon – se réalise également, et avant même qu’il ait une chance sérieuse d’accéder au second tour et alors qu’il ne représente pas franchement une position extrême. Pour François Hollande, “Mélenchon représente un danger pour la démocratie”. Ce pauvre Jean-Luc ne peut pas sortir avec des chaussettes dépareillées sans que tout l’appareil médiatique ne l’accuse de complaisance avec Chavez, avec l’islamisme, avec Poutine, demain ce sera avec Staline ou la Corée du Nord.

Un front unanime s’est formé. Dès qu’ils ont le temps entre un silence sur Le Pen et une rigolade sur Zemmour, les résidus informes du PS incarnés Anne Hildago ou le mégalomane très atlantiste Yannick Jadot chantent en chœur avec tous les macronistes que le danger est là, que Mélenchon c’est Poutine à nos portes, c’est les rouges au couteau entre les dents. C’est la déstabilisation de la “démocratie” (celle qui éborgne, gouverne par conseils de défense et précarise avant de recommander de traverser la rue). Et il n’est pas au second tour, à peine à 15%. Imaginez quel concert de chats crevés on entendrait s’il passait devant Le Pen. Alors ils feront tout pour que ça n’arrive pas. Et si ça arrive (contre qui que ce soit), ce sera l’union sacrée.

Sous nos yeux se déroulent les dernières convulsions des blocs sociaux issus de l’après-guerre. Le bloc bourgeois a absorbé le PS. Le bloc de droite absorbera LR sans perdre le PS, définitivement radicalisé bourgeois. L’enjeu est d’empêcher la reconstitution d’un bloc de gauche et de finir de provoquer son effondrement, comme cela a déjà eu lieu en Italie ou à d’autres périodes historiques. Comme dans Les Damnés, de Visconti, tous les murs tombent et tous les crimes deviennent possibles. Les gens, même les plus honnêtes, s’ils ne tiennent pas une ligne politique de fer, finiront de compromission en compromission par se faire manger par la gangrène. Dans le film, rien n’y résiste – sinon par la mort – soyons certains que le scenario est universel. Rien ne résiste à la simplicité d’une proposition violente quand il s’agit de préserver des intérêts vitaux bien réels (le capital) ou fantasmés (les valeurs de l’Europe) servant à faire avaler aux pauvres les premiers, contre leur propre intérêt.

En laissant la porte ouverte au pire pour préserver le capital et les intérêts bourgeois, ce bloc de droite ne pourra que continuer de céder toujours plus. Les mêmes qui, il n’y a pas cinq ans hurlaient au retour des “nationalismes” se retrouvent à chanter la force de l’Europe et de ses “valeurs”. Les unes du Point ou de l’Express nous mettent en garde contre ceux qui en veulent à l’Occident. Ils reprennent un discours nationaliste pour défendre une structure de capitalisme institué : l’Union Européenne. En politique intérieure, il ne leur restera que la force pour réprimer et la violence comme discours politique. L’Union Européenne, qui ira forcément vers plus d’intégration et de fédéralisme pour “peser”, risque bien de se retrouver en capitalisme constitué traversé de forces violentes. C’est-à-dire précisément un ennemi mortel de la Démocratie (la vraie). Pour les deux mois à venir, la solution est à l’isoloir, pour la suite elle sera dans l’acrostiche.

Déstabilisations

Texte d’une intervention au colloque intelligence économique qui s’est tenu au Sénat à l’initiative de Marie-Noëlle Lienemann. La vidéo de la table ronde est en bas du texte

Mesdames les sénatrices, messieurs les sénateurs, mesdames messieurs,

Merci aux intervenants précédents, merci à madame la sénatrice Lienemann pour son invitation sur le thème « L’industrie française est en danger, que faire ? Quelles sont nos armes dans les nouvelles guerres économiques ? ».

Il est heureux qu’enfin, la classe politique se soucie d’un phénomène qui appauvrit les français, affaiblit notre économie, notre Nation et donc également notre démocratie depuis 40 ans. Du PCF à LR, tout le monde semble enfin se soucier de la question. Pourtant, j’ai de sérieux doutes quant à cette prise de conscience. Les discours se ressemblent, et ressemblent surtout à ceux concernant le « réchauffement climatique ».
Ni le réchauffement climatique, ni la destruction de l’environnement, ni celle de notre industrie ne sont le fait de lois universelles. Le libre échange, le capitalisme, l’UE, ne sont pas des lois immuables comme le sont la gravitation ou la thermodynamique. Les lois de l’économie sont d’abord sociales. On peut donc les changer. Pour autant ces lois sont le fruit de rapports de force, et il faut reconnaître qu’aujourd’hui la force est à l’argent et à la finance, ni à l’industrie ni à l’environnement.

Mais revenons d’abord sur des constats universellement partagés (retrouvez les chiffres dans ce document) :

De 1974 à 2016, l’industrie a perdu 2.3 millions d’ETP. La part de l’industrie dans la valeur ajoutée nationale est passée de 23 % à 11 %, faisant de la France le pays le plus désindustrialisé d’Europe, derrière la Grèce. Pour autant, les produits industriels représentent encore près de 30 % de la demande intérieure. Cette dégradation a conduit à plusieurs choses :
– un grave déséquilibre de notre balance commerciale ;
– un chômage de masse impossible à résorber (rappelons qu’un emploi industriel génère 3 ou 4 emplois induits) ;
– la mise en dépendance de la Nation sur nombre de produits, parmi lesquels des produits stratégiques.

Ce dernier point s’est particulièrement révélé avec la crise sanitaire et notamment les pénuries de masques (remercions l’industrie textile quasi entièrement délocalisée), de principes actifs, psychotropes ou anesthésiques (on pourrait parler de Sanofi). Aujourd’hui, des usines Renault ou Peugeot sont mises à l’arrêt du fait des pénuries en composants électroniques. Des pénuries de matières premières diverses (graviers, bois, aciers, etc) mettent à mal des secteurs pourtant dynamiques comme le BTP.

Si l’on veut enrayer le phénomène, voire inverser la tendance, il faut commencer par en identifier les causes.
Tout d’abord tordre le cou à l’idée que nos problèmes seraient dus à la lourdeur des charges et autres impôts de production. Dans l’industrie, le taux de marge atteint près de 40 %, soit plus que l’ensemble des sociétés non financières. En 2021, le taux de marge des entreprises a atteint un niveau record depuis 1945. Il faut faire ici une parenthèse et rappeler que l’impôt sur les bénéfices recule presqu’aussi vite qu’augmentent les subventions et allègements de charges (CICE, CIR en tête), eux même à la traîne derrière la rémunération du capital.

Parmi les raisons de la désindustrialisation, on peut citer par contre des facteurs bien connus et identifiés. Je pense notamment
– aux délocalisations, dont la moitié se fait au sein de l’UE  ;
– à un taux de change défavorable (ainsi que la perte de l’outil monétaire) depuis l’introduction de la monnaie unique ;
– au dogme de la tertiarisation, commencé dès les années 80, selon lequel il fallait nous concentrer sur la plus forte valeur ajoutée et délocaliser les productions moins rémunératrices ;

La responsabilité de la financiarisation de l’actionnariat commence également à être pointée, certains regrettant l’actionnariat familial, supposément plus humain et responsable, pourtant si bien documenté par Émile Zola. Il faut bien reconnaître que le capitalisme financiarisé ne se soucie ni de l’environnement, ni de la France, ni de l’outil de production, ni des salariés, et qu’en ça, il est le pire des capitalismes en tant que sa forme terminale. Mais nous faisons ici une réflexion, si j’ai bien compris, à institutions constantes. Il n’est donc pas question de renverser le capitalisme, financiarisé ou non ni l’Union Européenne, austéritaire ou non.

En tout cas, je dirais que la première source de déstabilisation de notre industrie, c’est le comportement de nos actionnaires, de nos politiques et de nos patrons. Ceux-ci ont délocalisé pour accroître ou conserver les marges (Serge Tchuruk et sa fameuse industrie sans usine) ou vendu à l’étranger (Alstom, Technip, Alcatel, Pechiney, etc). Ils ont transformé les grands groupes en centres de profits qui pressurent des sous-traitants devenus incapables d’investir et de se développer.
La deuxième, c’est celui de notre classe politique qui se gave de mots, d’action, de lutte, de combat (faut-il rappeler vraiment la promesse d’Emmanuel Macron de revenir voir les Whirlpool?). A chaque fermeture d’usine, ils sont prompts à «  battre » et sitôt les élections passées, ils reviennent négocier des accords de libre échange qui nous mettront encore plus à mal.

Afin d’illustrer mon propos, je voudrais vous raconter l’histoire de MBF, une fonderie aluminium dans le Jura (l’histoire peut se transposer à n’importe laquelle des autres fonderies alu). En 2016, un actionnaire étranger, Gianmario Cola, rachète l’entreprise. Ses clients industriels (Renault et Peugeot) passent une commande pour répondre à laquelle M. Colla a mis en gage l’intégralité des actifs de l’entreprise. En même temps, comme on dit, il organisait l’évasion de la trésorerie de MBF vers le Luxembourg via des droits de transferts et des royalties. Cette année, l’entreprise est en liquidation. Les salariés ont un beau plan de reprise bien ficelé, mais Renault et Peugeot ne veulent plus passer commande parce qu’entre temps, l’UE a décidé de la fin de la voiture thermique. Évidemment, personne à Bruxelles n’aura réfléchi aux milliers de salariés impactés par cette décision. Ni amortisseur social, ni stratégie de reconversion industrielle. A Bercy, à l’assemblée nationale, bien peu s’en émeuvent.

On a là un exemple qui illustre les points dont je parlais précédemment : un actionnaire véreux, des structures supranationales bureaucratisées et idéologues, une libre circulation des capitaux utilisée à siphonner la valeur, et enfin des politiques au mieux dépassés, au pire incompétents et faibles.

Un autre exemple, passé complètement sous les radars. SOMAB, ex Ernault-Somua (ex grand leader des machines-outils de précision), fournisseur du CEA pour des machines capables d’opérer en environnement radioactif, s’est fait racheter par un fonds chinois. Je les ai rencontrés. Leur actionnaire est dormant, mais pour combien de temps ? Qui s’est occupé à Bercy, en ministère, de vérifier que l’actionnaire entrant n’allait pas siphonner les brevets avant de partir, ce qu’il peut faire à tout moment ?

Que faire alors pour se protéger de ces déstabilisations, le tout sous la contrainte de rester à institutions constantes ?
Cette contrainte est bien lourde décidément, parce qu’à force d’évacuer sous le tapis la question d’institutions qu’on croit immuables (alors que rien n’est plus mutable que des institutions, pour la peine qu’on veuille les changer), on en est à discuter de bouts de ficelle. L’État peut jouer sur un taux ou un autre et les administrations courir après toujours plus de lièvres à la fois.

Essayons toutefois de nous prêter à l’exercice.

A institutions constantes, on doit déjà protéger ce qu’on a encore. Il est urgent d’identifier les entreprises stratégiques (et pas seulement les grands groupes mais aussi leurs fournisseurs, y compris des PME). Dans l’urgence, je pense notamment à STMicroelectronics, dont il faudrait sécuriser le capital, pourquoi pas à parité avec l’Italie (voir nos travaux sur le numérique). Un rachat par GlobalFoundries, Samsung ou Huawei serait une catastrophe à la mesure de celle que va être le rachat d’ARM par NVIDIA.
Dans notre réseau de PME et ETI, il faut ausculter chaque micro-filière (machine-outils, moteur électrique, etc), y identifier des entreprises importantes, l’état du capital de chacune, leur trésorerie, leur carnets de commande etc. Cela suppose de doter l’État de moyens d’audit, de contrôle, d’intervention et de sanction (je ne sais pas dans quelle état sont nos capacités à ce sujet).

A institutions constantes, on peut commencer par l’utiliser. A Bercy, via l’Office des investissements étrangers, on peut s’opposer à une cession à l’étranger. Ce recours a été utilisé pour photonis, producteur de matériel de vision nocturne. Si c’est possible, pourquoi ne pas le faire plus systématiquement ? Pourquoi ne pas l’avoir faire pour Alstom ? Pour Alcatel ?
De la même manière, en tordant à peine le droit européen, la commande publique pourrait être fléchée sur l’industrie nationale via des clauses spécifiques dans les appels d’offre. Les allemands ne se gênent pas ! Pourquoi pas nous ?

A institutions constantes, on peut investir dans la R&D, par exemple en arrêtant d’attribuer du CIR aux banques et à la grande distribution. Ou encore en finançant le lycée professionnel, les écoles d’ingénieurs ou l’université.

A institutions constantes, il est également possible de poursuivre et punir nos naufrageurs bien à nous. Comment comprendre qu’un Patrick Kron (Alstom), qu’un Serge Tchuruk (Alcatel), qu’une Anne Lauvergeon (Areva), puissent passer leurs temps dans des conseils d’administration, le portefeuille bien garni de millions de bonus, alors qu’ils ont littéralement liquidé des groupes stratégiques ? Il faudrait les poursuivre et qu’ils soient comptables devant la représentation nationale et les français.

A institutions constantes, on peut aussi se doter d’une stratégie. Il ne sert à rien de saupoudrer des milliards indifféremment. Il faut planifier. C’est ce que font les américains, les chinois, les russes, les allemands.

A institutions constantes, il faut arrêter d’être naïfs, les autres pays, y compris nos « alliés » et nos voisins, ne sont pas nos amis.

Enfin, il faut arrêter de raisonner à institutions constantes, mais raisonner à France constante, et faire coller enfin le droit aux intérêts de la Nation plutôt que la Nation à la réalité éthérée d’un droit édicté par des intérêts particuliers.

La vidéo de la table ronde :

Une ambition pour l’industrie française

La situation de l’industrie française était déjà extrêmement préoccupante.
Démantèlements, cessions, désinvestissement et politiques publiques insuffisantes ou inadaptées ont fait régresser les capacités industrielles françaises. Ce constat est apparu violemment dans le contexte de la pandémie. L’incapacité à produire ou importer des équipements hospitaliers essentiels a aggravé la crise sanitaire.
Le sous-équipement des personnels hospitaliers les a mis en danger. L’absence de tests et la saturation du système de santé ne nous ont laissé que le confinement général comme moyen de protéger les populations. Celui-ci se mesurera bientôt en faillites et chômage, affaiblissant d’autant plus un tissu économique et industriel déjà fragilisé. Par ailleurs, la politique déflationniste envisagée par le gouvernement visant à renforcer la compétitivité des entreprises en baissant les salaires risque au contraire de déprimer la demande intérieure, aujourd’hui tournée pour près de moitié vers les produits industriels. Ce qui risque de se jouer, en plus d’une catastrophe sociale, c’est unaffaiblissement supplémentaire de nos capacités industrielles. Dans certains secteurs, le choc risque d’être létal et nécessite une réponse d’ampleur. Continuer de laisser mourir ou délocaliser trop l’industrie nous exposerait à une vulnérabilité encore accrue en cas de nouvelle pandémie ou de catastrophe climatique.

Cette note propose un tableau de la désindustrialisation en France depuis les années 1970, une évaluation de ses conséquences économiques et budgétaires ainsi que des propositions pour remédier à la situation, dans le contexte d’une rupture écologique nécessaire.

Ce travail est disponible sous licence GPL v2 sur notre github.