[gull] Above Meltdown & Spectre
Daniel Cordey
dc at pxcluster.com
Wed Feb 7 22:21:33 CET 2018
On 07. 02. 18 21:04, Marc Mongenet wrote:
> Bonjour
>
> Le 7 février 2018 à 00:22, Daniel Cordey <dc at pxcluster.com> a écrit :
>> Sachant que la majorité du code se résume à l'exécution de LOAD & STORE
>> (mesure sur des millions de lignes de code ayant permit de définir
>> l'architecture HP-PA, ~80% !!!),
> Il doit y avoir un malentendu, car la notion de ligne s'applique au code source,
> tandis que la notion LOAD/STORE s'applique aux instructions machine.
Statistiques collectées à l'aide de l'analyse de millions de lignes de
code source de différents langage !
> Et il est difficile d'imaginer un programme exécutant 80% de load/store.
> Même avec des compilateur d'il y a 25 ans sur une architecture pauvre
> en registres comme x86,
:-) Toutefois, c'est cette analyse qui a mené à la création de
l'architecture PA-RISC. PA signifiant justement Precision Architecture
parce que son jeu d'instruction et son architecture avait été pensée sur
la base de cette collecte de statistiques. C'est Joel Birnbaum qui est à
dirigé la conception de PA-RISC, puis par la suite d'Itanium
(magnifiquement mal géré par les équipes marketing d'HP et Intel en
prenant 5 ans de retard dans le dévelopement !). Birnbaum est aussi à la
base du premier processeur RISC chez IBM (IBM 801)...
> il n'y a que 34% de load/store dans l'exécution
> des benchmarks SPECint92 (ref: Computer Architecture a Quantitative
> Approach, 2nd edition, p.81).
Justement le parfait exemple du toy-benchmark débile auquel presque tout
le monde fait référence. Ce qui est dommage est que ces performances ne
se traduisent pas par des comportements aussi magnifique dans les
application générale. SpecInt ne mesure que la capacité à faire toujours
la même boucle et en utilisant un nombre restreint de registres... comme
on ne peut décemment pas se contenter de boucler sur 3 valeurs... on lui
donne un vecteur à manger... qui va utiliser la cache, mais de manière
séquentielle. C'est comme de définir la performance d'un disque en
donnant uniquement ses performances en streaming... la réalité des accès
aléatoire est toute autre. Il en va de même avec les benchmark. Tout ça
pour dire que SPECInt ne permet que de démontrer la capacité d'un CPU a
enchaîné les opération arithmétique sur des entiers. Il faut aussi noter
que depuis 1992 (plus de 25 ans), SPECInt a été complété et est
maintenant composé de plus de benchmarks. Mais ce qui est intéressant
est que :
The SPECint2006 test suite consists of 12 benchmark programs, designed
to test exclusively the integer performance of the system. (wikipedia)
Donc, il est évident que ce genre de benchmark tend justement à
minimiser les LOAD/STORE... Néanmoins, on voit que dans un test purement
conçu pour tester uniquement les performances de l'ALU sur des entiers
on a quand même 34% de LOAD/STORE; je suis d'ailleurs même impressionner
qu'il y en ait autant dans ce genre de tests. Ce qui fait que l'on
imagine bien que dans d'autres tests plus généraux on va se rapprocher
de cette fameuse valeur de 80% :-)
> Selon la même source, il y a 20% de branchements conditionnels.
Oui... mais on ne peut pas se contenter de faire une simple règle de
trois pour spéculer sur le gain de performance. Il est indéniable que
les techniques de "branch optimisation" limite la casse, mais leur
impact est souvent moins spectaculaire que ce que l'on pourrait croire.
D'abord on a souvent de nombreux "branch" dans le code, qui sont
imbriqués dans des boucles et le CPU n'a qu'un nombre limité de
registres collectant l'historique des "branch" sur une adresse donnée.
Il y a donc des situation où, de toute façon, on a quand même un branch
miss. Oui, on perd 8-10 cycles (ou même un peu plus) dans ce cas... mais
c'est à mettre en perspective avec les 120-170 cycles qu'il faut à la
dernière génération de CPU-Server d'Intel pour aller récupérer une
donnée dans la cache L3 ! Ce qui fait que, sur un benchmark de web
serveur, l'impact du "branch prediction" fait sourire à côté du reste.
> Avec des pipelines d'aujourd'hui de plus de 10 étages,
Le processeur RISC de DEC avait déjà 10 étages à la fin des années 80...
MIPS et SPARC en avait sauf erreur 8, etc. Donc, rien de très nouveau...
> supprimer l'exécution
> spéculative (correcte dans bien plus de 90% des cas) aurait un effet
> dévastateur sur les performances:
... des toy benchmarks.
> il y aurait une bulle dans le pipeline
> tant que le branchement ne serait pas retiré, donc durant presque
> autant de cycles qu'il y a d'étages de pipeline.
Je suis capable d'écrire un benchmark qui va faire un "branch miss" à
chaque boucle en faisant une boucle très courte. Bien sur, j'aurais un
"pipe flush" à chaque coup, mais ma prochaine instruction sera dans la
cache L1... Je connais tout ça depuis... 1986.
dc
More information about the gull
mailing list