Advertisement
Guest User

Untitled

a guest
Jun 18th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.41 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include "Types.h"
  4. #include "Config.h"
  5. #include <iostream>
  6. #include <thread>
  7. #include <atomic>
  8. #include <utility>
  9. #include <mutex>
  10. #include <condition_variable>
  11.  
  12.  
  13. #ifndef BARRIER_SYNC
  14. /** barrier wait macro */
  15. #define BARRIER_SYNC() \
  16. sync_barrier++; \
  17. while (sync_barrier != Config::NUM_WORKERS) \
  18. { \
  19. }; \
  20. sync_barrier--;
  21. #endif
  22.  
  23. //https://stackoverflow.com/questions/24465533/implementing-boostbarrier-in-c11
  24. class Barrier {
  25. public:
  26. explicit Barrier(std::size_t iCount) :
  27. mThreshold(iCount),
  28. mCount(iCount),
  29. mGeneration(0) {
  30. }
  31.  
  32. void Wait() {
  33. std::unique_lock<std::mutex> lLock{mMutex};
  34. auto lGen = mGeneration;
  35. if (!--mCount) {
  36. mGeneration++;
  37. mCount = mThreshold;
  38. mCond.notify_all();
  39. } else {
  40. mCond.wait(lLock, [this, lGen] { return lGen != mGeneration; });
  41. }
  42. }
  43.  
  44. private:
  45. std::mutex mMutex;
  46. std::condition_variable mCond;
  47. std::size_t mThreshold;
  48. std::size_t mCount;
  49. std::size_t mGeneration;
  50. };
  51.  
  52. class RadixJoin
  53. {
  54. public:
  55. RadixJoin(relation_t *R, relation_t *S);
  56. RadixJoin(RadixJoin &&) = default;
  57. RadixJoin(const RadixJoin &) = default;
  58. RadixJoin &operator=(RadixJoin &&) = default;
  59. RadixJoin &operator=(const RadixJoin &) = default;
  60. ~RadixJoin();
  61.  
  62. result_relation_t *join();
  63.  
  64. result_relation_t *nlj();
  65.  
  66. private:
  67. inline uint32_t get_hist_size(uint32_t relSize)
  68. {
  69. NEXT_POW_2(relSize);
  70. relSize >>= 2;
  71. if (relSize < 4)
  72. relSize = 4;
  73. return relSize;
  74. }
  75. void parallel_probe(tuple_t * tuples_r, tuple_t * tuples_s, int tuple_count_s, int32_t *hist, uint32_t MASK, int nbits, std::vector<std::pair<uint32_t, uint32_t>> *return_ptr);
  76. bool parallel_partitioning(int tid, int nbits, relation_t *rel, tuple_t *tmp, int **hist, int tuples_per_thread, int histSize, Barrier& barier);
  77. int* partitioning(int tid, int nbits, relation_t *rel, tuple_t *tmp);
  78. std::vector<std::pair<uint32_t,uint32_t>>* build_probe(relation_t* partition_r, relation_t* partition_s, int nbits);
  79.  
  80. relation_t *R_ = nullptr;
  81. relation_t *S_ = nullptr;
  82.  
  83. std::atomic<int> sync_barrier{0};
  84. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement