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  32
  14. #define BLOCKDIM_Y  4
  15. #define BLOCKDIM_Z  1
  16. char *volumeFilename = "brain_181_217_181.raw";
  17. char *maskFilename = "phi.raw";
  18. char *outputFilename= "output.raw";
  19. //cudaExtent volumeSize = make_cudaExtent(87, 87, 111);
  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* loadRawUchar(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. short* loadRawShort(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. short *data = (short *) malloc(size*sizeof(short));
  52. size_t read = fread(data, 2, size, fp);
  53. fclose(fp);
  54.     printf("Read '%s', %d bytesn", filename, read);
  55.     return data;
  56. }
  57. float *loadMask(char *filename, size_t size){
  58. FILE *fp = fopen(filename, "rb");
  59.     if (!fp) {
  60.         fprintf(stderr, "Error opening file '%s'n", filename);
  61.         exit(EXIT_FAILURE);
  62.     }
  63. float *data = (float *) malloc(size*sizeof(float));
  64. size_t read = fread(data, 4, size, fp);
  65. fclose(fp);
  66.     printf("Read '%s', %d elementsn", filename, read);
  67.     return data;
  68. }
  69. void cuda_update(){
  70. dim3 dimGrid( ((imageW-1)/BLOCKDIM_X) + 1, ((imageH-1)/BLOCKDIM_Y) +1);
  71. dim3 dimBlock(BLOCKDIM_X, BLOCKDIM_Y, BLOCKDIM_Z);
  72. updatephi<<< dimGrid, dimBlock>>>(d_phi, d_phi1, d_D,  imageW, imageH, imageD, pitch);
  73. d_phi1=d_phi;
  74. CUT_CHECK_ERROR("Kernel execution failedn");
  75. cudaThreadSynchronize();
  76. }
  77. int main(int argc, char** argv){
  78. size = volumeSize.width*volumeSize.height*volumeSize.depth;
  79. input = loadRawUchar(volumeFilename, size);
  80. phi = loadMask(maskFilename, size);
  81. imageW=volumeSize.width;
  82. imageH=volumeSize.height;
  83. imageD=volumeSize.depth;
  84. N=imageW*imageH*imageD;
  85. if((D = (float *)malloc(imageW*imageH*imageD*sizeof(float)))==NULL)printf("ME_Dn");
  86. for(i=0;i<N;i++){
  87. D[i] = EPSILON - abs((unsigned char)input[i] - THRESHOLD);
  88. }
  89. // Set up CUDA Timer
  90. cutCreateTimer(&Timer);
  91. cutCreateTimer(&IterationTimer);
  92. cutStartTimer(Timer);
  93. // Allocate Memory on Device
  94. cudaMallocPitch((void**)&d_D,   &pitchbytes, sizeof(float)*imageW, imageH*imageD);
  95. cudaMallocPitch((void**)&d_phi,           &pitchbytes, sizeof(float)*imageW, imageH*imageD);
  96. cudaMallocPitch((void**)&d_phi1,          &pitchbytes, sizeof(float)*imageW, imageH*imageD);
  97. pitch=pitchbytes/sizeof(float);
  98. // Copy Host Thresholding Data to Device Memory
  99. cudaMemcpy2D(d_D,    pitchbytes, D,   sizeof(float)*imageW, sizeof(float)*imageW, imageH*imageD, cudaMemcpyHostToDevice);
  100. cudaMemcpy2D(d_phi1, pitchbytes, phi, sizeof(float)*imageW, sizeof(float)*imageW, imageH*imageD, cudaMemcpyHostToDevice);
  101. for(its=0;its<ITERATIONS;its++){
  102. cuda_update();
  103. if(its%50==0){
  104. printf("Iteration %3d Total Time: %3.2f ReInit Time: %3.2fn", its, 0.001*cutGetTimerValue(Timer), 0.001*cutGetTimerValue(IterationTimer));}
  105. }
  106. if((output = (unsigned char *) malloc(imageW*imageH*imageD))==NULL)printf("ME_OUTPUTn");
  107. cudaMemcpy2D(phi, sizeof(float)*imageW, d_phi1, pitchbytes, sizeof(float)*imageW, imageH*imageD, cudaMemcpyDeviceToHost);
  108. for(i=0;i<N;i++){
  109. if(phi[i]>0){output[i]=0;} else { output[i]=255; }
  110. }
  111. FILE *fp = fopen(outputFilename, "wb");
  112. size_t write = fwrite(output, 1, size, fp);
  113. fclose(fp);
  114.     printf("Write '%s', %d bytesn", outputFilename, write);
  115. }