-
Notifications
You must be signed in to change notification settings - Fork 0
/
turtle-buffer.cuh
101 lines (80 loc) · 1.68 KB
/
turtle-buffer.cuh
1
2
3
4
5
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
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include"turtle-globals.cuh"
#include"quick-helper.cuh"
#include<string>
namespace TurtleBuffer
{
template<typename Type>
struct Buffer
{
private:
bool compressed;
bool allocated;
Type* data;
int n;
std::string name;
public:
Buffer()
{
compressed = false;
data = nullptr;
n = 0;
name = "unnamed";
allocated = false;
}
Buffer(std::string nameString, int numElements, CUdevice currentDevice, bool optInCompression)
{
//cudaSetDevice(currentDevice);
name = nameString;
data = nullptr;
n = numElements;
allocated = false;
if (optInCompression)
{
if (CUDA_SUCCESS != QuickHelper::allocateCompressible((void**)&data, n * sizeof(Type), true))
{
compressed = false;
std::cout <<name<< " buffer has CUDA ERROR: compressible memory failed. Trying normal allocation" << std::endl;
}
else
{
compressed = true;
allocated = true;
}
}
else
{
compressed = false;
}
if (!compressed)
{
auto errCu = cudaMalloc(&data, n * sizeof(Type));
TurtleGlobals::gpuErrchk(errCu);
allocated = true;
}
}
Type* Data()
{
return data;
}
bool CompressionEnabled()
{
return compressed;
}
~Buffer()
{
if (allocated && data != nullptr && n > 0 && name!="unnamed")
{
if (compressed)
{
if (CUDA_SUCCESS != QuickHelper::freeCompressible((void*)data, n * sizeof(Type), true))
{
std::cout<< name << " buffer has CUDA ERROR: compressible memory-free failed. Trying normal deallocation" << std::endl;
TurtleGlobals::gpuErrchk(cudaFree(data));
}
}
else
TurtleGlobals::gpuErrchk(cudaFree(data));
}
}
};
}