results_cilk.hpp 781 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #ifndef RESULTS_CILK
  2. #define RESULTS_CILK
  3. #include <cilk/cilk.h>
  4. #include <cilk/reducer.h>
  5. #include "results.hpp"
  6. class ResultsReducer{
  7. private:
  8. struct Monoid:cilk::monoid_base<Results>{
  9. static void reduce(Results* left,Results* right);
  10. };
  11. cilk::reducer<Monoid> imp_;
  12. public:
  13. ResultsReducer();
  14. size_t& n(size_t g);
  15. void reset();
  16. Results& get_results();
  17. };
  18. extern ResultsReducer cilk_results;
  19. inline
  20. ResultsReducer::ResultsReducer():imp_(){
  21. }
  22. inline void
  23. ResultsReducer::reset(){
  24. imp_.view().clear();
  25. }
  26. inline void
  27. ResultsReducer::Monoid::reduce(Results* left,Results* right){
  28. left->add(*right);
  29. }
  30. inline size_t&
  31. ResultsReducer::n(size_t g){
  32. return imp_.view().n[g];
  33. }
  34. inline Results&
  35. ResultsReducer::get_results(){
  36. return imp_.view();
  37. }
  38. #endif