@@ -72,7 +72,7 @@ void dpnp_rng_srand_c(size_t seed)
72
72
}
73
73
74
74
template <typename _DataType>
75
- INP_DLLEXPORT void dpnp_rng_beta_c (void * result, const _DataType a, const _DataType b, const size_t size)
75
+ void dpnp_rng_beta_c (void * result, const _DataType a, const _DataType b, const size_t size)
76
76
{
77
77
if (!size)
78
78
{
@@ -116,7 +116,6 @@ void dpnp_rng_binomial_c(void* result, const int ntrial, const double p, const s
116
116
{
117
117
return ;
118
118
}
119
- _DataType* result1 = reinterpret_cast <_DataType*>(result);
120
119
121
120
if (ntrial == 0 || p == 0 )
122
121
{
@@ -131,6 +130,7 @@ void dpnp_rng_binomial_c(void* result, const int ntrial, const double p, const s
131
130
}
132
131
else
133
132
{
133
+ _DataType* result1 = reinterpret_cast <_DataType*>(result);
134
134
if (dpnp_queue_is_cpu_c ())
135
135
{
136
136
mkl_rng::binomial<_DataType> distribution (ntrial, p);
@@ -253,29 +253,34 @@ void dpnp_rng_f_c(void* result, const _DataType df_num, const _DataType df_den,
253
253
template <typename _DataType>
254
254
void dpnp_rng_gamma_c (void * result, const _DataType shape, const _DataType scale, const size_t size)
255
255
{
256
- if (!size)
256
+ if (!size || result == nullptr )
257
257
{
258
258
return ;
259
259
}
260
260
261
- // set displacement a
262
- const _DataType a = (_DataType (0.0 ));
263
-
264
- _DataType* result1 = reinterpret_cast <_DataType*>(result);
265
-
266
- if (dpnp_queue_is_cpu_c ())
261
+ if (shape == 0.0 || scale == 0.0 )
267
262
{
268
- mkl_rng::gamma<_DataType> distribution (shape, a, scale);
269
- // perform generation
270
- auto event_out = mkl_rng::generate (distribution, DPNP_RNG_ENGINE, size, result1);
271
- event_out.wait ();
263
+ dpnp_zeros_c<_DataType>(result, size);
272
264
}
273
265
else
274
266
{
275
- int errcode = vdRngGamma (VSL_RNG_METHOD_GAMMA_GNORM, get_rng_stream (), size, result1, shape, a, scale);
276
- if (errcode != VSL_STATUS_OK)
267
+ _DataType* result1 = reinterpret_cast <_DataType*>(result);
268
+ const _DataType a = (_DataType (0.0 ));
269
+
270
+ if (dpnp_queue_is_cpu_c ())
271
+ {
272
+ mkl_rng::gamma<_DataType> distribution (shape, a, scale);
273
+ // perform generation
274
+ auto event_out = mkl_rng::generate (distribution, DPNP_RNG_ENGINE, size, result1);
275
+ event_out.wait ();
276
+ }
277
+ else
277
278
{
278
- throw std::runtime_error (" DPNP RNG Error: dpnp_rng_gamma_c() failed." );
279
+ int errcode = vdRngGamma (VSL_RNG_METHOD_GAMMA_GNORM, get_rng_stream (), size, result1, shape, a, scale);
280
+ if (errcode != VSL_STATUS_OK)
281
+ {
282
+ throw std::runtime_error (" DPNP RNG Error: dpnp_rng_gamma_c() failed." );
283
+ }
279
284
}
280
285
}
281
286
}
@@ -298,16 +303,23 @@ void dpnp_rng_gaussian_c(void* result, const _DataType mean, const _DataType std
298
303
template <typename _DataType>
299
304
void dpnp_rng_geometric_c (void * result, const float p, const size_t size)
300
305
{
301
- if (!size)
306
+ if (!size || !result )
302
307
{
303
308
return ;
304
309
}
305
- _DataType* result1 = reinterpret_cast <_DataType*>(result);
306
310
307
- mkl_rng::geometric<_DataType> distribution (p);
308
- // perform generation
309
- auto event_out = mkl_rng::generate (distribution, DPNP_RNG_ENGINE, size, result1);
310
- event_out.wait ();
311
+ if (p == 1.0 )
312
+ {
313
+ dpnp_ones_c<_DataType>(result, size);
314
+ }
315
+ else
316
+ {
317
+ _DataType* result1 = reinterpret_cast <_DataType*>(result);
318
+ mkl_rng::geometric<_DataType> distribution (p);
319
+ // perform generation
320
+ auto event_out = mkl_rng::generate (distribution, DPNP_RNG_ENGINE, size, result1);
321
+ event_out.wait ();
322
+ }
311
323
}
312
324
313
325
template <typename _KernelNameSpecialization>
@@ -316,82 +328,114 @@ class dpnp_blas_scal_c_kernel;
316
328
template <typename _DataType>
317
329
void dpnp_rng_gumbel_c (void * result, const double loc, const double scale, const size_t size)
318
330
{
319
- cl::sycl::event event;
320
- if (!size)
331
+ if (!size || !result)
321
332
{
322
333
return ;
323
334
}
324
335
325
- const _DataType alpha = (_DataType (-1.0 ));
326
- std::int64_t incx = 1 ;
327
- _DataType* result1 = reinterpret_cast <_DataType*>(result);
328
- double negloc = loc * (double (-1.0 ));
329
-
330
- mkl_rng::gumbel<_DataType> distribution (negloc, scale);
331
- event = mkl_rng::generate (distribution, DPNP_RNG_ENGINE, size, result1);
332
- event.wait ();
333
-
334
- // OK for CPU and segfault for GPU device
335
- // event = mkl_blas::scal(DPNP_QUEUE, size, alpha, result1, incx);
336
- if (dpnp_queue_is_cpu_c ())
336
+ if (scale == 0.0 )
337
337
{
338
- event = mkl_blas::scal (DPNP_QUEUE, size, alpha, result1, incx);
338
+ _DataType* fill_value = reinterpret_cast <_DataType*>(dpnp_memory_alloc_c (sizeof (_DataType)));
339
+ fill_value[0 ] = static_cast <_DataType>(loc);
340
+ dpnp_initval_c<_DataType>(result, fill_value, size);
341
+ dpnp_memory_free_c (fill_value);
339
342
}
340
343
else
341
344
{
342
- // for (size_t i = 0; i < size; i++) result1[i] *= alpha;
343
- cl::sycl::range<1 > gws (size);
344
- auto kernel_parallel_for_func = [=](cl::sycl::id<1 > global_id) {
345
- size_t i = global_id[0 ];
346
- result1[i] *= alpha;
347
- };
348
- auto kernel_func = [&](cl::sycl::handler& cgh) {
349
- cgh.parallel_for <class dpnp_blas_scal_c_kernel <_DataType>>(gws, kernel_parallel_for_func);
350
- };
351
- event = DPNP_QUEUE.submit (kernel_func);
345
+ const _DataType alpha = (_DataType (-1.0 ));
346
+ std::int64_t incx = 1 ;
347
+ _DataType* result1 = reinterpret_cast <_DataType*>(result);
348
+ double negloc = loc * (double (-1.0 ));
349
+
350
+ mkl_rng::gumbel<_DataType> distribution (negloc, scale);
351
+ auto event_distribution = mkl_rng::generate (distribution, DPNP_RNG_ENGINE, size, result1);
352
+
353
+ // OK for CPU and segfault for GPU device
354
+ // event = mkl_blas::scal(DPNP_QUEUE, size, alpha, result1, incx);
355
+ cl::sycl::event prod_event;
356
+ if (dpnp_queue_is_cpu_c ())
357
+ {
358
+ prod_event = mkl_blas::scal (DPNP_QUEUE, size, alpha, result1, incx, {event_distribution});
359
+ }
360
+ else
361
+ {
362
+ // for (size_t i = 0; i < size; i++) result1[i] *= alpha;
363
+ cl::sycl::range<1 > gws (size);
364
+ auto kernel_parallel_for_func = [=](cl::sycl::id<1 > global_id) {
365
+ size_t i = global_id[0 ];
366
+ result1[i] *= alpha;
367
+ };
368
+ auto kernel_func = [&](cl::sycl::handler& cgh) {
369
+ cgh.depends_on ({event_distribution});
370
+ cgh.parallel_for <class dpnp_blas_scal_c_kernel <_DataType>>(gws, kernel_parallel_for_func);
371
+ };
372
+ prod_event = DPNP_QUEUE.submit (kernel_func);
373
+ }
374
+ prod_event.wait ();
352
375
}
353
- event.wait ();
354
376
}
355
377
356
378
template <typename _DataType>
357
379
void dpnp_rng_hypergeometric_c (void * result, const int l, const int s, const int m, const size_t size)
358
380
{
359
- if (!size)
381
+ if (!size || !result )
360
382
{
361
383
return ;
362
384
}
363
- _DataType* result1 = reinterpret_cast <_DataType*>(result);
364
385
365
- if (dpnp_queue_is_cpu_c () )
386
+ if (m == 0 )
366
387
{
367
- mkl_rng::hypergeometric<_DataType> distribution (l, s, m);
368
- // perform generation
369
- auto event_out = mkl_rng::generate (distribution, DPNP_RNG_ENGINE, size, result1);
370
- event_out.wait ();
388
+ dpnp_zeros_c<_DataType>(result, size);
389
+ }
390
+ else if (l == m)
391
+ {
392
+ _DataType* fill_value = reinterpret_cast <_DataType*>(dpnp_memory_alloc_c (sizeof (_DataType)));
393
+ fill_value[0 ] = static_cast <_DataType>(s);
394
+ dpnp_initval_c<_DataType>(result, fill_value, size);
395
+ dpnp_memory_free_c (fill_value);
371
396
}
372
397
else
373
398
{
374
- int errcode = viRngHypergeometric (VSL_RNG_METHOD_HYPERGEOMETRIC_H2PE, get_rng_stream (), size, result1, l, s, m );
375
- if (errcode != VSL_STATUS_OK )
399
+ _DataType* result1 = reinterpret_cast <_DataType*>(result );
400
+ if (dpnp_queue_is_cpu_c () )
376
401
{
377
- throw std::runtime_error (" DPNP RNG Error: dpnp_rng_hypergeometric_c() failed." );
402
+ mkl_rng::hypergeometric<_DataType> distribution (l, s, m);
403
+ // perform generation
404
+ auto event_out = mkl_rng::generate (distribution, DPNP_RNG_ENGINE, size, result1);
405
+ event_out.wait ();
406
+ }
407
+ else
408
+ {
409
+ int errcode =
410
+ viRngHypergeometric (VSL_RNG_METHOD_HYPERGEOMETRIC_H2PE, get_rng_stream (), size, result1, l, s, m);
411
+ if (errcode != VSL_STATUS_OK)
412
+ {
413
+ throw std::runtime_error (" DPNP RNG Error: dpnp_rng_hypergeometric_c() failed." );
414
+ }
378
415
}
379
416
}
380
417
}
381
418
382
419
template <typename _DataType>
383
420
void dpnp_rng_laplace_c (void * result, const double loc, const double scale, const size_t size)
384
421
{
385
- if (!size)
422
+ if (!size || !result )
386
423
{
387
424
return ;
388
425
}
389
- _DataType* result1 = reinterpret_cast <_DataType*>(result);
390
426
391
- mkl_rng::laplace<_DataType> distribution (loc, scale);
392
- // perform generation
393
- auto event_out = mkl_rng::generate (distribution, DPNP_RNG_ENGINE, size, result1);
394
- event_out.wait ();
427
+ if (scale == 0.0 )
428
+ {
429
+ dpnp_zeros_c<_DataType>(result, size);
430
+ }
431
+ else
432
+ {
433
+ _DataType* result1 = reinterpret_cast <_DataType*>(result);
434
+ mkl_rng::laplace<_DataType> distribution (loc, scale);
435
+ // perform generation
436
+ auto event_out = mkl_rng::generate (distribution, DPNP_RNG_ENGINE, size, result1);
437
+ event_out.wait ();
438
+ }
395
439
}
396
440
397
441
template <typename _KernelNameSpecialization>
0 commit comments