L' article de Wikipedia sur EPIC a déjà décrit les nombreux dangers communs à VLIW et EPIC.
Si quelqu'un ne comprend pas le sentiment de fatalisme de cet article, laissez-moi souligner ceci:
Les réponses de chargement à partir d'une hiérarchie de mémoire comprenant des caches de processeur et de mémoire vive dynamique n'ont pas de délai déterministe.
En d'autres termes, toute conception matérielle qui ne parvient pas à gérer (*) la latence non déterministe à partir de l'accès à la mémoire deviendra tout simplement un échec spectaculaire.
(*) Par "faire face", il est nécessaire d’obtenir des performances d’exécution raisonnablement bonnes (en d’autres termes, "coût compétitif"), ce qui nécessite de ne pas laisser le processeur tourner au ralenti pendant des dizaines à des centaines de cycles.
Notez que la stratégie d’adaptation utilisée par EPIC (mentionnée dans l’article de Wikipedia référencé ci-dessus) ne résout pas le problème. Cela indique simplement que le fardeau d'indiquer la dépendance des données incombe maintenant au compilateur. C'est très bien; le compilateur a déjà cette information, il est donc facile pour le compilateur de s'y conformer. Le problème est que le processeur va toujours rester inactif pendant des dizaines à des centaines de cycles sur un accès mémoire. En d’autres termes, il extériorise une responsabilité secondaire tout en ne s’acquittant pas de la responsabilité première.
La question peut être reformulée de la manière suivante: "Étant donné qu'une plate-forme matérielle est vouée à un échec, pourquoi (1) ne peut-il pas (2) les rédacteurs du compilateur ne pourraient-ils pas faire un effort héroïque pour le racheter?"
J'espère que ma reformulation rendra la réponse à cette question évidente.
Il y a un deuxième aspect de l'échec qui est également fatal.
Les stratégies d'adaptation (mentionnées dans le même article) supposent que la prélecture basée sur logiciel peut être utilisée pour récupérer au moins une partie de la perte de performance due à une latence non déterministe à partir d'un accès à la mémoire.
En réalité, le préchargement n’est rentable que si vous effectuez des opérations de streaming (lecture de la mémoire de manière séquentielle ou hautement prévisible).
(Cela dit, si votre code permet un accès fréquent à certaines zones de mémoire localisées, la mise en cache aidera.)
Cependant, la plupart des logiciels à usage général doivent créer de nombreux accès en mémoire aléatoire. Si nous considérons les étapes suivantes:
- Calculez l'adresse, puis
- Lire la valeur, puis
- Utilisez-le dans certains calculs
Pour la plupart des logiciels à usage général, ces trois opérations doivent être exécutées rapidement. En d'autres termes, il n'est pas toujours possible (dans les limites de la logique logicielle) de calculer l'adresse à l'avance ou de trouver suffisamment de travail à faire pour combler les lacunes entre ces trois étapes.
Pour aider à expliquer pourquoi il n’est pas toujours possible de trouver assez de travail pour remplir les stands, voici comment le visualiser.
- Supposons que pour masquer efficacement les stalles, nous devons remplir 100 instructions qui ne dépendent pas de la mémoire (elles ne souffriront donc pas de latence supplémentaire).
- Maintenant, en tant que programmeur, veuillez charger n'importe quel logiciel de votre choix dans un désassembleur. Choisissez une fonction aléatoire pour l'analyse.
- Pouvez-vous identifier n'importe où une séquence de 100 instructions (*) exclusivement libres d'accès à la mémoire?
(*) Si nous pouvions faire NOP
un travail utile ...
Les processeurs modernes essaient de gérer la même chose en utilisant des informations dynamiques - en suivant simultanément les progrès de chaque instruction lors de leur circulation dans les pipelines. Comme je l'ai mentionné plus haut, une partie de cette information dynamique est due à une latence non déterministe de la mémoire. Par conséquent, elle ne peut être prédite avec une extrême précision par les compilateurs. En général, il n’ya tout simplement pas assez d’informations disponibles au moment de la compilation pour prendre des décisions qui pourraient éventuellement combler ces lacunes.
En réponse à la réponse de AProgrammer
Ce n'est pas que "le compilateur ... extraire le parallélisme est difficile".
La réorganisation de la mémoire et des instructions arithmétiques par les compilateurs modernes est la preuve évidente qu'il n'a pas de problème à identifier les opérations indépendantes et donc exécutables simultanément.
Le problème principal est que la latence non déterministe de la mémoire signifie que le "couplage d'instructions" que l'on a codé pour le processeur VLIW / EPIC finira par être bloqué par un accès mémoire.
L'optimisation des instructions qui ne se bloquent pas (arithmétique en registre uniquement) n'aidera pas les problèmes de performances causés par des instructions très susceptibles de se bloquer (accès à la mémoire).
C’est un exemple d’échec dans l’application de la règle d’optimisation 80-20: l’optimisation des choses déjà rapides n’améliorera pas sensiblement les performances globales, à moins que les choses plus lentes soient également optimisées.
En réponse à la réponse de Basile Starynkevitch
Ce n’est pas "... (peu importe), c'est difficile", c’est que l’EPIC ne convient pas à une plate-forme qui doit faire face à un fort dynamisme en matière de latence.
Par exemple, si un processeur présente toutes les caractéristiques suivantes:
- Pas d'accès direct à la mémoire;
- Tout accès en mémoire (en lecture ou en écriture) doit être planifié par transfert DMA;
- Chaque instruction a la même latence d'exécution;
- Exécution en ordre;
- Unités d'exécution larges / vectorisées;
Ensuite, VLIW / EPIC conviendra parfaitement.
Où trouve-t-on de tels processeurs? DSP. Et c’est là que VLIW a prospéré.
En rétrospective, l’échec d’Itanium (et la poursuite des efforts de R & D, malgré des preuves évidentes) est un exemple d’échec organisationnel et mérite d’être étudié en profondeur.
Certes, les autres projets du fournisseur, tels que l'hyperthreading, le SIMD, etc., semblent avoir beaucoup de succès. Il est possible que l’investissement dans Itanium ait eu un effet enrichissant sur les compétences de ses ingénieurs, ce qui leur a peut-être permis de créer la prochaine génération de technologies performantes.