#pragma OPENCL EXTENSION cl_khr_fp64: enable int findIndexSeq(double * CDF, int lengthCDF, double value) { int index = -1; int x; for(x = 0; x < lengthCDF; x++) { if(CDF[x] >= value) { index = x; break; } } if(index == -1) return lengthCDF-1; return index; } int findIndexBin(double * CDF, int beginIndex, int endIndex, double value) { if(endIndex < beginIndex) return -1; int middleIndex; while(endIndex > beginIndex) { middleIndex = beginIndex + ((endIndex-beginIndex)/2); if(CDF[middleIndex] >= value) { if(middleIndex == 0) return middleIndex; else if(CDF[middleIndex-1] < value) return middleIndex; else if(CDF[middleIndex-1] == value) { while(CDF[middleIndex] == value && middleIndex >= 0) middleIndex--; middleIndex++; return middleIndex; } } if(CDF[middleIndex] > value) endIndex = middleIndex-1; else beginIndex = middleIndex+1; } return -1; } /***************************** * OpenCL Kernel Function to replace FindIndex * param1: arrayX * param2: arrayY * param3: CDF * param4: u * param5: xj * param6: yj * param7: Nparticles *****************************/ __kernel void particle_kernel(__global double * arrayX, __global double * arrayY, __global double * CDF, __global double * u, __global double * xj, __global double * yj, int Nparticles){ int i = get_global_id(0); if(i < Nparticles){ int index = -1; int x; for(x = 0; x < Nparticles; x++){ if(CDF[x] >= u[i]){ index = x; break; } } if(index == -1){ index = Nparticles-1; } xj[i] = arrayX[index]; yj[i] = arrayY[index]; } }