Small refactoring

This commit is contained in:

View File

@@ -52,7 +52,7 @@ void link(sm::block* out, sm::block* in) {
in->input_blocks.push_back(out);
}
PIVector<sm::block*> scheme_generate(int blocks_count = 100, int begin_block_count = 3, int expansion = 3, float connectivity = 0.3) {
PIVector<sm::block*> scheme_generate(int blocks_count = 100, int begin_block_count = 3, int expansion_shift = 0, int expansion_d = 3, float connectivity = 0.3) {
PIVector<sm::block*> start_blocks;
if (blocks_count <= 0) return start_blocks;
is_calc_statuses.resize(blocks_count, false);
@@ -66,7 +66,7 @@ PIVector<sm::block*> scheme_generate(int blocks_count = 100, int begin_block_cou
PIVector<sm::block*> current_blocks = start_blocks;
do {
int new_blocks_count = rand() % (2 * expansion) - expansion + current_blocks.size();
int new_blocks_count = rand() % (2 * expansion_d) - expansion_d + expansion_shift + current_blocks.size();
if (new_blocks_count < 1) new_blocks_count = 1;
new_blocks_count = new_blocks_count + all_block_count > blocks_count ? blocks_count - all_block_count : new_blocks_count;
@@ -134,21 +134,21 @@ void unlock(sm::block* block, int locks_count = -1) {
block->barrier.clear(std::memory_order_release);
}
int try_lock(PIVector<sm::block*>& block_pool) {
for (int i = 0; i < block_pool.size(); ++i) {
auto block = block_pool[i];
if (block->barrier.test_and_set(std::memory_order_acquire)) continue;
bool try_lock(sm::block* block) {
if (block->barrier.test_and_set(std::memory_order_acquire)) return false;
int locks_count = 0;
for (auto & input_block : block->input_blocks) {
if (input_block->barrier.test_and_set(std::memory_order_acquire)) break;
locks_count++;
}
if (locks_count == block->input_blocks.size()) return i;
if (locks_count == block->input_blocks.size()) {
return true;
} else {
unlock(block, locks_count);
return false;
}
return -1;
}
sm::block* try_lock_next_and_post(std::atomic_flag& block_pool_flag, PIVector<sm::block*>& block_pool, bool& is_block_pool_empty, PIVector<sm::block*>& new_available_blocks) {
@@ -163,11 +163,13 @@ sm::block* try_lock_next_and_post(std::atomic_flag& block_pool_flag, PIVector<sm
is_block_pool_empty = true;
} else {
is_block_pool_empty = false;
int block_idx = try_lock(block_pool);
if (block_idx != -1) {
block = block_pool[block_idx];
block_pool.remove(block_idx);
for (int i = 0; i < block_pool.size(); ++i) {
if (try_lock(block_pool[i])) {
block = block_pool[i];
block_pool.remove(i);
// std::cout << block->is_calc_idx << ": locked for calc" << std::endl;
break;
}
}
}
@@ -290,8 +292,8 @@ void print_performance(std::vector<std::future<sm::time_report>>& duration_futur
int main() {
srand(time(nullptr));
PIVector<sm::block*> start_blocks = scheme_generate(1000, 3, 4, 0.2);
// scheme_print(start_blocks);
PIVector<sm::block*> start_blocks = scheme_generate(100, 3, 1, 3, 0.1);
scheme_print(start_blocks);
auto duration_futures = check_performance(start_blocks, 1);
print_performance(duration_futures);