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

3D图形编程

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <cuda_runtime.h>
  4. #include <cutil.h>
  5. #define BLOCKDIM_X  32
  6. #define BLOCKDIM_Y  4
  7. #define BLOCKDIM_Z  1
  8. char *volumeFilename, *maskFilename;
  9. int ITERATIONS, THRESHOLD, EPSILON;
  10. float alpha;
  11. float *phi, *D;
  12. size_t size, pitchbytes;
  13. unsigned char *input,*output;
  14. int NX, NY, NZ, N, pitch, sizeofelements;
  15. float *d_phi, *d_phi1, *d_D;
  16. int its=0;
  17. unsigned int Timer = 0;
  18. unsigned int IterationTimer = 0;
  19. int i,j,k;
  20. __global__ void updatephi( float *d_phi, float *d_phi1, float *d_D, int NX, int NY, int NZ, float alpha, int pitch);
  21. unsigned char* loadRawUchar(char *filename, size_t size){
  22. FILE *fp = fopen(filename, "rb");
  23.     if (!fp) {
  24.         fprintf(stderr, "Error opening file '%s'n", filename);
  25.         exit(EXIT_FAILURE);
  26.     }
  27. unsigned char *data;
  28. if((data = (unsigned char *) malloc(size))==NULL)printf("MEn");
  29. size_t read = fread(data, 1, size, fp);
  30. fclose(fp);
  31.     printf("Read '%s', %d bytesn", filename, read);
  32.     return data;
  33. }
  34. short* loadRawShort(char *filename, size_t size){
  35. FILE *fp = fopen(filename, "rb");
  36.     if (!fp) {
  37.         fprintf(stderr, "Error opening file '%s'n", filename);
  38.         exit(EXIT_FAILURE);
  39.     }
  40. short *data = (short *) malloc(size*sizeof(short));
  41. size_t read = fread(data, 2, size, fp);
  42. fclose(fp);
  43.     printf("Read '%s', %d bytesn", filename, read);
  44.     return data;
  45. }
  46. float *loadMask(char *filename, size_t size){
  47. FILE *fp = fopen(filename, "rb");
  48.     if (!fp) {
  49.         fprintf(stderr, "Error opening file '%s'n", filename);
  50.         exit(EXIT_FAILURE);
  51.     }
  52. float *data;
  53. if((data = (float *) malloc(size*sizeof(float)))==NULL)printf("MEn");
  54. size_t read = fread(data, 4, size, fp);
  55. fclose(fp);
  56.     printf("Read '%s', %d elementsn", filename, read);
  57.     return data;
  58. }
  59. void cuda_update(){
  60. dim3 dimGrid( ((NX-1)/BLOCKDIM_X) + 1, ((NY-1)/BLOCKDIM_Y) +1);
  61. dim3 dimBlock(BLOCKDIM_X, BLOCKDIM_Y, BLOCKDIM_Z);
  62. updatephi<<< dimGrid, dimBlock>>>(d_phi, d_phi1, d_D,  NX, NY, NZ, alpha, pitch);
  63. d_phi1=d_phi;
  64. CUT_CHECK_ERROR("Kernel execution failedn");
  65. CUDA_SAFE_CALL(cudaThreadSynchronize());
  66. }
  67. int main(int argc, char** argv){
  68. if(argc<9){
  69. printf("Too few command line arguments specified. Example: Seg -volume=brain_181_217_181.raw -mask=phi.raw -xsize=181 -ysize=217 -zsize=181 -iterations=1000 -threshold=150 -epsilon=50 -alpha=0.03n");
  70. exit(0);
  71. }
  72. cutGetCmdLineArgumentstr( argc, (const char**) argv, "volume", &volumeFilename);
  73. cutGetCmdLineArgumentstr( argc, (const char**) argv, "mask", &maskFilename);
  74. cutGetCmdLineArgumenti( argc, (const char**) argv, "xsize", &NX);
  75. cutGetCmdLineArgumenti( argc, (const char**) argv, "ysize", &NY);
  76. cutGetCmdLineArgumenti( argc, (const char**) argv, "zsize", &NZ);
  77. cutGetCmdLineArgumenti( argc, (const char**) argv, "iterations", &ITERATIONS);
  78. cutGetCmdLineArgumenti( argc, (const char**) argv, "threshold", &THRESHOLD);
  79. cutGetCmdLineArgumenti( argc, (const char**) argv, "epsilon", &EPSILON);
  80. cutGetCmdLineArgumentf( argc, (const char**) argv, "alpha", &alpha);
  81. //cutGetCmdLineArgumenti( argc, (const char**) argv, "sizeofelements", &sizeofelements);
  82. N=NX*NY*NZ;
  83. input = loadRawUchar(volumeFilename, N);
  84. phi = loadMask(maskFilename, N);
  85. if((D = (float *)malloc(NX*NY*NZ*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. // Allocate Memory on Device
  90. CUDA_SAFE_CALL( cudaMallocPitch((void**)&d_D,   &pitchbytes, sizeof(float)*NX, NY*NZ));
  91. CUDA_SAFE_CALL( cudaMallocPitch((void**)&d_phi,           &pitchbytes, sizeof(float)*NX, NY*NZ));
  92. CUDA_SAFE_CALL( cudaMallocPitch((void**)&d_phi1,          &pitchbytes, sizeof(float)*NX, NY*NZ));
  93. pitch=pitchbytes/sizeof(float);
  94. // Copy Host Thresholding Data to Device Memory
  95. CUDA_SAFE_CALL( cudaMemcpy2D(d_D,    pitchbytes, D,   sizeof(float)*NX, sizeof(float)*NX, NY*NZ, cudaMemcpyHostToDevice));
  96. CUDA_SAFE_CALL( cudaMemcpy2D(d_phi1, pitchbytes, phi, sizeof(float)*NX, sizeof(float)*NX, NY*NZ, cudaMemcpyHostToDevice));
  97. // Set up CUDA Timer
  98. cutCreateTimer(&Timer);
  99. cutCreateTimer(&IterationTimer);
  100. cutStartTimer(Timer);
  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(NX*NY*NZ))==NULL)printf("ME_OUTPUTn");
  107. cudaMemcpy2D(phi, sizeof(float)*NX, d_phi1, pitchbytes, sizeof(float)*NX, NY*NZ, cudaMemcpyDeviceToHost);
  108. for(i=0;i<N;i++){
  109. if(phi[i]>0){output[i]=0;} else { output[i]=255; }
  110. }
  111. char *outputFilename= "output.raw";
  112. FILE *fp = fopen(outputFilename, "wb");
  113. size_t write = fwrite(output, 1, N, fp);
  114. fclose(fp);
  115.     printf("Write '%s', %d bytesn", outputFilename, write);
  116. char dummy[100];
  117. scanf("%c",dummy);
  118. CUDA_SAFE_CALL( cudaFree(d_phi) ); CUDA_SAFE_CALL( cudaFree(d_phi1) ); CUDA_SAFE_CALL( cudaFree(d_D) ); free(D); free(phi); free(input);
  119. }