Ceci est une ancienne révision du document !


Installation de Par4All sous Debian Wheezy

En construction
Cette page présente l'installation de par4all pour les versions 1.4 de Par4All.

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 à partir des sources.

wget http://download.par4all.org/development/ubuntu/x86_64/2012/11/2012-11-29/par4all-1.4.3-e2355ae_src.tar.gz

tar xzf par4all-1.4.3-e2355ae_src.tar.gz 

Préparation du système

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

Récupération, compilation et installation

Pour la version 1.2 : le dossier d'installation choisi est /opt/par4all-1.2

# 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

Pour la version 1.3

# 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


Utilisation

La première étape consiste à charger les variables d'environnements pour ensuite utiliser la commande “magique”, p4a

# 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

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 :

#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;
}

Si nous appelons ce code matrix.c, pour le compiler simplement avec GCC, nous avons :

gcc -o matrix matrix.c

Si nous voulons optimiser un peu la compilation, nous utilisons les options -O3, -mtune=native et -march=native :

gcc -O3 -march=native -mtune=native -o matrix matrix.c
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.

Pour utiliser P4A en mode analyse

Utilisation directe

p4a --simple -vv matrix.c -o matrix-simple

Utilisation avec compilation séparée

p4a --simple -vv matrix.c
gcc -O3 -mtune=native -o matrix-simple matrix.p4a.c

Pour utiliser P4A en mode OpenMP

Utilisation directe

p4a --openmp -vv matrix.c --fine -o matrix-openmp

Utilisation avec compilation séparée

p4a --openmp -vv matrix.c
gcc -fopenmp -O3 -mtune=native -o matrix-openmp matrix.p4a.c

Pour utiliser P4A en mode Cuda

Utilisation directe

export CUDA_DIR=/opt/cuda
p4a --cuda -vv matrix.c --fine -o matrix-cuda

Utilisation avec compilation séparée

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

Pour utiliser P4A en mode OpenCL

Utilisation simple passe

p4a --opencl -vvv matrix.c -o matrix-ocl

Utilisation double passe



Exemple

Emmanuel Quemener 2011/11/06 17:38

developpement/activites/integration/par4all4wheezy.1380130108.txt.gz · Dernière modification: 2015/01/07 10:04 (modification externe)