// OpenMP Scheduling example SJ #include #include #include #include #include int dummy_seq(int N); int dummy_par1(int N); int dummy_par2(int N); int dummy_par3(int N); double ltime(); int main(int argc, char *argv[]) { int N = 100000; int P = 1; int res = 0; double starttime, endtime, seqtime, partime; if (argc > 1) N = atoi(argv[1]); P = omp_get_num_procs(); // wake up processors to full speed res = dummy_seq(N); res += dummy_seq(N); res += dummy_seq(N); printf("%d\n", res); starttime = ltime(); res = dummy_seq(N); endtime = ltime(); seqtime = endtime-starttime; printf("Sequential %d, N=%d, time = %.6lf s, %6.3lf Giter/s\n", res, N, seqtime, ((double)N*N/(200*seqtime))/1000000000); starttime = ltime(); res = dummy_par1(N); endtime = ltime(); partime = endtime-starttime; printf("Parallel1 %d, N=%d, time = %.6lf s, %6.3lf Giter/s\n", res, N, partime, ((double)N*N/(200*partime))/1000000000); printf("Speedup %6.2f, P = %d, efficiency = %4.2f\n", seqtime/partime, P, (seqtime/partime)/P); starttime = ltime(); res = dummy_par2(N); endtime = ltime(); partime = endtime-starttime; printf("Parallel2 %d, N=%d, time = %.6lf s, %6.3lf Giter/s\n", res, N, partime, ((double)N*N/(200*partime))/1000000000); printf("Speedup %6.2f, P = %d, efficiency = %4.2f\n", seqtime/partime, P, (seqtime/partime)/P); starttime = ltime(); res = dummy_par3(N); endtime = ltime(); partime = endtime-starttime; printf("Parallel3 %d, N=%d, time = %.6lf s, %6.3lf Giter/s\n", res, N, partime, ((double)N*N/(200*partime))/1000000000); printf("Speedup %6.2f, P = %d, efficiency = %4.2f\n", seqtime/partime, P, (seqtime/partime)/P); } int dummy_seq(int N) { int i, j, s = 0; for (i = 0; i < N; i++) { for (j = 0; j < i/100; j++) { if (j%2 || i%2) s++; // some extra logic to avoid too } // powerful optimizer } return s; } int dummy_par1(int N) { int i, j, s = 0, s2 = 0; #pragma omp parallel private(s2) { s2 = 0; #pragma omp for for (i = 0; i < N; i++) { for (j = 0; j < i/100; j++) { if (j%2 || i%2) s2++; } } #pragma omp critical s += s2; } return s; } int dummy_par2(int N) { int i, j, s = 0, s2 = 0; #pragma omp parallel private(s2) { s2 = 0; #pragma omp for schedule(static,10) for (i = 0; i < N; i++) { for (j = 0; j < i/100; j++) { if (j%2 || i%2) s2++; } } #pragma omp critical s += s2; } return s; } int dummy_par3(int N) { int i, j, s = 0, s2 = 0; #pragma omp parallel private(s2) { s2 = 0; #pragma omp for schedule(guided) for (i = 0; i < N; i++) { for (j = 0; j < i/100; j++) { if (j%2 || i%2) s2++; } } #pragma omp critical s += s2; } return s; } double ltime() { struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); return tv.tv_sec + (double)tv.tv_usec/1000000; }