add function to generate list of random numbers with cuda and opencl on the device
This commit is contained in:
@ -7,21 +7,13 @@ cl_device_id OpenCLBase::m_device_id = NULL;
|
||||
cl_event OpenCLBase::m_last_event = NULL;
|
||||
|
||||
OpenCLBase::OpenCLBase() {
|
||||
//m_context = NULL;
|
||||
//m_command_queue = NULL;
|
||||
m_program = NULL;
|
||||
m_kernel = NULL;
|
||||
//m_device_id = NULL;
|
||||
//m_platform_id = NULL;
|
||||
m_kernel_file = NULL;
|
||||
|
||||
m_last_event = NULL;
|
||||
|
||||
//m_events = new cl_event[500];
|
||||
//m_num_events = 0;
|
||||
|
||||
defaultRndSet = 0;
|
||||
|
||||
}
|
||||
|
||||
OpenCLBase::~OpenCLBase() {
|
||||
@ -41,11 +33,11 @@ int OpenCLBase::ocl_createRndStates(int size) {
|
||||
strcat(kernel_file, "OpenCL/OpenCLKernels/OpenCLCollimatorPhysics.cl");
|
||||
ocl_loadKernel(kernel_file);
|
||||
delete[] kernel_file;
|
||||
|
||||
|
||||
//allocate memory for rand states
|
||||
int ierr;
|
||||
defaultRndState = ocl_allocateMemory(sizeof(RNDState)*size, ierr);
|
||||
|
||||
|
||||
//exec kernel
|
||||
int seed = 0;
|
||||
ocl_createKernel("initRand");
|
||||
@ -55,13 +47,34 @@ int OpenCLBase::ocl_createRndStates(int size) {
|
||||
|
||||
size_t work_items = size;
|
||||
size_t work_group_size = 1;
|
||||
|
||||
ocl_executeKernel(1, &work_items, &work_group_size);
|
||||
|
||||
defaultRndSet = 1;
|
||||
|
||||
return DKS_SUCCESS;
|
||||
}
|
||||
|
||||
return OCL_SUCCESS;
|
||||
int OpenCLBase::ocl_createRandomNumbers(void *mem_ptr, int size) {
|
||||
//load kernel
|
||||
char * kernel_file = new char[500];
|
||||
kernel_file[0] = '\0';
|
||||
strcat(kernel_file, OPENCL_KERNELS);
|
||||
strcat(kernel_file, "OpenCL/OpenCLKernels/OpenCLCollimatorPhysics.cl");
|
||||
ocl_loadKernel(kernel_file);
|
||||
delete[] kernel_file;
|
||||
|
||||
//set kernel variables
|
||||
cl_mem tmp_data = (cl_mem) mem_ptr;
|
||||
|
||||
ocl_createKernel("createRandoms");
|
||||
ocl_setKernelArg(0, sizeof(cl_mem), &defaultRndState);
|
||||
ocl_setKernelArg(1, sizeof(cl_mem), &tmp_data);
|
||||
ocl_setKernelArg(2, sizeof(int), &size);
|
||||
|
||||
size_t work_size = 128;
|
||||
size_t work_items = (size % work_size + 1) * work_size;
|
||||
ocl_executeKernel(1, &work_items, &work_size);
|
||||
|
||||
return DKS_SUCCESS;
|
||||
}
|
||||
|
||||
/* destroy rnd states */
|
||||
@ -70,7 +83,7 @@ int OpenCLBase::ocl_deleteRndStates() {
|
||||
ocl_freeMemory(defaultRndState);
|
||||
defaultRndSet = 0;
|
||||
|
||||
return OCL_SUCCESS;
|
||||
return DKS_SUCCESS;
|
||||
|
||||
}
|
||||
|
||||
|
@ -30,11 +30,20 @@
|
||||
#include <CL/cl_ext.h>
|
||||
#endif
|
||||
|
||||
#include "clRNG/clRNG.h"
|
||||
#include "clRNG/mrg31k3p.h"
|
||||
|
||||
#include "../DKSDefinitions.h"
|
||||
|
||||
/* struct for random number state */
|
||||
typedef struct {
|
||||
double s10;
|
||||
double s11;
|
||||
double s12;
|
||||
double s20;
|
||||
double s21;
|
||||
double s22;
|
||||
double z;
|
||||
bool gen;
|
||||
} RNDState;
|
||||
|
||||
class OpenCLBase {
|
||||
|
||||
private:
|
||||
@ -122,6 +131,11 @@ public:
|
||||
*/
|
||||
int ocl_createRndStates(int size);
|
||||
|
||||
/* Create an array of random numbers on the device
|
||||
*
|
||||
*/
|
||||
int ocl_createRandomNumbers(void *mem_ptr, int size);
|
||||
|
||||
/*
|
||||
Destroy rnd states
|
||||
Return: success or error code
|
||||
|
@ -1,6 +1,4 @@
|
||||
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
|
||||
#pragma OPENCL EXTENSION
|
||||
|
||||
|
||||
/******Random numbers********/
|
||||
|
||||
@ -89,13 +87,14 @@ __kernel void initRand(__global RNDState *s, unsigned int seed, int N) {
|
||||
|
||||
if (id < N) {
|
||||
RNDState tmp;
|
||||
int tmp_seed = id;// * 0x100000000ULL;
|
||||
int tmp_seed = 2*id;// * 0x100000000ULL;
|
||||
tmp.s10 = 12345 + tmp_seed;
|
||||
tmp.s11 = 12345 + tmp_seed;
|
||||
tmp.s12 = 123 + tmp_seed;
|
||||
tmp.s12 = 12345 + tmp_seed;
|
||||
tmp.s20 = 12345 + tmp_seed;
|
||||
tmp.s21 = 12345 + tmp_seed;
|
||||
tmp.s22 = 123 + tmp_seed;
|
||||
tmp.s22 = 12345 + tmp_seed;
|
||||
|
||||
|
||||
tmp.z = 0;
|
||||
tmp.gen = true;
|
||||
@ -105,6 +104,19 @@ __kernel void initRand(__global RNDState *s, unsigned int seed, int N) {
|
||||
|
||||
}
|
||||
|
||||
/* create random numbers and fill an array */
|
||||
__kernel void createRandoms(__global RNDState *states, __global double *data, int size) {
|
||||
|
||||
int idx = get_global_id(0);
|
||||
|
||||
if (idx < size) {
|
||||
RNDState s = states[idx];
|
||||
data[idx] = rand_uniform(&s);
|
||||
states[idx] = s;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**********Degrader**********/
|
||||
enum PARAMS { POSITION,
|
||||
|
Reference in New Issue
Block a user