#include #include #include #include #include #include #include #include "stencil.h" double *cur_step; double *next_step; int next_thread_id = 0; pthread_mutex_t thread_id_mutex; /* A COMPLETER: variables globales */ sem_t upper_border[NB_THREADS]; sem_t lower_border[NB_THREADS]; /* initialize matrixes */ void init() { int i, j; cur_step = malloc(sizeof(double) * N * N); next_step = malloc(sizeof(double) * N * N); srand(time(NULL)); for(i=0; i 0) sem_wait(&upper_border[my_id]); if(my_id < NB_THREADS-1) sem_wait(&lower_border[my_id]); if(my_id == 0) printf("STEP %d...\n", i); compute(i_min, i_max, j_min, j_max, m1, m2); double *tmp = m1; m1 = m2; m2 = tmp; if(my_id < NB_THREADS-1) sem_post(&upper_border[my_id+1]); if(my_id > 0) sem_post(&lower_border[my_id-1]); } printf("Thread %d ends\n", my_id); return NULL; } int main(int argc, char**argv) { struct timeval t1, t2; unsigned int i; printf("Initialization (problem size: %d)\n", N); init(); printf("Start computing (%d steps)\n", NB_STEPS); GET_TIME(t1); pthread_t tids[NB_THREADS]; for(i=0;i