#include "cpu/aarch64/brgemm/brgemm_containers.hpp"
#include "cpu/aarch64/brgemm/jit_brdgmm_kernel.hpp"
namespace dnnl {
namespace impl {
namespace cpu {
namespace aarch64 {
using namespace dnnl::impl::utils;
namespace brgemm_containers {
#ifdef BRGEMM_KERNEL_GLOBAL_STORAGE
std::set<std::shared_ptr<brgemm_kernel_t>,
decltype(brgemm_kernel_container_t::brgemm_kernel_cmp) *>
brgemm_kernel_container_t::set_
= std::set<std::shared_ptr<brgemm_kernel_t>,
decltype(brgemm_kernel_container_t::brgemm_kernel_cmp) *>(
brgemm_kernel_container_t::brgemm_kernel_cmp);
#endif
bool brgemm_desc_container_t::insert(int idx, brgemm_desc_t &brg,
const std::vector<char> &bd_mask,
const std::vector<brgemm_batch_element_t> &static_offsets) {
bd_mask_list_.push_back(bd_mask);
brg.brgattr.bd_mask = bd_mask_list_.back().data();
static_offsets_list_.push_back(static_offsets);
brg.brgattr.static_offsets = static_offsets_list_.back().data();
const auto ret = set_.insert(brg);
refs_[idx] = &(*ret.first);
if (!ret.second) {
bd_mask_list_.pop_back();
static_offsets_list_.pop_back();
}
return ret.second;
}
bool brgemm_kernel_container_t::brgemm_kernel_cmp(
const std::shared_ptr<brgemm_kernel_t> &lhs,
const std::shared_ptr<brgemm_kernel_t> &rhs) {
const auto lsz = lhs->get_jit_generator()->getSize();
const auto rsz = rhs->get_jit_generator()->getSize();
if (lsz != rsz) return (lsz < rsz);
const auto lcode = lhs->get_jit_generator()->CodeGenerator::getCode();
const auto rcode = rhs->get_jit_generator()->CodeGenerator::getCode();
return (std::memcmp(lcode, rcode, lsz) < 0);
}
status_t brgemm_kernel_container_t::insert(int idx, const brgemm_desc_t *brg) {
const auto brgemm_it = brgemm_map_.find(brg);
if (brgemm_it == brgemm_map_.end()) {
brgemm_kernel_t *brg_kernel = nullptr;
status_t s = brgemm_kernel_create(&brg_kernel, *brg);
if (s != status::success) {
delete brg_kernel;
return s;
}
std::shared_ptr<brgemm_kernel_t> sptr(brg_kernel);
lock_write();
const auto kernel_ret = set_.insert(sptr);
refs_[idx] = kernel_ret.first->get();
unlock_write();
const auto brgemm_ret = brgemm_map_.insert({brg, refs_[idx]});
if (!brgemm_ret.second) return status::runtime_error;
} else {
refs_[idx] = brgemm_it->second;
}
return status::success;
}
} } } } }