/*! * \file v3.cpp * \brief vv3 part of the exercise. * * \author * Christos Choutouridis AEM:8997 * */ #include // for (int i=0 ; i int nworkers() { if (session.max_threads) return (session.max_threads < __cilkrts_get_nworkers()) ? session.max_threads : __cilkrts_get_nworkers(); else return __cilkrts_get_nworkers(); } std::vector triang_v(matrix& A) { std::vector c(A.size()); cilk_for (int i=0 ; i& v, index_t begin, index_t end) { for (auto i =begin ; i != end ; ++i) out_sum += v[i]; } value_t sum (std::vector& v) { int n = nworkers(); std::vector sum_v(n, 0); for (index_t i =0 ; i < n ; ++i) { cilk_spawn do_sum(sum_v[i], v, i*v.size()/n, (i+1)*v.size()/n); } cilk_sync; value_t s =0; for (auto& it : sum_v) s += it; return s; } #elif defined OMP /* // export OMP_NUM_THREADS= */ int nworkers() { if (session.max_threads && session.max_threads < (size_t)omp_get_max_threads()) { omp_set_dynamic(0); omp_set_num_threads(session.max_threads); return session.max_threads; } else { omp_set_dynamic(1); return omp_get_max_threads(); } } std::vector triang_v(matrix& A) { std::vector c(A.size()); #pragma omp parallel for shared(c) for (int i=0 ; i& v) { value_t s =0; #pragma omp parallel for reduction(+:s) for (auto i =0u ; i triang_v(matrix& A) { std::vector c(A.size()); for (int i=0 ; i& v) { value_t s =0; for (auto& it : v) s += it; return s; } #endif value_t triang_count (std::vector& c) { return (session.makeSymmetric) ? sum(c)/3 : sum(c); } }