• [^] # Re: Surprenant que le Fortran ne soit pas mentionné

    Posté par . En réponse à la dépêche Version 1.0 de Julia. Évalué à 5. Dernière modification le 05 mars 2012 à 00:56.

    Pour faire du calcul parallèle scientifique en C/C++ ou en Fortran, il y a actuellement plusieurs méthodes utilisées.

    • OpenMP: On insère des directives en commentaires et un compilateur qui est compatible OpenMP (gcc/icc par exemple) et le compilateur parallélise le tout. Le plus souvent, OpenMP est utilisé pour paralléliser des boucles, mais c'est beaucoup trop réducteur que de le cantonner à cela. A l'exécution, ce sont plusieurs threads qui apparaissent.

    • MPI: C'est souvent utiliser pour paralléliser des gros bout de codes. Par exemple, avoir plusieurs simulations qui tournent avec différentes conditions initiales, et les synchroniser de temps à autre pour changer quelques paramètres. Cela nécessite une librairie et des appels de fonction. A l'exécution, ce sont plusieurs processus qui sont exécutés et qui s'envoient des "messages" d'ou le nom de MPI (Message Passing Interface).

    Ces deux méthodes sont très populaires en Fortran comme en C et il est possible de les mélanger. Cependant, de nombreux ajouts au Fortran 2008 tendent à remplacer ces deux méthodes. Ils ont l'avantage de faire partie du language et d'être plus faciles à utiliser.


    Pointer aliasing

    On dit qu'on a un aliasing de pointeur lorsque deux pointeurs pointent vers la même case mémoire. La plupart du temps cela n'arrive pas, et le compilateur peut optimiser le code. Par exemple en C, dans le code suivant

    void test(int *a, int *array, int size) {
    int k;

    for (k = 0, k less size, ++k) {
     array[k] = array[k] * (* a);
    }
    
    

    }

    il parrait absurder d'appeler le code avec

    test(array + 2, array, n);

    qui va multiplier par a[2] a[0], a[1] et a[2] et par a2 les valeurs dans a[3], …, a[n]. En général personne ne va appeler le code comme cela, mais le compilateur ne peut pas en être sur.
    Supposons que le compilateur ait moyen de savoir qu'il n'y a pas d'aliasing (dans notre exemple a et &array[2] pointent vers la même case mémoire) il peut en déduire que la boucle peut être exécutée dans n'importe quel sens et même parallélisée.