8 #include "DeviceCodecTemplatesImpl.hpp" 23 genie::compression::decodeArrayParallel<DeviceCompositeCodec<DeviceBitPackingCodec,DeviceCopyCodec>>(int, int, uint32_t*, size_t, uint32_t*, size_t,
size_t*);
25 genie::compression::decodeArrayParallel<DeviceCompositeCodec<DeviceBitPackingCodec,DeviceVarintCodec>>(int, int, uint32_t*, size_t, uint32_t*, size_t,
size_t*);
28 template <
class Codec1,
class Codec2>
void 33 int codec1minEffLength = codec1.decodeArrayParallel_minEffectiveLength();
34 size_t codec1Length = (length / codec1minEffLength) * codec1minEffLength;
35 size_t codec2Length = length - codec1Length;
36 assert (codec1Length + codec2Length == length);
37 assert (codec2Length <= length);
42 codec1.encodeArray(in, codec1Length, out + 1, nvalue1);
43 assert(nvalue >= nvalue1);
48 nvalue2 = nvalue - nvalue1;
49 codec2.encodeArray(in + codec1Length, codec2Length, out + 1 + nvalue1, nvalue2);
50 assert(nvalue - nvalue1 >= nvalue2);
55 nvalue = 1 + nvalue1 + nvalue2;
58 template <
class Codec1,
class Codec2>
const uint32_t*
61 size_t firstCodecComprLength = *in++;
65 const uint32_t *inForCodec2 = in;
67 if (firstCodecComprLength){
69 inForCodec2 = codec1.decodeArray(in, firstCodecComprLength, out, nvalue1);
71 if (nvalue1 > nvalue){
76 if (inForCodec2 == in + comprLength - 1){
82 assert(inForCodec2 == in + firstCodecComprLength);
85 size_t nvalue2 = nvalue - nvalue1;
86 size_t leftoverLength = comprLength - 1 - (inForCodec2 - in);
87 const uint32_t *inAfterBothCodecs = codec2.decodeArray(inForCodec2, leftoverLength, out + nvalue1, nvalue2);
89 if (nvalue2 > nvalue - nvalue1){
90 nvalue = nvalue1 + nvalue2;
94 assert(in + comprLength - 1 == inAfterBothCodecs);
95 nvalue = nvalue1 + nvalue2;
96 return inAfterBothCodecs;
100 template <
class Codec1,
class Codec2> __device__ uint32_t*
108 template <
class Codec1,
class Codec2> __device__ uint32_t*
110 uint32_t *d_in,
size_t comprLength, uint32_t *d_out,
size_t &nvalue)
112 size_t firstCodecComprLength = *d_in++;
116 uint32_t *d_inForCodec2 = d_in;
118 if (firstCodecComprLength){
121 d_inForCodec2 = codec1.decodeArrayParallel(d_in, firstCodecComprLength, d_out, nvalue1);
124 if (nvalue1 > nvalue){
129 if (d_inForCodec2 == d_in + comprLength - 1){
131 return d_inForCodec2;
135 assert(d_inForCodec2 == d_in + firstCodecComprLength);
138 size_t nvalue2 = nvalue - nvalue1;
139 size_t leftoverLength = comprLength - 1 - firstCodecComprLength;
140 uint32_t *d_inAfterBothCodecs = codec2.decodeArrayParallel(d_inForCodec2, leftoverLength, d_out + nvalue1, nvalue2);
143 if (nvalue2 > nvalue - nvalue1){
144 nvalue = nvalue1 + nvalue2;
148 assert(d_in + comprLength - 1 == d_inAfterBothCodecs);
149 nvalue = nvalue1 + nvalue2;
150 return d_inAfterBothCodecs;
const uint32_t * decodeArray(const 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)
void encodeArray(uint32_t *in, const size_t length, uint32_t *out, size_t &nvalue)
__device__ uint32_t * decodeArraySequential(uint32_t *d_in, size_t length, uint32_t *d_out, size_t &nvalue)