particle_naive.cl 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #pragma OPENCL EXTENSION cl_khr_fp64: enable
  2. int findIndexSeq(double * CDF, int lengthCDF, double value)
  3. {
  4. int index = -1;
  5. int x;
  6. for(x = 0; x < lengthCDF; x++)
  7. {
  8. if(CDF[x] >= value)
  9. {
  10. index = x;
  11. break;
  12. }
  13. }
  14. if(index == -1)
  15. return lengthCDF-1;
  16. return index;
  17. }
  18. int findIndexBin(double * CDF, int beginIndex, int endIndex, double value)
  19. {
  20. if(endIndex < beginIndex)
  21. return -1;
  22. int middleIndex;
  23. while(endIndex > beginIndex)
  24. {
  25. middleIndex = beginIndex + ((endIndex-beginIndex)/2);
  26. if(CDF[middleIndex] >= value)
  27. {
  28. if(middleIndex == 0)
  29. return middleIndex;
  30. else if(CDF[middleIndex-1] < value)
  31. return middleIndex;
  32. else if(CDF[middleIndex-1] == value)
  33. {
  34. while(CDF[middleIndex] == value && middleIndex >= 0)
  35. middleIndex--;
  36. middleIndex++;
  37. return middleIndex;
  38. }
  39. }
  40. if(CDF[middleIndex] > value)
  41. endIndex = middleIndex-1;
  42. else
  43. beginIndex = middleIndex+1;
  44. }
  45. return -1;
  46. }
  47. /*****************************
  48. * OpenCL Kernel Function to replace FindIndex
  49. * param1: arrayX
  50. * param2: arrayY
  51. * param3: CDF
  52. * param4: u
  53. * param5: xj
  54. * param6: yj
  55. * param7: Nparticles
  56. *****************************/
  57. __kernel void particle_kernel(__global double * arrayX, __global double * arrayY, __global double * CDF, __global double * u, __global double * xj, __global double * yj, int Nparticles){
  58. int i = get_global_id(0);
  59. if(i < Nparticles){
  60. int index = -1;
  61. int x;
  62. for(x = 0; x < Nparticles; x++){
  63. if(CDF[x] >= u[i]){
  64. index = x;
  65. break;
  66. }
  67. }
  68. if(index == -1){
  69. index = Nparticles-1;
  70. }
  71. xj[i] = arrayX[index];
  72. yj[i] = arrayY[index];
  73. }
  74. }