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]));
}
|