HISTOIRE DES UNITES CENTRALES DES ORDINATEURS
©2002 Jean Bellec
en construction
Je pensais au début décrire l'évolution des processeurs mais il m'a semblé préférable d'y adjoindre au moins partiellement les évolutions des architectures des mémoires principales et des canaux d'entrées-sorties, ainsi que les évolutions de l'architecture sous l'angle de vue du concepteur de processeurs. Les ordinateurs sont largement les descendants des calculatrices numériques capables d'effectuer une opération sur des nombres introduits par l'opérateur ou stockés dans des registres. L'utilisation de circuits électroniques pour replacer les mécanismes d'horlogerie ou la logique à relais permit de faire des opérations élémentaires beaucoup plus vite qu'auparavant. Si de nombreuses applications de gestion pouvaient se contenter de ces opérations (addition, soustraction, multiplication, pourcentage), beaucoup d'applications militaires et scientifiques nécessitaient l'exécution d'un algorithme c'est à dire d'une séquence d'instructions. La puissance des calculateurs capables d'exécuter des séquences d'instructions fut démontrée par Alan Turing avant même l'avènement du premier ordinateur. Les calculatrices à programme enregistré (y compris les programmes par cartes et les automates) ont comme élément principal des instructions qui spécifient la commande à exécuter et les opérandes concernés par cette commande (en général des registres de calcul). La commande peut être spécifiée dans l'instruction sous forme décodée comprenant un bit par porte à valider dans les circuits de commande des alimentations d'opérandes ou des opérateurs, solution gagnant du temps, mais généralement onéreuse ou sous forme codée, solution généralement employée mais prenant le temps de la décodification. La nature des opérandes dépendait des applications. Les applications de statistiques et de comptabilité nécessitaient essentiellement des opérations sur des nombres représentés extérieurement sous forme d'un ensemble discret de chiffres; elles avaient par ailleurs à se préoccuper de faire des opérations (comparaison) sur des libellés codés en alphanumérique . Les applications scientifiques et techniques recherchaient des opérations rapides favorisées par une représentation binaire des nombres. Deux problèmes aux solutions assez largement contradictoires se sont posés aux designers pendant les années 1950: la diminution du coût des machines et l'augmentation de leurs performances. La réduction de coût semblait devoir être atteinte par une architecture "série" pouvant se contenter d'opérateurs sur un seul bit. Quelques registres de travail toujours disponibles, des mémoires d'accès série basées sur des tambours magnétiques ou des lignes à retard conduisaient à une architecture simple et relativement économique. Cependant, les machines mécanographiques étaient déjà des machines parallèles (sur 12 ou 80 bits) et le traitement par l'ordinateur nécessiterait des conversions parallèle/série et série/parallèle, et par ailleurs une machine série était par construction au moins un ordre de grandeur plus lente qu'une machine parallèle. Des compromis entre ces deux architectures furent réalisés comme les machines dont le parallélisme était limité à un caractère, solution fort répandue en 1960 et qui représentait un bon compromis pour les machines de gestion. Si certaines calculatrices électroniques initiales exécutaient leurs
opérations en étant synchronisées par une source mécanographique extérieure, on
constata assez tôt que la mise au point de séries de calculateurs asynchrones
présentait de grandes difficultés en particulier dues à la variation des
caractéristiques physiques des composants électroniques (tubes et semi-conducteurs) et
on imagina de synchroniser intérieurement l'ordinateur par une horloge interne ou plus
exactement un oscillateur de synchronisation des opérations (on disait parfois
unification). Cet oscillateur (généralement contrôlé par un simple circuit RC était
assez facilement réglable et le ralentissement de l'horloge pouvait être une solution à
une certaine fatigue de composants). Le développement de calculateurs entièrement ou
partiellement asynchrones resta un sujet de discussion. La synchronisation par horloge
alignait les performances sur les opérateurs les plus complexes et les composants les
plus douteux, elle introduisait des retards intrinsèques dans la machine. Cependant, la
plupart des designs de processeurs asynchrones -et chaque constructeur en a étudié, se
traduisirent par des échecs traumatisants qui découragèrent la recherche de meilleures
options de conception de telles machines. L'analyse des algorithmes conduisit immédiatement au souci de définir des instructions conditionnelles à exécuter en fonction de la valeur des résultats des opérations précédentes. Il était relativement facile à réaliser des indicateurs de résultats à partir de l'opérateur de calcul (indicateur de report -carry- et indicateur de signe). Un indicateur d'identité souvent codé avec les deux premiers complétaient les registres de la machine, plus ou moins cachés au programmeur. Au début, une des solutions pour assurer l'enchaînement des instructions d'un même algorithme fut de prolonger le mot d'instructions par l'adresse de l'instruction suivante. Cette approche permettait de ranger l' instruction suivante sur le tambour à une distance variable dépendant de la durée d'exécution de l'instruction en cours. Cependant, cette solution était encombrante et on lui préféra la solution du compteur d'instruction (program counter) qui contient en permanence l'emplacement de l'instruction suivante généralement consécutive à celui de l'emplacement en cours. Dans les ordinateurs à instructions de longueur constante, ce compteur est incrémenté de 1 mot par cycle, dans le cas où les instructions sont de longueur variable (ex: S/360) ce compteur est incrémenté de la longueur de l'instruction. Les instructions conditionnelles et les instructions répétées (boucles ou itérations) sont réalisées le plus souvent par une instruction de chargement du compteur d'instructions (JUMP ou BRANCH). |
Un grand débat à l'origine des ordinateurs qui se poursuit jusqu'à aujourd'hui a été celui de la banalisation de la mémoire entre programmes et données. L'architecture banalisée dite de von Neumann triompha au milieu des années 1950, par suite de la similitude des deux éléments, similitude augmentée par la programmation automatique. Il était également considéré comme primordial de pouvoir modifier dynamiquement les instructions pour pouvoir adresser des données différentes (ex: tableaux de variables) avec les mêmes instructions. D'autres considérations de micro-optimisation (stockage de constantes) militaient aussi pour cette uniformisation de la mémoire. Il faut noter que des alternatives à la modification dynamique des programmes pour la gestion des tableaux furent fournis par la mise au point des registres d'index et par l'établissement de l'adressage indirect qui permettaient de désigner une mémoire contenant non pas les données mais l'adresse des données. Plus tard, se rajoutèrent la possibilité de cascader plusieurs registres d'index ou des descripteurs indirects. Il arriva sur des machines des années 1960 que la durée de préparation des instructions devenait impossible à prévoir et qu'il devint nécessaire de prendre des précautions contre la possibilité de programmer des instructions sans fin avec de tels mécanismes. La mémoire a été du temps des mémoires à tambours ou des tubes de
Williams adressée par l'adresse physique (n° de tête, n° de mots sur la piste), puis
avec la généralisation des mémoires à tores, les positions de mémoire (mots de 1 ou
plusieurs caractères ou chaînes de bits de longueur fixe) furent désignés par des
adresses de valeur continues. Un autre débat règna entre les partisans d'un adressage binaire et ceux d'un adressage décimal. Les seconds arguaient de la disponibilité d'un additionneur décimal qui pouvait être réutilisé pour les calculs d'adrresse ainsi que d'une meilleure lisibilité externe des valeurs d'adressage. Le spremiers firent triompher leur point de vue dès la fin des années 1950 et définitivement quelques années plus tard en montrant la plus grande simplicité de l'unité de commande d'adressage. Une controverse qui dura plus longtemps (et dure encore) fut le choix entre faire les opérations arithmétiques directement sur la mémoire ou de les limiter à des opérations sur des registres. La seconde théorie, qui permettait d'utiliser des zones d'adressage plus courtes pour les opérations arithmétiques, fut même poussée à l'extrême dans les machines à piles où la position des opérandes était implicite. Seules des opérations de lecture ou d'écriture en mémoire principale citaient des adresses complètes. L'autre débat concernait le nombre d'opérandes explicites citées dans une instruction. Certains estimaient que la logique des instructions du type " c=a + b" sous-entendait l'usage d'instructions à 3 adresses. D'autres estimaient suffisant le nombre de 2 adresses explicites, les partisans des machines à piles se contentaient de 0 ou une seule adresse. Lors de la conception de la série S/360, IBM estima nécessaire de ne pas faire de décisions optimales pour une seule machine mais simultanément sur toute une gamme de produits de puissances et d'usages différents. Pour résoudre le problème de la longueur d'adressage, la S/360 établit l'usage d'un registre de base (second registre d'index) qui contenait une adresse de 24 bits (soit 16 millions d'octets) associé à une syllabe d'adresse réduite à 12 bits (4Ko) ainsi qu'à des registres d'index également sur 24 bits. Une des caractéristiques importantes gouvernant le coût et les performances d'un processeur est la largeur du chemin de données. Nous avons vu plus haut le naissance des ordinateurs série (chemin de données sur 1-bit) et ordinateurs parallèles (chemins de donnée sur 1 mot). On s'est aperçu au début des années 1960, qu'il n'était pas obligatoire d'aligner la taille des chemins de données sur celle des registres de mots d'instruction, ni sur celle des registres de calcul, ni même de celle de l'unité arithmétique. Il était possible de réduire le chemin de données au dépens des performances en transmettant successivement des portions de mots (par exemple chaque caractère) ou bien au contraire de transmettre simultanément en parallèle des entités comportant plusieurs mots de façon à libérer plus tôt l'entité émettrice. C'est sur cette particularité que se sont fondées les lignes de produits compatibles comme la série 360. Les transferts de données peuvent se faire à l'unité ou en blocs. Le transfert par bloc de plusieurs unités de transfert permet de désigner seulement l'adresse de la première et le nombre d'unité à transférer, ce qui ne nécessite que seule opération de synchronisation pour l'ensemble du bloc. Ce mécanisme permet de gagner des performances en anticipant le besoin en données ou programmes, à un moindre coût qu'une augmentation de la largeur des chemins de données, spécialement pour les transferts à longue distance (entre armoires dans les années 1950, en sortie de la puce aujourd'hui). Les transferts sous forme de blocs nécessitent toutefois des mémoires tampons additionnelles puisque les informations transférées ne sont pas immédiatement utilisées comme données ou comme instructions par le processeur.
|