#include #include #include #define NELEMENTS 1024*1024 #define NTHREADS 16 typedef struct { unsigned int thread_ID; float* pvecstripA; float* pvecstripB; float* pvecstripC; } argumenti_t; pthread_t nit[NTHREADS]; void* funkcija_niti(void* arg); void* (*pfunkcija_niti)(void*); argumenti_t args[NTHREADS]; float* pvecA; float* pvecB; float* pvecC; float rezultat = 0.0; int main(){ pfunkcija_niti = funkcija_niti; // dinamično ustvarim 3 velike vektorje v pomnilniku pvecA = (float*)malloc(NELEMENTS*sizeof(float)); pvecB = (float*)malloc(NELEMENTS*sizeof(float)); pvecC = (float*)malloc(NELEMENTS*sizeof(float)); // init vektorjev A in B: for (int i = 0; i < NELEMENTS; i++) { *(pvecA + i) = 2.0; pvecB[i] = 3.0; } for (int i = 0; i < NTHREADS; i++) { args[i].thread_ID = i; args[i].pvecstripA = (float*)(pvecA + i*NELEMENTS/NTHREADS); args[i].pvecstripB = (float*)(pvecB + i*NELEMENTS/NTHREADS); args[i].pvecstripC = (float*)(pvecC + i*NELEMENTS/NTHREADS); pthread_create(&(nit[i]), // kazalec na nit, ki jo ustvarjamo NULL, pfunkcija_niti, // funkcija, ki jo izvede ustvarjena nit (void*) &args[i]); // argumenti funkcije, ki jo izvede ustvarjena nit - // edini argument je navaden void naslov, zato moram naslov na strukturo args1 // pretvorit v navaden void naslov } // Počakajmo , da se vse niti zaključijo. V ta namen uporabim funkcijo join: for (int i = 0; i < NTHREADS; i++) { pthread_join(nit[i], NULL); } // šele sedaj je varno zaključiti main(). printf("Rezultat = %f \n", rezultat); free(pvecA); free(pvecB); free(pvecC); return 0; } void* funkcija_niti(void* arg){ // argument arg je navaden void nasalov, ki ga želim uporabiti za dostop do elementov strukture, na katero kaže. // Zato moram definirati nov kazalec na sterukturo in argument castat na ta tip argumenti_t* argumenti = (argumenti_t*) arg; for (int i = 0; i < NELEMENTS/NTHREADS; i++) { argumenti->pvecstripC[i] = argumenti->pvecstripA[i] + argumenti->pvecstripB[i]; rezultat = rezultat + argumenti->pvecstripC[i]; } }