123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- #ifndef RESULTS_HPP
- #define RESULTS_HPP
- #include <cilk/cilk.h>
- #include <cilk/reducer.h>
- #include "config.hpp"
- static const size_t result_size=max_len/2;
- struct Results{
- size_t numbers[result_size];
- Reel sum_fp[result_size];
- Results();
- void reset();
- };
- class ResultsReducer{
- private:
- struct Monoid:cilk::monoid_base<Results>{
- static void reduce(Results* left, Results* Right);
- };
- cilk::reducer<Monoid> imp_;
- public:
- ResultsReducer();
- size_t& numbers(size_t i);
- Reel& sum_fp(size_t i);
- void reset();
- };
- extern ResultsReducer cilk_results;
- inline
- Results::Results(){
- reset();
- }
- inline void
- Results::reset(){
- for(size_t i=0;i<result_size;++i){
- numbers[i]=0;
- sum_fp[i]=0;
- }
- }
- inline
- ResultsReducer::ResultsReducer(){
- reset();
- }
- inline void
- ResultsReducer::Monoid::reduce(Results* left,Results* right){
- for(size_t i=0;i<result_size;++i){
- left->numbers[i]+=right->numbers[i];
- left->sum_fp[i]+=right->sum_fp[i];
- }
- }
- inline void
- ResultsReducer::reset(){
- imp_.view().reset();
- }
- inline size_t&
- ResultsReducer::numbers(size_t i){
- return imp_.view().numbers[i];
- }
- inline Reel&
- ResultsReducer::sum_fp(size_t i){
- return imp_.view().sum_fp[i];
- }
- #endif
|