#include "mylib.h" #include // assert() #include #include #include // multiplies<>{} #include #include // iota() #ifdef _OPENMP #include #endif #include using namespace std; double scalar(vector const &x, vector const &y) { assert(x.size() == y.size()); // switch off via compile flag: -DNDEBUG size_t const N = x.size(); double sum = 0.0; #pragma omp parallel for default(none) shared(x,y,N) reduction(+:sum) schedule(static) for (size_t i = 0; i < N; ++i) { sum += x[i] * y[i]; //sum += exp(x[i])*log(y[i]); } return sum; } double scalar2(vector const &x, vector const &y) { assert(x.size() == y.size()); size_t const N = x.size(); double sum = 0.0; #pragma omp parallel shared(x,y,N,sum) { double local_sum = 0.0; int const th_id = omp_get_thread_num(); int const nthrds = omp_get_num_threads(); for (size_t i = th_id; i < N; i += nthrds) { local_sum += x[i] * y[i]; } #pragma omp atomic sum += local_sum; } return sum; } vector reduction_vec(int n) { vector vec(n); #pragma omp parallel default(none) shared(cout) reduction(VecAdd:vec) { #pragma omp barrier #pragma omp critical cout << omp_get_thread_num() << " : " << vec.size() << endl; #pragma omp barrier iota( vec.begin(),vec.end(), omp_get_thread_num() ); #pragma omp barrier #pragma omp critical cout << vec << endl; } return vec; } vector reduction_vec_append(int n) { vector vec; #pragma omp parallel default(none) shared(cout,n) reduction(VecAppend:vec) { vector local(n); #pragma omp barrier #pragma omp critical cout << omp_get_thread_num() << " : " << local.size() << endl; #pragma omp barrier iota( local.begin(),local.end(), omp_get_thread_num() ); #pragma omp critical vec.insert(vec.end(), local.begin(), local.end()); } return vec; }