1#include "CudaVecRandom.h"
2#include "ThreadArray.h"
18 void _linearScale(
float* a,
float c,
float s,
int n)
20 int nThreads = blockDim.x * gridDim.x;
21 int startID = blockIdx.x * blockDim.x + threadIdx.x;
22 for (
int i = startID; i < n; i +=
nThreads) {
31 void _linearScale(
double* a,
double c,
double s,
int n)
33 int nThreads = blockDim.x * gridDim.x;
34 int startID = blockIdx.x * blockDim.x + threadIdx.x;
35 for (
int i = startID; i < n; i +=
nThreads) {
45 const int n = a.capacity();
52 _linearScale<<<nBlocks, nThreads>>>(a.cArray(), c, s, n);
60 const int n = a.capacity();
67 _linearScale<<<nBlocks, nThreads>>>(a.cArray(), c, s, n);
83 curandStatus_t status;
84 status = curandCreateGenerator(&gen_, CURAND_RNG_PSEUDO_DEFAULT);
103 gettimeofday(&time, NULL);
104 seed_ = time.tv_sec + 1123*time.tv_usec;
108 curandStatus_t status;
109 status = curandSetPseudoRandomGeneratorSeed(gen_, seed_);
112 isInitialized_ =
true;
122 if (!isInitialized_) {
126 curandStatus_t status;
127 status = curandGenerateUniform(gen_, data.
cArray(), n);
138 if (!isInitialized_) {
142 curandStatus_t status;
143 status = curandGenerateUniformDouble(gen_, data.
cArray(), n);
151 float min,
float max)
155 linearScale(data, max - min, min);
162 double min,
double max)
166 linearScale(data, max - min, min);
173 float stddev,
float mean)
176 if (!isInitialized_) {
182 UTIL_THROW(
"normal() requires array size to be an even number.");
185 curandStatus_t status;
186 status = curandGenerateNormal(gen_, data.
cArray(), n, mean, stddev);
194 double stddev,
double mean)
197 if (!isInitialized_) {
203 UTIL_THROW(
"normal() requires array size to be an even number.");
206 curandStatus_t status;
207 status = curandGenerateNormalDouble(gen_, data.
cArray(),
217 void CudaVecRandom::errorCheck(curandStatus_t
const & error)
219 if (error == CURAND_STATUS_SUCCESS) {
222 std::string errString;
226 errString =
"UNKNOWN";
228 case CURAND_STATUS_VERSION_MISMATCH:
229 errString =
"CURAND_STATUS_VERSION_MISMATCH";
231 case CURAND_STATUS_NOT_INITIALIZED:
232 errString =
"CURAND_STATUS_NOT_INITIALIZED";
234 case CURAND_STATUS_ALLOCATION_FAILED:
235 errString =
"CURAND_STATUS_ALLOCATION_FAILED";
237 case CURAND_STATUS_TYPE_ERROR:
238 errString =
"CURAND_STATUS_TYPE_ERROR";
240 case CURAND_STATUS_OUT_OF_RANGE:
241 errString =
"CURAND_STATUS_OUT_OF_RANGE";
243 case CURAND_STATUS_LENGTH_NOT_MULTIPLE:
244 errString =
"CURAND_STATUS_LENGTH_NOT_MULTIPLE";
246 case CURAND_STATUS_DOUBLE_PRECISION_REQUIRED:
247 errString =
"CURAND_STATUS_DOUBLE_PRECISION_REQUIRED";
249 case CURAND_STATUS_LAUNCH_FAILURE:
250 errString =
"CURAND_STATUS_LAUNCH_FAILURE";
252 case CURAND_STATUS_PREEXISTING_FAILURE:
253 errString =
"CURAND_STATUS_PREEXISTING_FAILURE";
255 case CURAND_STATUS_INITIALIZATION_FAILED:
256 errString =
"CURAND_STATUS_INITIALIZATION_FAILED";
258 case CURAND_STATUS_INTERNAL_ERROR:
259 errString =
"CURAND_STATUS_INTERNAL_ERROR";
261 case CURAND_STATUS_ARCH_MISMATCH:
262 errString =
"CURAND_STATUS_ARCH_MISMATCH";
266 Log::file() <<
"CudaVecRandom error: " << errString << std::endl;
267 UTIL_THROW(
"CudaVecRandom number generation failed.");
long seed()
Returns value of random seed (private member variable seed_).
void setSeed(unsigned long long seed)
Set value of random seed (private member variable seed_).
virtual ~CudaVecRandom()
Destructor.
void uniform(DeviceArray< float > &data)
Populate array with uniform random floats in (0, 1].
CudaVecRandom()
Constructor.
void normal(DeviceArray< float > &data, float stddev, float mean=0.0)
Populate array on device with normal-distributed random floats.
Dynamic array on the GPU device with aligned data.
int capacity() const
Return array capacity.
Data * cArray()
Return pointer to underlying C array.
static std::ostream & file()
Get log ostream by reference.
File containing preprocessor macros for error handling.
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
#define UTIL_THROW(msg)
Macro for throwing an Exception, reporting function, file and line number.
void setThreadsLogical(int nThreadsLogical)
Given total number of threads, set 1D execution configuration.
int nThreads()
Get the number of threads per block for execution.
int nBlocks()
Get the current number of blocks for execution.
PSCF package top-level namespace.