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()
...
}