Ci-dessous, les différences entre deux révisions de la page.
developpement:activites:integration:par4all4wheezy [2013/09/26 09:13] equemene [Installation] |
developpement:activites:integration:par4all4wheezy [2015/01/07 10:04] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== Installation de Par4All sous Debian Wheezy ====== | ||
- | |||
- | <note important>En construction</note> | ||
- | |||
- | <note important>Cette page présente l'installation de par4all pour les versions 1.4 de Par4All. </note> | ||
- | |||
- | ===== Contexte ===== | ||
- | |||
- | Comment facilement paralléliser les codes que nous avons à disposition pour exploiter les derniers développements matériels à notre disposition (multi-coeurs, GPU) ? | ||
- | |||
- | Par4All exploite un outil déjà vieux (et éprouvé) analysant le code et le transformant pour permettre d'effectuer pour nous ce travail de portage : PIPS. | ||
- | |||
- | Ses avantages sont nombreux : | ||
- | * il est Open Source | ||
- | * il est simple à installer | ||
- | * il est simple à utiliser | ||
- | * il est français (voire breton) | ||
- | |||
- | ===== Installation ===== | ||
- | |||
- | Voici les quelques commandes pour installer **Par4All** dans ''/opt'' à partir des sources. | ||
- | |||
- | Récupération et expansion de l'archive : | ||
- | <code> | ||
- | cd /tmp | ||
- | wget http://download.par4all.org/development/ubuntu/x86_64/2012/11/2012-11-29/par4all-1.4.3-e2355ae_src.tar.gz | ||
- | tar xzf /tmp/par4all-1.4.3-e2355ae_src.tar.gz | ||
- | cd /tmp/par4all-1.4.3_src/ | ||
- | </code> | ||
- | |||
- | Compilation & Installation dans ''/opt'' | ||
- | <code> | ||
- | src/simple_tools/p4a_setup.py --prefix=/opt/par4all-1.4.3 -v --jobs=4 | ||
- | </code> | ||
- | |||
- | Paramétrage du lien : | ||
- | <code> | ||
- | cd /opt | ||
- | [ -d /opt/par4all ] && mv /opt/par4all /opt/par4all-$(date '+%Y%m%d') | ||
- | cd /opt | ||
- | ln -sf par4all-1.4.3 par4all | ||
- | </code> | ||
- | |||
- | |||
- | ==== Préparation du système ==== | ||
- | |||
- | <code> | ||
- | apt-get install libncurses5 libreadline6 python ipython cproto indent flex bison automake libtool autoconf libreadline6-dev python-dev swig python-ply libgmp3-dev libmpfr-dev gfortran subversion git wget libmpfr4 python-docutils tex4ht | ||
- | </code> | ||
- | |||
- | ==== Récupération, compilation et installation ==== | ||
- | |||
- | Pour la version 1.2 : le dossier d'installation choisi est ''/opt/par4all-1.2'' | ||
- | <code> | ||
- | # Passage en root | ||
- | sudo su - | ||
- | # Recuperation du code par WGET | ||
- | cd /tmp | ||
- | wget http://download.par4all.org/releases/debian/x86_64/par4all-1.2-d26bc44_src.tar.gz | ||
- | # Expansion de l'archive | ||
- | tar xzf par4all-1.2-d26bc44_src.tar.gz | ||
- | # Passage dans le répertoire | ||
- | cd par4all-1.2_src/ | ||
- | # Compilation et installation dans /opt/par4all-1.2 | ||
- | src/simple_tools/p4a_setup.py --prefix=/opt/par4all-1.2 -v --jobs=4 | ||
- | </code> | ||
- | |||
- | |||
- | Pour la version 1.3 | ||
- | <code> | ||
- | # Passage en root | ||
- | sudo su - | ||
- | # Recuperation du code par WGET | ||
- | cd /tmp | ||
- | wget http://download.par4all.org/development/debian/x86_64/2011-10-15/par4all-1.3-20111015T235237~6d76df5_src.tar.gz | ||
- | # Expansion de l'archive | ||
- | tar xzf par4all-1.3-20111015T235237~6d76df5_src.tar.gz | ||
- | # Passage dans le répertoire | ||
- | cd par4all-1.3_src/ | ||
- | # Compilation et installation dans /opt/par4all-1.3 | ||
- | src/simple_tools/p4a_setup.py --prefix=/opt/par4all-1.3 -v --jobs=4 | ||
- | </code> | ||
- | |||
- | <code> | ||
- | |||
- | </code> | ||
- | |||
- | |||
- | |||
- | ===== Utilisation ===== | ||
- | |||
- | La première étape consiste à charger les variables d'environnements pour ensuite utiliser la commande "magique", ''p4a''<code> | ||
- | # Pour la version 1.3 et si vous utilisez ksh ou assimiles | ||
- | source /opt/par4all-1.3/etc/par4all-rc.sh | ||
- | # Pour la version 1.3 et si vous utilisez csh ou assimiles | ||
- | source /opt/par4all-1.3/etc/par4all-rc.csh | ||
- | </code> | ||
- | |||
- | Ensuite, il faut disposer d'un code très simple et que nous savons aisément parallélisable : un produit de matrices par exemple. Le code source le plus élémentaire que nous puissions trouver est le suivant : | ||
- | <code> | ||
- | #include <stdio.h> | ||
- | |||
- | #define size 2048 | ||
- | #define FTYPE double | ||
- | |||
- | int main(void) | ||
- | { | ||
- | FTYPE a[size][size]; | ||
- | FTYPE b[size][size]; | ||
- | FTYPE c[size][size]; | ||
- | |||
- | int i,j,k; | ||
- | |||
- | for (i = 0; i < size; ++i) { | ||
- | for ( j = 0; j < size; ++j) { | ||
- | a[i][j] = (FTYPE)i + j; | ||
- | b[i][j] = (FTYPE)i - j; | ||
- | c[i][j] = 0.0f; | ||
- | } | ||
- | } | ||
- | |||
- | for ( i = 0; i < size; ++i) { | ||
- | for ( j = 0; j < size; ++j) { | ||
- | for (k = 0; k < size; ++k) { | ||
- | c[i][j] += a[i][k] * b[k][j]; | ||
- | } | ||
- | } | ||
- | } | ||
- | |||
- | for ( i = 0; i < size; ++i) { | ||
- | printf("%f ",c[i][i]); | ||
- | } | ||
- | printf("\n"); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | Si nous appelons ce code ''matrix.c'', pour le compiler simplement avec GCC, nous avons :<code> | ||
- | gcc -o matrix matrix.c | ||
- | </code> | ||
- | |||
- | Si nous voulons optimiser un peu la compilation, nous utilisons les options ''-O3'', ''-mtune=native'' et ''-march=native'' :<code> | ||
- | gcc -O3 -march=native -mtune=native -o matrix matrix.c | ||
- | </code> | ||
- | |||
- | <note important> | ||
- | Je conseille très **fortement** de toujours disposer d'exécutables "//témoins//" pour vérifier les sorties des autres implémentations ! Nous pouvons voir que le programme ci-dessus présente en sortie les éléments de la diagonale de la matrice, éléments qui peuvent être utilisés pour une vérification //a minima// des résultats.</note> | ||
- | |||
- | ==== Pour utiliser P4A en mode analyse ==== | ||
- | |||
- | Utilisation directe | ||
- | <code> | ||
- | p4a --simple -vv matrix.c -o matrix-simple | ||
- | </code> | ||
- | |||
- | Utilisation avec compilation séparée | ||
- | <code> | ||
- | p4a --simple -vv matrix.c | ||
- | gcc -O3 -mtune=native -o matrix-simple matrix.p4a.c | ||
- | </code> | ||
- | |||
- | ==== Pour utiliser P4A en mode OpenMP ==== | ||
- | |||
- | Utilisation directe | ||
- | <code> | ||
- | p4a --openmp -vv matrix.c --fine -o matrix-openmp | ||
- | </code> | ||
- | |||
- | Utilisation avec compilation séparée | ||
- | <code> | ||
- | p4a --openmp -vv matrix.c | ||
- | gcc -fopenmp -O3 -mtune=native -o matrix-openmp matrix.p4a.c | ||
- | </code> | ||
- | |||
- | ==== Pour utiliser P4A en mode Cuda ==== | ||
- | |||
- | Utilisation directe | ||
- | <code> | ||
- | export CUDA_DIR=/opt/cuda | ||
- | p4a --cuda -vv matrix.c --fine -o matrix-cuda | ||
- | </code> | ||
- | |||
- | Utilisation avec compilation séparée | ||
- | <code> | ||
- | export CUDA_DIR=/opt/cuda | ||
- | # Appel de Par4all | ||
- | p4a --fine --cuda -vv matrix.c | ||
- | # Compilation des sources CUDA avec le compilateur Nvidia | ||
- | nvcc --cuda -I$CUDA_DIR/include -DP4A_ACCEL_CUDA -I/opt/par4all-1.3/share/p4a_accel -o matrix.p4a.cpp matrix.p4a.cu | ||
- | nvcc --cuda -I$CUDA_DIR/include -DP4A_ACCEL_CUDA -I/opt/par4all-1.3/share/p4a_accel -o p4a_accel.cpp /opt/par4all-1.3/share/p4a_accel/p4a_accel.cu | ||
- | # Compilation des deux sources | ||
- | g++ -c -I$CUDA_DIR/include -DP4A_ACCEL_CUDA -I/opt/par4all-1.3/share/p4a_accel -Wall -fno-strict-aliasing -fPIC -O3 -o matrix.p4a.o matrix.p4a.cpp | ||
- | g++ -c -I$CUDA_DIR/include -DP4A_ACCEL_CUDA -I/opt/par4all-1.3/share/p4a_accel -Wall -fno-strict-aliasing -fPIC -O3 -o p4a_accel.o p4a_accel.cpp | ||
- | # Compilation finale de l'executable | ||
- | g++ -L$CUDADIR/lib64 -L$CUDADIR/lib -Bdynamic -lcudart -o matrix-cuda matrix.p4a.o p4a_accel.o | ||
- | # Effacement des fichiers intermédiaires inutiles | ||
- | rm p4a_accel.o p4a_accel.cpp | ||
- | </code> | ||
- | |||
- | ==== Pour utiliser P4A en mode OpenCL ==== | ||
- | |||
- | |||
- | Utilisation simple passe | ||
- | <code> | ||
- | p4a --opencl -vvv matrix.c -o matrix-ocl | ||
- | </code> | ||
- | |||
- | Utilisation double passe | ||
- | <code> | ||
- | |||
- | </code> | ||
- | ===== Exemple ===== | ||
- | |||
- | --- //[[emmanuel.quemener@ens-lyon.fr|Emmanuel Quemener]] 2011/11/06 17:38// |