mirror of https://github.com/dnomd343/klotski.git
Dnomd343
2 months ago
6 changed files with 191 additions and 89 deletions
@ -1,22 +0,0 @@ |
|||
#include <gtest/gtest.h> |
|||
|
|||
#include "cases.h" |
|||
|
|||
using klotski::cases::TYPE_ID_LIMIT; |
|||
|
|||
void type_id_parallel(std::function<void(uint32_t type_id)> &&func) { |
|||
|
|||
BS::thread_pool pool; |
|||
|
|||
// TODO: using `detach_sequence`
|
|||
for (uint32_t type_id = 0; type_id < TYPE_ID_LIMIT; ++type_id) { |
|||
|
|||
pool.detach_task([type_id, func = std::move(func)]() { |
|||
func(type_id); |
|||
}); |
|||
|
|||
} |
|||
|
|||
pool.wait(); |
|||
|
|||
} |
@ -0,0 +1,86 @@ |
|||
#include <BS_thread_pool.hpp> |
|||
|
|||
#include <iostream> |
|||
|
|||
#include "group/group.h" |
|||
#include "helper/parallel.h" |
|||
#include "all_cases/all_cases.h" |
|||
|
|||
using klotski::cases::AllCases; |
|||
using klotski::cases::TYPE_ID_LIMIT; |
|||
using klotski::cases::ALL_CASES_NUM_; |
|||
|
|||
void helper::type_id_parallel(std::function<void(uint32_t type_id)> &&func) { |
|||
|
|||
BS::thread_pool pool; |
|||
|
|||
// TODO: using `detach_sequence`
|
|||
for (uint32_t type_id = 0; type_id < TYPE_ID_LIMIT; ++type_id) { |
|||
|
|||
pool.detach_task([type_id, &func]() { |
|||
func(type_id); |
|||
}); |
|||
|
|||
} |
|||
|
|||
pool.wait(); |
|||
|
|||
} |
|||
|
|||
void helper::group_union_parallel(std::function<void(GroupUnion)> &&func) { |
|||
type_id_parallel([&func](uint32_t type_id) { |
|||
func(GroupUnion::unsafe_create(type_id)); |
|||
}); |
|||
} |
|||
|
|||
void helper::common_code_parallel(std::function<void(std::span<CommonCode>)> &&func) { |
|||
|
|||
static auto codes = AllCases::instance().fetch().codes(); |
|||
|
|||
BS::thread_pool pool; |
|||
|
|||
// TODO: enhance performance
|
|||
|
|||
pool.detach_blocks((uint64_t)0, codes.size(), [&func](auto start, auto end) { |
|||
|
|||
func(std::span<CommonCode> {codes.data() + start, end - start}); |
|||
|
|||
}, 16); |
|||
|
|||
pool.wait(); |
|||
|
|||
} |
|||
|
|||
void helper::raw_code_parallel(std::function<void(std::span<RawCode>)> &&func) { |
|||
|
|||
auto common_codes = AllCases::instance().fetch().codes(); |
|||
static auto codes = std::vector<RawCode> {common_codes.begin(), common_codes.end()}; |
|||
|
|||
BS::thread_pool pool; |
|||
pool.detach_blocks((uint64_t)0, codes.size(), [&func](auto start, auto end) { |
|||
|
|||
func(std::span<RawCode> {codes.data() + start, end - start}); |
|||
|
|||
}, 16); |
|||
|
|||
pool.wait(); |
|||
|
|||
} |
|||
|
|||
void helper::short_code_parallel(std::function<void(std::span<ShortCode>)> &&func) { |
|||
static auto codes = []() { |
|||
std::vector<uint32_t> v (klotski::codec::SHORT_CODE_LIMIT); |
|||
std::iota(v.begin(), v.end(), 0); |
|||
return v; |
|||
}(); |
|||
|
|||
BS::thread_pool pool; |
|||
pool.detach_blocks((uint64_t)0, codes.size(), [&func](auto start, auto end) { |
|||
|
|||
auto span = std::span<uint32_t> {codes.data() + start, end - start}; |
|||
func(std::bit_cast<std::span<ShortCode>>(span)); |
|||
|
|||
}, 16); |
|||
|
|||
pool.wait(); |
|||
} |
@ -0,0 +1,51 @@ |
|||
#pragma once |
|||
|
|||
#include <span> |
|||
|
|||
#include "raw_code/raw_code.h" |
|||
#include "short_code/short_code.h" |
|||
#include "common_code/common_code.h" |
|||
|
|||
using klotski::codec::RawCode; |
|||
using klotski::codec::ShortCode; |
|||
using klotski::codec::CommonCode; |
|||
|
|||
using klotski::cases::GroupUnion; |
|||
|
|||
namespace helper { |
|||
|
|||
// ----------------------------------------------------------------------------------------- //
|
|||
|
|||
void type_id_parallel(std::function<void(uint32_t type_id)> &&func); |
|||
|
|||
void group_union_parallel(std::function<void(GroupUnion group_union)> &&func); |
|||
|
|||
#define TYPE_ID_PARALLEL(impl) \ |
|||
helper::type_id_parallel([](uint32_t type_id) {impl}) |
|||
|
|||
#define GROUP_UNION_PARALLEL(impl) \ |
|||
helper::group_union_parallel([](GroupUnion group_union) {impl}) |
|||
|
|||
// ----------------------------------------------------------------------------------------- //
|
|||
|
|||
/// Spawn all valid RawCodes in parallel.
|
|||
void raw_code_parallel(std::function<void(std::span<RawCode>)> &&func); |
|||
|
|||
/// Spawn all valid ShortCodes in parallel.
|
|||
void short_code_parallel(std::function<void(std::span<ShortCode>)> &&func); |
|||
|
|||
/// Spawn all valid CommonCodes in parallel.
|
|||
void common_code_parallel(std::function<void(std::span<CommonCode>)> &&func); |
|||
|
|||
#define CODE_PARALLEL(Type, type, impl) \ |
|||
helper::type##_code_parallel([](std::span<Type##Code> codes) { \ |
|||
for (auto code : codes) {impl} \ |
|||
}) |
|||
|
|||
#define RAW_CODE_PARALLEL(impl) CODE_PARALLEL(Raw, raw, impl) |
|||
#define SHORT_CODE_PARALLEL(impl) CODE_PARALLEL(Short, short, impl) |
|||
#define COMMON_CODE_PARALLEL(impl) CODE_PARALLEL(Common, common, impl) |
|||
|
|||
// ----------------------------------------------------------------------------------------- //
|
|||
|
|||
} // namespace helper
|
Loading…
Reference in new issue