#include #include #include #include // silly version ... long sum_silly (int N){ long sum = 0; #pragma omp parallel for schedule(static,1) for (int i = 1; i <= N ; i++) { sum += i; } return sum; } // less silly version ... long sum_less_silly (int N){ long sum = 0; #pragma omp parallel for schedule(static,1) for (int i = 1; i <= N ; i++) { #pragma omp critical sum += i; } return sum; } // not silly version ... long sum_not_silly (int N){ long sum = 0; #pragma omp parallel for reduction(+:sum) schedule(static,1) for (int i = 1; i <= N ; i++) { sum += i; } return sum; } // not silly version (hand made) ... long sum_not_silly_hand_made (int N){ long sum = 0; #pragma omp parallel { long local_sum = 0; int start = N* omp_get_thread_num()/omp_get_num_threads() + 1; int end = N*(omp_get_thread_num()+1)/omp_get_num_threads() + 1; for (int i = start; i < end ; i++) { local_sum += i; } #pragma omp critical sum += local_sum; } return sum; } int main (int argc, char *argv[]){ long N = atoi(argv[1]); printf("exact = %ld\n",(N*(N+1))/2); printf("silly = %ld\n",sum_silly(N)); printf("less silly = %ld\n",sum_less_silly(N)); printf("not silly = %ld\n",sum_not_silly(N)); printf("not silly hand made = %ld\n",sum_not_silly_hand_made(N)); return 0; }