@@ -394,30 +394,38 @@ void dpnp_rng_laplace_c(void* result, const double loc, const double scale, cons
394
394
event_out.wait ();
395
395
}
396
396
397
+ template <typename _KernelNameSpecialization>
398
+ class dpnp_rng_logistic_c_kernel ;
399
+
397
400
/* Logistic(loc, scale) ~ loc + scale * log(u/(1.0 - u)) */
398
401
template <typename _DataType>
399
402
void dpnp_rng_logistic_c (void * result, const double loc, const double scale, const size_t size)
400
403
{
401
- if (!size)
404
+ if (!size || !result )
402
405
{
403
406
return ;
404
407
}
405
- cl::sycl::vector_class<cl::sycl::event> no_deps;
406
408
407
409
const _DataType d_zero = _DataType (0.0 );
408
410
const _DataType d_one = _DataType (1.0 );
409
411
410
412
_DataType* result1 = reinterpret_cast <_DataType*>(result);
411
413
412
414
mkl_rng::uniform<_DataType> distribution (d_zero, d_one);
413
- auto event_out = mkl_rng::generate (distribution, DPNP_RNG_ENGINE, size, result1);
414
- event_out.wait ();
415
-
416
- for (size_t i = 0 ; i < size; i++)
417
- result1[i] = log (result1[i] / (1.0 - result1[i]));
415
+ auto event_distribution = mkl_rng::generate (distribution, DPNP_RNG_ENGINE, size, result1);
418
416
419
- for (size_t i = 0 ; i < size; i++)
417
+ cl::sycl::range<1 > gws (size);
418
+ auto kernel_parallel_for_func = [=](cl::sycl::id<1 > global_id) {
419
+ size_t i = global_id[0 ];
420
+ result1[i] = cl::sycl::log (result1[i] / (1.0 - result1[i]));
420
421
result1[i] = loc + scale * result1[i];
422
+ };
423
+ auto kernel_func = [&](cl::sycl::handler& cgh) {
424
+ cgh.depends_on ({event_distribution});
425
+ cgh.parallel_for <class dpnp_rng_logistic_c_kernel <_DataType>>(gws, kernel_parallel_for_func);
426
+ };
427
+ auto event = DPNP_QUEUE.submit (kernel_func);
428
+ event.wait ();
421
429
}
422
430
423
431
template <typename _DataType>
0 commit comments