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

3D图形编程

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <float.h>
  5. #include <GL/glew.h>
  6. #include <cuda_runtime.h>
  7. #include <cutil.h>
  8. #include <math.h>
  9. #include <GL/glut.h>
  10. #define IMAGE "mask.bmp"
  11. #define ITERATIONS   5000
  12. #define THRESHOLD  180
  13. #define EPSILON  45
  14. #define RITS  50
  15. #define BLOCKDIM_X  32
  16. #define BLOCKDIM_Y  8
  17. float *phi, *D;
  18. uchar4 *h_Src, *h_Mask;
  19. int imageW, imageH, N, pitch;
  20. size_t pitchbytes;
  21. float *d_phi, *d_D;
  22. float *d_phi1;
  23. void LoadBMPFile(uchar4 **dst, int *width, int *height, const char *name);
  24. void sedt2d(int *_d,unsigned char *_bimg,int _h,int _w);
  25. int its=0;
  26. unsigned int Timer = 0;
  27. unsigned int ReInitTimer = 0;
  28. int r;
  29. int c;
  30. int i;
  31. __global__ void updatephi( float *d_phi, float *d_phi1, float *d_D, int imageW, int imageH, int pitch);
  32. void init_phi(){
  33. int *init;
  34. unsigned char *mask;
  35. const char *mask_path = "mask.bmp";
  36. if((init=(int *)malloc(imageW*imageH*sizeof(int)))==NULL)printf("ME_INITn");
  37. if((phi=(float *)malloc(imageW*imageH*sizeof(float)))==NULL)printf("ME_PHIn");
  38. mask = (unsigned char *)malloc(imageW*imageH*sizeof(unsigned char));
  39. //printf("Init Maskn");
  40. LoadBMPFile(&h_Mask, &imageW, &imageH, mask_path);
  41. for(r=0;r<imageH;r++){
  42. for(c=0;c<imageW;c++){
  43. mask[r*imageW+c] = (h_Mask[r*imageW+c].x)/255;
  44. //printf("%3d ", mask[r*imageW+c]);
  45. }
  46. //printf("n");
  47. }
  48. sedt2d(init,mask,imageH,imageW);
  49. //printf("sdf of init maskn");
  50. for(r=0;r<imageH;r++){
  51. for(c=0;c<imageW;c++){
  52. phi[r*imageW+c]=(float)init[r*imageW+c];
  53. if(phi[r*imageW+c]>0){
  54. phi[r*imageW+c]=0.5*sqrt(abs(phi[r*imageW+c]));
  55. } else {
  56. phi[r*imageW+c]=-0.5*sqrt(abs(phi[r*imageW+c]));
  57. }
  58. //printf("%6.3f ", phi[r*imageW+c]);
  59. }
  60. //printf("n");
  61. }
  62. free(init);
  63. free(mask);
  64. }
  65. void reinit_phi(){
  66. int *intphi;
  67. unsigned char *reinit;
  68. if((intphi=(int *)malloc(imageW*imageH*sizeof(int)))==NULL)printf("ME_INITn");
  69. reinit=(unsigned char *)malloc(imageW*imageH*sizeof(unsigned char));//TODO check
  70. for(i=0;i<N;i++){
  71. if(phi[i]<0){
  72. phi[i]=1;
  73. } else {
  74. phi[i]=0;
  75. }
  76. reinit[i]=(int)phi[i];
  77. }
  78. sedt2d(intphi,reinit,imageH,imageW);
  79. /*printf("ReInit @ %4d itsn",its);*/
  80. for(r=0;r<imageH;r++){
  81. for(c=0;c<imageW;c++){
  82. phi[r*imageW+c]=(float)intphi[r*imageW+c];
  83. if(phi[r*imageW+c]>0){
  84. phi[r*imageW+c]=0.5*sqrt(abs(phi[r*imageW+c]));
  85. } else {
  86. phi[r*imageW+c]=-0.5*sqrt(abs(phi[r*imageW+c]));
  87. }
  88. //printf("%6.3f ", phi[r*imageW+c]);
  89. }
  90. //printf("n");
  91. }
  92. free(reinit);
  93. free(intphi);
  94. }
  95. void cuda_update(){
  96. dim3 dimGrid( ((imageW-1)/BLOCKDIM_X) + 1, ((imageH-1)/BLOCKDIM_Y) +1 );
  97. dim3 dimBlock(BLOCKDIM_X, BLOCKDIM_Y);
  98. cutStartTimer(ReInitTimer); // ReInit Timer Start
  99. updatephi<<< dimGrid, dimBlock>>>(d_phi, d_phi1, d_D,  imageW, imageH, pitch);
  100. cudaThreadSynchronize();
  101. cutStopTimer(ReInitTimer); // ReInit Timer Stop
  102. d_phi=d_phi1;
  103. }
  104. int main(int argc, char** argv){
  105. // Load the Input Image using BMPLoader
  106. const char *image_path = IMAGE;
  107. LoadBMPFile(&h_Src, &imageW, &imageH, image_path);
  108. D = (float *)malloc(imageW*imageH*sizeof(float));
  109. for(r=0;r<imageH;r++){
  110. for(c=0;c<imageW;c++){
  111. D[r*imageW+c] = h_Src[r*imageW+c].x;
  112. }
  113. }
  114. N = imageW*imageH;
  115. // Threshold based on hash defined paramters
  116. for(i=0;i<N;i++){
  117. D[i] = EPSILON - abs(D[i] - THRESHOLD);
  118. }
  119. // Init phi to SDF
  120. init_phi();
  121. // Set up CUDA Timer
  122. cutCreateTimer(&Timer);
  123. cutCreateTimer(&ReInitTimer);
  124. // Allocate Memory on Device
  125. cudaMallocPitch((void**)&d_D,   &pitchbytes, sizeof(float)*imageW, imageH);
  126. cudaMallocPitch((void**)&d_phi,           &pitchbytes, sizeof(float)*imageW, imageH);
  127. cudaMallocPitch((void**)&d_phi1,          &pitchbytes, sizeof(float)*imageW, imageH);
  128. pitch=pitchbytes/sizeof(float);
  129. // Copy Host Thresholding Data to Device Memory
  130. cudaMemcpy2D(d_D,    pitchbytes, D,   sizeof(float)*imageW, sizeof(float)*imageW, imageH, cudaMemcpyHostToDevice);
  131. cudaMemcpy2D(d_phi1, pitchbytes, phi, sizeof(float)*imageW, sizeof(float)*imageW, imageH, cudaMemcpyHostToDevice);
  132. cutStartTimer(Timer);
  133. for(its=0;its<=ITERATIONS;its++){
  134. cuda_update();
  135. if(its%50==0)printf("Iteration %3d Total Time: %3.2fn", its, 0.001*cutGetTimerValue(Timer));
  136. }
  137. cudaMemcpy(phi, d_phi, sizeof(float)*imageW*imageH, cudaMemcpyDeviceToHost);
  138. unsigned char *output;
  139. if((output = (unsigned char *) malloc(N))==NULL)printf("ME_OUTPUTn");
  140. for(i=0;i<N;i++){
  141. if(phi[i]>0){output[i]=0;} else { output[i]=255; }
  142. }
  143. char *outputFilename= "output.raw";
  144. FILE *fp = fopen(outputFilename, "wb");
  145. size_t write = fwrite(output, 1, N, fp);
  146. fclose(fp);
  147.     printf("Write '%s', %d bytesn", outputFilename, write);
  148. char dummy[100];
  149. scanf("%c",dummy);
  150. }