Low-Cost Memory Analyses for Efficient Compilers
Total Page:16
File Type:pdf, Size:1020Kb
Low-cost memory analyses for efficient compilers Maroua Maalej Kammoun To cite this version: Maroua Maalej Kammoun. Low-cost memory analyses for efficient compilers. Other [cs.OH]. Univer- sité de Lyon, 2017. English. NNT : 2017LYSE1167. tel-01626398v2 HAL Id: tel-01626398 https://tel.archives-ouvertes.fr/tel-01626398v2 Submitted on 11 Dec 2017 HAL is a multi-disciplinary open access L’archive ouverte pluridisciplinaire HAL, est archive for the deposit and dissemination of sci- destinée au dépôt et à la diffusion de documents entific research documents, whether they are pub- scientifiques de niveau recherche, publiés ou non, lished or not. The documents may come from émanant des établissements d’enseignement et de teaching and research institutions in France or recherche français ou étrangers, des laboratoires abroad, or from public or private research centers. publics ou privés. No d’ordre NNT : 2017LYSE1167 THÈSE DE DOCTORAT DE L’UNIVERSITÉ DE LYON opérée au sein de l’Université Claude Bernard Lyon 1 École Doctorale ED512 InfoMaths Spécialité de doctorat : Informatique Soutenue publiquement le 26/09/2017, par : Maroua MAALEJ KAMMOUN Low-cost memory analyses for efficient compilers Devant le jury composé de : Xavier Urbain, Professeur des Universités, Université Claude Bernard Lyon 1 Examinateur Sanjay Rajopadhye, Professeur, Colorado State University Rapporteur Corinne Ancourt, Maître de Recherches, École supérieure des mines de Paris Rapporteure Alain Girault, Directeur de Recherches, Inria Examinateur Karine Heydemann, Maître de Conférences, Université Pierre et Marie Curie Examinatrice Vincent Loechner, Maître de Conférences, Université de Strasbourg Examinateur Frédéric Vivien, Directeur de Recherches, Inria Directeur de thèse Laure Gonnord, Maître de Conférences, Université Claude Bernard Lyon1 Co-directrice de thèse !" #$% &' & "# $ % &'( %) "# $ ''* "# $ %'*)' "# + **,' ! " "%( " *- ' . & 6 "# $ #3' " "/ *- ! . 6 " $ # &)**3( " 2 6 "# $ # &3 '3)! 3 4 6 " $ # )() ' ) ! &4 6 "# 7# '35 ) ! 5 6 " $ "# !%355 $ &4 % ! 5 4 6 "# # ' "%) &4 6 "# $ # 5%''( & 6 " # '*)7 ' 6 "# % %""3) ) $ 6 "# $ !# <<3%' " 6 "# $ # 53"(3 " 6 "# $ %# &'( %) - 6 "# $ = *'('5 ! 5 - ! 6 "# >#(3**' 3+ ! *- 6 "# &# )'3() - *- 6 "# $ '#')( ' ! - ' 6 "# # ) (*5 ) 5 4 *- 8 6 "# $ # )53( ' ! $ ' 6 "# $ # "3 ()355' ) ! 9 ; 6 "# (# *'&3)!(' Low-cost memory analyses for efficient compilers Remerciments Lors de la préparation et de la soutenance de ma thèse, j’ai bénéficié du soutien et de l’aide de plusieurs personnes. Par ces quelques lignes, je tiens à les remercier. Je voudrais remercier en premier lieu Laure Gonnord qui m’a encadrée tout au long de la thèse avec le sérieux et l’enthousiasme d’une directrice, la complicité d’une amie, et l’affection et la bienveillance d’une mère. Merci pour ses relectures nombreuses du manuscrit et pour la disponibilité dont elle a fait preuve tout au long de ce travail. Je remercie aussi Frédéric Vivien qui m’a accepté dans son équipe ROMA et m’a encadré pour la fin de cette thèse. J’exprime par la même occasion ma grande gratitude à Alain Darte, qui m’a intégré dans son équipe Compsys et assuré le début de ma thèse. Sans eux, cette thèse n’aurait jamais pu avoir lieu. Je tiens ensuite à remercier les membres du jury : merci à Xavier Urbain pour avoir accepté d’être président de mon jury de thèse. Merci aussi aux rapporteurs Sanjay Rajopadhye et Corinne Ancourt et aux examinateurs Alain Girault, Karine Heydemann et Vincent Loechner pour leurs lectures minucieuses du manuscrit et les remarques pertinentes qu’ils m’ont fait parvenir. Je tiens aussi à remercier Fernando Magno Quintão Pereira et Sylvain Collange. J’ai eu l’oppor- tunité d’avoir plusieurs collaborations avec Fernando et ses étudiants m’ont été d’une aide con- sidérable vis-à-vis de l’expertise que j’ai pu acquérir dans le compilateur LLVM. J’ai beaucoup apprécié mes interactions scientifiques avec Sylvain à travers lesquelles j’ai pu me familiariser aux GPUs et découvrir de nouvelles pistes d’applications des analyses de pointeurs. Je remercie également toutes les personnes qui ont indirectement contribué au bon déroulement de ce travail : Alexandre Isoard, mon premier et préféré collègue de bureau mais aussi l’ami qui, même après son départ, a su être là pour me motiver, me conseiller, et m’aider à surmonter des difficultés techniques ; Aurélien Cavelan et Oguz Kaya, mes collègues de bureau pour avoir partagé leur amour de travail, de persévérance et d’acharnement en fin de thèse. J’aimerais aussi exprimer ma profonde gratitude à tous les doctorants que j’ai pu croiser à un moment donné de ma thèse, pour la confiance qu’ils m’ont accordée pour les représenter au conseil du laboratoire et pour les moments de détente qu’on a pu partager ensemble (une pensée spéciale à Issam Rais pour tous les repas qu’on a partagés). Je n’oublie évidemment pas les assistantes des équipes du LIP : Laëtitia Lecot, Evelyne Blesle, Chiraz Benamor Marie Bozo et Sylvie Boyer. Immanquablement de bonne humeur, elles ont toujours des réponses à tout ! Enfin, je remercie bien sûr ma famille : Mes parents Ferdaous et Habib qui m’ont appris le goût de la réussite. Ils ont été toujours et depuis longtemps à mes côtés pour me soutenir, m’encourager et me combler d’amour. Mes deux sœurs, Sonia et Sirine, mes modèles de réussite et de persévérance. Mes beaux-parents Naama et Salah et mes belles-sœurs Yosra et Manel pour avoir cru en moi et m’avoir supportée. Finalement, je remercie à mon grand amour, Adam, d’avoir supporté la distance géographique qui nous séparait tout au long de la thèse, d’avoir accepté mes humeurs et mes doutes, et d’avoir géré mes indisponibilités et mes moments de travail les plus intenses. Maroua MAALEJ 3/142 Low-cost memory analyses for efficient compilers Maroua MAALEJ 4/142 Résumé long Les technologies de l’information sont devenues de plus en plus importantes dans nos vies quo- tidiennes, et maintenant nous vivons en grande partie ce qui a été extrapolé dans les oeuvres de littérature majeures de science fiction. Grâce à la production de massives machines puissantes, de nouvelles tablettes et smartphones, certaines tâches sont devenues moins complexes, et nous ont permis de gagner du temps. Néan- moins, dans le même temps, l’interaction entre les différents systèmes de calcul et d’informations eux-mêmes est devenue complexe, et la manipulation de tels systèmes nécessite de plus en plus une gestion automatisée et optimisée, et donc une meilleure compréhension des problématiques liées aux ressources de calcul et de mémoire, dont dépendent leur efficacité. L’évolution des performances des machines est allée de pair avec ce que l’on appelle “le saut performance-mémoire”. L’agrandissement des capacités de stockage mémoire n’a pas été accom- pagnée d’une diminution substantielle de la durée d’accès aux données. En conséquence, les temps d’accès à la mémoire sont maintenant non négligeables dans le coût d’un calcul. Un compilateur prend en entrée un programme écrit en un langage de haut niveau et génère le code bas niveau qui sera exécuté sur la machine cible. Un des moyens de rendre les programmes performants est de profiter de la rapidité des processeurs tout en diminuant le plus possible le besoin d’accéder à la mémoire. Pour cela, un compilateur peut effectuer des transformations (“optimisations”) plus ou moins automatiquement, à sémantique constante. Dans un compilateur, un des concepts cruciaux est la notion de dépendance entre les variables du programme : cette information sert à valider ou invalider une transformation donnée. Calculer efficacement ces dépendances reste un challenge dans les compilateurs, notamment à cause des problèmes d’aliasing induits par les variables pointeurs. Ces pointeurs sont en effet l’un des fondamentaux des langages de bas niveau comme le C car ils permettent au développeur de manipuler explicitement la mémoire. Ce sont des outils puissants et expressifs. Démontrer que deux pointeurs p et q sont disjoints (n’aliasent pas) permet de garantir qu’une écriture dans p ne modifie pas la valeur pointée par q. Dans le cas contraire, une modification de la région pointée par p a un impact “silencieux” (i.e. non détectable syntaxiquement en regardant les modifications apportées à q) sur q. Par conséquence, toute optimisation utilisant le fait qu’une dépendance de données n’est pas modifiée en changeant une lecture/écriture dans le programme doit vérifier qu’il n’y a pas de dépendance “cachée” par des pointeurs. Les optimisations de code faisant appel à une analyse d’alias sont donc nombreuses ; parmi elles on peut citer la vectorisation, l’élimination de code mort et le déplacement d’instructions dans le code. Ces optimisations sont cruciales à l’intérieur des compilateurs. Fournir aux passes d’optimisation des analyses d’alias précises et sûres (dépourvus de fausses alarmes, ce qui veut dire si l’analyse conclut que p et q sont disjoints, alors ils le sont réellement) est donc d’une extrême importance. Au sein d’un compilateur, une analyse de pointeurs peut être réalisée statiquement (sans exécuter Maroua MAALEJ 5/142 Low-cost memory analyses for efficient compilers le programme), dynamiquement (en exécutant une partie du code), ou de manière hybride. L’état de l’art des analyses statiques de pointeurs est pléthorique, depuis l’analyse d’Andersen [And94] jusqu’aux analyses les plus récentes telles que celle de Zhang et al. [Zha+14]. Les caractéristiques de ces analyses varient. Elles prennent plus ou moins en compte le flot de programme, le contexte d’appel des fonctions et les caractéristiques de structures, induisant des variations en terme de coût et de précision. Cependant, malgré toute l’attention accordée au sujet des analyses d’alias, notre état de l’art démontre que les analyses implémentées dans les compilateurs en production ont de nombreuses faiblesses lorsqu’il s’agit de prendre en compte l’arithmétique de pointeurs.