kernel.cu
上传用户:liuping58
上传日期:2022-06-05
资源大小:105k
文件大小:7k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <cutil.h>
  3. #define DT  0.1
  4. #define max(x,y)    ((x>y) ? x : y )
  5. #define min(x,y)    ((x<y) ? x : y )
  6. #define INDEX(i,j,j_off)  (i +__mul24(j,j_off))
  7. #define BLOCKDIM_X  32
  8. #define BLOCKDIM_Y  4
  9. #define BLOCKDIM_Z  1
  10. __global__ void updatephi( float *d_phi, float *d_phi1, float *d_D, int NX, int NY, int NZ, float alpha, int pitch)
  11. {
  12. float dx,dy,dz;
  13. float dxplus, dyplus, dzplus, dxminus, dyminus, dzminus;
  14. float dxplusy, dxminusy, dxplusz, dxminusz, dyplusx, dyminusx, dyplusz, dyminusz, dzplusx, dzminusx, dzplusy, dzminusy;
  15. float gradphimax, gradphimin, nplusx, nplusy, nplusz, nminusx, nminusy, nminusz, curvature;
  16. float F, gradphi;
  17. int   indg, indg_h, indg0;
  18. int   i, j, k, ind, ind_h, halo, active;
  19. #define IOFF  1
  20. #define JOFF  (BLOCKDIM_X+2)
  21. #define KOFF  (BLOCKDIM_X+2)*(BLOCKDIM_Y+2)
  22. int NXM1 = NX-1; int NYM1 = NY-1; int NZM1 = NZ-1;
  23. __shared__ float s_data[3*(BLOCKDIM_X+2)*(BLOCKDIM_Y+2)];
  24. k    =  threadIdx.y*BLOCKDIM_X + threadIdx.x;
  25. halo = k < 2*(BLOCKDIM_X+BLOCKDIM_Y+2);
  26. if (halo) {
  27. if (threadIdx.y<2) {               // y-halos (coalesced)
  28. i = threadIdx.x;
  29. j = threadIdx.y*(BLOCKDIM_Y+1) - 1;
  30. }
  31. else {                             // x-halos (not coalesced)
  32. i = (k%2)*(BLOCKDIM_X+1) - 1;
  33. j =  k/2 - BLOCKDIM_X - 1;
  34. }
  35. ind_h  = INDEX(i+1,j+1,BLOCKDIM_X+2);
  36. i      = INDEX(i,blockIdx.x,BLOCKDIM_X);   // global indices
  37. j      = INDEX(j,blockIdx.y,BLOCKDIM_Y);
  38. indg_h = INDEX(i,j,pitch);
  39. halo   =  (i>=0) && (i<NX) && (j>=0) && (j<NY);
  40. }
  41. //
  42. // then set up indices for main block
  43. //
  44. i    = threadIdx.x;
  45. j    = threadIdx.y;
  46. ind  = INDEX(i+1,j+1,BLOCKDIM_X+2) ;
  47. i    = INDEX(i,blockIdx.x,BLOCKDIM_X);     // global indices
  48. j    = INDEX(j,blockIdx.y,BLOCKDIM_Y);
  49. indg = INDEX(i,j,pitch);
  50. active = (i<NX) && (j<NY);
  51. //
  52. // read initial plane of u1 array
  53. //
  54. if (active) s_data[ind+KOFF+KOFF] = d_phi1[indg]; if (halo) s_data[ind_h+KOFF+KOFF] = d_phi1[indg_h];
  55. for(int k=0;k<NZ;k++){
  56. if (active) { indg0 = indg; indg  = INDEX(indg,NY,pitch); s_data[ind-KOFF+KOFF] = s_data[ind+KOFF]; s_data[ind+KOFF]      = s_data[ind+KOFF+KOFF]; if (k<NZ-1) s_data[ind+KOFF+KOFF] = d_phi1[indg]; } if (halo) { indg_h = INDEX(indg_h,NY,pitch); s_data[ind_h-KOFF+KOFF] = s_data[ind_h+KOFF]; s_data[ind_h+KOFF]      = s_data[ind_h+KOFF+KOFF]; if (k<NZ-1) s_data[ind_h+KOFF+KOFF] = d_phi1[indg_h]; }
  57. if (active) {
  58. int ind2=ind+KOFF;
  59. if(i==0||i==NXM1){dx=0;} else {dx=(s_data[ind2+IOFF]-s_data[ind2-IOFF])/2;}
  60. if(j==0||j==NYM1){dy=0;} else {dy=(s_data[ind2-JOFF]-s_data[ind2+JOFF])/2;}
  61. if(k==0||k==NZM1){dz=0;} else {dz=(s_data[ind2+KOFF]-s_data[ind2-KOFF])/2;}
  62. if(i==NXM1){dxplus=0;}   else {dxplus =(s_data[ind2+IOFF]-s_data[ind2     ]);}
  63. if(j==0){dyplus=0;}  else {dyplus =(s_data[ind2-JOFF]-s_data[ind2     ]);}
  64. if(k==NZM1){dzplus=0;}   else {dzplus =(s_data[ind2+KOFF]-s_data[ind2     ]);}
  65. if(i==0){dxminus=0;}     else {dxminus=(s_data[ind2     ]-s_data[ind2-IOFF]);}
  66. if(j==NYM1){dyminus=0;}  else {dyminus=(s_data[ind2     ]-s_data[ind2+JOFF]);}
  67. if(k==0){dzminus=0;}     else {dzminus=(s_data[ind2     ]-s_data[ind2-KOFF]);}
  68. if(i==0||i==NXM1||j==0){dxplusy=0;}  else {dxplusy =(s_data[ind2-JOFF+IOFF]-s_data[ind2-JOFF-IOFF])/2;}
  69. if(i==0||i==NXM1||j==NYM1){dxminusy=0;}  else {dxminusy=(s_data[ind2+JOFF+IOFF]-s_data[ind2+JOFF-IOFF])/2;}
  70. if(i==0||i==NXM1||k==NZM1) {dxplusz=0;}  else {dxplusz =(s_data[ind2+KOFF+IOFF]-s_data[ind2+KOFF-IOFF])/2;}
  71. if(i==0||i==NXM1||k==0) {dxminusz=0;}  else {dxminusz=(s_data[ind2-KOFF+IOFF]-s_data[ind2-KOFF-IOFF])/2;}
  72. if(j==0||j==NYM1||i==NXM1){dyplusx=0;}   else {dyplusx =(s_data[ind2-JOFF+IOFF]-s_data[ind2+JOFF+IOFF])/2;}
  73. if(j==0||j==NYM1||i==0){dyminusx=0;}  else {dyminusx=(s_data[ind2-JOFF-IOFF]-s_data[ind2+JOFF-IOFF])/2;}
  74. if(j==0||j==NYM1||k==NZM1) {dyplusz=0;}  else {dyplusz =(s_data[ind2+KOFF-JOFF]-s_data[ind2+KOFF+JOFF])/2;}
  75. if(j==0||j==NYM1||k==0) {dyminusz=0;}  else {dyminusz=(s_data[ind2-KOFF-JOFF]-s_data[ind2-KOFF+JOFF])/2;}
  76. if(k==0||k==NZM1||i==NXM1) {dzplusx=0;}  else {dzplusx =(s_data[ind2+IOFF+KOFF]-s_data[ind2+IOFF-KOFF])/2;}
  77. if(k==0||k==NZM1||i==0) {dzminusx=0;}  else {dzminusx=(s_data[ind2-IOFF+KOFF]-s_data[ind2-IOFF-KOFF])/2;}
  78. if(k==0||k==NZM1||j==0) {dzplusy=0;}  else {dzplusy =(s_data[ind2-JOFF+KOFF]-s_data[ind2-JOFF-KOFF])/2;}
  79. if(k==0||k==NZM1||j==NYM1) {dzminusy=0;} else {dzminusy=(s_data[ind2+JOFF+KOFF]-s_data[ind2+JOFF-KOFF])/2;}
  80. gradphimax=sqrt((sqrt(max(dxplus,0)*max(dxplus,0)+max(-dxminus,0)*max(-dxminus,0)))*(sqrt(max(dxplus,0)*max(dxplus,0)+max(-dxminus,0)*max(-dxminus,0)))
  81. +(sqrt(max(dyplus,0)*max(dyplus,0)+max(-dyminus,0)*max(-dyminus,0)))*(sqrt(max(dyplus,0)*max(dyplus,0)+max(-dyminus,0)*max(-dyminus,0)))
  82. +(sqrt(max(dzplus,0)*max(dzplus,0)+max(-dzminus,0)*max(-dzminus,0)))*(sqrt(max(dzplus,0)*max(dzplus,0)+max(-dzminus,0)*max(-dzminus,0))));
  83. gradphimin=sqrt((sqrt(min(dxplus,0)*min(dxplus,0)+min(-dxminus,0)*min(-dxminus,0)))*(sqrt(min(dxplus,0)*min(dxplus,0)+min(-dxminus,0)*min(-dxminus,0)))
  84. +(sqrt(min(dyplus,0)*min(dyplus,0)+min(-dyminus,0)*min(-dyminus,0)))*(sqrt(min(dyplus,0)*min(dyplus,0)+min(-dyminus,0)*min(-dyminus,0)))
  85. +(sqrt(min(dzplus,0)*min(dzplus,0)+min(-dzminus,0)*min(-dzminus,0)))*(sqrt(min(dzplus,0)*min(dzplus,0)+min(-dzminus,0)*min(-dzminus,0))));
  86. nplusx = dxplus / sqrt(1.192092896e-07F + (dxplus*dxplus) + ((dyplusx + dy)*(dyplusx + dy)*0.25) + ((dzplusx + dz)*(dzplusx + dz)*0.25));
  87. nplusy = dyplus / sqrt(1.192092896e-07F + (dyplus*dyplus) + ((dxplusy + dx)*(dxplusy + dx)*0.25) + ((dzplusy + dz)*(dzplusy + dz)*0.25));
  88. nplusz = dzplus / sqrt(1.192092896e-07F + (dzplus*dzplus) + ((dxplusz + dz)*(dxplusz + dz)*0.25) + ((dyplusz + dy)*(dyplusz + dy)*0.25));
  89. nminusx=dxminus / sqrt(1.192092896e-07F + (dxminus*dxminus) + ((dyminusx + dy)*(dyminusx + dy)*0.25) + ((dzminusx + dz)*(dzminusx + dz)*0.25));
  90. nminusy=dyminus / sqrt(1.192092896e-07F + (dyminus*dyminus) + ((dxminusy + dx)*(dxminusy + dx)*0.25) + ((dzminusy + dz)*(dzminusy + dz)*0.25));
  91. nminusz=dzminus / sqrt(1.192092896e-07F + (dzminus*dzminus) + ((dxminusz + dz)*(dxminusz + dz)*0.25) + ((dyminusz + dy)*(dyminusz + dy)*0.25));
  92. curvature= ((nplusx-nminusx)+(nplusy-nminusy)+(nplusz-nminusz))/2;
  93. F = (-alpha * d_D[indg0]) + ((1-alpha) * curvature);
  94. if(F>0) {gradphi=gradphimax;} else {gradphi=gradphimin;}
  95. d_phi[indg0]=s_data[ind2] + (DT * F * gradphi);
  96. }
  97. __syncthreads();
  98. }
  99. }