#ifndef GRAPH_BACKEND_DNNL_EXECUTABLES_LAYER_NORM_HPP
#define GRAPH_BACKEND_DNNL_EXECUTABLES_LAYER_NORM_HPP
#include "graph/backend/dnnl/executables/base.hpp"
namespace dnnl {
namespace impl {
namespace graph {
namespace dnnl_impl {
struct layernorm_executable_t : public op_executable_t {
DECLARE_DESC_CLASS_AND_CREATOR(
dnnl::layer_normalization_forward::primitive_desc);
DECLARE_ARG_INDICES_GETTER;
layernorm_executable_t(std::shared_ptr<op_t> &op,
const dnnl::engine &p_engine, pd_cache_t &pd_cache,
const fpmath_t &fpmath, bool use_block_layout) {
auto desc
= create_desc(op, p_engine, pd_cache, fpmath, use_block_layout);
prim_ = dnnl::layer_normalization_forward(desc);
}
void execute(const stream &stream,
const std::unordered_map<int, memory> &args) const override {
prim_.execute(stream, args);
}
#ifdef DNNL_WITH_SYCL
std::optional<::sycl::event> execute_sycl(const stream &stream,
const std::unordered_map<int, memory> &args,
const std::vector<::sycl::event> &deps) const override {
auto e = dnnl::sycl_interop::execute(prim_, stream, args, deps);
if (stream.get_engine().get_kind() == engine::kind::cpu) e.wait();
return e;
}
#endif
#if DNNL_GPU_RUNTIME == DNNL_RUNTIME_OCL
cl_event execute_ocl(const stream &stream,
const std::unordered_map<int, memory> &args,
const std::vector<cl_event> &deps) const override {
auto e = dnnl::ocl_interop::execute(prim_, stream, args, deps);
return e;
}
#endif
private:
dnnl::layer_normalization_forward prim_;
};
struct layernorm_bwd_executable_t : public op_executable_t {
DECLARE_DESC_CLASS_AND_CREATOR(
dnnl::layer_normalization_backward::primitive_desc);
DECLARE_ARG_INDICES_GETTER;
layernorm_bwd_executable_t(std::shared_ptr<op_t> &op,
const dnnl::engine &p_engine, pd_cache_t &pd_cache,
const fpmath_t &fpmath, bool use_block_layout) {
auto desc
= create_desc(op, p_engine, pd_cache, fpmath, use_block_layout);
prim_ = dnnl::layer_normalization_backward(desc);
}
void execute(const stream &stream,
const std::unordered_map<int, memory> &args) const override {
prim_.execute(stream, args);
}
#ifdef DNNL_WITH_SYCL
std::optional<::sycl::event> execute_sycl(const stream &stream,
const std::unordered_map<int, memory> &args,
const std::vector<::sycl::event> &deps) const override {
auto e = dnnl::sycl_interop::execute(prim_, stream, args, deps);
if (stream.get_engine().get_kind() == engine::kind::cpu) e.wait();
return e;
}
#endif
#if DNNL_GPU_RUNTIME == DNNL_RUNTIME_OCL
cl_event execute_ocl(const stream &stream,
const std::unordered_map<int, memory> &args,
const std::vector<cl_event> &deps) const override {
auto e = dnnl::ocl_interop::execute(prim_, stream, args, deps);
return e;
}
#endif
private:
dnnl::layer_normalization_backward prim_;
};
} } } }
#endif