#ifndef GPU_AMD_MIOPEN_ELTWISE_HPP
#define GPU_AMD_MIOPEN_ELTWISE_HPP
#include "common/eltwise_pd.hpp"
#include "gpu/amd/engine.hpp"
#include "gpu/amd/miopen_eltwise_impl.hpp"
#include "gpu/gpu_primitive.hpp"
namespace dnnl {
namespace impl {
namespace gpu {
namespace amd {
struct miopen_eltwise_fwd_t : public gpu::primitive_t {
using gpu::primitive_t::primitive_t;
struct pd_t : public eltwise_fwd_pd_t {
using eltwise_fwd_pd_t::eltwise_fwd_pd_t;
DECLARE_COMMON_PD_T("hip:miopen:any", miopen_eltwise_fwd_t);
status_t init(impl::engine_t *) {
using namespace alg_kind;
bool ok = is_fwd()
&& utils::one_of(desc()->alg_kind, eltwise_relu,
eltwise_tanh, eltwise_elu, eltwise_soft_relu,
eltwise_abs, eltwise_logistic)
&& IMPLICATION(desc()->alg_kind == eltwise_soft_relu,
desc()->alpha == 1.f)
&& utils::one_of(
src_md()->data_type, data_type::f32, data_type::f16)
&& src_md()->data_type == dst_md()->data_type
&& attr()->has_default_values()
&& set_default_formats_common()
&& memory_desc_wrapper(src_md())
== memory_desc_wrapper(dst_md())
&& src_md()->format_desc.blocking.inner_nblks == 0;
if (!ok) return status::unimplemented;
eltwise_fwd_impl_.reset(new miopen_eltwise_fwd_impl_t());
return eltwise_fwd_impl_->init(this);
}
std::shared_ptr<miopen_eltwise_impl_base_t> eltwise_fwd_impl_;
};
status_t execute(const exec_ctx_t &ctx) const override;
private:
const pd_t *pd() const { return (const pd_t *)primitive_t::pd().get(); }
};
struct miopen_eltwise_bwd_t : public gpu::primitive_t {
using gpu::primitive_t::primitive_t;
struct pd_t : public eltwise_bwd_pd_t {
using eltwise_bwd_pd_t::eltwise_bwd_pd_t;
DECLARE_COMMON_PD_T("hip:miopen:any", miopen_eltwise_bwd_t);
status_t init(impl::engine_t *) {
using namespace alg_kind;
bool ok = !is_fwd()
&& utils::one_of(
desc()->alg_kind, eltwise_relu, eltwise_soft_relu)
&& IMPLICATION(desc()->alg_kind == eltwise_soft_relu,
desc()->alpha == 1.f)
&& utils::everyone_is(data_type::f32, data_md()->data_type,
diff_src_md()->data_type, diff_dst_md()->data_type)
&& attr()->has_default_values()
&& set_default_formats_common()
&& memory_desc_wrapper(diff_src_md())
== memory_desc_wrapper(diff_dst_md())
&& src_md()->format_desc.blocking.inner_nblks == 0
&& diff_dst_md()->format_desc.blocking.inner_nblks == 0;
if (!ok) return status::unimplemented;
eltwise_bwd_impl_.reset(new miopen_eltwise_bwd_impl_t());
return eltwise_bwd_impl_->init(this);
}
std::shared_ptr<miopen_eltwise_impl_base_t> eltwise_bwd_impl_;
};
status_t execute(const exec_ctx_t &ctx) const override;
private:
const pd_t *pd() const { return (const pd_t *)primitive_t::pd().get(); }
};
} } } }
#endif