Architecture des processeurs et optimisation Janvier 2013 Documents autorisés - Durée 2h utiliser impérativement les feuilles quadrillées fournies pour les schémas Une réponse non justifiée sera considérée comme fausse On souhaite étudier et comparer la performance d'exécution de la fonction strcpy sur différentes plateformes matérielles. Toutes ces plateformes sont équipées de la réalisation super-scalaire à 2 pipelines de l’architecture Mips-32 étudiée en cours. Cette réalisation est appelée SS2. La fonction strcpy copie une chaîne de caractères source dans une autre chaîne de caractères destination. char *strcpy (char *dst, char *src) { int i = 0; while (src [i] != ‘\0’) { dst [i] = src [i]; i ++; } return dst; } Le code de la boucle principale de la fonction strcpy en assembleur Mips-32 pipeline est le suivant. Conformément aux conventions utilisées par le compilateur Gcc, on suppose qu'à l'entrée de la boucle : • le • le registre R4 pointe sur la chaîne dst registre R5 pointe sur la chaîne src _while : Lb Sb Addiu Addiu Bne Nop r6 r6 r4 r5 r6 , , , , , 0 (r5 ) 0 (r4 ) r4 , 1 r5 , 1 r0 , _while Dans un premier temps, on considère que le système mémoire est parfait (tous les accès mémoire s'effectuent en 1 cycle). 1- En supposant que l’étiquette _while se trouve sur une adresse alignée et que le buffer d’instructions est vide au début de la boucle, montrer à l’aide d’un schéma simplifié, l’exécution de la boucle sur la réalisation SS2. Calculer le nombre moyen de cycles par itération. Calculer le CPI et le CPI-utile. 2- Pour la réalisation SS2, optimiser ce code en modifiant l’ordre des instructions de manière à éviter au maximum les cycles perdus. Montrer à l’aide d’un schéma simplifié, l’exécution de la boucle optimisée sur la réalisation SS2. Calculer le nombre moyen de cycles par itération. Calculer le CPI et le CPI-utile. 3- Pour la réalisation SS2, optimiser ce code utilisant la technique Software pipeline. Indiquer clairement le nombre d’étages et les instructions comprises dans chaque étage. Montrer à l’aide d’un schéma simplifié, l’exécution de la boucle optimisée sur la réalisation SS2. Calculer le nombre moyen de cycles par itération. Calculer le CPI et le CPI-utile. 4- Expliquer pourquoi ne peut-on pas utiliser le déroulement de boucle pour optimiser cette boucle. Dans le reste du sujet, on considère le code original de la boucle. On suppose que la chaîne de caractères source contient 1024 caractères en comptant le caractère de fin de chaîne. Les adresses des chaînes source et destination sont multiples de 1024. On souhaite évaluer la performance d’exécution de ce code sur différentes plateforme matérielle. Sur toutes les plateformes, le processeur est relié à un cache de données et à un cache d'instructions séparés. Le cache d'instructions est parfait (taux de miss = 0). On suppose qu'au début de l'exécution de la fonction le cache de données est vide. Le cache de données a une capacité de 1 Koctets. C'est un cache à correspondance directe (Direct Mapping) et un bloc du cache contient 16 octets. Le temps d’accès au cache est de 1 cycle en cas de hit. Le cache de données est relié à la mémoire primaire à travers un bus. A chaque cycle, on peut transférer 4 octets (1 mots) sur le bus. Pour initialiser le transfert, il faut, en moyenne, 8 cycles. Ainsi, en cas de Miss dans le cache, il faut 1 cycle pour détecter le Miss, puis 12 cycles ( 8 +1 × 16 4 ) pour transférer le bloc manquant. Après le chargement du bloc, il faut encore 1 cycle pour mettre à jour le cache et 1 cycle supplémentaire pour répondre au processeur. Sur la première plateforme, on utilise un cache de données Write Through qui dispose d'un buffer d'écritures postées de 1 place. Si le buffer est vide, une écriture coûte 1 cycle, le temps nécessaire pour écrire dans le buffer. Le buffer est vidé à la fin de la transaction sur le bus. Il faut donc 9 ( 8 +1 × 4 ) cycles pour vider le buffer. 4 5- Le cache de données contient combien d'emplacements ? Combien d'ensembles ? 6- Combien de Miss se produisent-ils lors de l’exécution de la fonction ? Calculer le nombre de cycles supplémentaires par itération dus aux lectures. Calculer le nombre de cycles supplémentaires par itération dus aux écritures. En déduire le nombre moyen de cycles par itération, le CPI et le CPI-utile. 7- Peut-on obtenir une meilleure performance, si l’on remplace le cache Direct Mapping par un cache Set Associative de même taille ? Expliquer pourquoi ? Sur la seconde plateforme, on utilise un cache de données Write Back. Pour une écriture, lorsque le bloc n'est pas présent dans le cache, le cache commence par charger le bloc manquant, puis le modifie. 8- Du point de vue du processeur, combien de cycles dure l’accès à une donnée (distinguer 3 cas) ? 9- Combien de Miss se produisent-ils lors l’exécution de la fonction (distinguer 2 types de Miss) ? Calculer le nombre de cycles supplémentaires par itération. En déduire le nombre moyen de cycles par itération, le CPI et le CPI-utile. 10- Pour améliorer les performances, on décide de placer la chaîne de caractères destination sur une adresse d telle que : d modulo 1024 = 16. Combien de Miss se produisent-ils lors l’exécution de la fonction (distinguer 2 types de Miss) ? Calculer le nombre de cycles supplémentaires par itération. En déduire le nombre moyen de cycles par itération, le CPI et le CPI-utile. 11- Dans une autre expérience, on décide de placer la chaîne de caractères destination sur une adresse d telle que : d modulo 1024 = 1008. Combien de Miss se produisent-ils lors l’exécution de la fonction (distinguer 2 types de Miss) ? Calculer le nombre de cycles supplémentaires par itération. En déduire le nombre moyen de cycles par itération, le CPI et le CPI-utile. Sur la troisième plateforme, on utilise un cache de données Write Back partiellement associative de degré 2 utilisant une stratégie de remplacement LRU. 12- Les adresses des chaînes de caractères source et destination sont multiple de 1024. Combien de Miss se produisent-ils lors l’exécution de la fonction (distinguer 2 types de Miss) ? Calculer le nombre de cycles supplémentaires par itération. En déduire le nombre moyen de cycles par itération, le CPI et le CPI-utile.