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

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 ITERATIONS   1000
  11. #define THRESHOLD  150
  12. #define EPSILON  50
  13. #define BLOCKDIM_X  11
  14. #define BLOCKDIM_Y  11
  15. #define BLOCKDIM_Z  1
  16. char *volumeFilename = "brain.raw";
  17. char *maskFilename = "phi.raw";
  18. char *outputFilename= "output.raw";
  19. //cudaExtent volumeSize = make_cudaExtent(86, 86, 22);
  20. cudaExtent volumeSize = make_cudaExtent(181,217,181);
  21. //cudaExtent volumeSize = make_cudaExtent(10,10,10);
  22. float *phi, *D, *contour;
  23. char *path;
  24. size_t size, pitchbytes;
  25. unsigned char *input,*output;
  26. int imageW, imageH, imageD, N, pitch;
  27. float *d_phi, *d_phi1, *d_D;
  28. int its=0;
  29. unsigned int Timer = 0;
  30. unsigned int IterationTimer = 0;
  31. int i,j,k;
  32. __global__ void updatephi( float *d_phi, float *d_phi1, float *d_D, int imageW, int imageH, int imageD, int pitch);
  33. unsigned char* loadRawFile(char *filename, size_t size){
  34. FILE *fp = fopen(filename, "rb");
  35.     if (!fp) {
  36.         fprintf(stderr, "Error opening file '%s'n", filename);
  37.         exit(EXIT_FAILURE);
  38.     }
  39. unsigned char *data = (unsigned char *) malloc(size);
  40. size_t read = fread(data, 1, size, fp);
  41. fclose(fp);
  42.     printf("Read '%s', %d bytesn", filename, read);
  43.     return data;
  44. }
  45. float *loadMask(char *filename, size_t size){
  46. FILE *fp = fopen(filename, "rb");
  47.     if (!fp) {
  48.         fprintf(stderr, "Error opening file '%s'n", filename);
  49.         exit(EXIT_FAILURE);
  50.     }
  51. float *data = (float *) malloc(size*sizeof(float));
  52. size_t read = fread(data, 4, size, fp);
  53. fclose(fp);
  54.     printf("Read '%s', %d elementsn", filename, read);
  55.     return data;
  56. }
  57. void cuda_update(){
  58. dim3 dimGrid( ((imageW-1)/BLOCKDIM_X) + 1, ((imageH-1)/BLOCKDIM_Y) +1);
  59. dim3 dimBlock(BLOCKDIM_X, BLOCKDIM_Y, BLOCKDIM_Z);
  60. updatephi<<< dimGrid, dimBlock>>>(d_phi, d_phi1, d_D,  imageW, imageH, imageD, pitch);
  61. d_phi1=d_phi;
  62. CUT_CHECK_ERROR("Kernel execution failedn");
  63. cudaThreadSynchronize();
  64. }
  65. int main(int argc, char** argv){
  66. size = volumeSize.width*volumeSize.height*volumeSize.depth;
  67. input = loadRawFile(volumeFilename, size);
  68. phi = loadMask(maskFilename, size);
  69. imageW=volumeSize.width;
  70. imageH=volumeSize.height;
  71. imageD=volumeSize.depth;
  72. N=imageW*imageH*imageD;
  73. if((D = (float *)malloc(imageW*imageH*imageD*sizeof(float)))==NULL)printf("ME_Dn");
  74. for(i=0;i<N;i++){
  75. D[i] = EPSILON - abs(input[i] - THRESHOLD);
  76. }
  77. // Set up CUDA Timer
  78. cutCreateTimer(&Timer);
  79. cutCreateTimer(&IterationTimer);
  80. cutStartTimer(Timer);
  81. // Allocate Memory on Device
  82. cudaMallocPitch((void**)&d_D,   &pitchbytes, sizeof(float)*imageW, imageH*imageD);
  83. cudaMallocPitch((void**)&d_phi,           &pitchbytes, sizeof(float)*imageW, imageH*imageD);
  84. cudaMallocPitch((void**)&d_phi1,          &pitchbytes, sizeof(float)*imageW, imageH*imageD);
  85. pitch=pitchbytes/sizeof(float);
  86. // Copy Host Thresholding Data to Device Memory
  87. cudaMemcpy2D(d_D,    pitchbytes, D,   sizeof(float)*imageW, sizeof(float)*imageW, imageH*imageD, cudaMemcpyHostToDevice);
  88. cudaMemcpy2D(d_phi1, pitchbytes, phi, sizeof(float)*imageW, sizeof(float)*imageW, imageH*imageD, cudaMemcpyHostToDevice);
  89. for(its=0;its<ITERATIONS;its++){
  90. cuda_update();
  91. if(its%50==0){
  92. printf("Iteration %3d Total Time: %3.2f ReInit Time: %3.2fn", its, 0.001*cutGetTimerValue(Timer), 0.001*cutGetTimerValue(IterationTimer));}
  93. }
  94. if((output = (unsigned char *) malloc(imageW*imageH*imageD))==NULL)printf("ME_OUTPUTn");
  95. cudaMemcpy2D(phi, sizeof(float)*imageW, d_phi1, pitchbytes, sizeof(float)*imageW, imageH*imageD, cudaMemcpyDeviceToHost);
  96. for(i=0;i<N;i++){
  97. if(phi[i]>0){output[i]=0;} else { output[i]=255; }
  98. }
  99. FILE *fp = fopen(outputFilename, "wb");
  100. size_t write = fwrite(output, 1, size, fp);
  101. fclose(fp);
  102.     printf("Write '%s', %d bytesn", outputFilename, write);
  103. }