Skip to content

Commit 814ad56

Browse files
Use backend_sycl_singleton, remove backend_sycl
1 parent c11b779 commit 814ad56

File tree

3 files changed

+117
-133
lines changed

3 files changed

+117
-133
lines changed

dpnp/backend/kernels/dpnp_krnl_random.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ static VSLStreamStatePtr get_rng_stream()
7070

7171
void dpnp_rng_srand_c(size_t seed)
7272
{
73-
backend_sycl::backend_sycl_rng_engine_init(seed);
73+
auto &be = backend_sycl_singleton::get();
74+
be.set_rng_engines_seed(seed);
7475
set_rng_stream(seed);
7576
}
7677

dpnp/backend/src/queue_sycl.cpp

Lines changed: 6 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,7 @@
3131
#include "dpnp_utils.hpp"
3232
#include "queue_sycl.hpp"
3333

34-
sycl::queue *backend_sycl::queue = nullptr;
35-
mkl_rng::mt19937 *backend_sycl::rng_engine = nullptr;
36-
mkl_rng::mcg59 *backend_sycl::rng_mcg59_engine = nullptr;
37-
38-
static void dpnpc_show_mathlib_version()
34+
[[maybe_unused]] static void dpnpc_show_mathlib_version()
3935
{
4036
#if 1
4137
const int len = 256;
@@ -60,7 +56,7 @@ static void dpnpc_show_mathlib_version()
6056
}
6157

6258
#if (not defined(NDEBUG))
63-
static void show_available_sycl_devices()
59+
[[maybe_unused]] static void show_available_sycl_devices()
6460
{
6561
const std::vector<sycl::device> devices = sycl::device::get_devices();
6662

@@ -84,22 +80,6 @@ static void show_available_sycl_devices()
8480
}
8581
#endif
8682

87-
static sycl::device get_default_sycl_device()
88-
{
89-
int dpnpc_queue_gpu = 0;
90-
sycl::device dev = sycl::device(sycl::cpu_selector_v);
91-
92-
const char *dpnpc_queue_gpu_var = getenv("DPNPC_QUEUE_GPU");
93-
if (dpnpc_queue_gpu_var != NULL) {
94-
dpnpc_queue_gpu = atoi(dpnpc_queue_gpu_var);
95-
}
96-
97-
if (dpnpc_queue_gpu) {
98-
dev = sycl::device(sycl::gpu_selector_v);
99-
}
100-
101-
return dev;
102-
}
10383

