File indexing completed on 2026-04-10 07:49:41
0001 #pragma once
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056 #if defined(__CUDACC__) || defined(__CUDABE__)
0057 #define QRNG_METHOD __device__
0058 #else
0059 #define QRNG_METHOD
0060 #endif
0061
0062 #include "srng.h"
0063
0064 using ULL = unsigned long long ;
0065
0066 template<typename T> struct qrng {} ;
0067
0068 template<>
0069 struct qrng<XORWOW>
0070 {
0071 ULL seed ;
0072 ULL offset ;
0073 ULL skipahead_event_offset ;
0074
0075
0076 #if defined(__CUDACC__) || defined(__CUDABE__)
0077 XORWOW* uploaded_states ;
0078 #else
0079 void* uploaded_states ;
0080 #endif
0081
0082
0083 #if defined(__CUDACC__) || defined(__CUDABE__)
0084 QRNG_METHOD void init(XORWOW& rng, unsigned long long event_idx, unsigned long long photon_idx )
0085 {
0086 rng = uploaded_states[photon_idx] ;
0087 ULL skipahead_ = skipahead_event_offset*event_idx ;
0088 skipahead( skipahead_, &rng );
0089 }
0090 #else
0091 qrng(ULL seed_, ULL offset_, ULL skipahead_event_offset_ )
0092 :
0093 seed(seed_),
0094 offset(offset_),
0095 skipahead_event_offset(skipahead_event_offset_),
0096 uploaded_states(nullptr)
0097 {
0098 }
0099
0100 void set_uploaded_states( void* uploaded_states_ )
0101 {
0102 uploaded_states = uploaded_states_ ;
0103 }
0104
0105 #endif
0106 };
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123 template<>
0124 struct qrng<Philox>
0125 {
0126 ULL seed ;
0127 ULL offset ;
0128 ULL skipahead_event_offset ;
0129
0130 #if defined(__CUDACC__) || defined(__CUDABE__)
0131 QRNG_METHOD void init(Philox& rng, unsigned long long event_idx, unsigned long long photon_idx )
0132 {
0133 ULL subsequence_ = photon_idx ;
0134 curand_init( seed, subsequence_, offset, &rng ) ;
0135 ULL skipahead_ = skipahead_event_offset*event_idx ;
0136 skipahead( skipahead_, &rng );
0137 }
0138 #else
0139 qrng(ULL seed_, ULL offset_, ULL skipahead_event_offset_ )
0140 :
0141 seed(seed_),
0142 offset(offset_),
0143 skipahead_event_offset(skipahead_event_offset_)
0144 {
0145 }
0146 void set_uploaded_states( void* ){}
0147 #endif
0148 };
0149
0150
0151 #ifdef RNG_PHILITEOX
0152 template<>
0153 struct qrng<PhiloxLite>
0154 {
0155 ULL seed ;
0156 ULL offset ;
0157 ULL skipahead_event_offset ;
0158
0159 #if defined(__CUDACC__) || defined(__CUDABE__)
0160 QRNG_METHOD void init(PhiloxLite& rng, unsigned long long event_idx, unsigned long long photon_idx )
0161 {
0162 ULL subsequence_ = photon_idx ;
0163 curand_init( seed, subsequence_, offset, &rng ) ;
0164 ULL skipahead_ = skipahead_event_offset*event_idx ;
0165 skipahead( skipahead_, &rng );
0166 }
0167 #else
0168 qrng(ULL seed_, ULL offset_, ULL skipahead_event_offset_ )
0169 :
0170 seed(seed_),
0171 offset(offset_),
0172 skipahead_event_offset(skipahead_event_offset_)
0173 {
0174 }
0175 void set_uploaded_states( void* ){}
0176 #endif
0177 };
0178 #endif
0179
0180