add function to generate list of random numbers with cuda and opencl on the device

This commit is contained in:
Uldis Locans
2016-12-09 13:43:09 +01:00
parent 3a74d6cdee
commit b5c5da29b2
9 changed files with 110 additions and 22 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -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,