From 6db800db097e926fed8e68c787bcda176201f766 Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Fri, 1 Mar 2024 10:43:11 -0600 Subject: [PATCH 1/9] Remove use of deprecated DPCTLQueueMgr_* functions This is done by reverting to DPNP_LOCAL_QUEUE=1 behavior. The ultimate goal is to get rid of DPNP_QUEUE throughout dpnp codebase --- dpnp/backend/src/queue_sycl.cpp | 26 ++++++------------------- dpnp/backend/src/queue_sycl.hpp | 34 +-------------------------------- 2 files changed, 7 insertions(+), 53 deletions(-) diff --git a/dpnp/backend/src/queue_sycl.cpp b/dpnp/backend/src/queue_sycl.cpp index b24cab1da72e..4c6ed5efc506 100644 --- a/dpnp/backend/src/queue_sycl.cpp +++ b/dpnp/backend/src/queue_sycl.cpp @@ -31,9 +31,7 @@ #include "dpnp_utils.hpp" #include "queue_sycl.hpp" -#if defined(DPNP_LOCAL_QUEUE) sycl::queue *backend_sycl::queue = nullptr; -#endif mkl_rng::mt19937 *backend_sycl::rng_engine = nullptr; mkl_rng::mcg59 *backend_sycl::rng_mcg59_engine = nullptr; @@ -61,7 +59,7 @@ static void dpnpc_show_mathlib_version() #endif } -#if (not defined(NDEBUG)) && defined(DPNP_LOCAL_QUEUE) +#if (not defined(NDEBUG)) static void show_available_sycl_devices() { const std::vector devices = sycl::device::get_devices(); @@ -86,11 +84,10 @@ static void show_available_sycl_devices() } #endif -#if defined(DPNP_LOCAL_QUEUE) static sycl::device get_default_sycl_device() { int dpnpc_queue_gpu = 0; - sycl::device dev = sycl::device(sycl::cpu_selector()); + sycl::device dev = sycl::device(sycl::cpu_selector_v); const char *dpnpc_queue_gpu_var = getenv("DPNPC_QUEUE_GPU"); if (dpnpc_queue_gpu_var != NULL) { @@ -98,12 +95,11 @@ static sycl::device get_default_sycl_device() } if (dpnpc_queue_gpu) { - dev = sycl::device(sycl::gpu_selector()); + dev = sycl::device(sycl::gpu_selector_v); } return dev; } -#endif #if defined(DPNPC_TOUCH_KERNEL_TO_LINK) /** @@ -135,7 +131,6 @@ static long dpnp_kernels_link() } #endif -#if defined(DPNP_LOCAL_QUEUE) // Catch asynchronous exceptions static void exception_handler(sycl::exception_list exceptions) { @@ -148,11 +143,9 @@ static void exception_handler(sycl::exception_list exceptions) } } }; -#endif void backend_sycl::backend_sycl_queue_init(QueueOptions selector) { -#if defined(DPNP_LOCAL_QUEUE) std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_clock::now(); @@ -167,10 +160,10 @@ void backend_sycl::backend_sycl_queue_init(QueueOptions selector) #endif if (QueueOptions::CPU_SELECTOR == selector) { - dev = sycl::device(sycl::cpu_selector()); + dev = sycl::device(sycl::cpu_selector_v); } else if (QueueOptions::GPU_SELECTOR == selector) { - dev = sycl::device(sycl::gpu_selector()); + dev = sycl::device(sycl::gpu_selector_v); } else { dev = get_default_sycl_device(); @@ -189,9 +182,6 @@ void backend_sycl::backend_sycl_queue_init(QueueOptions selector) std::chrono::high_resolution_clock::now(); std::chrono::duration time_queue_init = std::chrono::duration_cast>(t2 - t1); -#else - (void)selector; -#endif std::chrono::high_resolution_clock::time_point t3 = std::chrono::high_resolution_clock::now(); @@ -207,12 +197,8 @@ void backend_sycl::backend_sycl_queue_init(QueueOptions selector) std::cout << "Running on: " << DPNP_QUEUE.get_device().get_info() << "\n"; -#if defined(DPNP_LOCAL_QUEUE) std::cout << "queue initialization time: " << time_queue_init.count() << " (sec.)\n"; -#else - std::cout << "DPCtrl SYCL queue used\n"; -#endif std::cout << "SYCL kernels link time: " << time_kernels_link.count() << " (sec.)\n"; dpnpc_show_mathlib_version(); @@ -222,7 +208,7 @@ void backend_sycl::backend_sycl_queue_init(QueueOptions selector) bool backend_sycl::backend_sycl_is_cpu() { - sycl::queue &qptr = get_queue(); + const sycl::queue &qptr = get_queue(); if (qptr.get_device().is_cpu()) { return true; diff --git a/dpnp/backend/src/queue_sycl.hpp b/dpnp/backend/src/queue_sycl.hpp index b59c028e1043..f76e6789716f 100644 --- a/dpnp/backend/src/queue_sycl.hpp +++ b/dpnp/backend/src/queue_sycl.hpp @@ -40,16 +40,6 @@ #include -#if !defined(DPNP_LOCAL_QUEUE) -#if defined __has_include -#if __has_include() -#include -#else -#include -#endif -#endif -#endif - #include "dpnp_pstl.hpp" // this header must be included after #include "verbose.hpp" @@ -69,10 +59,8 @@ namespace mkl_rng = oneapi::mkl::rng; */ class backend_sycl { -#if defined(DPNP_LOCAL_QUEUE) static sycl::queue *queue; /**< contains SYCL queue pointer initialized in @ref backend_sycl_queue_init */ -#endif static mkl_rng::mt19937 *rng_engine; /**< RNG MT19937 engine ptr. initialized in @ref backend_sycl_rng_engine_init */ @@ -83,10 +71,7 @@ class backend_sycl static void destroy() { backend_sycl::destroy_rng_engine(); -#if defined(DPNP_LOCAL_QUEUE) delete queue; - queue = nullptr; -#endif } static void destroy_rng_engine() @@ -101,10 +86,9 @@ class backend_sycl public: backend_sycl() { -#if defined(DPNP_LOCAL_QUEUE) queue = nullptr; rng_engine = nullptr; -#endif + rng_mcg59_engine = nullptr; } virtual ~backend_sycl() @@ -139,27 +123,11 @@ class backend_sycl */ static sycl::queue &get_queue() { -#if defined(DPNP_LOCAL_QUEUE) if (!queue) { backend_sycl_queue_init(); } return *queue; -#else - // temporal solution. Started from Sept-2020 - DPCTLSyclQueueRef DPCtrl_queue = DPCTLQueueMgr_GetCurrentQueue(); - if (DPCtrl_queue == nullptr) { - std::string reason = - (DPCTLQueueMgr_GetQueueStackSize() == static_cast(-1)) - ? ": the queue stack is empty, probably no device is " - "available." - : "."; - throw std::runtime_error( - "Failed to create a copy of SYCL queue with default device" + - reason); - } - return *(reinterpret_cast(DPCtrl_queue)); -#endif } /** From b578f87f07a437799213f152ebd75012422f18b3 Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Fri, 1 Mar 2024 10:44:38 -0600 Subject: [PATCH 2/9] Removed setting DPNP_LOCAL_QUEUE in tests Since DPNP_LOCAL_QUEUE has been removed. --- dpnp/backend/tests/test_broadcast_iterator.cpp | 2 -- dpnp/backend/tests/test_utils_iterator.cpp | 2 -- 2 files changed, 4 deletions(-) diff --git a/dpnp/backend/tests/test_broadcast_iterator.cpp b/dpnp/backend/tests/test_broadcast_iterator.cpp index 58587b1774ff..0fa4a0cf2ab1 100644 --- a/dpnp/backend/tests/test_broadcast_iterator.cpp +++ b/dpnp/backend/tests/test_broadcast_iterator.cpp @@ -30,8 +30,6 @@ #include "dpnp_iterator.hpp" #include "dpnp_test_utils.hpp" -// TODO need to fix build procedure and remove this workaround. Issue #551 -#define DPNP_LOCAL_QUEUE 1 #include "queue_sycl.hpp" struct IteratorParameters diff --git a/dpnp/backend/tests/test_utils_iterator.cpp b/dpnp/backend/tests/test_utils_iterator.cpp index f8f6748f8eef..4b20408b10c2 100644 --- a/dpnp/backend/tests/test_utils_iterator.cpp +++ b/dpnp/backend/tests/test_utils_iterator.cpp @@ -30,8 +30,6 @@ #include "dpnp_iterator.hpp" #include "dpnp_test_utils.hpp" -// TODO need to fix build procedure and remove this workaround. Issue #551 -#define DPNP_LOCAL_QUEUE 1 #include "queue_sycl.hpp" using namespace std; From 6309f2694322475f6b7d67f53ba4da601e5cffa0 Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Fri, 1 Mar 2024 10:58:58 -0600 Subject: [PATCH 3/9] Removed uses of device_context --- doc/dpctl.rst | 23 ++++++++++++---------- examples/example10.py | 11 +++-------- tests/third_party/intel/zero-copy-test1.py | 7 +------ 3 files changed, 17 insertions(+), 24 deletions(-) diff --git a/doc/dpctl.rst b/doc/dpctl.rst index 2df63e0ce499..11469841af84 100644 --- a/doc/dpctl.rst +++ b/doc/dpctl.rst @@ -10,20 +10,23 @@ Interplay with the Data Parallel Control Library An example below demonstrates how the Data Parallel Extension for NumPy* can be easily combined with the device management interface provided by dpctl package. -Literally, the SYCL* queue manager interface from the dpctl package allows -to set an input queue as the currently usable queue inside the context -manager's scope. This way an array creation function from the dpnp package -which is defined inside the context will allocate the data using that queue. - .. code-block:: python :linenos: - import dpctl - import dpnp as np + import dpctl + import dpnp + + d = dpctl.select_cpu_device() + x = dpnp.array([1, 2, 3], device=d) + s = dpnp.sum(x) + + y = dpnp.linspace(0, dpnp.pi, num=10**6, device="gpu") + f = 1 + y * dpnp.sin(y) - with dpctl.device_context("opencl:gpu"): - x = np.array([1, 2, 3]) - s = np.sum(x) + # locate argument where function attains global maximum + max_arg = x[dpnp.argmax(f)] + max_val = dpnp.max(f) + For more information please refer to `Data Parallel Control Library`_ documentation. diff --git a/examples/example10.py b/examples/example10.py index 655d5d41c00b..19a4dff99cb2 100644 --- a/examples/example10.py +++ b/examples/example10.py @@ -87,12 +87,7 @@ def example(): if __name__ == "__main__": - try: - import dpctl + import dpctl - with dpctl.device_context("opencl:gpu") as gpu_queue: - gpu_queue.get_sycl_device().print_device_info() - example() - - except ImportError: - example() + dpctl.select_default_device().print_device_info() + example() diff --git a/tests/third_party/intel/zero-copy-test1.py b/tests/third_party/intel/zero-copy-test1.py index 44d2d776e9b6..f99565df5e68 100644 --- a/tests/third_party/intel/zero-copy-test1.py +++ b/tests/third_party/intel/zero-copy-test1.py @@ -62,12 +62,7 @@ def dppy_f(array_like_obj): hb = np.arange(0, global_size, dtype="i4") da = DuckUSMArray(hb.shape, dtype=hb.dtype, host_buffer=hb) - if dpctl.has_gpu_queues(dpctl.backend_type.level_zero): - print("\nScheduling on OpenCL GPU\n") - with dpctl.device_context("opencl:gpu") as gpu_queue: - dppy_f[global_size, dppy.DEFAULT_LOCAL_SIZE](da) - else: - print("\nSkip scheduling on OpenCL GPU\n") + dppy_f[global_size, dppy.DEFAULT_LOCAL_SIZE](da) assert da[0] == 10 From 67867d8a03d55a4f6633d27d2ca82a1fd54c602a Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Sat, 16 Mar 2024 20:24:17 -0500 Subject: [PATCH 4/9] Removed trailing whitespace --- doc/dpctl.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/dpctl.rst b/doc/dpctl.rst index 11469841af84..3916d3c8b01a 100644 --- a/doc/dpctl.rst +++ b/doc/dpctl.rst @@ -26,7 +26,7 @@ easily combined with the device management interface provided by dpctl package. # locate argument where function attains global maximum max_arg = x[dpnp.argmax(f)] max_val = dpnp.max(f) - + For more information please refer to `Data Parallel Control Library`_ documentation. From c11b779361814a760411d05372698e5aa25319f7 Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Sat, 16 Mar 2024 20:25:40 -0500 Subject: [PATCH 5/9] Replaced tab with spaces --- dpnp/backend/src/queue_sycl.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dpnp/backend/src/queue_sycl.hpp b/dpnp/backend/src/queue_sycl.hpp index f76e6789716f..fc429074d3a7 100644 --- a/dpnp/backend/src/queue_sycl.hpp +++ b/dpnp/backend/src/queue_sycl.hpp @@ -88,7 +88,7 @@ class backend_sycl { queue = nullptr; rng_engine = nullptr; - rng_mcg59_engine = nullptr; + rng_mcg59_engine = nullptr; } virtual ~backend_sycl() From 814ad56bac64ed71eb43f77e803868947fa3723f Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Mon, 18 Mar 2024 13:16:17 -0500 Subject: [PATCH 6/9] Use backend_sycl_singleton, remove backend_sycl --- dpnp/backend/kernels/dpnp_krnl_random.cpp | 3 +- dpnp/backend/src/queue_sycl.cpp | 126 ++-------------------- dpnp/backend/src/queue_sycl.hpp | 121 ++++++++++++++++++--- 3 files changed, 117 insertions(+), 133 deletions(-) diff --git a/dpnp/backend/kernels/dpnp_krnl_random.cpp b/dpnp/backend/kernels/dpnp_krnl_random.cpp index 53f37ee5c3c4..5d8fb80467fe 100644 --- a/dpnp/backend/kernels/dpnp_krnl_random.cpp +++ b/dpnp/backend/kernels/dpnp_krnl_random.cpp @@ -70,7 +70,8 @@ static VSLStreamStatePtr get_rng_stream() void dpnp_rng_srand_c(size_t seed) { - backend_sycl::backend_sycl_rng_engine_init(seed); + auto &be = backend_sycl_singleton::get(); + be.set_rng_engines_seed(seed); set_rng_stream(seed); } diff --git a/dpnp/backend/src/queue_sycl.cpp b/dpnp/backend/src/queue_sycl.cpp index 4c6ed5efc506..b234a7da21bd 100644 --- a/dpnp/backend/src/queue_sycl.cpp +++ b/dpnp/backend/src/queue_sycl.cpp @@ -31,11 +31,7 @@ #include "dpnp_utils.hpp" #include "queue_sycl.hpp" -sycl::queue *backend_sycl::queue = nullptr; -mkl_rng::mt19937 *backend_sycl::rng_engine = nullptr; -mkl_rng::mcg59 *backend_sycl::rng_mcg59_engine = nullptr; - -static void dpnpc_show_mathlib_version() +[[maybe_unused]] static void dpnpc_show_mathlib_version() { #if 1 const int len = 256; @@ -60,7 +56,7 @@ static void dpnpc_show_mathlib_version() } #if (not defined(NDEBUG)) -static void show_available_sycl_devices() +[[maybe_unused]] static void show_available_sycl_devices() { const std::vector devices = sycl::device::get_devices(); @@ -84,22 +80,6 @@ static void show_available_sycl_devices() } #endif -static sycl::device get_default_sycl_device() -{ - int dpnpc_queue_gpu = 0; - sycl::device dev = sycl::device(sycl::cpu_selector_v); - - const char *dpnpc_queue_gpu_var = getenv("DPNPC_QUEUE_GPU"); - if (dpnpc_queue_gpu_var != NULL) { - dpnpc_queue_gpu = atoi(dpnpc_queue_gpu_var); - } - - if (dpnpc_queue_gpu) { - dev = sycl::device(sycl::gpu_selector_v); - } - - return dev; -} #if defined(DPNPC_TOUCH_KERNEL_TO_LINK) /** @@ -131,107 +111,13 @@ static long dpnp_kernels_link() } #endif -// Catch asynchronous exceptions -static void exception_handler(sycl::exception_list exceptions) -{ - for (std::exception_ptr const &e : exceptions) { - try { - std::rethrow_exception(e); - } catch (sycl::exception const &e) { - std::cout << "DPNP. Caught asynchronous SYCL exception:\n" - << e.what() << std::endl; - } - } -}; - -void backend_sycl::backend_sycl_queue_init(QueueOptions selector) -{ - std::chrono::high_resolution_clock::time_point t1 = - std::chrono::high_resolution_clock::now(); - - if (queue) { - backend_sycl::destroy(); - } - - sycl::device dev; - -#if not defined(NDEBUG) - show_available_sycl_devices(); -#endif - - if (QueueOptions::CPU_SELECTOR == selector) { - dev = sycl::device(sycl::cpu_selector_v); - } - else if (QueueOptions::GPU_SELECTOR == selector) { - dev = sycl::device(sycl::gpu_selector_v); - } - else { - dev = get_default_sycl_device(); - } - - if (is_verbose_mode()) { - sycl::property_list properties{ - sycl::property::queue::enable_profiling()}; - queue = new sycl::queue(dev, exception_handler, properties); - } - else { - queue = new sycl::queue(dev, exception_handler); - } - - std::chrono::high_resolution_clock::time_point t2 = - std::chrono::high_resolution_clock::now(); - std::chrono::duration time_queue_init = - std::chrono::duration_cast>(t2 - t1); - - std::chrono::high_resolution_clock::time_point t3 = - std::chrono::high_resolution_clock::now(); -#if defined(DPNPC_TOUCH_KERNEL_TO_LINK) - // Remove pre-link kernel library at startup time - dpnp_kernels_link(); -#endif - std::chrono::high_resolution_clock::time_point t4 = - std::chrono::high_resolution_clock::now(); - std::chrono::duration time_kernels_link = - std::chrono::duration_cast>(t4 - t3); - - std::cout << "Running on: " - << DPNP_QUEUE.get_device().get_info() - << "\n"; - std::cout << "queue initialization time: " << time_queue_init.count() - << " (sec.)\n"; - std::cout << "SYCL kernels link time: " << time_kernels_link.count() - << " (sec.)\n"; - dpnpc_show_mathlib_version(); - - std::cout << std::endl; -} - -bool backend_sycl::backend_sycl_is_cpu() -{ - const sycl::queue &qptr = get_queue(); - - if (qptr.get_device().is_cpu()) { - return true; - } - - return false; -} - -void backend_sycl::backend_sycl_rng_engine_init(size_t seed) -{ - if (rng_engine) { - backend_sycl::destroy_rng_engine(); - } - rng_engine = new mkl_rng::mt19937(DPNP_QUEUE, seed); - rng_mcg59_engine = new mkl_rng::mcg59(DPNP_QUEUE, seed); -} - -void dpnp_queue_initialize_c(QueueOptions selector) +void dpnp_queue_initialize_c(QueueOptions) { - backend_sycl::backend_sycl_queue_init(selector); + [[maybe_unused]] auto &be = backend_sycl_singleton::get(); } size_t dpnp_queue_is_cpu_c() { - return backend_sycl::backend_sycl_is_cpu(); + const auto &be = backend_sycl_singleton::get(); + return be.backend_sycl_is_cpu(); } diff --git a/dpnp/backend/src/queue_sycl.hpp b/dpnp/backend/src/queue_sycl.hpp index fc429074d3a7..9a79d528fbbb 100644 --- a/dpnp/backend/src/queue_sycl.hpp +++ b/dpnp/backend/src/queue_sycl.hpp @@ -29,8 +29,9 @@ //#pragma clang diagnostic push //#pragma clang diagnostic ignored "-Wpass-failed" -#include +#include //#pragma clang diagnostic pop +#include #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-parameter" @@ -46,9 +47,102 @@ namespace mkl_rng = oneapi::mkl::rng; -#define DPNP_QUEUE backend_sycl::get_queue() -#define DPNP_RNG_ENGINE backend_sycl::get_rng_engine() -#define DPNP_RNG_MCG59_ENGINE backend_sycl::get_rng_mcg59_engine() +#define DPNP_QUEUE backend_sycl_singleton::get_queue() +#define DPNP_RNG_ENGINE backend_sycl_singleton::get_rng_engine() +#define DPNP_RNG_MCG59_ENGINE backend_sycl_singleton::get_rng_mcg59_engine() + +class backend_sycl_singleton { +public: + ~backend_sycl_singleton() {} + + static backend_sycl_singleton& get() { + static backend_sycl_singleton backend = lookup(); + return backend; + } + + static sycl::queue& get_queue() { + auto &be = backend_sycl_singleton::get(); + return *(be.queue_ptr); + } + + static mkl_rng::mt19937& get_rng_engine() { + auto &be = backend_sycl_singleton::get(); + return *(be.rng_mt19937_engine_ptr); + } + + static mkl_rng::mcg59& get_rng_mcg59_engine() { + auto &be = backend_sycl_singleton::get(); + return *(be.rng_mcg59_engine_ptr); + } + + template + void set_rng_engines_seed(const SeedT &seed) { + auto rng_eng_mt19937 = std::make_shared(*queue_ptr, seed); + if (!rng_eng_mt19937) { + throw std::runtime_error( + "Could not create MT19937 engine with given seed" + ); + } + auto rng_eng_mcg59 = std::make_shared(*queue_ptr, seed); + if (!rng_eng_mcg59) { + throw std::runtime_error( + "Could not create MCG59 engine with given seed" + ); + } + + rng_mt19937_engine_ptr.swap(rng_eng_mt19937); + rng_mcg59_engine_ptr.swap(rng_eng_mcg59); + } + + bool backend_sycl_is_cpu() const { + if (queue_ptr) { + const sycl::queue &q = *queue_ptr; + + return q.get_device().is_cpu(); + } + return false; + } + +private: + backend_sycl_singleton() : + queue_ptr{}, rng_mt19937_engine_ptr{}, rng_mcg59_engine_ptr{} + { + const sycl::property_list &prop = (is_verbose_mode()) ? + sycl::property_list{sycl::property::queue::enable_profiling()} + : sycl::property_list{}; + queue_ptr = std::make_shared(sycl::default_selector_v, prop); + + if (!queue_ptr) { + throw std::runtime_error( + "Could not create queue for default-selected device" + ); + } + + constexpr std::size_t default_seed = 1; + rng_mt19937_engine_ptr = std::make_shared(*queue_ptr, default_seed); + if (!rng_mt19937_engine_ptr) { + throw std::runtime_error( + "Could not create MT19937 engine" + ); + } + + rng_mcg59_engine_ptr = std::make_shared(*queue_ptr, default_seed); + if (!rng_mcg59_engine_ptr) { + throw std::runtime_error( + "Could not create MCG59 engine" + ); + } + } + + static backend_sycl_singleton& lookup() { + static backend_sycl_singleton backend{}; + return backend; + } + + std::shared_ptr queue_ptr; + std::shared_ptr rng_mt19937_engine_ptr; + std::shared_ptr rng_mcg59_engine_ptr; +}; /** * This is container for the SYCL queue, random number generation engine and @@ -57,16 +151,18 @@ namespace mkl_rng = oneapi::mkl::rng; * initialization order is undefined. This class postpone initialization of the * SYCL queue and mt19937 random number generation engine. */ +#if 0 class backend_sycl { - static sycl::queue *queue; /**< contains SYCL queue pointer initialized in - @ref backend_sycl_queue_init */ - static mkl_rng::mt19937 - *rng_engine; /**< RNG MT19937 engine ptr. initialized in @ref + /**< contains SYCL queue pointer initialized in + @ref backend_sycl_queue_init */ + static sycl::queue *queue; + /**< RNG MT19937 engine ptr. initialized in @ref backend_sycl_rng_engine_init */ - static mkl_rng::mcg59 - *rng_mcg59_engine; /**< RNG MCG59 engine ptr. initialized in @ref - backend_sycl_rng_engine_init */ + static mkl_rng::mt19937 *rng_engine; + /**< RNG MCG59 engine ptr. initialized in @ref + backend_sycl_rng_engine_init */ + static mkl_rng::mcg59 *rng_mcg59_engine; static void destroy() { @@ -106,7 +202,7 @@ class backend_sycl * Initialize @ref queue */ static void backend_sycl_queue_init( - QueueOptions selector = QueueOptions::CPU_SELECTOR); + QueueOptions selector = QueueOptions::AUTO_SELECTOR); /** * Return True if current @ref queue is related to cpu device @@ -152,5 +248,6 @@ class backend_sycl return *rng_mcg59_engine; } }; +#endif #endif // QUEUE_SYCL_H From bf24b2276cfebdadf8c0e151c8f3d225d161c167 Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Mon, 18 Mar 2024 22:43:19 -0500 Subject: [PATCH 7/9] Removed pre-preprocessor fenced out dead code Renamed backend_sycl_singleton back to backend_sycl Removed dpnp_queue_initialize_c function and QueueOptions enum as no longer used. Removed uses of these from examples and code base --- dpnp/backend/examples/example10.cpp | 2 - dpnp/backend/examples/example3.cpp | 1 - dpnp/backend/examples/example5.cpp | 2 - dpnp/backend/examples/example7.cpp | 2 - dpnp/backend/examples/example8.cpp | 2 - dpnp/backend/examples/example9.cpp | 2 - dpnp/backend/examples/example_bs.cpp | 1 - dpnp/backend/include/dpnp_iface.hpp | 29 +--- dpnp/backend/kernels/dpnp_krnl_random.cpp | 2 +- dpnp/backend/src/queue_sycl.cpp | 7 +- dpnp/backend/src/queue_sycl.hpp | 175 +++++----------------- dpnp/dpnp_algo/dpnp_algo.pxd | 7 - dpnp/dpnp_algo/dpnp_algo.pyx | 5 - 13 files changed, 43 insertions(+), 194 deletions(-) diff --git a/dpnp/backend/examples/example10.cpp b/dpnp/backend/examples/example10.cpp index 279854a57cef..b09ea9b335dc 100644 --- a/dpnp/backend/examples/example10.cpp +++ b/dpnp/backend/examples/example10.cpp @@ -50,8 +50,6 @@ void test_dpnp_random_normal(const size_t size, double dev_time_used = 0.0; double sum_dev_time_used = 0.0; - dpnp_queue_initialize_c(QueueOptions::GPU_SELECTOR); - double *result = (double *)dpnp_memory_alloc_c(size * sizeof(double)); dpnp_rng_srand_c(seed); // TODO: will move diff --git a/dpnp/backend/examples/example3.cpp b/dpnp/backend/examples/example3.cpp index 48d8acb514cc..2d516dc0b8de 100644 --- a/dpnp/backend/examples/example3.cpp +++ b/dpnp/backend/examples/example3.cpp @@ -44,7 +44,6 @@ int main(int, char **) { const size_t size = 256; - dpnp_queue_initialize_c(); std::cout << "SYCL queue is CPU: " << dpnp_queue_is_cpu_c() << std::endl; int *array1 = (int *)dpnp_memory_alloc_c(size * sizeof(int)); diff --git a/dpnp/backend/examples/example5.cpp b/dpnp/backend/examples/example5.cpp index 368f5fe441bb..1bb09e445a63 100644 --- a/dpnp/backend/examples/example5.cpp +++ b/dpnp/backend/examples/example5.cpp @@ -52,8 +52,6 @@ int main(int, char **) { const size_t size = 256; - dpnp_queue_initialize_c(QueueOptions::CPU_SELECTOR); - double *result = (double *)dpnp_memory_alloc_c(size * sizeof(double)); size_t seed = 10; diff --git a/dpnp/backend/examples/example7.cpp b/dpnp/backend/examples/example7.cpp index df4c7eacf85d..49c12c5dd51c 100644 --- a/dpnp/backend/examples/example7.cpp +++ b/dpnp/backend/examples/example7.cpp @@ -45,8 +45,6 @@ int main(int, char **) const size_t size = 2; size_t len = size * size; - dpnp_queue_initialize_c(QueueOptions::CPU_SELECTOR); - float *array = (float *)dpnp_memory_alloc_c(len * sizeof(float)); float *result1 = (float *)dpnp_memory_alloc_c(size * sizeof(float)); float *result2 = (float *)dpnp_memory_alloc_c(len * sizeof(float)); diff --git a/dpnp/backend/examples/example8.cpp b/dpnp/backend/examples/example8.cpp index 9970e9803b72..19074c5c8fc3 100644 --- a/dpnp/backend/examples/example8.cpp +++ b/dpnp/backend/examples/example8.cpp @@ -42,8 +42,6 @@ int main(int, char **) { const size_t size = 16; - dpnp_queue_initialize_c(QueueOptions::GPU_SELECTOR); - double *array = (double *)dpnp_memory_alloc_c(size * sizeof(double)); long *result = (long *)dpnp_memory_alloc_c(size * sizeof(long)); diff --git a/dpnp/backend/examples/example9.cpp b/dpnp/backend/examples/example9.cpp index 7aa7bf30737e..fedcb909a7af 100644 --- a/dpnp/backend/examples/example9.cpp +++ b/dpnp/backend/examples/example9.cpp @@ -46,8 +46,6 @@ int main(int, char **) long result = 0; long result_verification = 0; - dpnp_queue_initialize_c(QueueOptions::CPU_SELECTOR); - long *array = reinterpret_cast(dpnp_memory_alloc_c(size * sizeof(long))); diff --git a/dpnp/backend/examples/example_bs.cpp b/dpnp/backend/examples/example_bs.cpp index 847877c98228..6fcbd9b142f8 100644 --- a/dpnp/backend/examples/example_bs.cpp +++ b/dpnp/backend/examples/example_bs.cpp @@ -229,7 +229,6 @@ int main(int, char **) const double RISK_FREE = 0.1; const double VOLATILITY = 0.2; - dpnp_queue_initialize_c(QueueOptions::GPU_SELECTOR); std::cout << "SYCL queue is CPU: " << dpnp_queue_is_cpu_c() << std::endl; double *price = (double *)dpnp_memory_alloc_c(SIZE * sizeof(double)); diff --git a/dpnp/backend/include/dpnp_iface.hpp b/dpnp/backend/include/dpnp_iface.hpp index c3dfceef21a2..224a69f30c2c 100644 --- a/dpnp/backend/include/dpnp_iface.hpp +++ b/dpnp/backend/include/dpnp_iface.hpp @@ -68,32 +68,6 @@ typedef ssize_t shape_elem_type; * @} */ -/** - * @ingroup BACKEND_API - * @brief SYCL queue initialization selector. - * - * The structure defines the parameters that are used for the library - * initialization by @ref dpnp_queue_initialize_c "dpnp_queue_initialize". - */ -enum class QueueOptions : uint32_t -{ - CPU_SELECTOR, /**< CPU side execution mode */ - GPU_SELECTOR, /**< Intel GPU side execution mode */ - AUTO_SELECTOR /**< Automatic selection based on environment variable with - @ref CPU_SELECTOR default */ -}; - -/** - * @ingroup BACKEND_API - * @brief SYCL queue initialization. - * - * Global SYCL queue initialization. - * - * @param [in] selector Select type @ref QueueOptions of the SYCL queue. - * Default @ref AUTO_SELECTOR - */ -INP_DLLEXPORT void dpnp_queue_initialize_c( - QueueOptions selector = QueueOptions::AUTO_SELECTOR); /** * @ingroup BACKEND_API @@ -112,8 +86,7 @@ INP_DLLEXPORT size_t dpnp_queue_is_cpu_c(); * @param [in] size_in_bytes Number of bytes for requested memory allocation. * @param [in] q_ref Reference to SYCL queue. * - * @return A pointer to newly created memory on @ref dpnp_queue_initialize_c - * "initialized SYCL device". + * @return A pointer to newly created memory on SYCL device. */ INP_DLLEXPORT char *dpnp_memory_alloc_c(DPCTLSyclQueueRef q_ref, size_t size_in_bytes); diff --git a/dpnp/backend/kernels/dpnp_krnl_random.cpp b/dpnp/backend/kernels/dpnp_krnl_random.cpp index 5d8fb80467fe..e7e05323ac8d 100644 --- a/dpnp/backend/kernels/dpnp_krnl_random.cpp +++ b/dpnp/backend/kernels/dpnp_krnl_random.cpp @@ -70,7 +70,7 @@ static VSLStreamStatePtr get_rng_stream() void dpnp_rng_srand_c(size_t seed) { - auto &be = backend_sycl_singleton::get(); + auto &be = backend_sycl::get(); be.set_rng_engines_seed(seed); set_rng_stream(seed); } diff --git a/dpnp/backend/src/queue_sycl.cpp b/dpnp/backend/src/queue_sycl.cpp index b234a7da21bd..42f88d58cb76 100644 --- a/dpnp/backend/src/queue_sycl.cpp +++ b/dpnp/backend/src/queue_sycl.cpp @@ -111,13 +111,8 @@ static long dpnp_kernels_link() } #endif -void dpnp_queue_initialize_c(QueueOptions) -{ - [[maybe_unused]] auto &be = backend_sycl_singleton::get(); -} - size_t dpnp_queue_is_cpu_c() { - const auto &be = backend_sycl_singleton::get(); + const auto &be = backend_sycl::get(); return be.backend_sycl_is_cpu(); } diff --git a/dpnp/backend/src/queue_sycl.hpp b/dpnp/backend/src/queue_sycl.hpp index 9a79d528fbbb..d5056386761a 100644 --- a/dpnp/backend/src/queue_sycl.hpp +++ b/dpnp/backend/src/queue_sycl.hpp @@ -47,43 +47,58 @@ namespace mkl_rng = oneapi::mkl::rng; -#define DPNP_QUEUE backend_sycl_singleton::get_queue() -#define DPNP_RNG_ENGINE backend_sycl_singleton::get_rng_engine() -#define DPNP_RNG_MCG59_ENGINE backend_sycl_singleton::get_rng_mcg59_engine() +#define DPNP_QUEUE backend_sycl::get_queue() +#define DPNP_RNG_ENGINE backend_sycl::get_rng_engine() +#define DPNP_RNG_MCG59_ENGINE backend_sycl::get_rng_mcg59_engine() -class backend_sycl_singleton { +/** + * This is container for the SYCL queue, random number generation engine and + * related functions like queue and engine initialization and maintenance. The + * queue could not be initialized as a global object. Global object + * initialization order is undefined. This class postpone initialization of the + * SYCL queue and mt19937 random number generation engine. + */ +class backend_sycl +{ public: - ~backend_sycl_singleton() {} + ~backend_sycl() {} - static backend_sycl_singleton& get() { - static backend_sycl_singleton backend = lookup(); + static backend_sycl& get() + { + static backend_sycl backend{}; return backend; } - static sycl::queue& get_queue() { - auto &be = backend_sycl_singleton::get(); + static sycl::queue& get_queue() + { + auto &be = backend_sycl::get(); return *(be.queue_ptr); } - static mkl_rng::mt19937& get_rng_engine() { - auto &be = backend_sycl_singleton::get(); + static mkl_rng::mt19937& get_rng_engine() + { + auto &be = backend_sycl::get(); return *(be.rng_mt19937_engine_ptr); } - static mkl_rng::mcg59& get_rng_mcg59_engine() { - auto &be = backend_sycl_singleton::get(); + static mkl_rng::mcg59& get_rng_mcg59_engine() + { + auto &be = backend_sycl::get(); return *(be.rng_mcg59_engine_ptr); } template - void set_rng_engines_seed(const SeedT &seed) { - auto rng_eng_mt19937 = std::make_shared(*queue_ptr, seed); + void set_rng_engines_seed(const SeedT &seed) + { + auto rng_eng_mt19937 = + std::make_shared(*queue_ptr, seed); if (!rng_eng_mt19937) { throw std::runtime_error( "Could not create MT19937 engine with given seed" ); } - auto rng_eng_mcg59 = std::make_shared(*queue_ptr, seed); + auto rng_eng_mcg59 = + std::make_shared(*queue_ptr, seed); if (!rng_eng_mcg59) { throw std::runtime_error( "Could not create MCG59 engine with given seed" @@ -94,18 +109,15 @@ class backend_sycl_singleton { rng_mcg59_engine_ptr.swap(rng_eng_mcg59); } - bool backend_sycl_is_cpu() const { - if (queue_ptr) { - const sycl::queue &q = *queue_ptr; - - return q.get_device().is_cpu(); - } - return false; + bool backend_sycl_is_cpu() const + { + const sycl::queue &q = *queue_ptr; + return q.get_device().is_cpu(); } private: - backend_sycl_singleton() : - queue_ptr{}, rng_mt19937_engine_ptr{}, rng_mcg59_engine_ptr{} + backend_sycl() + : queue_ptr{}, rng_mt19937_engine_ptr{}, rng_mcg59_engine_ptr{} { const sycl::property_list &prop = (is_verbose_mode()) ? sycl::property_list{sycl::property::queue::enable_profiling()} @@ -134,120 +146,13 @@ class backend_sycl_singleton { } } - static backend_sycl_singleton& lookup() { - static backend_sycl_singleton backend{}; - return backend; - } + backend_sycl(backend_sycl const &) = default; + backend_sycl &operator=(backend_sycl const &) = default; + backend_sycl &operator=(backend_sycl &&) = default; std::shared_ptr queue_ptr; std::shared_ptr rng_mt19937_engine_ptr; std::shared_ptr rng_mcg59_engine_ptr; }; -/** - * This is container for the SYCL queue, random number generation engine and - * related functions like queue and engine initialization and maintenance. The - * queue could not be initialized as a global object. Global object - * initialization order is undefined. This class postpone initialization of the - * SYCL queue and mt19937 random number generation engine. - */ -#if 0 -class backend_sycl -{ - /**< contains SYCL queue pointer initialized in - @ref backend_sycl_queue_init */ - static sycl::queue *queue; - /**< RNG MT19937 engine ptr. initialized in @ref - backend_sycl_rng_engine_init */ - static mkl_rng::mt19937 *rng_engine; - /**< RNG MCG59 engine ptr. initialized in @ref - backend_sycl_rng_engine_init */ - static mkl_rng::mcg59 *rng_mcg59_engine; - - static void destroy() - { - backend_sycl::destroy_rng_engine(); - delete queue; - } - - static void destroy_rng_engine() - { - delete rng_engine; - delete rng_mcg59_engine; - - rng_engine = nullptr; - rng_mcg59_engine = nullptr; - } - -public: - backend_sycl() - { - queue = nullptr; - rng_engine = nullptr; - rng_mcg59_engine = nullptr; - } - - virtual ~backend_sycl() - { - backend_sycl::destroy(); - } - - /** - * Explicitly disallow copying - */ - backend_sycl(const backend_sycl &) = delete; - backend_sycl &operator=(const backend_sycl &) = delete; - - /** - * Initialize @ref queue - */ - static void backend_sycl_queue_init( - QueueOptions selector = QueueOptions::AUTO_SELECTOR); - - /** - * Return True if current @ref queue is related to cpu device - */ - static bool backend_sycl_is_cpu(); - - /** - * Initialize @ref rng_engine and @ref rng_mcg59_engine - */ - static void backend_sycl_rng_engine_init(size_t seed = 1); - - /** - * Return the @ref queue to the user - */ - static sycl::queue &get_queue() - { - if (!queue) { - backend_sycl_queue_init(); - } - - return *queue; - } - - /** - * Return the @ref rng_engine to the user - */ - static mkl_rng::mt19937 &get_rng_engine() - { - if (!rng_engine) { - backend_sycl_rng_engine_init(); - } - return *rng_engine; - } - - /** - * Return the @ref rng_mcg59_engine to the user - */ - static mkl_rng::mcg59 &get_rng_mcg59_engine() - { - if (!rng_engine) { - backend_sycl_rng_engine_init(); - } - return *rng_mcg59_engine; - } -}; -#endif - #endif // QUEUE_SYCL_H diff --git a/dpnp/dpnp_algo/dpnp_algo.pxd b/dpnp/dpnp_algo/dpnp_algo.pxd index 528b03e3b583..d2c454d62ec4 100644 --- a/dpnp/dpnp_algo/dpnp_algo.pxd +++ b/dpnp/dpnp_algo/dpnp_algo.pxd @@ -194,17 +194,10 @@ cdef extern from "dpnp_iface_fptr.hpp": DPNPFuncData get_dpnp_function_ptr(DPNPFuncName name, DPNPFuncType first_type, DPNPFuncType second_type) except + -cdef extern from "dpnp_iface.hpp" namespace "QueueOptions": # need this namespace for Enum import - cdef enum QueueOptions "QueueOptions": - CPU_SELECTOR - GPU_SELECTOR - AUTO_SELECTOR - cdef extern from "constants.hpp": void dpnp_python_constants_initialize_c(void * py_none, void * py_nan) cdef extern from "dpnp_iface.hpp": - void dpnp_queue_initialize_c(QueueOptions selector) char * dpnp_memory_alloc_c(size_t size_in_bytes) except + void dpnp_memory_free_c(void * ptr) diff --git a/dpnp/dpnp_algo/dpnp_algo.pyx b/dpnp/dpnp_algo/dpnp_algo.pyx index 3013cd76094f..e8012e74bbaf 100644 --- a/dpnp/dpnp_algo/dpnp_algo.pyx +++ b/dpnp/dpnp_algo/dpnp_algo.pyx @@ -83,12 +83,7 @@ cpdef dpnp_queue_initialize(): It takes visible time and needs to be done in the module loading procedure. """ cdef time_t seed_from_time - cdef QueueOptions queue_type = CPU_SELECTOR - if (config.__DPNP_QUEUE_GPU__): - queue_type = GPU_SELECTOR - - dpnp_queue_initialize_c(queue_type) dpnp_python_constants_initialize_c(< void*> None, < void * > dpnp.nan) From ac1b43a7faea648279be51af6f9a7f07b6246015 Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Mon, 18 Mar 2024 23:13:53 -0500 Subject: [PATCH 8/9] Formatting suggested by pre-commit hooks --- dpnp/backend/include/dpnp_iface.hpp | 1 - dpnp/backend/src/queue_sycl.cpp | 1 - dpnp/backend/src/queue_sycl.hpp | 60 ++++++++++++++--------------- 3 files changed, 28 insertions(+), 34 deletions(-) diff --git a/dpnp/backend/include/dpnp_iface.hpp b/dpnp/backend/include/dpnp_iface.hpp index 224a69f30c2c..ccbf6fa85361 100644 --- a/dpnp/backend/include/dpnp_iface.hpp +++ b/dpnp/backend/include/dpnp_iface.hpp @@ -68,7 +68,6 @@ typedef ssize_t shape_elem_type; * @} */ - /** * @ingroup BACKEND_API * @brief SYCL queue device status. diff --git a/dpnp/backend/src/queue_sycl.cpp b/dpnp/backend/src/queue_sycl.cpp index 42f88d58cb76..5e6df29d21d2 100644 --- a/dpnp/backend/src/queue_sycl.cpp +++ b/dpnp/backend/src/queue_sycl.cpp @@ -80,7 +80,6 @@ } #endif - #if defined(DPNPC_TOUCH_KERNEL_TO_LINK) /** * Function push the SYCL kernels to be linked (final stage of the compilation) diff --git a/dpnp/backend/src/queue_sycl.hpp b/dpnp/backend/src/queue_sycl.hpp index d5056386761a..fc7283a229e3 100644 --- a/dpnp/backend/src/queue_sycl.hpp +++ b/dpnp/backend/src/queue_sycl.hpp @@ -58,91 +58,87 @@ namespace mkl_rng = oneapi::mkl::rng; * initialization order is undefined. This class postpone initialization of the * SYCL queue and mt19937 random number generation engine. */ -class backend_sycl +class backend_sycl { public: ~backend_sycl() {} - static backend_sycl& get() + static backend_sycl &get() { static backend_sycl backend{}; return backend; } - static sycl::queue& get_queue() + static sycl::queue &get_queue() { auto &be = backend_sycl::get(); return *(be.queue_ptr); - } + } - static mkl_rng::mt19937& get_rng_engine() + static mkl_rng::mt19937 &get_rng_engine() { auto &be = backend_sycl::get(); return *(be.rng_mt19937_engine_ptr); - } + } - static mkl_rng::mcg59& get_rng_mcg59_engine() + static mkl_rng::mcg59 &get_rng_mcg59_engine() { auto &be = backend_sycl::get(); return *(be.rng_mcg59_engine_ptr); } template - void set_rng_engines_seed(const SeedT &seed) + void set_rng_engines_seed(const SeedT &seed) { - auto rng_eng_mt19937 = + auto rng_eng_mt19937 = std::make_shared(*queue_ptr, seed); if (!rng_eng_mt19937) { throw std::runtime_error( - "Could not create MT19937 engine with given seed" - ); + "Could not create MT19937 engine with given seed"); } - auto rng_eng_mcg59 = - std::make_shared(*queue_ptr, seed); + auto rng_eng_mcg59 = std::make_shared(*queue_ptr, seed); if (!rng_eng_mcg59) { throw std::runtime_error( - "Could not create MCG59 engine with given seed" - ); + "Could not create MCG59 engine with given seed"); } rng_mt19937_engine_ptr.swap(rng_eng_mt19937); rng_mcg59_engine_ptr.swap(rng_eng_mcg59); } - bool backend_sycl_is_cpu() const + bool backend_sycl_is_cpu() const { const sycl::queue &q = *queue_ptr; return q.get_device().is_cpu(); } private: - backend_sycl() - : queue_ptr{}, rng_mt19937_engine_ptr{}, rng_mcg59_engine_ptr{} + backend_sycl() + : queue_ptr{}, rng_mt19937_engine_ptr{}, rng_mcg59_engine_ptr{} { - const sycl::property_list &prop = (is_verbose_mode()) ? - sycl::property_list{sycl::property::queue::enable_profiling()} - : sycl::property_list{}; - queue_ptr = std::make_shared(sycl::default_selector_v, prop); + const sycl::property_list &prop = + (is_verbose_mode()) + ? sycl::property_list{sycl::property::queue::enable_profiling()} + : sycl::property_list{}; + queue_ptr = + std::make_shared(sycl::default_selector_v, prop); if (!queue_ptr) { throw std::runtime_error( - "Could not create queue for default-selected device" - ); + "Could not create queue for default-selected device"); } constexpr std::size_t default_seed = 1; - rng_mt19937_engine_ptr = std::make_shared(*queue_ptr, default_seed); + rng_mt19937_engine_ptr = + std::make_shared(*queue_ptr, default_seed); if (!rng_mt19937_engine_ptr) { - throw std::runtime_error( - "Could not create MT19937 engine" - ); + throw std::runtime_error("Could not create MT19937 engine"); } - rng_mcg59_engine_ptr = std::make_shared(*queue_ptr, default_seed); + rng_mcg59_engine_ptr = + std::make_shared(*queue_ptr, default_seed); if (!rng_mcg59_engine_ptr) { - throw std::runtime_error( - "Could not create MCG59 engine" - ); + throw std::runtime_error("Could not create MCG59 engine"); } } From f9b1db77178fff20297669970da8d532fa9135b3 Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Tue, 19 Mar 2024 05:20:23 -0500 Subject: [PATCH 9/9] Addressed issues raised by @diptorupd --- dpnp/backend/src/queue_sycl.hpp | 73 +++++++++++---------------------- 1 file changed, 24 insertions(+), 49 deletions(-) diff --git a/dpnp/backend/src/queue_sycl.hpp b/dpnp/backend/src/queue_sycl.hpp index fc7283a229e3..a50da2e539a7 100644 --- a/dpnp/backend/src/queue_sycl.hpp +++ b/dpnp/backend/src/queue_sycl.hpp @@ -31,7 +31,6 @@ //#pragma clang diagnostic ignored "-Wpass-failed" #include //#pragma clang diagnostic pop -#include #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-parameter" @@ -39,7 +38,7 @@ #include #pragma clang diagnostic pop -#include +#include #include "dpnp_pstl.hpp" // this header must be included after @@ -72,83 +71,59 @@ class backend_sycl static sycl::queue &get_queue() { auto &be = backend_sycl::get(); - return *(be.queue_ptr); + return be.queue_; } static mkl_rng::mt19937 &get_rng_engine() { auto &be = backend_sycl::get(); - return *(be.rng_mt19937_engine_ptr); + return be.rng_mt19937_engine_; } static mkl_rng::mcg59 &get_rng_mcg59_engine() { auto &be = backend_sycl::get(); - return *(be.rng_mcg59_engine_ptr); + return be.rng_mcg59_engine_; } template void set_rng_engines_seed(const SeedT &seed) { - auto rng_eng_mt19937 = - std::make_shared(*queue_ptr, seed); - if (!rng_eng_mt19937) { - throw std::runtime_error( - "Could not create MT19937 engine with given seed"); - } - auto rng_eng_mcg59 = std::make_shared(*queue_ptr, seed); - if (!rng_eng_mcg59) { - throw std::runtime_error( - "Could not create MCG59 engine with given seed"); - } - - rng_mt19937_engine_ptr.swap(rng_eng_mt19937); - rng_mcg59_engine_ptr.swap(rng_eng_mcg59); + mkl_rng::mt19937 rng_eng_mt19937(queue_, seed); + mkl_rng::mcg59 rng_eng_mcg59(queue_, seed); + + // now that instances are created, let's move them + rng_mt19937_engine_ = std::move(rng_eng_mt19937); + rng_mcg59_engine_ = std::move(rng_eng_mcg59); } bool backend_sycl_is_cpu() const { - const sycl::queue &q = *queue_ptr; - return q.get_device().is_cpu(); + const auto &dev = queue_.get_device(); + return dev.is_cpu(); } private: + static constexpr std::size_t default_seed = 1; + backend_sycl() - : queue_ptr{}, rng_mt19937_engine_ptr{}, rng_mcg59_engine_ptr{} + : queue_{sycl::default_selector_v, + (is_verbose_mode()) + ? sycl::property_list{sycl::property::queue:: + enable_profiling()} + : sycl::property_list{}}, + rng_mt19937_engine_{queue_, default_seed}, rng_mcg59_engine_{ + queue_, default_seed} { - const sycl::property_list &prop = - (is_verbose_mode()) - ? sycl::property_list{sycl::property::queue::enable_profiling()} - : sycl::property_list{}; - queue_ptr = - std::make_shared(sycl::default_selector_v, prop); - - if (!queue_ptr) { - throw std::runtime_error( - "Could not create queue for default-selected device"); - } - - constexpr std::size_t default_seed = 1; - rng_mt19937_engine_ptr = - std::make_shared(*queue_ptr, default_seed); - if (!rng_mt19937_engine_ptr) { - throw std::runtime_error("Could not create MT19937 engine"); - } - - rng_mcg59_engine_ptr = - std::make_shared(*queue_ptr, default_seed); - if (!rng_mcg59_engine_ptr) { - throw std::runtime_error("Could not create MCG59 engine"); - } } backend_sycl(backend_sycl const &) = default; backend_sycl &operator=(backend_sycl const &) = default; backend_sycl &operator=(backend_sycl &&) = default; - std::shared_ptr queue_ptr; - std::shared_ptr rng_mt19937_engine_ptr; - std::shared_ptr rng_mcg59_engine_ptr; + sycl::queue queue_; + mkl_rng::mt19937 rng_mt19937_engine_; + mkl_rng::mcg59 rng_mcg59_engine_; }; #endif // QUEUE_SYCL_H