#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 float myDotProd; }; pthread_t thread[THREADS]; float *vecA; float *vecB; float *vecC; float dotProd; /* timespec is a struct defined in ctime as * struct timespec { * time_t tv_sec; // seconds * long tv_nsec; // nanoseconds * }; */ struct timespec timeStart, timeEnd; // 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]; args->myDotProd += vecC[mojID*(NELEMENTS/THREADS)+i]; } } 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(); clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &timeStart); // ustvarimo THREADS niti: for (int i = 0; i < THREADS; i++) { // inicializiraj IDje: args[i].myID = i; args[i].myDotProd = 0.0; // 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); dotProd += args[i].myDotProd; } clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &timeEnd); clock_t end = clock(); double time_taken = ((double)(end-start))/CLOCKS_PER_SEC; // calculate the elapsed time double elapsed_time = (timeEnd.tv_sec - timeStart.tv_sec) + (timeEnd.tv_nsec - timeStart.tv_nsec) / 1e9; // in seconds printf("Skalarni produkt = %f \n", dotProd); printf("Čas izvajanja: %f sekund \n", time_taken); printf("Čas izvajanja: %f sekund \n", elapsed_time); return 0; }