GENIE
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
DeviceSerialCodec.cu
Go to the documentation of this file.
1 #include "DeviceCompositeCodec.h"
3 #include "DeviceVarintCodec.h"
4 
5 #include "DeviceCodecTemplatesImpl.hpp"
6 
7 #include "DeviceSerialCodec.h"
8 
9 using namespace genie::compression;
10 
11 // Explicit template instances for Serial Codecs
12 
13 template class
15 template class
17 template class
19 template class
21 template class
23 template class
25 template class
27 
28 // Explicit template instances for decoding wrapper function for Serial Codecs
29 // NOTE: This is intentionally separated into mutliple codec implementation files in order to facilitiate separate
30 // compilation units, as opposed to defining all these templates in one place
31 template void
32 genie::compression::decodeArrayParallel<DeviceSerialCodec<DeviceCopyCodec,DeviceCopyCodec>>(int, int, uint32_t*, size_t, uint32_t*, size_t, size_t*);
33 template void
34 genie::compression::decodeArrayParallel<DeviceSerialCodec<DeviceDeltaCodec,DeviceCopyCodec>>(int, int, uint32_t*, size_t, uint32_t*, size_t, size_t*);
35 template void
36 genie::compression::decodeArrayParallel<DeviceSerialCodec<DeviceDeltaCodec,DeviceDeltaCodec>>(int, int, uint32_t*, size_t, uint32_t*, size_t, size_t*);
37 template void
38 genie::compression::decodeArrayParallel<DeviceSerialCodec<DeviceDeltaCodec,DeviceVarintCodec>>(int, int, uint32_t*, size_t, uint32_t*, size_t, size_t*);
39 template void
40 genie::compression::decodeArrayParallel<DeviceSerialCodec<DeviceDeltaCodec,DeviceBitPackingCodec>>(int, int, uint32_t*, size_t, uint32_t*, size_t, size_t*);
41 template void
42 genie::compression::decodeArrayParallel<DeviceSerialCodec<DeviceDeltaCodec,DeviceCompositeCodec<DeviceBitPackingCodec,DeviceCopyCodec>>>(int, int, uint32_t*, size_t, uint32_t*, size_t, size_t*);
43 template void
44 genie::compression::decodeArrayParallel<DeviceSerialCodec<DeviceDeltaCodec,DeviceCompositeCodec<DeviceBitPackingCodec,DeviceVarintCodec>>>(int, int, uint32_t*, size_t, uint32_t*, size_t, size_t*);
45 
46 
47 template <class Codec1, class Codec2> void
48 genie::compression::DeviceSerialCodec<Codec1,Codec2>::encodeArray(uint32_t *in, const size_t length, uint32_t *out, size_t &nvalue)
49 {
50  assert(length > 0);
51  assert(nvalue > 0);
52 
53  uint32_t mid[nvalue];
54 
55  size_t nvalue1 = nvalue;
56  codec1.encodeArray(in, length, mid, nvalue1);
57  assert(nvalue1 <= nvalue); // Error - compression overflow
58 
59  size_t nvalue2 = nvalue;
60  codec2.encodeArray(mid, nvalue1, out, nvalue2);
61  assert(nvalue2 <= nvalue); // Error - compression overflow
62 
63  nvalue = nvalue2;
64 }
65 
66 
67 template <class Codec1, class Codec2> const uint32_t*
68 genie::compression::DeviceSerialCodec<Codec1,Codec2>::decodeArray(const uint32_t *in, const size_t comprLength, uint32_t *out, size_t &nvalue)
69 {
70 
71  uint32_t mid[nvalue];
72 
73  size_t nvalue2 = nvalue;
74  codec2.decodeArray(in, comprLength, mid, nvalue2);
75  assert(nvalue2 <= nvalue); // Error - compression overflow
76  // if (nvalue2 > nvalue){ // Error - Codec2 does not have enough capacity
77  // nvalue = nvalue2; // Set nvalue to required capacity of codec1
78  // return in; // Return pointer to the deginning of the compressed array
79  // }
80 
81  size_t nvalue1 = nvalue;
82  codec1.decodeArray(mid, nvalue2, out, nvalue1);
83  assert(nvalue1 <= nvalue); // Error - compression overflow
84  // if (nvalue1 > nvalue){ // Error - Codec1 does not have enough capacity
85  // nvalue = nvalue1; // Set nvalue to required capacity of codec1
86  // return in; // Return pointer to the deginning of the compressed array
87  // }
88 
89  nvalue = nvalue1;
90  return out + nvalue2;
91 }
92 
93 
94 template <class Codec1, class Codec2> __device__ uint32_t*
95 genie::compression::DeviceSerialCodec<Codec1,Codec2>::decodeArraySequential(uint32_t *d_in, size_t length, uint32_t *d_out, size_t &nvalue)
96 {
97  return nullptr;
98 }
99 
100 
101 template <class Codec1, class Codec2> __device__ uint32_t*
103  uint32_t *d_in, size_t comprLength, uint32_t *d_out, size_t &nvalue)
104 {
105  __shared__ uint32_t s_Mid[GPUGENIE_CODEC_SERIAL_MAX_UNCOMPR_LENGTH];
106 
107  // Codec2 decompresses as much as it can
108  size_t nvalue2 = nvalue; // set capacity for codec2 to overall capacity
109  uint32_t *d_inAfterCodec2 = codec2.decodeArrayParallel(d_in, comprLength, s_Mid, nvalue2);
110  __syncthreads();
111  // Hard capacity verification
112  assert(nvalue2 <= nvalue); // Error - compression overflow
113  assert(d_inAfterCodec2 == d_in + comprLength);
114 
115  // // Soft capacity verification
116  // if (nvalue2 > nvalue){ // Error - Codec2 does not have enough capacity
117  // nvalue = nvalue2; // Set nvalue to required capacity of codec2
118  // return d_in; // Return pointer to the beginning of the compressed array
119  // }
120 
121  // Codec1 decompresses the leftover
122  size_t nvalue1 = nvalue; // remaining capacity
123  uint32_t *s_MidAfterCodec1 = codec1.decodeArrayParallel(s_Mid, nvalue2, d_out, nvalue1);
124  __syncthreads();
125  // Hard capacity verification
126  assert(nvalue1 <= nvalue); // Error - compression overflow
127  assert(s_MidAfterCodec1 == s_Mid + nvalue2);
128 
129  // // Soft capacity verification
130  // if (nvalue1 > nvalue){ // Error - Codec1 does not have enough capacity
131  // nvalue = nvalue1; // Set nvalue to required capacity of codec2 + codec1
132  // return d_in; // Return pointer to the beginning of the compressed array
133  // }
134 
135  nvalue = nvalue1; // set nvalue to final uncompressed length
136  return d_inAfterCodec2;
137 }
138 
void encodeArray(uint32_t *in, const size_t length, uint32_t *out, size_t &nvalue)
__device__ uint32_t * decodeArrayParallel(uint32_t *d_in, size_t length, uint32_t *d_out, size_t &nvalue)
__device__ uint32_t * decodeArraySequential(uint32_t *d_in, size_t length, uint32_t *d_out, size_t &nvalue)
#define GPUGENIE_CODEC_SERIAL_MAX_UNCOMPR_LENGTH
const uint32_t * decodeArray(const uint32_t *in, const size_t length, uint32_t *out, size_t &nvalue)