// matmul_pthread4.c full featured, not all used // threadID 0 for main, 1, 2, 3, 4 same for SlaveID #include #include #include #include #include #define DIM 2048 static double a[DIM][DIM]; static double b[DIM][DIM]; static double c[DIM][DIM]; #define nthread 5 // includes main static int results[nthread]; static pthread_mutex_t ready[nthread]; // allows slave to proceed static pthread_mutex_t done [nthread]; // allows master to proceed static pthread_mutex_t ack [nthread]; // acknowlege proceeding void master_init(int slaveID) { int t = slaveID; pthread_mutex_init(&ready[t], NULL); // holds up slave pthread_mutex_lock(&ready[t]); pthread_mutex_init(&done[t], NULL); // holds up master pthread_mutex_unlock(&done[t]); pthread_mutex_init(&ack[t], NULL); // holds up slave pthread_mutex_unlock(&ack[t]); } // end master_init void master_release(int slaveID) { int t = slaveID; pthread_mutex_lock(&ack[t]); // for hold after ready pthread_mutex_unlock(&ready[t]); // let slaves run } // end master_release void master_barrier(int slaveID) { int t = slaveID; pthread_mutex_lock(&done[t]); // waits for slave to be done pthread_mutex_lock(&ready[t]); // hold slaves until everybody done pthread_mutex_unlock(&done[t]); // ready for slaves next task pthread_mutex_unlock(&ack[t]); // ready for slaves next task } // end master_barrier void slave_init(int slaveID) { int i = slaveID; pthread_mutex_lock(&done[i]); // no wait, master keeps unlocked pthread_mutex_lock(&ready[i]); // wait for master to release pthread_mutex_unlock(&ready[i]); // unlock } // end slave_init void slave_task_done(int slaveID) { int i = slaveID; pthread_mutex_unlock(&done[i]); // this task done } // end slave_task_done void slave_barrier(int slaveID) { int i = slaveID; pthread_mutex_unlock(&done[i]); // master can test for done pthread_mutex_lock(&ack[i]); // wait for master ack pthread_mutex_unlock(&ack[i]); // unlock pthread_mutex_lock(&ready[i]); // waiting for master to release pthread_mutex_unlock(&ready[i]); // unlock pthread_mutex_lock(&done[i]); // no wait, master keeps unlocked } // end slave barrier void * slave_code(void * threadID) { int part; // slaves 1,2,3,4 main is nthread 0 (unused here) double sum; int i, j, k, i1, i2; part = (int)(long int)threadID; if(part==0) { slave_init(part); slave_task_done(part); pthread_exit(NULL); // done } // nothing for main printf(" thread %d started, waiting \n", part); fflush(stdout); slave_init(part); printf(" thread %d computing \n", part); fflush(stdout); i1 = (part-1)*DIM/(nthread-1); i2 = (part)*DIM/(nthread-1); printf(" thread %d i1=%d i2=%d \n", part, i1, i2); fflush(stdout); for(i=i1; i