#ifndef GPU_INTEL_IP_REF_HPP
#define GPU_INTEL_IP_REF_HPP
#include "common/c_types_map.hpp"
#include "gpu/intel/ip/config.hpp"
#include "gpu/intel/primitive.hpp"
namespace dnnl {
namespace impl {
namespace gpu {
namespace intel {
namespace ip {
struct ref_fwd_t : public primitive_t {
using primitive_t::primitive_t;
struct pd_t : public fwd_pd_t {
using fwd_pd_t::fwd_pd_t;
DECLARE_COMMON_PD_T("ocl:ref:any", ref_fwd_t);
status_t init(impl::engine_t *engine) {
using namespace data_type;
using namespace prop_kind;
using namespace data_type;
assert(engine->kind() == engine_kind::gpu);
auto *intel_engine = utils::downcast<intel::engine_t *>(engine);
const auto attr_skip_mask = primitive_attr_t::skip_mask_t::scales
| primitive_attr_t::skip_mask_t::post_ops;
VDISPATCH_INNER_PRODUCT(
utils::one_of(desc()->prop_kind, forward_training,
forward_inference),
VERBOSE_BAD_PROPKIND);
VDISPATCH_INNER_PRODUCT_SC(
set_default_params(), VERBOSE_UNSUPPORTED_TAG);
auto src_dt = src_md()->data_type;
auto dst_dt = dst_md()->data_type;
auto wei_dt = weights_md(0)->data_type;
const bool is_f32 = src_dt == f32
&& utils::one_of(wei_dt, f32, s8, u8)
&& utils::one_of(dst_dt, f32, f16, bf16);
const bool is_f16 = src_dt == f16
&& utils::one_of(wei_dt, f16, s8, u8)
&& utils::one_of(dst_dt, u8, s8, f16, bf16);
const bool is_bf16 = src_dt == bf16
&& utils::one_of(wei_dt, bf16, s8, u8)
&& utils::one_of(dst_dt, bf16, f32);
const bool is_int8 = utils::one_of(src_dt, u8, s8)
&& utils::one_of(wei_dt, u8, s8)
&& utils::one_of(dst_dt, f32, s8, u8, s32, f16, bf16);
VDISPATCH_INNER_PRODUCT((is_int8 || is_f32 || is_f16 || is_bf16),
VERBOSE_UNSUPPORTED_DT);
VDISPATCH_INNER_PRODUCT(
IMPLICATION(with_bias(),
utils::one_of(desc()->bias_desc.data_type, u8, s8,
bf16, f16, f32)),
VERBOSE_UNSUPPORTED_DT);
VDISPATCH_INNER_PRODUCT(attr()->has_default_values(attr_skip_mask),
VERBOSE_UNSUPPORTED_ATTR);
VDISPATCH_INNER_PRODUCT(
post_ops_with_binary_ok(attr(), desc()->dst_desc),
VERBOSE_UNSUPPORTED_POSTOP);
VDISPATCH_INNER_PRODUCT_SC(attr_.set_default_formats(dst_md(0)),
VERBOSE_UNSUPPORTED_POSTOP);
VDISPATCH_INNER_PRODUCT(
IMPLICATION(!attr()->scales_.has_default_values(),
utils::one_of(src_md_.data_type, s8, u8)
&& attr_scales_ok()),
VERBOSE_UNSUPPORTED_SCALES_CFG);
VDISPATCH_INNER_PRODUCT(
IMPLICATION(desc()->src_desc.data_type == f16,
intel_engine->mayiuse(
compute::device_ext_t::khr_fp16)),
VERBOSE_UNSUPPORTED_DT_CFG);
CHECK(init_conf(engine));
return status::success;
}
status_t init_conf(impl::engine_t *engine);
status_t init_kernel_ctx(compute::kernel_ctx_t &kernel_ctx) const;
conf_t conf;
offsets_t off;
};
status_t init(impl::engine_t *engine) override {
compute::kernel_ctx_t kernel_ctx;
status_t status = pd()->init_kernel_ctx(kernel_ctx);
CHECK(status);
CHECK(create_kernel(
engine, &kernel_, "ref_inner_product_fwd", kernel_ctx));
if (!kernel_) return status::runtime_error;
return status::success;
}
status_t execute(const exec_ctx_t &ctx) const override {
return execute_forward(ctx);
}
private:
status_t execute_forward(const exec_ctx_t &ctx) const;
const pd_t *pd() const { return (const pd_t *)primitive_t::pd().get(); }
compute::kernel_t kernel_;
};
struct ref_bwd_data_t : public primitive_t {
using primitive_t::primitive_t;
struct pd_t : public bwd_data_pd_t {
using bwd_data_pd_t::bwd_data_pd_t;
DECLARE_COMMON_PD_T("ref:any", ref_bwd_data_t);
status_t init(impl::engine_t *engine) {
using namespace data_type;
using namespace prop_kind;
assert(engine->kind() == engine_kind::gpu);
VDISPATCH_INNER_PRODUCT(utils::one_of(this->desc()->prop_kind,
backward, backward_data),
VERBOSE_BAD_PROPKIND);
VDISPATCH_INNER_PRODUCT_SC(
this->set_default_params(), VERBOSE_UNSUPPORTED_TAG);
VDISPATCH_INNER_PRODUCT(
utils::one_of(true,
expect_data_types(
f16, f16, data_type::undef, f16, f32),
expect_data_types(
f32, f16, data_type::undef, f16, f32),
expect_data_types(
bf16, bf16, data_type::undef, bf16, f32),
expect_data_types(
f32, bf16, data_type::undef, bf16, f32),
expect_data_types(
f32, f32, data_type::undef, f32, f32)),
VERBOSE_UNSUPPORTED_DT);
VDISPATCH_INNER_PRODUCT(
attr()->has_default_values(), VERBOSE_UNSUPPORTED_ATTR);
CHECK(init_conf(engine));
return status::success;
}
status_t init_conf(impl::engine_t *engine);
status_t init_kernel_ctx(compute::kernel_ctx_t &kernel_ctx) const;
conf_t conf;
offsets_t off;
};
status_t init(impl::engine_t *engine) override {
compute::kernel_ctx_t kernel_ctx;
status_t status = pd()->init_kernel_ctx(kernel_ctx);
CHECK(status);
CHECK(create_kernel(
engine, &kernel_, "ref_inner_product_bwd_data", kernel_ctx));
if (!kernel_) return status::runtime_error;
return status::success;
}
status_t execute(const exec_ctx_t &ctx) const override {
return execute_backward_data(ctx);
}
private:
status_t execute_backward_data(const exec_ctx_t &ctx) const;
const pd_t *pd() const { return (const pd_t *)primitive_t::pd().get(); }
compute::kernel_t kernel_;
};
struct ref_bwd_weights_t : public primitive_t {
using primitive_t::primitive_t;
struct pd_t : public bwd_weights_pd_t {
using bwd_weights_pd_t::bwd_weights_pd_t;
DECLARE_COMMON_PD_T("ref:any", ref_bwd_weights_t);
status_t init(impl::engine_t *engine) {
using namespace data_type;
using namespace prop_kind;
assert(engine->kind() == engine_kind::gpu);
VDISPATCH_INNER_PRODUCT(utils::one_of(this->desc()->prop_kind,
backward, backward_weights),
VERBOSE_BAD_PROPKIND);
VDISPATCH_INNER_PRODUCT_SC(
this->set_default_params(), VERBOSE_UNSUPPORTED_TAG);
VDISPATCH_INNER_PRODUCT(
utils::one_of(true,
expect_data_types(
f16, f16, data_type::undef, f16, f32),
expect_data_types(
f16, f32, data_type::undef, f16, f32),
expect_data_types(
bf16, bf16, data_type::undef, bf16, f32),
expect_data_types(
bf16, f32, data_type::undef, bf16, f32),
expect_data_types(
f32, f32, data_type::undef, f32, f32)),
VERBOSE_UNSUPPORTED_DT);
VDISPATCH_INNER_PRODUCT(
attr()->has_default_values(), VERBOSE_UNSUPPORTED_ATTR);
CHECK(init_conf(engine));
return status::success;
}
status_t init_conf(impl::engine_t *engine);
status_t init_kernel_ctx(compute::kernel_ctx_t &kernel_ctx) const;
conf_t conf;
offsets_t off;
};
status_t init(impl::engine_t *engine) override {
compute::kernel_ctx_t kernel_ctx;
status_t status = pd()->init_kernel_ctx(kernel_ctx);
CHECK(status);
CHECK(create_kernel(
engine, &kernel_, "ref_inner_product_bwd_weights", kernel_ctx));
if (!kernel_) return status::runtime_error;
return status::success;
}
status_t execute(const exec_ctx_t &ctx) const override {
return execute_backward_weights(ctx);
}
private:
status_t execute_backward_weights(const exec_ctx_t &ctx) const;
const pd_t *pd() const { return (const pd_t *)primitive_t::pd().get(); }
compute::kernel_t kernel_;
};
} } } } }
#endif