diff --git a/drama/src/rev-mc.c b/drama/src/rev-mc.c index 8a4ae82..421ad9d 100644 --- a/drama/src/rev-mc.c +++ b/drama/src/rev-mc.c @@ -337,7 +337,7 @@ find_row_mask(std::vector &sets, fprintf(stderr, "worker_step: %ld\n", step); for (int i = 0; i < thread_num; ++i) { - workers.emplace_back([&] { + workers.emplace_back([=, &row_mask, &found, &lock] { while (!found) { uint64_t cur_mask = last_mask; { @@ -350,12 +350,33 @@ find_row_mask(std::vector &sets, } for (int i = 0; i < step && cur_mask < last_mask; ++i) { - if (!found.load(std::memory_order_relaxed) && resolve(cur_mask)) { - std::lock_guard _(lock); - if (!found.exchange(true)) { - row_mask = cur_mask; - break; + if (found.load(std::memory_order_relaxed)) { break; } + + if (cur_mask & LS_BITMASK(CL_SHIFT)) { + cur_mask = next_bit_permutation(row_mask); + continue; + } + bool mismatch = false; + for (auto addr_pool : same_row_sets) { + addr_tuple base_addr = addr_pool[0]; + for (int i = 1; i < addr_pool.size(); i++) { + addr_tuple tmp = addr_pool[i]; + if ((tmp.p_addr & row_mask) != (base_addr.p_addr & cur_mask)) { + mismatch = true; + break; + } } + if (mismatch) { break; } + } + if (mismatch) { + cur_mask = next_bit_permutation(row_mask); + continue; + } + + std::lock_guard _(lock); + if (!found.exchange(true)) { + row_mask = cur_mask; + break; } } }