#include #include #include #include #include using namespace std; #define ARRLEN 1048576 long count = 0; string formatval(int ct, int id, int val) { ostringstream s; s << "[" << ct << "(" << id << "): multiply by " << val << "]" << endl; return s.str(); } void func(long long arr[], int val, int threadid) { count++; int j; cout << formatval(count, threadid, val); for (j = 0; j < ARRLEN; j++) arr[j] *= val; cout << formatval(count, threadid, val); } int main(int argc, char ** argv) { long long arr[ARRLEN]; int i; // loop control const int prod = 2*3*5*7*11*13; ostringstream s; int threadct = 8; /* number of threads available*/ /* parse command-line arg for number of threads */ if (argc > 1) threadct = atoi(argv[1]); omp_set_num_threads(threadct); #pragma omp parallel default(shared) { #pragma omp for private(i) for (i = 0; i < ARRLEN; i++) arr[i] = prod*i+1; // assert: no element of arr[i] is divisible by a factor of prod #pragma omp sections { #pragma omp section func(arr, 2, omp_get_thread_num()); #pragma omp section func(arr, 3, omp_get_thread_num()); #pragma omp section func(arr, 5, omp_get_thread_num()); #pragma omp section func(arr, 7, omp_get_thread_num()); #pragma omp section func(arr, 11, omp_get_thread_num()); #pragma omp section func(arr, 13, omp_get_thread_num()); } #pragma omp for private(i, s) for (i = 0; i < ARRLEN; i++) if (arr[i] % prod != 0) { s.str(""); s << "arr[" << i << "] == " << arr[i] << " is not divisible by prod" << endl; cout << s.str(); } } cout << "At end, count = " << count << endl; return 0; }