15bool is_power_of_2(std::size_t
const n)
noexcept
17 return n > 0 && !(n & (n - 1));
22namespace ddc::detail {
24void distribute_blocks(
25 std::size_t nb_blocks,
26 std::span<DiscreteVectorElement
const>
const sizes,
27 std::span<DiscreteVectorElement>
const nb_blocks_per_dim)
29 assert(sizes.size() == nb_blocks_per_dim.size());
31 if (!is_power_of_2(nb_blocks)) {
32 throw std::runtime_error(
"DDC distribute_blocks expects a power of 2.");
35 for (DiscreteVectorElement& blocks : nb_blocks_per_dim) {
40 while (nb_blocks != 1) {
41 if (dim >= sizes.size()) {
42 throw std::runtime_error(
"DDC expects a smaller number of blocks.");
45 if (sizes[dim] >= nb_blocks_per_dim[dim] * 2) {
46 nb_blocks_per_dim[dim] *= 2;
54ComputeBlockFn::ComputeBlockFn(
55 DiscreteVectorElement
const extent,
56 DiscreteVectorElement
const nb_blocks)
noexcept
57 : m_quot(extent / nb_blocks)
58 , m_rem(extent % nb_blocks)
62DiscreteVectorElement ComputeBlockFn::operator()(DiscreteVectorElement
const i)
const noexcept
The top-level namespace of DDC.