int main() { try { const int s = 1001; std::vector<int> vec; vec.reserve(s); for (int i=0; i<s;++i) vec.push_back(1); int r = parallel_accumulate(vec.begin(), vec.end(),0); std::cout << r << std::endl; } catch (std::exception& ex) { std::cout << "ERROR= " << ex.what() << "" << std::endl; return 1; } catch (...) { std::cout << " ERROR= exception thrown" << std::endl; return 2; } return 0; }
int main() { std::vector<int> vi; for(int i=0;i<1000;++i) { vi.push_back(10); } int sum=parallel_accumulate(vi.begin(),vi.end(),5); std::cout<<"sum="<<sum<<std::endl; }
int main(void) { std::vector<int> ivec; for (int i = 0; i < 2000000; ++i) { ivec.push_back(1); } std::chrono::system_clock::time_point b = std::chrono::system_clock::now(); std::cout << parallel_accumulate(ivec.begin(), ivec.end(), 0) << std::endl; std::chrono::system_clock::time_point e = std::chrono::system_clock::now(); std::cout << (e - b).count() << std::endl; b = e; std::cout << std::accumulate(ivec.begin(), ivec.end(), 0) << std::endl; e = std::chrono::system_clock::now(); std::cout << (e - b).count() << std::endl; return 0; }
T parallel_accumulate(Iterator first, Iterator last, T init) { unsigned long const length = std::distance(first, last); unsigned long const max_chunk_size = 25; if (length <= max_chunk_size) { return std::accumulate(first, last, init); } else { Iterator mid_point = first; std::advance(mid_point, length / 2); std::future<T> first_half_result = std::async(parallel_accumulate<Iterator, T>, first, mid_point, init); T second_half_result = parallel_accumulate(mid_point, last, T()); return first_half_result.get() + second_half_result; } }