mkl-devel-dpcpp 2025.1.0__py2.py3-none-win_amd64.whl → 2025.2.0__py2.py3-none-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mkl-devel-dpcpp might be problematic. Click here for more details.
- {mkl_devel_dpcpp-2025.1.0.data → mkl_devel_dpcpp-2025.2.0.data}/data/Library/lib/mkl_sycl.lib +0 -0
- mkl_devel_dpcpp-2025.2.0.data/data/Library/lib/mkl_sycl_dft_dll.lib +0 -0
- {mkl_devel_dpcpp-2025.1.0.data → mkl_devel_dpcpp-2025.2.0.data}/data/Library/lib/mkl_sycl_dll.lib +0 -0
- mkl_devel_dpcpp-2025.2.0.data/data/Library/lib/mkl_sycl_lapack_dll.lib +0 -0
- {mkl_devel_dpcpp-2025.1.0.data → mkl_devel_dpcpp-2025.2.0.data}/data/Library/lib/mkl_sycl_rng_dll.lib +0 -0
- mkl_devel_dpcpp-2025.2.0.data/data/Library/lib/mkl_sycl_sparse_dll.lib +0 -0
- {mkl_devel_dpcpp-2025.1.0.dist-info → mkl_devel_dpcpp-2025.2.0.dist-info}/METADATA +4 -3
- mkl_devel_dpcpp-2025.2.0.dist-info/RECORD +15 -0
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/bfloat16.hpp +0 -26
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/blas/buffer.hpp +0 -42
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/blas/buffer_decls.hpp +0 -880
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/blas/spec.hpp +0 -42
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/blas/types.hpp +0 -60
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/blas/usm.hpp +0 -42
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/blas/usm_decls.hpp +0 -1240
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/blas.hpp +0 -34
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/dft/spec.hpp +0 -42
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/dft.hpp +0 -254
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/dfti.hpp +0 -22
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/exceptions.hpp +0 -110
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/experimental/data_fitting/interpolate.hpp +0 -67
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/experimental/data_fitting/spline_and_data_params.hpp +0 -68
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/experimental/data_fitting/splines.hpp +0 -177
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/experimental/data_fitting.hpp +0 -22
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/export.hpp +0 -25
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/lapack/concepts.hpp +0 -55
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/lapack/exceptions.hpp +0 -75
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/lapack/lapack.hpp +0 -1096
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/lapack/scratchpad.hpp +0 -107
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/lapack/spec.hpp +0 -42
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/lapack.hpp +0 -24
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/detail/engine_base.hpp +0 -48
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/bernoulli_impl.hpp +0 -89
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/beta_impl.hpp +0 -463
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/bits_impl.hpp +0 -71
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/distribution_base.hpp +0 -85
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/engine_base.hpp +0 -43
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/engine_helpers_base.hpp +0 -54
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/exponential_impl.hpp +0 -116
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/gamma_impl.hpp +0 -285
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/gaussian_impl.hpp +0 -270
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/geometric_impl.hpp +0 -99
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/lognormal_impl.hpp +0 -105
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/mcg31m1_helpers_impl.hpp +0 -117
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/mcg31m1_impl.hpp +0 -223
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/mcg59_helpers_impl.hpp +0 -118
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/mcg59_impl.hpp +0 -266
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/mrg32k3a_helpers_impl.hpp +0 -125
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/mrg32k3a_impl.hpp +0 -385
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/mrg32k3a_skip_ahead_matrix.hpp +0 -3668
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/philox4x32x10_helpers_impl.hpp +0 -141
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/philox4x32x10_impl.hpp +0 -552
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/poisson_impl.hpp +0 -328
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/types.hpp +0 -58
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/uniform_bits_impl.hpp +0 -51
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/uniform_impl.hpp +0 -287
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/vm_wrappers.hpp +0 -183
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/distributions.hpp +0 -700
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/engine_helpers.hpp +0 -116
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/engines.hpp +0 -187
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/functions.hpp +0 -59
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/types.hpp +0 -79
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device.hpp +0 -29
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/distributions.hpp +0 -1913
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/engines.hpp +0 -788
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/functions.hpp +0 -163
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/spec.hpp +0 -42
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng.hpp +0 -23
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/spblas/sparse_auxiliary.hpp +0 -111
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/spblas/sparse_operations.hpp +0 -446
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/spblas/sparse_structures.hpp +0 -193
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/spblas/spec.hpp +0 -42
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/spblas.hpp +0 -33
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/spec.hpp +0 -42
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/stats/spec.hpp +0 -42
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/stats.hpp +0 -357
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/types.hpp +0 -321
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/vm/buffer.hpp +0 -3529
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/vm/decls.hpp +0 -280
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/vm/device/detail/decls.hpp +0 -81
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/vm/device/detail/dispatch.hpp +0 -1059
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/vm/device/detail/ep.hpp +0 -861
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/vm/device/detail/ha.hpp +0 -860
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/vm/device/detail/la.hpp +0 -860
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/vm/device/detail/rts.hpp +0 -4608
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/vm/device/detail/scalar.hpp +0 -8963
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/vm/device/vm.hpp +0 -460
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/vm/span.hpp +0 -3813
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/vm/spec.hpp +0 -42
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/vm/usm.hpp +0 -3581
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/vm.hpp +0 -31
- mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl.hpp +0 -35
- mkl_devel_dpcpp-2025.1.0.data/data/Library/lib/mkl_sycl_dft_dll.lib +0 -0
- mkl_devel_dpcpp-2025.1.0.data/data/Library/lib/mkl_sycl_lapack_dll.lib +0 -0
- mkl_devel_dpcpp-2025.1.0.data/data/Library/lib/mkl_sycl_sparse_dll.lib +0 -0
- mkl_devel_dpcpp-2025.1.0.dist-info/RECORD +0 -99
- {mkl_devel_dpcpp-2025.1.0.data → mkl_devel_dpcpp-2025.2.0.data}/data/Library/lib/mkl_sycl_blas_dll.lib +0 -0
- {mkl_devel_dpcpp-2025.1.0.data → mkl_devel_dpcpp-2025.2.0.data}/data/Library/lib/mkl_sycl_data_fitting_dll.lib +0 -0
- {mkl_devel_dpcpp-2025.1.0.data → mkl_devel_dpcpp-2025.2.0.data}/data/Library/lib/mkl_sycl_stats_dll.lib +0 -0
- {mkl_devel_dpcpp-2025.1.0.data → mkl_devel_dpcpp-2025.2.0.data}/data/Library/lib/mkl_sycl_vm_dll.lib +0 -0
- {mkl_devel_dpcpp-2025.1.0.dist-info → mkl_devel_dpcpp-2025.2.0.dist-info}/LICENSE.txt +0 -0
- {mkl_devel_dpcpp-2025.1.0.dist-info → mkl_devel_dpcpp-2025.2.0.dist-info}/WHEEL +0 -0
- {mkl_devel_dpcpp-2025.1.0.dist-info → mkl_devel_dpcpp-2025.2.0.dist-info}/top_level.txt +0 -0
mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/mcg31m1_impl.hpp
DELETED
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
/*******************************************************************************
|
|
2
|
-
* Copyright (C) 2021 Intel Corporation
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing,
|
|
11
|
-
* software distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions
|
|
14
|
-
* and limitations under the License.
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
18
|
-
*******************************************************************************/
|
|
19
|
-
|
|
20
|
-
#ifndef _MKL_RNG_DEVICE_MCG31M1_IMPL_HPP_
|
|
21
|
-
#define _MKL_RNG_DEVICE_MCG31M1_IMPL_HPP_
|
|
22
|
-
|
|
23
|
-
namespace oneapi::mkl::rng::device {
|
|
24
|
-
|
|
25
|
-
template <std::int32_t VecSize = 1>
|
|
26
|
-
class mcg31m1;
|
|
27
|
-
|
|
28
|
-
namespace detail {
|
|
29
|
-
|
|
30
|
-
template <std::uint64_t VecSize>
|
|
31
|
-
constexpr sycl::vec<std::uint64_t, VecSize> select_vector_a_mcg31m1() {
|
|
32
|
-
if constexpr (VecSize == 1)
|
|
33
|
-
return sycl::vec<std::uint64_t, 1>(UINT64_C(1));
|
|
34
|
-
else if constexpr (VecSize == 2)
|
|
35
|
-
return sycl::vec<std::uint64_t, 2>({ UINT64_C(1), UINT64_C(1132489760) });
|
|
36
|
-
else if constexpr (VecSize == 3)
|
|
37
|
-
return sycl::vec<std::uint64_t, 3>(
|
|
38
|
-
{ UINT64_C(1), UINT64_C(1132489760), UINT64_C(826537482) });
|
|
39
|
-
else if constexpr (VecSize == 4)
|
|
40
|
-
return sycl::vec<std::uint64_t, 4>(
|
|
41
|
-
{ UINT64_C(1), UINT64_C(1132489760), UINT64_C(826537482), UINT64_C(289798557) });
|
|
42
|
-
else if constexpr (VecSize == 8)
|
|
43
|
-
return sycl::vec<std::uint64_t, 8>({ UINT64_C(1), UINT64_C(1132489760), UINT64_C(826537482),
|
|
44
|
-
UINT64_C(289798557), UINT64_C(480863449),
|
|
45
|
-
UINT64_C(1381340036), UINT64_C(1582925527),
|
|
46
|
-
UINT64_C(1918178478) });
|
|
47
|
-
else
|
|
48
|
-
return sycl::vec<std::uint64_t, 16>(
|
|
49
|
-
{ UINT64_C(1), UINT64_C(1132489760), UINT64_C(826537482), UINT64_C(289798557),
|
|
50
|
-
UINT64_C(480863449), UINT64_C(1381340036), UINT64_C(1582925527), UINT64_C(1918178478),
|
|
51
|
-
UINT64_C(1286028348), UINT64_C(482167044), UINT64_C(262060616), UINT64_C(1856662125),
|
|
52
|
-
UINT64_C(839877947), UINT64_C(1997268203), UINT64_C(458714024),
|
|
53
|
-
UINT64_C(650347998) });
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
template <std::uint64_t VecSize>
|
|
57
|
-
struct mcg31m1_vector_a {
|
|
58
|
-
static constexpr sycl::vec<std::uint64_t, VecSize> vector_a =
|
|
59
|
-
select_vector_a_mcg31m1<VecSize>(); // powers of a
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
struct mcg31m1_param {
|
|
63
|
-
static constexpr std::uint32_t a = 1132489760;
|
|
64
|
-
static constexpr std::uint64_t m_64 = 0x000000007FFFFFFF; // 2^31 - 1
|
|
65
|
-
static constexpr double m_fl = 2147483647.0; // 2^31 - 1
|
|
66
|
-
static constexpr std::uint64_t bits = 31;
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
template <std::int32_t VecSize>
|
|
70
|
-
struct engine_state<oneapi::mkl::rng::device::mcg31m1<VecSize>> {
|
|
71
|
-
std::uint32_t s;
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
namespace mcg31m1_impl {
|
|
75
|
-
|
|
76
|
-
// Improved modulus x % (2^31 - 1) operation (possible to do for divisor (2^N
|
|
77
|
-
// -1), but MCG31M1 needs only 2^31 - 1) if we want to do x % (2^N -1) we can
|
|
78
|
-
// find out that: x = A + B * 2^N, where A = x % 2^N = x & 00..01..11 (binary)
|
|
79
|
-
// where quantity of 1 is N, B = x / 2^N = x >> N also x = A + B * (2^N - 1 + 1)
|
|
80
|
-
// = (A + B) + B * (2^N - 1), but (A + B) may be greater than (2^N - 1), that's
|
|
81
|
-
// why we put x1 = A + B = A' + B' * 2^N = ... until new (A + B) < (2^N - 1) for
|
|
82
|
-
// MCG31m1 N = 31
|
|
83
|
-
template <typename T>
|
|
84
|
-
static inline T custom_mod(std::uint64_t x) {
|
|
85
|
-
std::uint64_t b = x >> mcg31m1_param::bits;
|
|
86
|
-
std::uint64_t a = x & mcg31m1_param::m_64;
|
|
87
|
-
x = a + b;
|
|
88
|
-
b = x >> mcg31m1_param::bits;
|
|
89
|
-
a = x & mcg31m1_param::m_64;
|
|
90
|
-
return static_cast<T>(a + b);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
template <std::int32_t VecSize>
|
|
94
|
-
static inline sycl::vec<std::uint32_t, VecSize> custom_mod(
|
|
95
|
-
const sycl::vec<std::uint64_t, VecSize>& x) {
|
|
96
|
-
sycl::vec<std::uint64_t, VecSize> b = x >> mcg31m1_param::bits;
|
|
97
|
-
sycl::vec<std::uint64_t, VecSize> a = x & mcg31m1_param::m_64;
|
|
98
|
-
sycl::vec<std::uint64_t, VecSize> res = a + b;
|
|
99
|
-
b = res >> mcg31m1_param::bits;
|
|
100
|
-
a = res & mcg31m1_param::m_64;
|
|
101
|
-
res = a + b;
|
|
102
|
-
return res.template convert<std::uint32_t>();
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
static inline std::uint64_t power(std::uint64_t a, std::uint64_t n) {
|
|
106
|
-
std::uint64_t a2;
|
|
107
|
-
// initialize result by 1 for recurrence
|
|
108
|
-
std::uint32_t result = 1;
|
|
109
|
-
|
|
110
|
-
if (n == 0) {
|
|
111
|
-
// return (a^0)%m = 1
|
|
112
|
-
return std::uint64_t{ 1 };
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Recurrence loop
|
|
116
|
-
do {
|
|
117
|
-
// For each odd n
|
|
118
|
-
if (n & 1) {
|
|
119
|
-
a2 = static_cast<std::uint64_t>(result) * a;
|
|
120
|
-
result = custom_mod<std::uint32_t>(a2);
|
|
121
|
-
}
|
|
122
|
-
// n /= 2
|
|
123
|
-
n >>= 1;
|
|
124
|
-
|
|
125
|
-
a2 = a * a;
|
|
126
|
-
a = custom_mod<std::uint64_t>(a2);
|
|
127
|
-
} while (n);
|
|
128
|
-
|
|
129
|
-
return static_cast<std::uint64_t>(result);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
template <std::int32_t VecSize>
|
|
133
|
-
static inline void skip_ahead(engine_state<oneapi::mkl::rng::device::mcg31m1<VecSize>>& state,
|
|
134
|
-
std::uint64_t num_to_skip) {
|
|
135
|
-
std::uint64_t loc_A = power(static_cast<std::uint64_t>(mcg31m1_param::a), num_to_skip);
|
|
136
|
-
state.s = custom_mod<std::uint32_t>(loc_A * static_cast<std::uint64_t>(state.s));
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
template <std::int32_t VecSize>
|
|
140
|
-
static inline void init(engine_state<oneapi::mkl::rng::device::mcg31m1<VecSize>>& state,
|
|
141
|
-
std::uint32_t seed, std::uint64_t offset) {
|
|
142
|
-
state.s = custom_mod<std::uint32_t>(seed);
|
|
143
|
-
if (state.s == 0)
|
|
144
|
-
state.s = 1;
|
|
145
|
-
skip_ahead(state, offset);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
template <std::int32_t VecSize>
|
|
149
|
-
static inline sycl::vec<std::uint32_t, VecSize> generate(
|
|
150
|
-
engine_state<oneapi::mkl::rng::device::mcg31m1<VecSize>>& state) {
|
|
151
|
-
sycl::vec<std::uint64_t, VecSize> x(state.s);
|
|
152
|
-
sycl::vec<std::uint32_t, VecSize> res = custom_mod(mcg31m1_vector_a<VecSize>::vector_a * x);
|
|
153
|
-
state.s =
|
|
154
|
-
custom_mod<std::uint32_t>(mcg31m1_param::a * static_cast<std::uint64_t>(res[VecSize - 1]));
|
|
155
|
-
return res;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
template <std::int32_t VecSize>
|
|
159
|
-
static inline std::uint32_t generate_single(
|
|
160
|
-
engine_state<oneapi::mkl::rng::device::mcg31m1<VecSize>>& state) {
|
|
161
|
-
std::uint32_t x = state.s;
|
|
162
|
-
state.s = custom_mod<std::uint32_t>(mcg31m1_param::a * static_cast<std::uint64_t>(state.s));
|
|
163
|
-
return x;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
} // namespace mcg31m1_impl
|
|
167
|
-
|
|
168
|
-
template <std::int32_t VecSize>
|
|
169
|
-
class engine_base<oneapi::mkl::rng::device::mcg31m1<VecSize>> {
|
|
170
|
-
protected:
|
|
171
|
-
engine_base(std::uint32_t seed, std::uint64_t offset = 0) {
|
|
172
|
-
mcg31m1_impl::init(this->state_, seed, offset);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
template <typename RealType>
|
|
176
|
-
auto generate(RealType a, RealType b) ->
|
|
177
|
-
typename std::conditional<VecSize == 1, RealType, sycl::vec<RealType, VecSize>>::type {
|
|
178
|
-
sycl::vec<RealType, VecSize> res;
|
|
179
|
-
sycl::vec<std::uint32_t, VecSize> res_uint;
|
|
180
|
-
|
|
181
|
-
RealType c = (b - a) / static_cast<RealType>(mcg31m1_param::m_fl);
|
|
182
|
-
|
|
183
|
-
res_uint = mcg31m1_impl::generate(this->state_);
|
|
184
|
-
|
|
185
|
-
res = res_uint.template convert<RealType>() * c + a;
|
|
186
|
-
|
|
187
|
-
return res;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
auto generate() -> typename std::conditional<VecSize == 1, std::uint32_t,
|
|
191
|
-
sycl::vec<std::uint32_t, VecSize>>::type {
|
|
192
|
-
return mcg31m1_impl::generate(this->state_);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
template <typename RealType>
|
|
196
|
-
RealType generate_single(RealType a, RealType b) {
|
|
197
|
-
RealType res;
|
|
198
|
-
std::uint32_t res_uint;
|
|
199
|
-
|
|
200
|
-
RealType c = (b - a) / static_cast<RealType>(mcg31m1_param::m_fl);
|
|
201
|
-
|
|
202
|
-
res_uint = mcg31m1_impl::generate_single(this->state_);
|
|
203
|
-
|
|
204
|
-
res = static_cast<RealType>(res_uint) * c + a;
|
|
205
|
-
return res;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
std::uint32_t generate_single() {
|
|
209
|
-
return mcg31m1_impl::generate_single(this->state_);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
void skip_ahead(std::uint64_t num_to_skip) {
|
|
213
|
-
detail::mcg31m1_impl::skip_ahead(this->state_, num_to_skip);
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
engine_state<oneapi::mkl::rng::device::mcg31m1<VecSize>> state_;
|
|
217
|
-
};
|
|
218
|
-
|
|
219
|
-
} // namespace detail
|
|
220
|
-
|
|
221
|
-
} // namespace oneapi::mkl::rng::device
|
|
222
|
-
|
|
223
|
-
#endif // _MKL_RNG_DEVICE_MCG31M1_IMPL_HPP_
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
/*******************************************************************************
|
|
2
|
-
* Copyright (C) 2023 Intel Corporation
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing,
|
|
11
|
-
* software distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions
|
|
14
|
-
* and limitations under the License.
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
18
|
-
*******************************************************************************/
|
|
19
|
-
|
|
20
|
-
#ifndef _MKL_RNG_DEVICE_MCG59_HELPERS_IMPL_HPP_
|
|
21
|
-
#define _MKL_RNG_DEVICE_MCG59_HELPERS_IMPL_HPP_
|
|
22
|
-
|
|
23
|
-
#include "oneapi/mkl/rng/device/detail/mcg59_impl.hpp"
|
|
24
|
-
|
|
25
|
-
namespace oneapi::mkl::rng::device::detail {
|
|
26
|
-
namespace mcg59_impl {
|
|
27
|
-
|
|
28
|
-
template <std::int32_t VecSize>
|
|
29
|
-
static inline void init(
|
|
30
|
-
engine_state<oneapi::mkl::rng::device::mcg59<VecSize>> &state, std::size_t id,
|
|
31
|
-
const sycl::accessor<std::uint32_t, 1, sycl::access::mode::read_write> &accessor) {
|
|
32
|
-
std::size_t num_elements_acc =
|
|
33
|
-
sizeof(engine_state<oneapi::mkl::rng::device::mcg59<VecSize>>) / sizeof(std::uint32_t);
|
|
34
|
-
state.s = *(reinterpret_cast<std::uint64_t *>(&accessor[id * num_elements_acc]));
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
template <std::int32_t VecSize>
|
|
38
|
-
static inline void store(
|
|
39
|
-
engine_state<oneapi::mkl::rng::device::mcg59<VecSize>> &state, std::size_t id,
|
|
40
|
-
const sycl::accessor<std::uint32_t, 1, sycl::access::mode::read_write> &accessor) {
|
|
41
|
-
std::size_t num_elements_acc =
|
|
42
|
-
sizeof(engine_state<oneapi::mkl::rng::device::mcg59<VecSize>>) / sizeof(std::uint32_t);
|
|
43
|
-
accessor[id * num_elements_acc] = reinterpret_cast<std::uint32_t *>(&state.s)[0];
|
|
44
|
-
accessor[id * num_elements_acc + 1] = reinterpret_cast<std::uint32_t *>(&state.s)[1];
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
} // namespace mcg59_impl
|
|
48
|
-
|
|
49
|
-
template <std::int32_t VecSize>
|
|
50
|
-
class engine_accessor_base<oneapi::mkl::rng::device::mcg59<VecSize>> {
|
|
51
|
-
public:
|
|
52
|
-
engine_accessor_base(sycl::buffer<std::uint32_t, 1> &state_buf, sycl::handler &cgh)
|
|
53
|
-
: states_accessor_(state_buf, cgh) {}
|
|
54
|
-
|
|
55
|
-
oneapi::mkl::rng::device::mcg59<VecSize> load(std::size_t id) const {
|
|
56
|
-
oneapi::mkl::rng::device::mcg59<VecSize> engine;
|
|
57
|
-
mcg59_impl::init(engine.state_, id, states_accessor_);
|
|
58
|
-
return engine;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
void store(oneapi::mkl::rng::device::mcg59<VecSize> &engine, std::size_t id) const {
|
|
62
|
-
mcg59_impl::store(engine.state_, id, states_accessor_);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
protected:
|
|
66
|
-
sycl::accessor<std::uint32_t, 1, sycl::access::mode::read_write> states_accessor_;
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
template <std::int32_t VecSize>
|
|
70
|
-
class engine_descriptor_base<oneapi::mkl::rng::device::mcg59<VecSize>> {
|
|
71
|
-
public:
|
|
72
|
-
using engine_type = oneapi::mkl::rng::device::mcg59<VecSize>;
|
|
73
|
-
|
|
74
|
-
using accessor_type =
|
|
75
|
-
oneapi::mkl::rng::device::engine_accessor<oneapi::mkl::rng::device::mcg59<VecSize>>;
|
|
76
|
-
|
|
77
|
-
engine_descriptor_base(sycl::queue &queue, sycl::range<1> range, std::uint64_t seed,
|
|
78
|
-
std::uint64_t offset)
|
|
79
|
-
: states_buffer_(range.get(0) * sizeof(engine_state<engine_type>) /
|
|
80
|
-
sizeof(std::uint32_t)) {
|
|
81
|
-
queue.submit([&](sycl::handler &cgh) {
|
|
82
|
-
accessor_type states_accessor(states_buffer_, cgh);
|
|
83
|
-
|
|
84
|
-
cgh.parallel_for<class init_kernel<engine_type>>
|
|
85
|
-
(range, [=](sycl::item<1> item) {
|
|
86
|
-
std::size_t id = item.get_id(0);
|
|
87
|
-
oneapi::mkl::rng::device::mcg59<VecSize> engine(seed, offset *id);
|
|
88
|
-
states_accessor.store(engine, id);
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
template <typename InitEngineFunc>
|
|
94
|
-
engine_descriptor_base(sycl::queue &queue, sycl::range<1> range, InitEngineFunc func)
|
|
95
|
-
: states_buffer_(range.get(0) * sizeof(engine_state<engine_type>) /
|
|
96
|
-
sizeof(std::uint32_t)) {
|
|
97
|
-
queue.submit([&](sycl::handler &cgh) {
|
|
98
|
-
accessor_type states_accessor(states_buffer_, cgh);
|
|
99
|
-
|
|
100
|
-
cgh.parallel_for<class init_kernel_ex<engine_type>>
|
|
101
|
-
(range, [=](sycl::item<1> item) {
|
|
102
|
-
std::size_t id = item.get_id(0);
|
|
103
|
-
states_accessor.store(func(item), id);
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
accessor_type get_access(sycl::handler &cgh) {
|
|
109
|
-
return accessor_type{ states_buffer_, cgh };
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
protected:
|
|
113
|
-
sycl::buffer<std::uint32_t, 1> states_buffer_;
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
} // namespace oneapi::mkl::rng::device::detail
|
|
117
|
-
|
|
118
|
-
#endif // _MKL_RNG_DEVICE_MCG59_HELPERS_IMPL_HPP_
|
mkl_devel_dpcpp-2025.1.0.data/data/Library/include/oneapi/mkl/rng/device/detail/mcg59_impl.hpp
DELETED
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
/*******************************************************************************
|
|
2
|
-
* Copyright (C) 2021 Intel Corporation
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing,
|
|
11
|
-
* software distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions
|
|
14
|
-
* and limitations under the License.
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
18
|
-
*******************************************************************************/
|
|
19
|
-
|
|
20
|
-
#ifndef _MKL_RNG_DEVICE_MCG59_IMPL_HPP_
|
|
21
|
-
#define _MKL_RNG_DEVICE_MCG59_IMPL_HPP_
|
|
22
|
-
|
|
23
|
-
namespace oneapi::mkl::rng::device {
|
|
24
|
-
|
|
25
|
-
template <std::int32_t VecSize = 1>
|
|
26
|
-
class mcg59;
|
|
27
|
-
|
|
28
|
-
namespace detail {
|
|
29
|
-
|
|
30
|
-
template <std::uint32_t VecSize>
|
|
31
|
-
constexpr sycl::vec<uint64_t, VecSize> select_vector_a_mcg59() {
|
|
32
|
-
if constexpr (VecSize == 1)
|
|
33
|
-
return sycl::vec<uint64_t, 1>(UINT64_C(1));
|
|
34
|
-
else if constexpr (VecSize == 2)
|
|
35
|
-
return sycl::vec<uint64_t, 2>({ UINT64_C(1), UINT64_C(0x113769B23C5FD) });
|
|
36
|
-
else if constexpr (VecSize == 3)
|
|
37
|
-
return sycl::vec<uint64_t, 3>(
|
|
38
|
-
{ UINT64_C(1), UINT64_C(0x113769B23C5FD), UINT64_C(0x65C69FC1A4D5C09) });
|
|
39
|
-
else if constexpr (VecSize == 4)
|
|
40
|
-
return sycl::vec<uint64_t, 4>({ UINT64_C(1), UINT64_C(0x113769B23C5FD),
|
|
41
|
-
UINT64_C(0x65C69FC1A4D5C09), UINT64_C(0x1CE44D68E81E1E5) });
|
|
42
|
-
else if constexpr (VecSize == 8)
|
|
43
|
-
return sycl::vec<uint64_t, 8>({ UINT64_C(1), UINT64_C(0x113769B23C5FD),
|
|
44
|
-
UINT64_C(0x65C69FC1A4D5C09), UINT64_C(0x1CE44D68E81E1E5),
|
|
45
|
-
UINT64_C(0x2F861CA52807851), UINT64_C(0x1CCDF2FE3A03D0D),
|
|
46
|
-
UINT64_C(0x707AB5B7C1E56D9), UINT64_C(0x6139AE457BD175) });
|
|
47
|
-
else
|
|
48
|
-
return sycl::vec<uint64_t, 16>(
|
|
49
|
-
{ UINT64_C(1), UINT64_C(0x113769B23C5FD), UINT64_C(0x65C69FC1A4D5C09),
|
|
50
|
-
UINT64_C(0x1CE44D68E81E1E5), UINT64_C(0x2F861CA52807851), UINT64_C(0x1CCDF2FE3A03D0D),
|
|
51
|
-
UINT64_C(0x707AB5B7C1E56D9), UINT64_C(0x6139AE457BD175), UINT64_C(0x171CF606D8C09A1),
|
|
52
|
-
UINT64_C(0x3764DC8D2D1691D), UINT64_C(0x50A1576CCF32A9), UINT64_C(0x499F3083ADC1E05),
|
|
53
|
-
UINT64_C(0x7A30C00B05283F1), UINT64_C(0x4FE299EB607DA2D), UINT64_C(0x51CCFD803CE3F79),
|
|
54
|
-
UINT64_C(0x58145D06A37D795) });
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
template <std::uint32_t VecSize>
|
|
58
|
-
struct mcg59_vector_a {
|
|
59
|
-
static constexpr sycl::vec<std::uint64_t, VecSize> vector_a =
|
|
60
|
-
select_vector_a_mcg59<VecSize>(); // powers of a
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
struct mcg59_param {
|
|
64
|
-
static constexpr uint64_t a = 0x113769B23C5FD; // 13^13
|
|
65
|
-
static constexpr uint64_t m_64 = 0x7FFFFFFFFFFFFFF; // 2^59 - 1
|
|
66
|
-
static constexpr float m_fl = 576460752303423488.0f; // 2^59
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
template <std::int32_t VecSize>
|
|
70
|
-
struct engine_state<oneapi::mkl::rng::device::mcg59<VecSize>> {
|
|
71
|
-
std::uint64_t s;
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
namespace mcg59_impl {
|
|
75
|
-
|
|
76
|
-
template <typename T>
|
|
77
|
-
static inline T custom_mod(T x) {
|
|
78
|
-
return (x & mcg59_param::m_64);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
static inline std::uint64_t power(std::uint64_t a, std::uint64_t n) {
|
|
82
|
-
// initialize result by 1 for recurrency
|
|
83
|
-
std::uint64_t result = 1;
|
|
84
|
-
if (n == 0) {
|
|
85
|
-
// return (a^0)%m = 1
|
|
86
|
-
return 1;
|
|
87
|
-
}
|
|
88
|
-
do {
|
|
89
|
-
// For each odd n
|
|
90
|
-
if (n & 1) {
|
|
91
|
-
result = custom_mod(result * a);
|
|
92
|
-
}
|
|
93
|
-
// n := n/2
|
|
94
|
-
n >>= 1;
|
|
95
|
-
a = custom_mod(a * a);
|
|
96
|
-
} while (n);
|
|
97
|
-
|
|
98
|
-
return result;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
template <std::int32_t VecSize>
|
|
102
|
-
static inline void skip_ahead(engine_state<oneapi::mkl::rng::device::mcg59<VecSize>>& state,
|
|
103
|
-
std::uint64_t num_to_skip) {
|
|
104
|
-
std::uint64_t loc_A = power(mcg59_param::a, num_to_skip);
|
|
105
|
-
state.s = custom_mod(loc_A * state.s);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
template <std::int32_t VecSize>
|
|
109
|
-
static inline void init(engine_state<oneapi::mkl::rng::device::mcg59<VecSize>>& state,
|
|
110
|
-
std::uint64_t seed, std::uint64_t offset) {
|
|
111
|
-
state.s = seed & mcg59_param::m_64;
|
|
112
|
-
if (state.s == 0)
|
|
113
|
-
state.s = 1;
|
|
114
|
-
|
|
115
|
-
skip_ahead(state, offset);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
template <std::int32_t VecSize>
|
|
119
|
-
static inline sycl::vec<std::uint64_t, VecSize> generate(
|
|
120
|
-
engine_state<oneapi::mkl::rng::device::mcg59<VecSize>>& state) {
|
|
121
|
-
sycl::vec<std::uint64_t, VecSize> res(state.s);
|
|
122
|
-
res = custom_mod(mcg59_vector_a<VecSize>::vector_a * res);
|
|
123
|
-
state.s = custom_mod(mcg59_param::a * res[VecSize - 1]);
|
|
124
|
-
return res;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
template <std::int32_t VecSize>
|
|
128
|
-
static inline std::uint64_t generate_single(
|
|
129
|
-
engine_state<oneapi::mkl::rng::device::mcg59<VecSize>>& state) {
|
|
130
|
-
std::uint64_t x = state.s;
|
|
131
|
-
state.s = custom_mod(mcg59_param::a * x);
|
|
132
|
-
return x;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
} // namespace mcg59_impl
|
|
136
|
-
|
|
137
|
-
template <std::int32_t VecSize>
|
|
138
|
-
class engine_base<oneapi::mkl::rng::device::mcg59<VecSize>> {
|
|
139
|
-
protected:
|
|
140
|
-
engine_base(std::uint64_t seed, std::uint64_t offset = 0) {
|
|
141
|
-
mcg59_impl::init(this->state_, seed, offset);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
template <typename RealType>
|
|
145
|
-
auto generate(RealType a, RealType b) ->
|
|
146
|
-
typename std::conditional<VecSize == 1, RealType, sycl::vec<RealType, VecSize>>::type {
|
|
147
|
-
sycl::vec<RealType, VecSize> res;
|
|
148
|
-
|
|
149
|
-
RealType c = (b - a) / static_cast<RealType>(mcg59_param::m_fl);
|
|
150
|
-
sycl::vec<std::uint64_t, VecSize> res_uint = mcg59_impl::generate(this->state_);
|
|
151
|
-
|
|
152
|
-
res = res_uint.template convert<RealType>() * c + a;
|
|
153
|
-
|
|
154
|
-
return res;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
auto generate() -> typename std::conditional<VecSize == 1, std::uint32_t,
|
|
158
|
-
sycl::vec<std::uint32_t, VecSize>>::type {
|
|
159
|
-
return mcg59_impl::generate(this->state_).template convert<std::uint32_t>();
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
auto generate_bits() -> typename std::conditional<VecSize == 1, std::uint64_t,
|
|
163
|
-
sycl::vec<std::uint64_t, VecSize>>::type {
|
|
164
|
-
return mcg59_impl::generate(this->state_);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
template <typename UIntType>
|
|
168
|
-
auto generate_uniform_bits() ->
|
|
169
|
-
typename std::conditional<VecSize == 1, UIntType, sycl::vec<UIntType, VecSize>>::type {
|
|
170
|
-
if constexpr (std::is_same<UIntType, std::uint32_t>::value) {
|
|
171
|
-
auto uni_res = mcg59_impl::generate(this->state_);
|
|
172
|
-
|
|
173
|
-
if constexpr (VecSize == 1) {
|
|
174
|
-
return static_cast<std::uint32_t>(uni_res[0] >> 27);
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
sycl::vec<std::uint32_t, VecSize> vec_out;
|
|
178
|
-
|
|
179
|
-
for (std::int32_t i = 0; i < VecSize; i++) {
|
|
180
|
-
vec_out[i] = static_cast<std::uint32_t>(uni_res[i] >> 27);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
return vec_out;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
auto uni_res1 = mcg59_impl::generate(this->state_);
|
|
188
|
-
auto uni_res2 = mcg59_impl::generate(this->state_);
|
|
189
|
-
|
|
190
|
-
if constexpr (VecSize == 1) {
|
|
191
|
-
uni_res1 >>= UIntType(27);
|
|
192
|
-
uni_res2 >>= UIntType(27);
|
|
193
|
-
|
|
194
|
-
return (uni_res2 << UIntType(32)) + uni_res1;
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
sycl::vec<std::uint64_t, VecSize> vec_out;
|
|
198
|
-
|
|
199
|
-
for (int i = 0; i < VecSize; i++) {
|
|
200
|
-
uni_res1[i] >>= 27;
|
|
201
|
-
uni_res2[i] >>= 27;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
if constexpr (VecSize != 3) {
|
|
205
|
-
for (int i = 0; i < VecSize / 2; i++) {
|
|
206
|
-
vec_out[i] = (uni_res1[2 * i + 1] << 32) + uni_res1[2 * i];
|
|
207
|
-
vec_out[i + VecSize / 2] = (uni_res2[2 * i + 1] << 32) + uni_res2[2 * i];
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
vec_out[0] = (uni_res1[1] << 32) + uni_res1[0];
|
|
212
|
-
vec_out[1] = (uni_res2[0] << 32) + uni_res1[2];
|
|
213
|
-
vec_out[2] = (uni_res2[2] << 32) + uni_res2[1];
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
return vec_out;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
template <typename RealType>
|
|
222
|
-
RealType generate_single(RealType a, RealType b) {
|
|
223
|
-
RealType res;
|
|
224
|
-
std::uint64_t res_uint;
|
|
225
|
-
|
|
226
|
-
RealType c = (b - a) / static_cast<RealType>(mcg59_param::m_fl);
|
|
227
|
-
|
|
228
|
-
res_uint = mcg59_impl::generate_single(this->state_);
|
|
229
|
-
res = static_cast<RealType>(res_uint) * c + a;
|
|
230
|
-
|
|
231
|
-
return res;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
auto generate_single() {
|
|
235
|
-
return mcg59_impl::generate_single(this->state_);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
template <typename UIntType>
|
|
239
|
-
auto generate_single_uniform_bits() {
|
|
240
|
-
if constexpr (std::is_same<UIntType, std::uint32_t>::value) {
|
|
241
|
-
auto uni_res = mcg59_impl::generate_single(this->state_) >> 27;
|
|
242
|
-
|
|
243
|
-
return static_cast<std::uint32_t>(uni_res);
|
|
244
|
-
}
|
|
245
|
-
else {
|
|
246
|
-
auto uni_res1 = mcg59_impl::generate_single(this->state_);
|
|
247
|
-
auto uni_res2 = mcg59_impl::generate_single(this->state_);
|
|
248
|
-
|
|
249
|
-
uni_res1 >>= 27;
|
|
250
|
-
uni_res2 >>= 27;
|
|
251
|
-
|
|
252
|
-
return (uni_res2 << 32) + uni_res1;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
void skip_ahead(std::uint64_t num_to_skip) {
|
|
257
|
-
detail::mcg59_impl::skip_ahead(this->state_, num_to_skip);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
engine_state<oneapi::mkl::rng::device::mcg59<VecSize>> state_;
|
|
261
|
-
};
|
|
262
|
-
|
|
263
|
-
} // namespace detail
|
|
264
|
-
} // namespace oneapi::mkl::rng::device
|
|
265
|
-
|
|
266
|
-
#endif // _MKL_RNG_DEVICE_MCG59_IMPL_HPP_
|