17 #ifndef EXAMPLE_UTILS_H
18 #define EXAMPLE_UTILS_H
27 #include "dnnl_debug.h"
29 #if DNNL_GPU_RUNTIME == DNNL_RUNTIME_OCL
33 #define COMPLAIN_DNNL_ERROR_AND_EXIT(what, status) \
35 printf("[%s:%d] `%s` returns oneDNN error: %s.\n", __FILE__, __LINE__, \
36 what, dnnl_status2str(status)); \
37 printf("Example failed.\n"); \
41 #define COMPLAIN_EXAMPLE_ERROR_AND_EXIT(complain_fmt, ...) \
43 printf("[%s:%d] Error in the example: " complain_fmt ".\n", __FILE__, \
44 __LINE__, __VA_ARGS__); \
45 printf("Example failed.\n"); \
53 printf(
"Application couldn't find GPU, please run with CPU "
63 dnnl_status_t s_ = f; \
64 if (s_ != dnnl_success) COMPLAIN_DNNL_ERROR_AND_EXIT(#f, s_); \
70 return validate_engine_kind(
dnnl_cpu);
71 }
else if (argc == 2) {
73 char *engine_kind_str = argv[1];
74 if (!strcmp(engine_kind_str,
"cpu")) {
75 return validate_engine_kind(
dnnl_cpu);
76 }
else if (!strcmp(engine_kind_str,
"gpu")) {
77 return validate_engine_kind(
dnnl_gpu);
82 COMPLAIN_EXAMPLE_ERROR_AND_EXIT(
83 "inappropriate engine kind.\n"
84 "Please run the example like this: %s [cpu|gpu].",
91 return "<Unknown engine>";
95 static inline void read_from_dnnl_memory(
void *handle,
dnnl_memory_t mem) {
100 if (!handle) COMPLAIN_EXAMPLE_ERROR_AND_EXIT(
"%s",
"handle is NULL.");
107 #ifdef DNNL_WITH_SYCL
112 if (is_cpu_sycl || is_gpu_sycl) {
113 void *mapped_ptr = NULL;
116 for (
size_t i = 0; i < bytes; ++i) {
117 ((
char *)handle)[i] = ((
char *)mapped_ptr)[i];
125 #if DNNL_GPU_RUNTIME == DNNL_RUNTIME_OCL
135 cl_int ret = clEnqueueReadBuffer(
136 q, m, CL_TRUE, 0, bytes, handle, 0, NULL, NULL);
137 if (ret != CL_SUCCESS)
138 COMPLAIN_EXAMPLE_ERROR_AND_EXIT(
139 "clEnqueueReadBuffer failed (status code: %d)", ret);
149 for (
size_t i = 0; i < bytes; ++i) {
150 ((
char *)handle)[i] = ((
char *)ptr)[i];
156 assert(!
"not expected");
160 static inline void write_to_dnnl_memory(
void *handle,
dnnl_memory_t mem) {
165 if (!handle) COMPLAIN_EXAMPLE_ERROR_AND_EXIT(
"%s",
"handle is NULL.");
172 #ifdef DNNL_WITH_SYCL
177 if (is_cpu_sycl || is_gpu_sycl) {
178 void *mapped_ptr = NULL;
181 for (
size_t i = 0; i < bytes; ++i) {
182 ((
char *)mapped_ptr)[i] = ((
char *)handle)[i];
190 #if DNNL_GPU_RUNTIME == DNNL_RUNTIME_OCL
200 cl_int ret = clEnqueueWriteBuffer(
201 q, m, CL_TRUE, 0, bytes, handle, 0, NULL, NULL);
202 if (ret != CL_SUCCESS)
203 COMPLAIN_EXAMPLE_ERROR_AND_EXIT(
204 "clEnqueueWriteBuffer failed (status code: %d)", ret);
215 for (
size_t i = 0; i < bytes; ++i) {
216 ((
char *)ptr)[i] = ((
char *)handle)[i];
222 assert(!
"not expected");
dnnl_engine_kind_t
Kinds of engines.
Definition: dnnl_types.h:2216
dnnl_status_t DNNL_API dnnl_engine_get_kind(dnnl_engine_t engine, dnnl_engine_kind_t *kind)
Returns the kind of an engine.
size_t DNNL_API dnnl_engine_get_count(dnnl_engine_kind_t kind)
Returns the number of engines of a particular kind.
@ dnnl_gpu
GPU engine.
Definition: dnnl_types.h:2222
@ dnnl_cpu
CPU engine.
Definition: dnnl_types.h:2220
dnnl_status_t DNNL_API dnnl_memory_unmap_data(const_dnnl_memory_t memory, void *mapped_ptr)
Unmaps a memory object and writes back any changes made to the previously mapped memory buffer.
dnnl_status_t DNNL_API dnnl_memory_get_engine(const_dnnl_memory_t memory, dnnl_engine_t *engine)
Returns the engine of a memory object.
dnnl_status_t DNNL_API dnnl_memory_get_memory_desc(const_dnnl_memory_t memory, const dnnl_memory_desc_t **memory_desc)
Returns the memory descriptor for a memory object.
dnnl_status_t DNNL_API dnnl_memory_get_data_handle(const_dnnl_memory_t memory, void **handle)
Returns memory object's data handle.
dnnl_status_t DNNL_API dnnl_memory_map_data(const_dnnl_memory_t memory, void **mapped_ptr)
Maps a memory object and returns a host-side pointer to a memory buffer with a copy of its contents.
size_t DNNL_API dnnl_memory_desc_get_size(const dnnl_memory_desc_t *memory_desc)
Returns the size of a memory descriptor.
dnnl_status_t DNNL_API dnnl_ocl_interop_stream_get_command_queue(dnnl_stream_t stream, cl_command_queue *queue)
Returns the OpenCL command queue associated with an execution stream.
dnnl_status_t DNNL_API dnnl_ocl_interop_memory_get_mem_object(const_dnnl_memory_t memory, cl_mem *mem_object)
Returns an OpenCL memory object associated with a memory object.
#define DNNL_RUNTIME_SYCL
SYCL runtime.
Definition: dnnl_types.h:2696
dnnl_status_t DNNL_API dnnl_stream_destroy(dnnl_stream_t stream)
Destroys an execution stream.
dnnl_status_t DNNL_API dnnl_stream_create(dnnl_stream_t *stream, dnnl_engine_t engine, unsigned flags)
Creates an execution stream.
@ dnnl_stream_default_flags
Default stream configuration.
Definition: dnnl_types.h:2661
An opaque structure to describe an engine.
Memory descriptor.
Definition: dnnl_types.h:1511
An opaque structure to describe a memory.
An opaque structure to describe an execution stream.