Rapport de stage Master 2 Informatique Haute Performance et Simulation, 2 ème année Ecole Centrale Paris Accélération des méthodes statistiques sur GPU Auteur : CHAI Anchen. Responsables: Joel Falcou et Christophe Genolini Laboratoire: LRI Du 01/04/2014 au 30/09/2014 1
Remerciements Je voudrais remercier Joel Falcou et Christophe Genolini, mes tuteurs du stage, de m avoir aidé avec beaucoup de patience pendant mon stage. Ils ont toujours encouragé ma créativité et m ont fait confiance sur mon travail. Je remercie également monsieur Antoine, thésard de deuxième années à LRI, pour ses aides concernant mon stage. Enfin, je voudrais remercier toutes les personnes de l équipe «parsys» pour leur accueil et leur bienveillance pendant mon stage. 2
Sommaire 1. Introduction:... 4 1.1 Statistique et informatique... 4 1.2 R++, the Next Step... 4 1.3 Parallélisme... 5 1.4 Méthodologie générale de notre travail... 6 1.5 Méthodes statistiques... 7 1.5.1 Bootstrap... 7 1.5.2 Imputation multiple... 7 Partie 2 : Méthode Bootstrap... 8 2.1 Description détaillée... 8 2.1.1 Cas univarié... 9 2.1.2 Cas multivarié... 9 2.1.3 Comparaison des deux cas... 10 2.2 Expérience effectuée... 11 2.3 Résultat et performance... 11 2.4 Conclusion... 14 Partie 3 : Imputation Multiple... 14 3.1 Description détaillée... 14 3.1.1 Modèle de régression linéaire... 15 3.2 Expérience effectuée... 16 3.3 Résultats et performance... 17 3.4 Conclusion... 21 4. Conclusion... 22 4.1 Contribution du stage... 22 4.2 Bilan d apport du stage... 23 Bibliographie... 24 Annexe... 25 3
1. Introduction 1.1 Statistique et informatique Depuis dizaine années, l analyse statistique est de plus en plus utilisée dans beaucoup de domaines. La statistique comprend souvent quatre parties : la collecte des données, le traitement des données collectées, l interprétation des données et enfin la présentation. Aujourd hui il n est plus rare d avoir besoin de traiter et interpréter des données comportant des millions d individus ou de variables. Le coût de temps des méthodes d analyse devient donc un facteur limitant. L arrivé des ordinateurs a profondément modifiée l utilisation des méthodes statistiques. Il existe deux types de logiciels qui permettent de faire l analyse statistique: les logiciel métier(r, SAS, SPSS...) sont souvent conçus par statisticiens et sont plus facile à utiliser par les statisticiens. L inconvénient de ce genre de logiciel est la performance. Le temps de réponse est souvent long. D un autre côté, les logiciels conçus par des informaticiens (Matlab, C/C++, Fortran...) sont plus performants au niveau de calcul, mais ils manquent d APIs de haut niveau pour les statisticiens. Ils sont donc très peu utilisés par les statisticiens. 1.2 R++, the Next Step L objectif du projet R++, the Next Step est de produire un logiciel statistique de haute performance qui proposera les fonctionnalités des logiciels métiers tout en profitant des techniques informatiques moderne. Ce projet s articule autour de trois axes : a) Parallélisme : Aujourd hui, il existe de plus en plus de sources de parallélisme dans le domaine informatique: extension SIMD, multi-cœur, les architectures récentes comme GPU et le Xeon Phi. Le challenge est donc de développer des modèles de programmations parallèles qui s adaptent bien à ces sources. 4
b) Big data : La taille de données devient aujourd hui un facteur limitant pour les logiciels statistiques (ils sont généralement bloqué autour du giga). Des techniques utilisant les bases de données(oracle ou PostGRES) ou encore plus moderne, le framework «Hadoop» permettent d aller au-delà. c) Interface homme-machine : Les logiciels statistiques actuels maquent souvent l interface graphique interactive. L objectif de cet axe est de développer une interface graphique qui facilite l interaction homme-machine. Dans ce stage, nous nous sommes intéressés au premier axe, la parallélisation des méthodes statistiques. Nous nous sommes concentré sur deux méthodes particulièrement utilisées et couteuses en temps : le Bootstrap et les Imputations Multiples. 1.3 Parallélisme Le parallélisme consiste à implémenter des programmes utilisant plusieurs processeurs permettant de traiter des informations de manière simultanée. Ces techniques ont pour objectif de réaliser le plus grand nombre d opérations en un temps le plus petit possible.il existe 3 types de sources principales de parallélisme: a) SIMD(Single Instruction Multiple Data) : la même instruction est appliquée simultanément à plusieurs données pour obtenir plusieurs résultats en même temps.c est typiquement le cas des processeurs vectoriels. b) Multi-cœur: un processeur possède plusieurs cœurs physiques travaillant en parallèle. Chaque cœur physique comprend toutes les fonctionnalités nécessaires à exécuter un programme de façon autonome. c) Many-cœur: ce sont des architectures massivement parallèle, par exemple GPU ou Xeon Phi. Elles permettent de traiter efficacement de nombreuses tâches simultanées. Aujourd hui, le parallélisme est exploré dans de nombreux logiciels. Beaucoup de bibliothèques numériques ou noyaux de calcul ont été développés pour exploiter différentes sources parallèles, par exemple BLAS, LAPACK..., qui sont largement utilisés dans différents domaines. 5
Dans ce stage, nous nous sommes concentré sur l implémentation parallèle sur GPU. Pourquoi nous nous intéressons le plus à GPU? Premièrement, GPU n est pas cher qui ont déjà été utilisés comme coprocesseurs pour un grand nombre d application. GPU est une unité de calcul massivement parallèle qui nous permet de traiter efficacement de nombreuses tâches simultanées. Deuxièmement, il existe de nombreuse bibliothèques numériques de haute performance sur GPU. Par exemple, curand(cuda Random Number Generation library)[nv10] réalise la génération des nombres aléatoires de haute qualité. Troisièmement, GPU sont largement utilisés actuellement, même dans un ordinateur portable, GPU sont souvent intégrés comme un élément standard. 1.4 Méthodologie générale de notre travail L objectif du stage est d étudier les performances du parallélisme appliqué aux méthodes statistiques. La qualité des résultats de certaines méthodes (généralement non déterministes) dépend du nombre de tentatives effectués pour trouver la solution. Cela signifie que pour obtenir des résultats intéressant, il faut faire un grand nombre d itérations, le plus grand nombre possible. Dans ce genre de cas, le coût en temps devient donc un facteur limitant. D où l importance la parallélisation des méthodes. Pour étudier la parallélisation, nous avons choisi deux méthodes statistiques modernes, très utilisées et assez coûteuses en temps : le Bootstrap et les Imputation multiple. Nous avons implémenté ces méthodes sur différentes architectures (Multicœur, GPU). Ensuite nous avons mesuré les temps d exécution avec différentes tailles de données. Enfin, nous avons comparéles versions classiques et parallèles, en C et en R[r12]. 6
1.5 Méthodes statistiques 1.5.1 Bootstrap En statistique, bootstrap est une technique permettant de faire de l inférence statistique à partir d un nombre limité d observation. Bootstrap est une méthode très utilisée dans le domaine statistique mais assez coûteux, qui est la troisieme fonction que nous voulons paralléliser dans R[tm14]. Du point de vu de l informatique, un grand nombre de rééchantillonnage indépendants sont requis, ce qui nous permet de penser que le parallélisme permettra effectivement un gain de temps. Il existe plusieurs packages parallèles de bootstrap, la liste(non exhaustif) est présentée ici : 1) Le package parallèle dans R. Les fonctions standards dans R, par exemple, boot(), bootstrap(), nous permettent de paralléliser bootstrap explicitement : boot(..., parallel=c( no, multicore, snow ) ) ou bootstrap(..., parallel=c( no, multicore, snow )). L option multicore permet d exécuter bootstrap en plusieurs processeurs en même temps. L option snow qui nous permet d exécuter bootstrap dans un cluster de machine. 2) Le package SPRINT[jh08](Simple Paralle R interface) qui nous permet de profiter de plusieurs nœuds en utilisant l interface MPI(Message Passing Interface)[sm98]. 1.5.2 Imputation multiple En statistique, l imputation consiste à remplacer des données manquantes par des valeurs de substitution. Afin de réduire le bruit due à l imputation, Rubin(1987) a développé une méthode appelé l imputation multiple[ru91]. L idée de cette méthode est d effectuer plusieurs imputations sur le même ensemble de données. Chaque ensemble de données imputées est ensuite analysée séparément. Le résultat final est la moyenne des résultats des analyses. 7
Imputation multiple est une méthode très utilisée à analyser des valeurs manquantes aléatoirement, mais c est aussi une méthode très coûteuse en temps d exécution. Partie 2 : Méthode Bootstrap 2.1 Description détaillée Le bootstrap est une méthode permettant de calculer l intervalle de confiance d une statistique S lorsque les méthodes classiques (paramétriques) ne le permettent pas. Différentes méthodes de bootstrap existent, mais elles font toutes appels à un processus de 4 étapes : 1) A partir d une population initiale de taille N, un échantillon de taille N, obtenu par tirage avec remise,est constitué. 2) La statistique S i est calculée sur l échantillon i 3) Les étapes 1) et 2) sont répétées M fois 4) Les M statistiques S i permettent de calculer l intervalle de confiance de S. Nous pouvons le voir, le processus de bootstrap est assez simple. Malheureusement, la fiabilité du résultat dépend grandement du nombre déchantillonages effectués M. Quand nous augmentons M, la précision du bootstrap augmente. En résumé, plus M est grand, meilleure sera la qualité de l intervalle. Mais d un point de vue informatique, plus M et N sont grands, plus de puissance de calcul nécessaire est importante. D où l intérêt d optimiser le Bootstrap avec l architecture parallèle récente : GPU(Graphics Processing Unit). 8
2.1.1 Cas univarié Nous considérons une population initial de taille N ne contenant qu une seule variable. Nous voulons effectuer M échantillonnages, donc nous avons besoin de faire N tirages par rééchantillonnage. Le nombre total de tirage que nous allons effectuer est M*N. Ensuite nous pourrons calculer la statistique qui nous intéressent pour chaque échantillon. Notons fla fonction qui calcule indice statistique. Les calculs dont nous avons besoin sont : 1) N*M fois de tirage avec remise pour construire M rééchantillonnages 2) M fois d appels de fonction f() pour calculer l indice statistique 2.1.2 Cas multivarié Supposons que nous avons n variables dépendantes et chaque variable a N observations dans l échantillon initial. Maintenant, la population initiale est une matrice de n lignes et N colonne. Chaque colonne est une variable. Puisque ces n variables sont dépendantes entre eux, nous ne pouvons pas faire les tirages indépendamment pour chaque variable. Donc nous avons toujours besoin de faire N tirages pour construire un échantillon, mais cette fois nous tirons une ligne à chaque tirage. Ensuite nous appelons f() pour chaque variable. Finalement tous les calculs dont nous avons besoin sont : 1) N*M fois de tirage de colonne pour construire M échantillon 2) n*m fois d appels de fonction f() 9
2.1.3 Comparaison des deux cas Si nous comparons le cas univarié et multivarié, nous pouvons constater que dans la méthode Bootstrap, le nombre de tirages ne dépend pas du nombre de variables, il dépend du nombre d individus N et du nombre d échantillonnage M. Par contre, le nombre d appel de f est décidé par le nombre de variablen et le nombre d échantillonnage M. Maintenant pour analyser quantitativement les deux cas, j introduis ici une métrique à les évaluer : la densité de calcul P qui est définit par le nombre de calcul par rapport au nombre total des éléments dans l échantillon initial. Pour le cas univarié : P = N M+M N Pour le cas multivarié : P = N M+n M N n =M + M N où M : nombre d échantillonnage désiré n : nombre de variable N : nombre d observation = M n + M N Nous pouvons observer que si le nombre d observation N reste constant, la densité de calcul de Bootstrap diminue lorsque le nombre de variable n augmente. Cela signifie que un peu de variable mais beaucoup d observations sera le cas optimal à paralléliser. Nous nous concentrerons donc au cas extrême : univariable dans la partie suivante. 10
2.2 Expérience effectuée Dans ce rapport, nous allons étudier la performance de bootstrap sur différents architecture : mono-cœur, multi-cœurs et GPU. Nous allons comparer le temps d exécution de bootstrap avec les implémentations sur R, C/C++ et CUDA(GPU). 2.2.1 Benchmark : L échantillon initial que nous allons utiliser ici sont des nombres flottants générés aléatoirement entre 0 et 100. Sa taille varie de 1*100 jusqu à 1*10^6. Nous cherchons à estimer le moyen de cet échantillon. Nous fixons le nombre de répétition M est 1000 fois. 2.2.2 Les processeurs utilisés : CPU : Intel Xeon E5645@2.4Ghz GPU : Tesla C2050, 3GB, 1.15GHz Multi-cœur : 12 cœurs Intel Xeon E5645@2.4Ghz 2.2.3 Compilateur utilisé : gcc version 4.6.4 2.3 Résultat et performance Dans cette partie, nous allons comparer les performances des différentes implémentations de bootstrap : 1) L implémentation manuelle avec R sur CPU(mono-cœur) sans utilisant des bibliothèques extérieurs(c, C++...) 2) La fonction standard de R : boot() avec des bibliothèques extérieurs(mean(x)) 3) L implémentation avec C/C++ sur CPU(mono-coeur) 4) L implémentation avec CUDA sur GPU 5) L implémentation sur multi-coeurs en utilisant OpenMP. Dans le tableau suivant, MC_N signifie que nous profitons de N cœurs simultanément. 11
2.3.1 L accélération par rapport à l implémentation séquentielle CPU : Speedup Size R Boot() CPU GPU MC_6 MC_8 MC_10 MC_12 1*10^2 0.04 0.216 1 0.041 1.41 0.605 0.229 1.034 1*10^3 0.04 0.483 1 0.31 3.315 3.62 2.669 2.036 1*10^4 0.04 0.689 1 2.294 4.85 6.37 5.741 7.382 1*10^5 0.04 0.698 1 8.451 5.23 6.89 8.227 9.855 1*10^6 0.04 0.577 1 8.81 5.27 6.75 8.442 9.887 Nous prenons ici l implémentation séquentielle sur CPU comme la référence,donc la colonne de CPU est toujours 1 dans le tableau. Quand la valeur dans ce tableau est inférieur à 1, c est-à-dire que la version est plus lente que CPU et qu il n y pas d accélération. Nous pouvons constater que l implémentation manuelle sur R est toujours 25 fois(1/0.04) plus lente que l implémentation sur CPU et la fonction standard boot() est plus rapide que R mais plus lente que GPU et multi-cœur. Ensuite nous pouvons trouver que GPU va gagner un gain à partir de taille 1*10^4. L accélération augmente quand la taille élargi. Nous obtenons un gain de 8.81 à 1*10^6 sur GPU. Nous avons toujours une accélération sur multi-cœur à partir de taille 1*10^3 et maintenant nous nous intéressons à la comparaison des performances de GPU avec le multi-cœur. Vous pouvez trouver aussi le tableau du temps d exécution réel de chaque implémentation de bootstrap dans l annexe. 12
Selon la courbe ou l histogramme au dessus, nous pouvons constater que l accélération de GPU est entre 10 cœur et 12 cœur à partir de taille 1*10^5. Cela signifie que quand nous avons assez de données à traiter, la performance de bootstrap sur GPU est meilleur qu un processeur de 10 cœurs. 13
2.4 Conclusion En conclusion, nous pouvons bien profiter de parallélisation sur GPU pour bootstrap quand nous avons assez de données dans l échantillonnage original. La performance de GPU est comparable avec un processeur de 10 cœurs. Mais la performance de certain résultats de GPU n est pas très optimale. En fait, cette limitation vient de deux aspects : a) Le temps de transfert de données entre GPU et CPU n est pas négligeable, donc quand nous n avons pas assez de calcul à faire, cette partie est assez élevée par rapport au tempstotal. b) L accès à la mémoire globale de GPU est couteux(souvent 400-500 cycles d horloge). Sachant que pour construire les rééchantillonnages dans bootstrap, nous avons besoin de faire de nombreuse fois de tirage qui demande d accéder la mémoire globale de manière très aléatoire. La conséquence de ce genre de l accès est de nombreuse de défauts de cache potentiels qui est un facteur important pour bootstrap. Partie 3 : Imputation Multiple 3.1 Description détaillée L Imputation multiple est une méthode statistique introduite par Rubin à 1987. Les étapes principales de l imputation multiple sont les suivantes : a) Choisir un modèle qui prédit toutes les données manquantes à partir de toute les autres informationsutilisables, par exemple, régression linéaire, régression logistique ou modèle non-linéaire... b) Utiliser le modèle choisi à créer un ensemble de données complet c) Faire l analyse statistique de cet ensemble de données complet et enregistrer les statistiques que nous cherchons(moyenne, ecart type... ) d) Répéter les étapes b) et c) (selon les auteurs, 3 à 5 fois suffisent) e) Faire l analyse finale pour l ensemble de ces répétitions Le dessin suivant montre le processus global de l imputation multiple. 14
Dans ce rapport, nous avons utilisé le modèle de régression linéaire pour faire l inférence des données manquantes. 3.1.1 Modèle de régression linéaire En statistique, un modèle de régression linéaire[cm91] est un modèle de régression d une variable expliquée sur une ou plusieurs variables explicatives. Dans ce modèle, nous faisons l hypothèse que la dépendance de variable expliquée et les variables explicatives est linéaire. La formule mathématique pour exprimer la relation entre une variable y et un vecteur de variables x est : (3.1) Où y est la variable expliquée, le vecteur x est l ensemble des variables explicatives. u désigne le terme d erreur aléatoire. Le vecteur ß est le paramètre que nous cherchons pour pouvoir faire l inférence les données manquantes. En fait, il existe plusieurs méthodes mathématiques pour estimer Le vecteur ß. Nous avons choisi la méthode OLS(ordinary least squares) pour résoudre cette équation. La formule mathématique est : 15
D où : (3.2) Sachant que trouver l inverse d une matrice est assez coûteux(o(n^3))], nous transformons cette formule en : (X T X)ß = X T y (3.3) En ce cas là, nous avons besoin de résoudre le système linéaire A*ß = Y, d où A est (X T X) et Y est (X T y). Une fois que nous trouvons ß, nous pouvons ensuite exprimer la variable expliquée y par le vecteur X qui nous permet d inférer les valeurs manquantes de y par l équation 3.1. Donc, l implémentation réelle de l imputation multiple est la suivante : 1) Initialiser toutes les valeurs manquantes. Si une valeur est manquantes, nous la réplaçons aléatoirement par une des valeurs possibles. Cela conduit a un jeu de donnée complet. 2) Appliquer le modèle de régression linéaire pour la première variable à qui il manque des valeurs. Nous remplaçons les valeurs manquantes initiales par les nouvelles valeurs qui sont trouvées par l équation 3.1 3) Ensuite nous faisons une deuxième régression linéaire pour deuxième variable à qui il manque des valeurs. Nous remplaçons les valeurs manquantes initiales par les nouvelles valeurs. Et ainsi de suite, jusqu à nous ayons traité toutes les variables à qui manquent des valeurs 4) Répéter 1), 2), 3) M fois 3.2 Expérience effectuée Dans ce rapport, nous allons étudier la performance de l imputation multiple sur 16
différents architectures : mono-cœur, multi-cœur et GPU. 3.2.1 Benchmark : Les Benchmarks effectués sont des matrices dont le nombre de variable varie de 10^2 jusqu à 10^3 et dont le nombre d observation de chaque variable varie de 10^3 jusqu à 10^6. Les valeurs de matrice sont des nombres flottants générés arbitrairement entre 0 et 100. Pour chaque taille de matrice, nous ajoutons 10% de valeurs manquantes et nous appliquons 5 imputations. 3.2.2 Les processeurs utilisés : CPU : Intel Xeon E5645@2.4Ghz GPU : Tesla C2050, 3GB, 1.15GHz Multi-cœur : 12 cœurs Intel Xeon E5645@2.4Ghz 3.2.3 Compilateur utilisé : gcc version 4.6.4 3.3 Résultats et performance Dans cette partie, nous allons comparer les performances des différentes implémentations de l imputation multiple: 1) L implémentation utilisant la fonction standard mice() dans R : 2) L implémentation sequentielle en C/C++ avec bibliothèque Blas[bl02] et Lapack[an99] 3) L implémentation GPU avec la bibliothèque Magma[do14] 4) L implémentation multi-cœur avec bibliothèque MKL[intel05] et Lapack, Dans le tableau suivant, MC_N signifie que nous profitons de N cœurs simultanément. 3.3.1 L accélération par rapport à l implémentation CPU 17
Speedup Size Mice() CPU GPU MC_4 MC_6 MC_8 MC_10 MC_12 10*10^3 0.028 1 0.025 0.967 0.93 0.97 0.947 0.88 10*10^4 0.0136 1 0.0752 1.25 1.05 1.15 1.04 1.07 10*10^5 0.00787 1 0.31 0.993 0.97 0.993 1.01 1.028 10*10^6 0.0088 1 1.015 1.039 1.07 1.09 1.06 0.69 Speedup Size Mice() CPU GPU MC_4 MC_6 MC_8 MC_10 MC_12 100*10^3 0.02 1 0.485 1.375 0.217 0.125 0.33 0.17 100*10^4 0.027 1 2.15 1.44 1.13 0.87 1.55 1.01 100*10^5 0.0314 1 3.36 1.37 2.22 2.39 2.31 2.24 100*10^6 0.0036 1 3.68 1.522 2.55 2.755 2.56 2.96 1000*1000 0.0074 1 5.79 1.56 3.02 1.65 3.76 3.09 Vous pouvez trouver aussi le tableau du temps d exécution réel de chaque implémentation de l imputation multiple dans l annexe. Nous prenons ici l implémentation CPU comme la référence, donc la colonne de CPU dans le tableau est toujours 1. Puisque à partir de taille 1000*10^4, l exécution de fonction mice() est trop longue(> 100h), la mesure donc s arrête à 1000*1000. 18
Comme nous avons prévu, l exécution de l imputation multiple sous R est assez coûteuse aux grandes tailles. Nous pouvons observer que quand la taille passe de 100*10^5 à 100*10^6, la fonction mice() est un peu près 100 fois plus lente(annexe 2). Mais pour CPU, GPU ou multi-cœur, le facteur est normalement 10. Cela signifie encore une fois que l overhead de R pour les problèmes de grandes tailles est assez élevé. Ensuite, la performance de GPU est toujours la meilleur à partir de 100*10^4. Puisque il existe des calculs assez intensifs dans cette méthode, par exemple la multiplication matricielle, résoudre le système linéaire... Donc l imputation multiple est une méthode très adaptée à GPU, l accélération est meilleur qu un processeur de 12 cœurs quand nous avons 100 variables à traiter. Maintenant nous nous intéressons à la comparaison des performances de GPU avec le multi-cœur. Nous prenons ici l implémentation de CPU comme référence : 1) 10 variables: 19
2) 100 variables 20
Maintenant plus clairement, pour les tailles petite(10 variables), la performance de GPU n est pas très optimale par rapport à laquelle de multi-cœur, mais quand nous augmentons le nombre de variables à 100, nous trouvons que GPU est plus rapide que multi-cœur à partir de 100*10^4. 3.4 Conclusion En conclusion, GPU est un bon choix pour accélérer l imputation multiple quand la taille de problème est grande. Mais pour les petites tailles, l implémentation séquentielle sur CPU est suffisante. En ce moment-là, nous n avons pas besoin d utiliser un GPU ou multi-cœur. 21
4. Conclusion 4.1 Contribution du stage Pendant 6 mois de stage, nous avons étudié le parallélisme potentiel des méthodes statistiques modernes. Nous avons implémenté ces méthodes sur différentes architectures avec des bibliothèques de haute performance. Avoir effectué les benchmarks sur différentes tailles de problème, nous avons montré que la parallélisation est un moyen faisable pour réduire le temps d exécution des méthodes statistiques intensives. Nous avons utilisé l implémentation CPU comme références à bien montrer que l overhead de R est très élevé quand la taille de problème devient grande. Nous trouvons que ce genre de logiciel métier ne peut plus satisfaire les besoins du statisticien pour traiter des millions de données efficacement aujourd hui. Cela confirme la motivation de notre projet dont l objectif est de produire un logiciel statistique adapté à Big data. De plus, pendant ce stage, nous avons comparé expérimentalement les performances de multi-cœur et GPU en fonction de tailles. Nous avons montré que la performance de GPU est meilleur qu un processeur de 12 cœurs quand il y a assez de données. 22
4.2 Bilan d apport du stage D abord, j ai appris deux méthodes statistiques très utilisée dans le domaine médical : Bootstrap et Imputation Multiple. Ce stage m a permis de découvrir le parallélisme potentiel de statistique et d appliquer GPGPU dans le domaine statistique. Pour pouvoir étudier et comparer la performance de différentes architectures, j ai utilisé beaucoup de bibliothèques à exploiter la parallélisation, par exemple, CURAND,Thrust, Blas, MKL, Magma... Ensuite, pendant ce stage, j ai eu la chance à connaître comment utiliser le logiciel R pour traiter et analyser des problèmes statistiques. J ai mesuré le temps d exécution de chaque méthode sous R et les ai utilisé à comparer avec GPU et multi-cœur. Enfin, ce stage était un stage multidisciplinaire, j ai eu la chance de travailler avec des statisticiens, informaticiens et des experts de compilation, qui me permettait d élargir mes connaissances dans différents domaines et d augmenter mon niveau de communication et collaboration. 23
Bibliographie [r12] R Core Team, R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing, Vienna, Austria, 2012. ISBN 3-900051-07-0, http://www.r-project.org. [nv10] Nvidia, C. U. D. A. (2010). Curand library. [tm14] Sloan, T. M., Piotrowski, M., Forster, T., & Ghazal, P. (2014). Parallel Optimisation of Bootstrapping in R. arxiv preprint arxiv:1401.6389. [jh08] Hill, J., Hambley, M., Forster, T., Mewissen, M., Sloan, T. M., Scharinger, F.,... & Ghazal, P. (2008). SPRINT: A new parallel framework for R. BMC bioinformatics, 9(1), 558. [sm98] Snir, M. (Ed.). (1998). MPI--the Complete Reference: The MPI core (Vol. 1). MIT press. [ru91] Rubin, D. B., & Schenker, N. (1991). Multiple imputation in health are databases: An overview and some applications. Statistics in medicine, 10(4), 585-598. [cm91] Charles Manski, «Regression», Journal of Economic Literature, vol. 29,n o 1, mars 1991, p. 34-50 [bl02] Blackford, L. S., Petitet, A., Pozo, R., Remington, K., Whaley, R. C., Demmel, J.,... & Lumsdaine, A. (2002). An updated set of basic linear algebra subprograms (BLAS). ACM Transactions on Mathematical Software, 28(2), 135-151. [an99] Anderson, E., Bai, Z., Bischof, C., Blackford, S., Demmel, J., Dongarra, J.,... & Sorensen, D. (1999). LAPACK Users' guide (Vol. 9). Siam. [do14] Dongarra, J., Gates, M., Haidar, A., Kurzak, J., Luszczek, P., Tomov, S., Yamazaki, I."Accelerating Numerical Dense Linear Algebra Calculations with GPUs," Numerical Calculations with GPUs, Volodymyr Kindratenko, eds., eds. Springer International Publishing, pp. 3-28, July, 2014. [intel05] Intel, M. K. L. (2005). Intel math kernel library, linear solvers basics. 24
Annexe 1. Le temps d exécution de bootstrap (en seconde) Size Time R Boot() CPU GPU MC_6 MC_8 MC_10 MC_12 1*10^2 0.119 0.025 0.0054 0.1324 0.00384 0.00893 0.0236 0.00522 1*10^3 0.995 0.085 0.0411 0.1343 0.0124 0.01136 0.0154 0.02019 1*10^4 8.614 0.531 0.3657 0.1594 0.0754 0.0574 0.0637 0.04954 1*10^5 87.557 5.056 3.52934 0.4176 0.675 0.5123 0.429 0.3581 1*10^6 871.417 61.563 35.534 4.033 6.7406 5.2628 4.2089 3.5938 25
2. Le temps d exécution de l imputation multiple(en seconde) Size Time Mice() CPU GPU MC_4 MC_6 MC_8 MC_10 MC_12 10*10^3 0.549 0.01548 0.6192 0.016 0.0167 0.01591 0.01634 0.01763 10*10^4 3.628 0.0495 0.6579 0.0396 0.0473 0.043 0.0473 0.046 10*10^5 32.008 0.252 0.8228 0.2537 0.2596 0.2537 0.2494 0.245 10*10^6 332.328 2.925 2.881 2.816 2.728 2.684 2.752 4.214 Size Time Mice() CPU GPU MC_4 MC_6 MC_8 MC_10 MC_12 100*10^3 33.85 0.7095 1.462 0.516 3.268 5.676 2.15 4.214 100*10^4 218.245 6.006 2.795 4.18 5.28 6.88 3.87 5.934 100*10^5 1933.0335 60.72 18.06 44.29 27.278 25.37 26.316 27.09 100*10^6 189742.457 (>50H) 684.8 186.19 449.78 268.32 248.54 267.46 230.91 1000*1000 80820.257 (>22H) 605.44 104.49 388.52 200.143 367.65 160.82 196.51 26