#include "gpu/intel/compute/block_manipulation.hpp"
namespace dnnl {
namespace impl {
namespace gpu {
namespace intel {
namespace compute {
bool mapped_block_t::can_merge(
const mapped_block_t &other, bool require_all_match) const {
bool same_broadcast = true;
bool all_match = true;
bool any_match = false;
for (size_t idx = 0; idx < DNNL_MAX_NDIMS; idx++) {
bool new_broadcast = other.is_broadcasted(idx);
bool old_broadcast = is_broadcasted(idx);
same_broadcast &= (new_broadcast == old_broadcast);
if (new_broadcast || old_broadcast) {
continue;
}
const block_t &new_block = other.get_buffer_blocks().at(idx);
const block_t &old_block = get_buffer_blocks().at(idx);
all_match &= old_block.can_merge(new_block, false);
any_match |= old_block.can_merge(new_block, false);
}
if (require_all_match) return same_broadcast && all_match;
return same_broadcast && any_match;
}
std::string block_bin_t::str() const {
ostringstream_t ss;
ss << "block bin (dim_idx: " << dim_idx;
ss << ", num_layouts: " << num_layouts;
ss << ", size: " << size() << ")" << std::endl;
ss << std::setw(50) << "broadcast:";
for (bool bc : is_broadcasted_) {
ss << std::setw(50) << bc;
}
ss << std::endl;
for (const mapped_block_t &blocks : mapped_blocks) {
ss << std::setw(50) << "block:";
for (size_t i = 0; i < num_layouts; i++) {
if (blocks.is_broadcasted(i))
ss << std::setw(50) << "broadcast";
else
ss << std::setw(50) << blocks.get_buffer_blocks().at(i).str();
}
ss << std::endl;
}
return ss.str();
}
} } } } }