Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| developpement:activites:integration:par4all4wheezy [2013/09/25 17:30] – [Installation] equemene | developpement:activites:integration:par4all4wheezy [2013/09/26 19:45] (Version actuelle) – [Exemple] equemene | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| ====== Installation de Par4All sous Debian Wheezy ====== | ====== Installation de Par4All sous Debian Wheezy ====== | ||
| - | |||
| - | |||
| - | <note important> | ||
| <note important> | <note important> | ||
| Ligne 20: | Ligne 17: | ||
| ===== Installation ===== | ===== Installation ===== | ||
| - | |||
| - | Voici les quelques commandes pour installer Par4All à partir des sources. | ||
| - | |||
| - | < | ||
| - | wget http:// | ||
| - | |||
| - | tar xzf par4all-1.4.3-e2355ae_src.tar.gz | ||
| - | |||
| - | cd par4all-1.4.3_src/ | ||
| - | src/ | ||
| - | |||
| - | </ | ||
| ==== Préparation du système ==== | ==== Préparation du système ==== | ||
| Ligne 40: | Ligne 25: | ||
| ==== Récupération, | ==== Récupération, | ||
| - | Pour la version 1.2 : le dossier d' | + | Voici les quelques commandes pour installer **Par4All** dans ''/ |
| + | |||
| + | Récupération et expansion de l'archive : | ||
| < | < | ||
| - | # Passage en root | ||
| - | sudo su - | ||
| - | # Recuperation du code par WGET | ||
| cd /tmp | cd /tmp | ||
| - | wget http:// | + | wget http:// |
| - | # Expansion de l' | + | tar xzf /tmp/par4all-1.4.3-e2355ae_src.tar.gz |
| - | tar xzf par4all-1.2-d26bc44_src.tar.gz | + | cd /tmp/par4all-1.4.3_src/ |
| - | # Passage dans le répertoire | + | |
| - | cd par4all-1.2_src/ | + | |
| - | # Compilation et installation dans /opt/par4all-1.2 | + | |
| - | src/ | + | |
| </ | </ | ||
| - | + | Compilation & Installation dans ''/ | |
| - | Pour la version 1.3 | + | |
| < | < | ||
| - | # Passage en root | + | src/ |
| - | sudo su - | + | |
| - | # Recuperation du code par WGET | + | |
| - | cd /tmp | + | |
| - | wget http:// | + | |
| - | # Expansion de l' | + | |
| - | tar xzf par4all-1.3-20111015T235237~6d76df5_src.tar.gz | + | |
| - | # Passage dans le répertoire | + | |
| - | cd par4all-1.3_src/ | + | |
| - | # Compilation et installation dans / | + | |
| - | src/ | + | |
| </ | </ | ||
| + | Paramétrage du lien : | ||
| < | < | ||
| + | cd /opt | ||
| + | [ -d / | ||
| + | cd /opt | ||
| + | ln -sf par4all-1.4.3 par4all | ||
| </ | </ | ||
| + | ===== Utilisation ===== | ||
| - | ===== Utilisation ===== | + | <note important> |
| + | Je conseille très **fortement** de toujours disposer d' | ||
| - | La première étape consiste à charger les variables d' | + | ==== Le code source |
| - | # Pour la version 1.3 et si vous utilisez ksh ou assimiles | + | |
| - | source | + | |
| - | # Pour la version 1.3 et si vous utilisez csh ou assimiles | + | |
| - | source / | + | |
| - | </ | + | |
| 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 : | 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 : | ||
| Ligne 90: | Ligne 60: | ||
| #include < | #include < | ||
| - | # | + | # |
| #define FTYPE double | #define FTYPE double | ||
| int main(void) | int main(void) | ||
| { | { | ||
| - | FTYPE a[size][size]; | + | FTYPE a[SIZE][SIZE]; |
| - | FTYPE b[size][size]; | + | FTYPE b[SIZE][SIZE]; |
| - | FTYPE c[size][size]; | + | FTYPE c[SIZE][SIZE]; |
| - | + | | |
| - | | + | |
| - | for (i = 0; i < size; ++i) { | + | for (unsigned int i = 0; i < SIZE; ++i) { |
| - | for ( j = 0; j < size; ++j) { | + | for (unsigned int j = 0; j < SIZE; ++j) { |
| - | a[i][j] = (FTYPE)i + j; | + | a[i][j] = (FTYPE)(i + j); |
| - | b[i][j] = (FTYPE)i - j; | + | b[i][j] = (FTYPE)(i - j); |
| c[i][j] = 0.0f; | c[i][j] = 0.0f; | ||
| } | } | ||
| } | } | ||
| - | for ( i = 0; i < size; ++i) { | + | for (unsigned int i = 0; i < SIZE; ++i) { |
| - | for ( j = 0; j < size; ++j) { | + | for (unsigned int j = 0; j < SIZE; ++j) { |
| - | for (k = 0; k < size; ++k) { | + | for (unsigned int k = 0; k < SIZE; ++k) { |
| c[i][j] += a[i][k] * b[k][j]; | c[i][j] += a[i][k] * b[k][j]; | ||
| } | } | ||
| Ligne 117: | Ligne 86: | ||
| } | } | ||
| - | for ( i = 0; i < size; ++i) { | + | for (unsigned int i = 0; i < SIZE; ++i) { |
| - | | + | |
| } | } | ||
| - | printf(" | + | |
| + | | ||
| return 0; | return 0; | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | ==== Compilation standard & Exécution ==== | ||
| Si nous appelons ce code '' | Si nous appelons ce code '' | ||
| - | gcc -o matrix matrix.c | + | gcc -std=c99 |
| </ | </ | ||
| - | Si nous voulons optimiser un peu la compilation, | + | En exécutant directement **matrix** par '' |
| - | gcc -O3 -march=native -mtune=native -o matrix matrix.c | + | < |
| + | Command terminated by signal 11 | ||
| + | 0.00user 0.00system 0: | ||
| + | 0inputs+0outputs (0major+134minor)pagefaults 0swaps | ||
| </ | </ | ||
| - | <note important> | + | Pour y remédier, nous étendons la taille de la pile (//stack// en langue de Shakespeare) à l' |
| - | 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 | + | <code> |
| + | # Pour eviter les Segmentation Fault | ||
| + | ulimit -s unlimited | ||
| + | </ | ||
| + | |||
| + | L' | ||
| + | < | ||
| + | La trace de la matrice est 18428734073246580736.00 | ||
| + | 152.60user 0.02system 2: | ||
| + | 0inputs+0outputs (0major+24740minor)pagefaults 0swaps | ||
| + | </ | ||
| + | |||
| + | Le programme | ||
| + | |||
| + | ==== Compilation optimisée & Exécution ==== | ||
| + | |||
| + | Nous avons plusieurs [[http:// | ||
| + | |||
| + | Si nous voulons optimiser un peu la compilation, | ||
| + | gcc -std=c99 -O2 -mtune=native -o matrix-O2 matrix.c | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | La trace de la matrice | ||
| + | 75.10user 0.02system 1: | ||
| + | 0inputs+0outputs (0major+24740minor)pagefaults 0swaps | ||
| + | </ | ||
| + | |||
| + | Si nous voulons optimiser un peu la compilation, nous utilisons les options '' | ||
| + | gcc -std=c99 -O3 -mtune=native -o matrix-O3 matrix.c | ||
| + | </code> | ||
| + | |||
| + | L' | ||
| + | < | ||
| + | La trace de la matrice est 18428734073246580736.00 | ||
| + | 39.61user 0.01system 0: | ||
| + | 0inputs+0outputs (0major+24740minor)pagefaults 0swaps | ||
| + | </code> | ||
| + | |||
| ==== Pour utiliser P4A en mode analyse ==== | ==== Pour utiliser P4A en mode analyse ==== | ||
| + | |||
| + | La première étape consiste à charger les variables d' | ||
| + | # Si vous utilisez ksh ou assimiles | ||
| + | source / | ||
| + | # Si vous utilisez csh ou assimiles | ||
| + | source / | ||
| + | </ | ||
| Utilisation directe | Utilisation directe | ||
| Ligne 144: | Ligne 165: | ||
| </ | </ | ||
| - | Utilisation avec compilation séparée | + | L' |
| < | < | ||
| - | p4a --simple -vv matrix.c | + | La trace de la matrice est 18428734073246580736.00 |
| - | gcc -O3 -mtune=native -o matrix-simple matrix.p4a.c | + | 40.73user 0.03system 0: |
| + | 0inputs+0outputs (0major+24740minor)pagefaults 0swaps | ||
| </ | </ | ||
| + | |||
| ==== Pour utiliser P4A en mode OpenMP ==== | ==== Pour utiliser P4A en mode OpenMP ==== | ||
| Ligne 154: | Ligne 177: | ||
| Utilisation directe | Utilisation directe | ||
| < | < | ||
| - | p4a --openmp -vv matrix.c --fine -o matrix-openmp | + | p4a --openmp -vv matrix.c --fine -o matrix-OpenMP |
| </ | </ | ||
| - | Utilisation | + | Utilisation |
| < | < | ||
| p4a --openmp -vv matrix.c | p4a --openmp -vv matrix.c | ||
| - | gcc -fopenmp -O3 -mtune=native -o matrix-openmp | + | gcc -fopenmp -O3 -mtune=native -o matrix-OpenMP |
| </ | </ | ||
| + | |||
| + | L' | ||
| + | < | ||
| + | La trace de la matrice est 18428734073246580736.00 | ||
| + | 182.20user 0.12system 0: | ||
| + | 0inputs+0outputs (0major+24825minor)pagefaults 0swaps | ||
| + | </ | ||
| + | |||
| + | Par défaut, le programme OpenMP se lance sur tous les coeurs disponibles (virtuels ou pas !). Pour limiter sur un certain nombre de coeurs '' | ||
| + | |||
| + | < | ||
| + | N=1 | ||
| + | while [ $N -ge 1 ] | ||
| + | do | ||
| + | echo " | ||
| + | export OMP_NUM_THREADS=$N | ||
| + | / | ||
| + | N=$(($N-1)) | ||
| + | echo | ||
| + | done | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | Lancement sur 8 threads | ||
| + | |||
| + | 187.95user 0.08system 0: | ||
| + | |||
| + | Lancement sur 7 threads | ||
| + | |||
| + | 170.10user 0.04system 0: | ||
| + | |||
| + | Lancement sur 6 threads | ||
| + | |||
| + | 151.38user 0.07system 0: | ||
| + | |||
| + | Lancement sur 5 threads | ||
| + | |||
| + | 125.15user 0.06system 0: | ||
| + | |||
| + | Lancement sur 4 threads | ||
| + | |||
| + | 104.46user 0.04system 0: | ||
| + | |||
| + | Lancement sur 3 threads | ||
| + | |||
| + | 95.95user 0.02system 0: | ||
| + | |||
| + | Lancement sur 2 threads | ||
| + | |||
| + | 87.65user 0.03system 0: | ||
| + | |||
| + | Lancement sur 1 threads | ||
| + | |||
| + | 91.47user 0.02system 1: | ||
| + | </ | ||
| + | |||
| ==== Pour utiliser P4A en mode Cuda ==== | ==== Pour utiliser P4A en mode Cuda ==== | ||
| - | Utilisation directe | + | Utilisation directe |
| < | < | ||
| - | export CUDA_DIR=/opt/cuda | + | export CUDA_DIR=/usr/lib/nvidia-cuda-toolkit/ |
| p4a --cuda -vv matrix.c --fine -o matrix-cuda | p4a --cuda -vv matrix.c --fine -o matrix-cuda | ||
| </ | </ | ||
| + | |||
| + | Nous allons explorer une autre solution : | ||
| Utilisation avec compilation séparée | Utilisation avec compilation séparée | ||
| < | < | ||
| - | export CUDA_DIR=/ | ||
| # Appel de Par4all | # Appel de Par4all | ||
| p4a --fine --cuda -vv matrix.c | p4a --fine --cuda -vv matrix.c | ||
| # Compilation des sources CUDA avec le compilateur Nvidia | # Compilation des sources CUDA avec le compilateur Nvidia | ||
| - | nvcc --cuda -I$CUDA_DIR/include -DP4A_ACCEL_CUDA -I/ | + | nvcc --cuda -I/usr/include -DP4A_ACCEL_CUDA -I/ |
| - | nvcc --cuda -I$CUDA_DIR/include -DP4A_ACCEL_CUDA -I/ | + | nvcc --cuda -I/usr/include -DP4A_ACCEL_CUDA -I/ |
| # Compilation des deux sources | # Compilation des deux sources | ||
| - | g++ -c -I$CUDA_DIR/include -DP4A_ACCEL_CUDA -I/ | + | g++ -c -I/usr/include -DP4A_ACCEL_CUDA -I/ |
| - | g++ -c -I$CUDA_DIR/include -DP4A_ACCEL_CUDA -I/ | + | g++ -c -I/usr/include -DP4A_ACCEL_CUDA -I/ |
| # Compilation finale de l' | # Compilation finale de l' | ||
| - | g++ -L$CUDADIR/lib64 -L$CUDADIR/lib -Bdynamic -lcudart -o matrix-cuda matrix.p4a.o p4a_accel.o | + | g++ -L/usr/lib/ |
| # Effacement des fichiers intermédiaires inutiles | # Effacement des fichiers intermédiaires inutiles | ||
| rm p4a_accel.o p4a_accel.cpp | rm p4a_accel.o p4a_accel.cpp | ||
| </ | </ | ||
| + | |||
| + | En lançant la ''/ | ||
| + | |||
| + | < | ||
| + | / | ||
| + | La trace de la matrice est 18428734073246580736.00 | ||
| + | 2.81user 1.01system 0: | ||
| + | 0inputs+88outputs (0major+27380minor)pagefaults 0swaps | ||
| + | </ | ||
| + | |||
| ==== Pour utiliser P4A en mode OpenCL ==== | ==== Pour utiliser P4A en mode OpenCL ==== | ||
| Ligne 193: | Ligne 283: | ||
| Utilisation simple passe | Utilisation simple passe | ||
| < | < | ||
| - | p4a --opencl -vvv matrix.c -o matrix-ocl | + | p4a --opencl -vvv matrix.c -o matrix-OpenCL |
| </ | </ | ||
| - | Utilisation double passe | + | Son exécution donne ''/ |
| < | < | ||
| + | La trace de la matrice est 18428734073246580736.00 | ||
| + | 3.39user 3.22system 0: | ||
| + | 32inputs+112outputs (0major+38185minor)pagefaults 0swaps | ||
| </ | </ | ||
| - | ===== Exemple ===== | ||
| - | --- // | + | ===== Analyse des résultats ===== |
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | --- // | ||