10484
#if defined(DPNPC_TOUCH_KERNEL_TO_LINK)
10585
/**
@@ -131,107 +111,13 @@ static long dpnp_kernels_link()
131111
}
132112
#endif
133113

134-
// Catch asynchronous exceptions
135-
static void exception_handler(sycl::exception_list exceptions)
136-
{
137-
for (std::exception_ptr const &e : exceptions) {
138-
try {
139-
std::rethrow_exception(e);
140-
} catch (sycl::exception const &e) {
141-
std::cout << "DPNP. Caught asynchronous SYCL exception:\n"
142-
<< e.what() << std::endl;
143-
}
144-
}
145-
};
146-
147-
void backend_sycl::backend_sycl_queue_init(QueueOptions selector)
148-
{
149-
std::chrono::high_resolution_clock::time_point t1 =
150-
std::chrono::high_resolution_clock::now();
151-
152-
if (queue) {
153-
backend_sycl::destroy();
154-
}
155-
156-
sycl::device dev;
157-
158-
#if not defined(NDEBUG)
159-
show_available_sycl_devices();
160-
#endif
161-
162-
if (QueueOptions::CPU_SELECTOR == selector) {
163-
dev = sycl::device(sycl::cpu_selector_v);
164-
}
165-
else if (QueueOptions::GPU_SELECTOR == selector) {
166-
dev = sycl::device(sycl::gpu_selector_v);
167-
}
168-
else {
169-
dev = get_default_sycl_device();
170-
}
171-
172-
if (is_verbose_mode()) {
173-
sycl::property_list properties{
174-
sycl::property::queue::enable_profiling()};
175-
queue = new sycl::queue(dev, exception_handler, properties);
176-
}
177-
else {
178-
queue = new sycl::queue(dev, exception_handler);
179-
}
180-
181-
std::chrono::high_resolution_clock::time_point t2 =
182-
std::chrono::high_resolution_clock::now();
183-
std::chrono::duration<double> time_queue_init =
184-
std::chrono::duration_cast<std::chrono::duration<double>>(t2 - t1);
185-
186-
std::chrono::high_resolution_clock::time_point t3 =
187-
std::chrono::high_resolution_clock::now();
188-
#if defined(DPNPC_TOUCH_KERNEL_TO_LINK)
189-
// Remove pre-link kernel library at startup time
190-
dpnp_kernels_link();
191-
#endif
192-
std::chrono::high_resolution_clock::time_point t4 =
193-
std::chrono::high_resolution_clock::now();
194-
std::chrono::duration<double> time_kernels_link =
195-
std::chrono::duration_cast<std::chrono::duration<double>>(t4 - t3);
196-
197-
std::cout << "Running on: "
198-
<< DPNP_QUEUE.get_device().get_info<sycl::info::device::name>()
199-
<< "\n";
200-
std::cout << "queue initialization time: " << time_queue_init.count()
201-
<< " (sec.)\n";
202-
std::cout << "SYCL kernels link time: " << time_kernels_link.count()
203-
<< " (sec.)\n";
204-
dpnpc_show_mathlib_version();
205-
206-
std::cout << std::endl;
207-
}
208-
209-
bool backend_sycl::backend_sycl_is_cpu()
210-
{
211-
const sycl::queue &qptr = get_queue();
212-
213-
if (qptr.get_device().is_cpu()) {
214-
return true;
215-
}
216-
217-
return false;
218-
}
219-
220-
void backend_sycl::backend_sycl_rng_engine_init(size_t seed)
221-
{
222-
if (rng_engine) {
223-
backend_sycl::destroy_rng_engine();
224-
}
225-
rng_engine = new mkl_rng::mt19937(DPNP_QUEUE, seed);
226-
rng_mcg59_engine = new mkl_rng::mcg59(DPNP_QUEUE, seed);
227-
}
228-
229-
void dpnp_queue_initialize_c(QueueOptions selector)
114+
void dpnp_queue_initialize_c(QueueOptions)
230115
{
231-
backend_sycl::backend_sycl_queue_init(selector);
116+
[[maybe_unused]] auto &be = backend_sycl_singleton::get();
232117
}
233118

234119
size_t dpnp_queue_is_cpu_c()
235120
{
236-
return backend_sycl::backend_sycl_is_cpu();
121+
const auto &be = backend_sycl_singleton::get();
122+
return be.backend_sycl_is_cpu();
237123
}

dpnp/backend/src/queue_sycl.hpp

Lines changed: 109 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,9 @@
2929

3030
//#pragma clang diagnostic push
3131
//#pragma clang diagnostic ignored "-Wpass-failed"
32-
#include <CL/sycl.hpp>
32+
#include <sycl/sycl.hpp>
3333
//#pragma clang diagnostic pop
34+
#include <memory>
3435

3536
#pragma clang diagnostic push
3637
#pragma clang diagnostic ignored "-Wunused-parameter"
@@ -46,9 +47,102 @@
4647

4748
namespace mkl_rng = oneapi::mkl::rng;
4849

49-
#define DPNP_QUEUE backend_sycl::get_queue()
50-
#define DPNP_RNG_ENGINE backend_sycl::get_rng_engine()
51-
#define DPNP_RNG_MCG59_ENGINE backend_sycl::get_rng_mcg59_engine()
50+
#define DPNP_QUEUE backend_sycl_singleton::get_queue()
51+
#define DPNP_RNG_ENGINE backend_sycl_singleton::get_rng_engine()
52+
#define DPNP_RNG_MCG59_ENGINE backend_sycl_singleton::get_rng_mcg59_engine()
53+
54+
class backend_sycl_singleton {
55+
public:
56+
~backend_sycl_singleton() {}
57+
58+
static backend_sycl_singleton& get() {
59+
static backend_sycl_singleton backend = lookup();
60+
return backend;
61+
}
62+
63+
static sycl::queue& get_queue() {
64+
auto &be = backend_sycl_singleton::get();
65+
return *(be.queue_ptr);
66+
}
67+
68+
static mkl_rng::mt19937& get_rng_engine() {
69+
auto &be = backend_sycl_singleton::get();
70+
return *(be.rng_mt19937_engine_ptr);
71+
}
72+
73+
static mkl_rng::mcg59& get_rng_mcg59_engine() {
74+
auto &be = backend_sycl_singleton::get();
75+
return *(be.rng_mcg59_engine_ptr);
76+
}
77+
78+
template <typename SeedT>
79+
void set_rng_engines_seed(const SeedT &seed) {
80+
auto rng_eng_mt19937 = std::make_shared<mkl_rng::mt19937>(*queue_ptr, seed);
81+
if (!rng_eng_mt19937) {
82+
throw std::runtime_error(
83+
"Could not create MT19937 engine with given seed"
84+
);
85+
}
86+
auto rng_eng_mcg59 = std::make_shared<mkl_rng::mcg59>(*queue_ptr, seed);
87+
if (!rng_eng_mcg59) {
88+
throw std::runtime_error(
89+
"Could not create MCG59 engine with given seed"
90+
);
91+
}
92+
93+
rng_mt19937_engine_ptr.swap(rng_eng_mt19937);
94+
rng_mcg59_engine_ptr.swap(rng_eng_mcg59);
95+
}
96+
97+
bool backend_sycl_is_cpu() const {
98+
if (queue_ptr) {
99+
const sycl::queue &q = *queue_ptr;
100+
101+
return q.get_device().is_cpu();
102+
}
103+
return false;
104+
}
105+
106+
private:
107+
backend_sycl_singleton() :
108+
queue_ptr{}, rng_mt19937_engine_ptr{}, rng_mcg59_engine_ptr{}
109+
{
110+
const sycl::property_list &prop = (is_verbose_mode()) ?
111+
sycl::property_list{sycl::property::queue::enable_profiling()}
112+
: sycl::property_list{};
113+
queue_ptr = std::make_shared<sycl::queue>(sycl::default_selector_v, prop);
114+
115+
if (!queue_ptr) {
116+
throw std::runtime_error(
117+
"Could not create queue for default-selected device"
118+
);
119+
}
120+
121+
constexpr std::size_t default_seed = 1;
122+
rng_mt19937_engine_ptr = std::make_shared<mkl_rng::mt19937>(*queue_ptr, default_seed);
123+
if (!rng_mt19937_engine_ptr) {
124+
throw std::runtime_error(
125+
"Could not create MT19937 engine"
126+
);
127+
}
128+
129+
rng_mcg59_engine_ptr = std::make_shared<mkl_rng::mcg59>(*queue_ptr, default_seed);
130+
if (!rng_mcg59_engine_ptr) {
131+
throw std::runtime_error(
132+
"Could not create MCG59 engine"
133+
);
134+
}
135+
}
136+
137+
static backend_sycl_singleton& lookup() {
138+
static backend_sycl_singleton backend{};
139+
return backend;
140+
}
141+
142+
std::shared_ptr<sycl::queue> queue_ptr;
143+
std::shared_ptr<mkl_rng::mt19937> rng_mt19937_engine_ptr;
144+
std::shared_ptr<mkl_rng::mcg59> rng_mcg59_engine_ptr;
145+
};
52146

53147
/**
54148
* This is container for the SYCL queue, random number generation engine and
@@ -57,16 +151,18 @@ namespace mkl_rng = oneapi::mkl::rng;
57151
* initialization order is undefined. This class postpone initialization of the
58152
* SYCL queue and mt19937 random number generation engine.
59153
*/
154+
#if 0
60155
class backend_sycl
61156
{
62-
static sycl::queue *queue; /**< contains SYCL queue pointer initialized in
63-
@ref backend_sycl_queue_init */
64-
static mkl_rng::mt19937
65-
*rng_engine; /**< RNG MT19937 engine ptr. initialized in @ref
157+
/**< contains SYCL queue pointer initialized in
158+
@ref backend_sycl_queue_init */
159+
static sycl::queue *queue;
160+
/**< RNG MT19937 engine ptr. initialized in @ref
66161
backend_sycl_rng_engine_init */
67-
static mkl_rng::mcg59
68-
*rng_mcg59_engine; /**< RNG MCG59 engine ptr. initialized in @ref
69-
backend_sycl_rng_engine_init */
162+
static mkl_rng::mt19937 *rng_engine;
163+
/**< RNG MCG59 engine ptr. initialized in @ref
164+
backend_sycl_rng_engine_init */
165+
static mkl_rng::mcg59 *rng_mcg59_engine;
70166

71167
static void destroy()
72168
{
@@ -106,7 +202,7 @@ class backend_sycl
106202
* Initialize @ref queue
107203
*/
108204
static void backend_sycl_queue_init(
109-
QueueOptions selector = QueueOptions::CPU_SELECTOR);
205+
QueueOptions selector = QueueOptions::AUTO_SELECTOR);
110206

111207
/**
112208
* Return True if current @ref queue is related to cpu device
@@ -152,5 +248,6 @@ class backend_sycl
152248
return *rng_mcg59_engine;
153249
}
154250
};
251+
#endif
155252

156253
#endif // QUEUE_SYCL_H

0 commit comments

Comments
 (0)