Blame view

scalarslice.cu 2.29 KB
3f56f1f9   dmayerich   initial commit
1
2
3
4
  #include "scalarslice.h"

  

  #include "rts/cuda_handle_error.h"
  #include "cublas_v2.h"
7d43100a   dmayerich   allow appending t...
5
  #include "envi/rtsEnvi.h"

3f56f1f9   dmayerich   initial commit
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
  

  scalarslice::scalarslice(int x, int y)

  {

  	//set the resolution

  	R[0] = x;

  	R[1] = y;

  

  	//allocate memory on the GPU

  	HANDLE_ERROR(cudaMalloc( (void**)&S, sizeof(ptype) * x * y ));

  }
  
  scalarslice::scalarslice()
  {
      R[0] = R[1] = 0;
      S = NULL;
  }

  

  scalarslice::~scalarslice()

  {

  	HANDLE_ERROR(cudaFree(S));

  	S = NULL;

  }

  

  void scalarslice::toImage(std::string filename, ptype vmin, ptype vmax, rts::colormap::colormapType cmap)

  {

  	rts::colormap::gpu2image<ptype>(S, filename, R[0], R[1], vmin, vmax, cmap);

  }
  
  void scalarslice::toImage(std::string filename, bool positive, rts::colormap::colormapType cmap)
  {
      cublasStatus_t stat;
      cublasHandle_t handle;
  
      //create a CUBLAS handle
      stat = cublasCreate(&handle);
      if(stat != CUBLAS_STATUS_SUCCESS)
      {
          std::cout<<"CUBLAS Error: initialization failed"<<std::endl;
          exit(1);
      }
  
      //find the index of the value with maximum magnitude
      int N = R[0] * R[1];
      int result;
      stat = cublasIsamax(handle, N, S, 1, &result);
  
      //std::cout<<"Maximum index: "<<result<<std::endl;
  
      //retrieve the maximum value
      ptype maxVal;
      HANDLE_ERROR(cudaMemcpy(&maxVal, S + result, sizeof(ptype), cudaMemcpyDeviceToHost));
3f56f1f9   dmayerich   initial commit
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
  
      //destroy the CUBLAS handle
      cublasDestroy(handle);
  
      //output the image
      if(positive)
          toImage(filename, 0, maxVal, cmap);
      else
          toImage(filename, -maxVal, maxVal, cmap);
  }
  
  void scalarslice::toEnvi(std::string filename, ptype wavelength, bool append)
  {
      std::string mode;
      if(append) mode = "a";
      else       mode = "w";
  
      //open the ENVI file
      EnviFile outfile(filename, mode);
  
      //get the scalar slice from the GPU to the CPU
      int memsize = sizeof(ptype) * R[0] * R[1];
      ptype* cpuData = (ptype*) malloc( memsize );
      HANDLE_ERROR(cudaMemcpy( cpuData, S, memsize, cudaMemcpyDeviceToHost));
  
3f56f1f9   dmayerich   initial commit
82
83
      //add a band to the ENVI file
      outfile.addBand(cpuData, R[0], R[1], wavelength);
3f56f1f9   dmayerich   initial commit
84
85
86
87
88
89
90
91
92
93
94
95
96
  
      outfile.close();
  
  
  }

  

  void scalarslice::clear()

  {

  	//this function sets the slice to zero

  	if(S != NULL)

  		//HANDLE_ERROR(cudaMalloc( (void**)&S, sizeof(ptype) * R[0] * R[1] ));

  		HANDLE_ERROR(cudaMemset(S, 0, sizeof(ptype) * R[0] * R[1]));

  }