diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/__init__.py | 1 | ||||
| -rw-r--r-- | src/daq.cu | 80 | 
2 files changed, 81 insertions, 0 deletions
| diff --git a/src/__init__.py b/src/__init__.py index d2958f1..865d612 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -3,3 +3,4 @@ import os  dir = os.path.split(os.path.realpath(__file__))[0]  kernel = open(dir + '/kernel.cu').read() +daq = open(dir + '/daq.cu').read() diff --git a/src/daq.cu b/src/daq.cu new file mode 100644 index 0000000..c79401c --- /dev/null +++ b/src/daq.cu @@ -0,0 +1,80 @@ +// -*-c++-*- +#include <curand_kernel.h> + +__device__ unsigned int float_to_sortable_int(float f) +{ +  return __float_as_int(f); +  //int i = __float_as_int(f); +  //unsigned int mask = -(int)(i >> 31) | 0x80000000; +  //return i ^ mask; +} + +__device__ float sortable_int_to_float(unsigned int i) +{ +  return __int_as_float(i); +  //unsigned int mask = ((i >> 31) - 1) | 0x80000000; +  //return __int_as_float(i ^ mask); +} + + +__device__ curandState daq_rng_states[100000]; + +extern "C" { + +  __global__ void init_daq_rng(int nthreads,  +			  unsigned long long seed, unsigned long long offset) +  { +    int id = blockIdx.x*blockDim.x + threadIdx.x; +     +    if (id >= nthreads) +      return; +     +    curand_init(seed, id, offset, daq_rng_states+id); +  } + +  __global__ void reset_earliest_time_int(float maxtime,  +				     int ntime_ints, unsigned int *time_ints) +  { +    int id = threadIdx.x + blockDim.x * blockIdx.x; +    if (id < ntime_ints) { +      unsigned int maxtime_int = float_to_sortable_int(maxtime); +      time_ints[id] = maxtime_int; +    } +  } + +  __global__ void run_daq(int detection_state, float time_rms, +		     int nphotons, float *photon_times, int *photon_states, +		     int *last_hit_triangles, int *solid_map, +		     int nsolids, unsigned int *earliest_time_int) +  { +    int id = threadIdx.x + blockDim.x * blockIdx.x; +     +    curandState_t rng = daq_rng_states[id]; + +    if (id < nphotons) { +      int triangle_id = last_hit_triangles[id]; +       +      if (triangle_id > -1) { +	int solid_id = solid_map[triangle_id]; +	int state = photon_states[id]; +	float time = photon_times[id];// + curand_normal(&rng) * time_rms; +	unsigned int time_int = float_to_sortable_int(time); +	if (solid_id < nsolids && state == detection_state) +	  atomicMin(earliest_time_int + solid_id, time_int); +      } +    } + +    daq_rng_states[id] = rng; +  } + +  __global__ void convert_sortable_int_to_float(int n,  +						unsigned int *sortable_ints,  +						float *float_output) +  { +    int id = threadIdx.x + blockDim.x * blockIdx.x; +     +    if (id < n) +      float_output[id] = sortable_int_to_float(sortable_ints[id]); +  } + +} // extern "C" | 
