#ifndef GRAPH_BACKEND_DNNL_EXECUTABLES_ELTWISE_HPP
#define GRAPH_BACKEND_DNNL_EXECUTABLES_ELTWISE_HPP
#include "graph/backend/dnnl/executables/base.hpp"
namespace dnnl {
namespace impl {
namespace graph {
namespace dnnl_impl {
struct eltwise_executable_t : public op_executable_t {
DECLARE_DESC_CLASS_AND_CREATOR(dnnl::eltwise_forward::primitive_desc);
DECLARE_ARG_INDICES_GETTER;
eltwise_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::eltwise_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::eltwise_forward prim_;
};
struct eltwise_bwd_executable_t : public op_executable_t {
DECLARE_DESC_CLASS_AND_CREATOR(dnnl::eltwise_backward::primitive_desc);
DECLARE_ARG_INDICES_GETTER;
eltwise_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::eltwise_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::eltwise_backward prim_;
};
struct binary_executable_t : public op_executable_t {
DECLARE_DESC_CLASS_AND_CREATOR(dnnl::binary::primitive_desc);
DECLARE_ARG_INDICES_GETTER;
binary_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) {
using ltw = logical_tensor_wrapper_t;
if (ltw(op->get_input_logical_tensor(0)).has_zero_dim()
|| ltw(op->get_input_logical_tensor(1)).has_zero_dim()) {
is_dummy_ = true;
return;
}
auto desc
= create_desc(op, p_engine, pd_cache, fpmath, use_block_layout);
prim_ = dnnl::binary(desc);
if (op->has_attr(op_attr::with_sum))
with_sum_ = op->get_attr<bool>(op_attr::with_sum);
}
void execute(const stream &stream,
const std::unordered_map<int, memory> &args) const override;
#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;
#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;
#endif
private:
dnnl::binary prim_;
bool with_sum_ {false};
bool is_dummy_ {false};
dummy_impl_t dummy_impl_;
};
struct prelu_executable_t : public op_executable_t {
DECLARE_DESC_CLASS_AND_CREATOR(dnnl::prelu_forward::primitive_desc);
DECLARE_ARG_INDICES_GETTER;
prelu_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::prelu_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::prelu_forward prim_;
};
struct prelu_bwd_executable_t : public op_executable_t {
DECLARE_DESC_CLASS_AND_CREATOR(dnnl::prelu_backward::primitive_desc);
DECLARE_ARG_INDICES_GETTER;
prelu_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::prelu_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::prelu_backward prim_;
};
} } } }
#endif