Advertisement
eggggggggor

parallel DBS query

Jun 14th, 2024
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.96 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <cstddef>
  4. #include <vector>
  5. #include <functional>
  6. #include <atomic>
  7.  
  8. template<typename row_t>
  9. using predicate_t = std::function<bool(const row_t&)>;
  10.  
  11.  
  12. template<typename row_t>
  13. bool is_satisfied_for_all(std::vector<predicate_t<row_t>> predicates, std::vector<row_t> data_table);
  14.  
  15. template<typename row_t>
  16. bool is_satisfied_for_any(std::vector<predicate_t<row_t>> predicates, std::vector<row_t> data_table);
  17.  
  18.  
  19. template<typename row_t>
  20. bool is_satisfied_for_all(std::vector<predicate_t<row_t>> predicates, std::vector<row_t> data_table) {
  21.     // Doimplementujte telo funkce, ktera rozhodne, zda pro VSECHNY dilci dotazy (obsazene ve
  22.     // vektoru 'predicates') existuje alespon jeden zaznam v tabulce (reprezentovane vektorem
  23.     // 'data_table'), pro ktery je dany predikat splneny.
  24.  
  25.     bool gg = false;
  26.     #pragma omp parallel for
  27.     for (int i = 0; i < predicates.size(); ++i) {
  28.         #pragma omp cancellation point for
  29.         bool go_on= false;
  30.         for (size_t j = 0; j < data_table.size(); j++) {
  31.             auto row = data_table[j];                // i-ty radek tabulky ...
  32.             bool is_satisfied = predicates[i](row);  // ... splnuje prvni predikat, pokud funkce first_predicate vrati true
  33.             if (is_satisfied) {
  34.                 go_on = true;
  35.                 break;
  36.             }
  37.         }
  38.         if (!go_on) {
  39.             gg = true;
  40.             #pragma omp cancel for
  41.         }
  42.     }
  43.     if (gg) {
  44.         return false;
  45.     }
  46.     return true;
  47. }
  48.  
  49. template<typename row_t>
  50. bool is_satisfied_for_any(std::vector<predicate_t<row_t>> predicates, std::vector<row_t> data_table) {
  51.     // Doimplementujte telo funkce, ktera rozhodne, zda je ALESPON JEDEN dilci dotaz pravdivy.
  52.     // To znamena, ze mate zjistit, zda existuje alespon jeden predikat 'p' a jeden zaznam
  53.     // v tabulce 'r' takovy, ze p(r) vraci true.
  54.  
  55.     // Zamyslete se nad tim, pro ktery druh dotazu je vhodny jaky druh paralelizace. Vas
  56.     // kod optimalizujte na situaci, kdy si myslite, ze navratova hodnota funkce bude true.
  57.     // Je pro Vas dulezitejsi rychle najit splnujici radek pro jeden vybrany predikat, nebo
  58.     // je dulezitejsi zkouset najit takovy radek pro vice predikatu paralelne?
  59.  
  60.     bool gg = false;
  61.     for (int i = 0; i < predicates.size(); ++i) {
  62.         bool go_on = true;
  63.         #pragma omp parallel for
  64.         for (size_t j = 0; j < data_table.size(); j++) {
  65.             #pragma omp cancellation point for
  66.             auto row = data_table[j];                // i-ty radek tabulky ...
  67.             bool is_satisfied = predicates[i](row);  // ... splnuje prvni predikat, pokud funkce first_predicate vrati true
  68.             if (is_satisfied) {
  69.                 go_on = false;
  70.                 #pragma omp cancel for
  71. //                break;
  72.             }
  73.         }
  74.         if (!go_on) {
  75.             gg = true;
  76.             break;
  77.         }
  78.     }
  79.     if (gg) {
  80.         return true;
  81.     }
  82.     return false;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement