#include "scan.hpp" #include template void omp_scan(int n, const T* in, T* out, Op op, unsigned nthreads) { int i, chunk; std::vector last_value_chunk_array(nthreads+1); /* Parallel region begins */ #pragma omp parallel shared(in, out, chunk) private(i) num_threads(nthreads) { const int num_threads = omp_get_num_threads(); // To get number of threads in machine float chunk_in_float = n/(float)num_threads; chunk = ceil(chunk_in_float); // Defining chunk values const int idthread = omp_get_thread_num(); // Get thread ID #pragma omp single { last_value_chunk_array[0] = 0; } int operation = 0; /* For region begins */ #pragma omp for schedule(static, chunk) nowait for(i=0;i{}, nthreads); } std::chrono::microseconds measure_time_omp(size_t num_threads) { auto beg = std::chrono::high_resolution_clock::now(); scan_omp(num_threads); auto end = std::chrono::high_resolution_clock::now(); return std::chrono::duration_cast(end - beg); }