#include "gpu/intel/matmul/gemm.hpp"
#include "gpu/intel/gemm/config.hpp"
#include "gpu/intel/gemm/primitive.hpp"
namespace dnnl {
namespace impl {
namespace gpu {
namespace intel {
namespace matmul {
status_t gemm_t::execute(const exec_ctx_t &ctx) const {
using namespace memory_tracking::names;
const auto src_d = ctx.memory_mdw(DNNL_ARG_SRC);
const auto weights_d = ctx.memory_mdw(DNNL_ARG_WEIGHTS);
const auto dst_d = ctx.memory_mdw(DNNL_ARG_DST);
const auto bia_d = ctx.memory_mdw(DNNL_ARG_BIAS);
memory_storage_t *a0
= &CTX_IN_STORAGE(DNNL_ARG_ATTR_ZERO_POINTS | DNNL_ARG_SRC);
memory_storage_t *b0
= &CTX_IN_STORAGE(DNNL_ARG_ATTR_ZERO_POINTS | DNNL_ARG_WEIGHTS);
memory_storage_t *c0
= &CTX_IN_STORAGE(DNNL_ARG_ATTR_ZERO_POINTS | DNNL_ARG_DST);
gemm::exec_args_t args;
args.a = &CTX_IN_STORAGE(DNNL_ARG_SRC);
args.b = &CTX_IN_STORAGE(DNNL_ARG_WEIGHTS);
args.c = &CTX_OUT_STORAGE(DNNL_ARG_DST);
args.bias = &CTX_IN_STORAGE(DNNL_ARG_BIAS);
args.a_zero_point = b0;
args.b_zero_point = a0;
args.c_zero_point = c0;
args.a_scales = &CTX_IN_STORAGE(DNNL_ARG_ATTR_SCALES | DNNL_ARG_WEIGHTS);
args.b_scales = &CTX_IN_STORAGE(DNNL_ARG_ATTR_SCALES | DNNL_ARG_SRC);
bool dyn_scales
= gemm_->pd()->attr()->scales_.get(DNNL_ARG_DST).is_dynamic();
args.c_scales = dyn_scales
? &CTX_OUT_STORAGE(DNNL_ARG_ATTR_SCALES | DNNL_ARG_DST)
: &CTX_IN_STORAGE(DNNL_ARG_ATTR_SCALES | DNNL_ARG_DST);
args.a_group_sums = &CTX_IN_STORAGE(
DNNL_ARG_ATTR_PRECOMPUTED_REDUCTIONS | DNNL_ARG_WEIGHTS);
args.b_group_sums = &CTX_IN_STORAGE(
DNNL_ARG_ATTR_PRECOMPUTED_REDUCTIONS | DNNL_ARG_SRC);
args.dropout_offset = &CTX_IN_STORAGE(DNNL_ARG_ATTR_DROPOUT_OFFSET);
args.dropout_seed = &CTX_IN_STORAGE(DNNL_ARG_ATTR_DROPOUT_SEED);
args.dropout_prob = &CTX_IN_STORAGE(DNNL_ARG_ATTR_DROPOUT_PROBABILITY);
args.dropout_mask = &CTX_OUT_STORAGE(DNNL_ARG_ATTR_DROPOUT_MASK);
args.sround_seed = &CTX_IN_STORAGE(DNNL_ARG_ATTR_ROUNDING_SEED);
args.exec_args = ctx.args();
gemm::desc_t desc;
CHECK(create_gemm_desc(&desc, src_d.md_, weights_d.md_, dst_d.md_,
bia_d.md_, pd()->desc()->accum_data_type, ctx.stream()->engine()));
gemm::exec_ctx_t gemm_ctx(ctx, args, &desc);
auto *nested_grantor = create_nested_grantor(ctx.get_scratchpad_grantor(),
key_nested, gemm_->pd()->scratchpad_registry());
gemm_ctx.set_scratchpad_grantor(nested_grantor);
status_t gemm_exec_status = gemm::gemm(gemm_)->execute(gemm_ctx);
if (gemm_exec_status != status::success) return gemm_exec_status;
return status::success;
}
} } } } }