#include #include #include "omp.h" #define NELEMENTS 1024*1024*4 int global_NumThreads; float vecA[NELEMENTS]; float vecB[NELEMENTS]; float vecC[NELEMENTS]; float dp = 0.0; double time; int main () { #pragma omp parallel for z for(int i=0; i < NELEMENTS; i ++) { vecA[i] = 1.0 ; vecB[i] = 2.0 ; } #pragma omp parallel for schedule(static) for(int i=0; i < NELEMENTS; i ++) { vecC[i] = vecA[i] * vecB[i]; } dp = 0.0; time = omp_get_wtime(); #pragma omp parallel for shared(dp) for(int i=0; i < NELEMENTS; i ++) { // ustvarimo kritično sekcijo #pragma omp critical { // "zakleni ključavnico" dp += vecC[i]; } // "odkleni ključavnico" } printf("TIME CRITICAL: %f ", omp_get_wtime() - time); printf("Dot product = %f \n", dp); dp = 0.0; time = omp_get_wtime(); #pragma omp parallel for shared(dp) for(int i=0; i < NELEMENTS; i ++) { // ustvarimo kritično sekcijo #pragma omp atomic dp += vecC[i]; } printf("TIME ATOMIC: %f ", omp_get_wtime() - time); printf("Dot product = %f \n", dp); dp = 0.0; time = omp_get_wtime(); #pragma omp parallel for reduction(+:dp) for(int i=0; i < NELEMENTS; i ++) { dp += vecC[i]; } printf("TIME REDUCTION: %f ", omp_get_wtime() - time); printf("Dot product = %f \n", dp); dp = 0.0; time = omp_get_wtime(); for(int i=0; i < NELEMENTS; i ++) { dp += vecC[i]; } printf("TIME NOPARALL: %f ", omp_get_wtime() - time); printf("Dot product = %f \n", dp); return 0; }