Blame view

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

  

d6f53e68   dmayerich   rts organization
3
  #include "rts/cuda/error.h"
3f56f1f9   dmayerich   initial commit
4
  #include "cublas_v2.h"
d6f53e68   dmayerich   rts organization
5
  #include "rts/envi/envi.h"

3f56f1f9   dmayerich   initial commit
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  

  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()

  {

51b6469a   dmayerich   added look-up tables
25
26
  	if(S != NULL)

  		HANDLE_ERROR(cudaFree(S));

3f56f1f9   dmayerich   initial commit
27
28
29
  	S = NULL;

  }

  

51b6469a   dmayerich   added look-up tables
30
  void scalarslice::toImage(std::string filename, ptype vmin, ptype vmax, rts::colormapType cmap)

3f56f1f9   dmayerich   initial commit
31
  {

51b6469a   dmayerich   added look-up tables
32
  	rts::gpu2image<ptype>(S, filename, R[0], R[1], vmin, vmax, cmap);

3f56f1f9   dmayerich   initial commit
33
34
  }
  
51b6469a   dmayerich   added look-up tables
35
  void scalarslice::toImage(std::string filename, bool positive, rts::colormapType cmap)
3f56f1f9   dmayerich   initial commit
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
  {
      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;
e70a251f   dmayerich   fixed double prec...
51
  #ifdef PRECISION_SINGLE
3f56f1f9   dmayerich   initial commit
52
      stat = cublasIsamax(handle, N, S, 1, &result);
e70a251f   dmayerich   fixed double prec...
53
54
55
56
57
58
59
60
61
62
63
64
  #elif defined PRECISION_DOUBLE
  	stat = cublasIdamax(handle, N, S, 1, &result);
  #endif
  
  	//adjust for 1-based indexing
  	result -= 1;
  
  	if(stat != CUBLAS_STATUS_SUCCESS)
  	{
  		std::cout<<"CUBLAS Error: failure finding maximum value."<<std::endl;
  		exit(1);
  	}
3f56f1f9   dmayerich   initial commit
65
  
51b6469a   dmayerich   added look-up tables
66
  
3f56f1f9   dmayerich   initial commit
67
68
69
70
  
      //retrieve the maximum value
      ptype maxVal;
      HANDLE_ERROR(cudaMemcpy(&maxVal, S + result, sizeof(ptype), cudaMemcpyDeviceToHost));
3f56f1f9   dmayerich   initial commit
71
72
73
74
75
76
77
78
  
      //destroy the CUBLAS handle
      cublasDestroy(handle);
  
      //output the image
      if(positive)
          toImage(filename, 0, maxVal, cmap);
      else
51b6469a   dmayerich   added look-up tables
79
          toImage(filename, -abs(maxVal), abs(maxVal), cmap);
3f56f1f9   dmayerich   initial commit
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
  }
  
  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
96
97
      //add a band to the ENVI file
      outfile.addBand(cpuData, R[0], R[1], wavelength);
3f56f1f9   dmayerich   initial commit
98
99
100
101
102
103
104
105
106
107
108
109
110
  
      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]));

  }