#include #include #include #include #define NELEMENTS 1024*1024*16 #define THREADS 16 // deklariram strukturo za prenašanje argumentov v niti struct argumenti { int myID; // ID posamezne niti }; pthread_t thread[THREADS]; // deklariraj in inicializiraj kljucavnico: pthread_mutex_t kljucavnica = PTHREAD_MUTEX_INITIALIZER; float *vecA; float *vecB; float *vecC; float dotProd; // instance struktur - vsak anit dobi svojo struct argumenti args[THREADS]; void *funkcijaNiti (void* arg){ int mojID; struct argumenti *args ; args = (struct argumenti *) arg; // vrni mi element myID iz strukture, ki je v pomnilniku shranjena na naslovu args: mojID = args->myID; printf("Nit %d racuna... \n", mojID); for (int i = 0; i < NELEMENTS/THREADS; i++) { //vecC[mojID*(NELEMENTS/THREADS)+i] = vecA[mojID*(NELEMENTS/THREADS)+i] * vecB[mojID*(NELEMENTS/THREADS)+i]; vecC[mojID*(NELEMENTS/THREADS)+i] = *(vecA + (mojID*(NELEMENTS/THREADS) + i)) * vecB[mojID*(NELEMENTS/THREADS)+i]; // zakleni kljucavnico in ob uspehu vstopi v kriticno sekcijo pthread_mutex_lock(&kljucavnica); // kriticna sekcija: dotProd += vecC[mojID*(NELEMENTS/THREADS)+i]; // konec kriticne sekcije, lahko odklenemo kljucavnico pthread_mutex_unlock(&kljucavnica); } } int main () { vecA = (float *) malloc(NELEMENTS * sizeof(float)); vecB = (float *) malloc(NELEMENTS * sizeof(float)); vecC = (float *) malloc(NELEMENTS * sizeof(float)); // init vhodnih vektorjev: for (int i = 0; i < NELEMENTS; i++) { vecA[i] = 1.0; //*(vecA + i) = 1.0; vecB[i] = 1.0; } dotProd = 0.0; clock_t start = clock(); // ustvarimo THREADS niti: for (int i = 0; i < THREADS; i++) { // inicializiraj IDje: args[i].myID = i; // ustvari niti: pthread_create( &thread[i], NULL, funkcijaNiti, (void *) &args[i]); } // pocakaj, da vse niti zaključijo z delom: for (int i = 0; i < THREADS; i++) { pthread_join(thread[i], NULL); } clock_t end = clock(); double time_taken = ((double)(end-start))/CLOCKS_PER_SEC; // calculate the elapsed time printf("Skalarni produkt = %f \n", dotProd); printf("Čas izvajanja: %f sekund \n", time_taken); pthread_mutex_destroy(&kljucavnica); return 0; }