origine=0; for(i=0;i<TAILLE;i++) for(j=0;j<TAILLE;j++){ a[i][j]=rand(); b[i][j]=rand(); } for(i=0;i<TAILLE;i++) for(j=0;j<TAILLE;j++) origine += a[i][j]+b[i][j]; for(i=0;i<TAILLE;i++) for(j=0;j<TAILLE;j++) a[i][j]=a[i][j]+b[i][j];
S0=0; { 0<=i<=TAILLE-1, 0<=j<=TAILLE-1 } : S1[i,j] = rand(); { 0<=i<=TAILLE-1, 0<=j<=TAILLE-1 } : S2[i,j] = rand(); { 0<=i<=TAILLE-1, 0<=j<=TAILLE-1 } : S3[i,j] = ( if(i==0 && j==0) S0; else if(j==0) S3[i-1,TAILLE-1]; else S3[i,j-1] ) + S1[i,j] + S2[i,j]; { 0<=i<=TAILLE-1, 0<=j<=TAILLE-1 } : S4[i,j] = S1[i,j] + S2[i,j];
#include <stdio.h> #include <stdlib.h> #define TAILLE 1024 int main(void){ int i,j; static double a[TAILLE][TAILLE]; static double b[TAILLE][TAILLE]; for(i=0;i<TAILLE;i++) for(j=0;j<TAILLE;j++){ a[i][j]=rand(); b[i][j]=rand(); } float origine=0; for(i=0;i<TAILLE;i++) for(j=0;j<TAILLE;j++) origine += a[i][j]+b[i][j]; for(i=0;i<TAILLE;i++) for(j=0;j<TAILLE;j++) a[i][j]=a[i][j]+b[i][j]; float resultat=0; for(i=0;i<TAILLE;i++) for(j=0;j<TAILLE;j++) resultat += a[i][j]; printf("origine=%lf resultat=%lf\n",origine,resultat); return 0; }
gcc -Wall -O3 --dump-tree-all -ftree-parallelize-loops=2 -floop-parallelize-all \ matrices.c -o matrices
$ cat matrices.c.165t.optimized main () { ... .paral_data_store.a = &a; .paral_data_store.b = &b; __builtin_GOMP_parallel_start (main._loopfn.0, &.paral_data_store, 2); main._loopfn.0 (&.paral_data_store); __builtin_GOMP_parallel_end (); ... } main._loopfn.0 (void * .paral_data_param) { // Sommer les lignes de .paral_data_param.a et de .paral_data_param.b // telles que i % __builtin_omp_get_num_threads() == __builtin_omp_get_thread_num() ... }