GENIE
DeviceCompositeCodec.h
Go to the documentation of this file.
1 #ifndef DEVICE_COMPOSITE_CODEC_H_
2 #define DEVICE_COMPOSITE_CODEC_H_
3 
4 #include <sstream>
5 #include <string>
6 #include <vector>
7 
8 #include "DeviceCodecs.h"
9 
10 namespace genie
11 {
12 namespace compression
13 {
14 
18 template <class Codec1, class Codec2>
20 public:
21 
22  __device__ __host__
24  assert(codec1.decodeArrayParallel_minEffectiveLength() > 1);
25  assert(codec2.decodeArrayParallel_minEffectiveLength() == 1);
26  }
27 
28  Codec1 codec1;
29  Codec2 codec2;
30 
31  void
32  encodeArray(uint32_t *in, const size_t length, uint32_t *out, size_t &nvalue);
33 
34  const uint32_t*
35  decodeArray(const uint32_t *in, const size_t length, uint32_t *out, size_t &nvalue);
36 
37  __device__ uint32_t*
38  decodeArraySequential(uint32_t *d_in, size_t length, uint32_t *d_out, size_t &nvalue);
39 
40  __device__ uint32_t*
41  decodeArrayParallel(uint32_t *d_in, size_t length, uint32_t *d_out, size_t &nvalue);
42 
43  std::string
44  name() const {
45  std::ostringstream convert;
46  convert << "Composite(" << codec1.name() << "-" << codec2.name() << ")";
47  return convert.str();
48  }
49 
50  __device__ __host__ int
52  return codec2.decodeArrayParallel_minEffectiveLength();
53  }
54 
55  __device__ __host__ int
57  return min(codec1.decodeArrayParallel_maxBlocks(), codec2.decodeArrayParallel_maxBlocks());
58  }
59 
60  __device__ __host__ int
62  assert(codec1.decodeArrayParallel_lengthPerBlock() == codec2.decodeArrayParallel_lengthPerBlock());
63  return codec1.decodeArrayParallel_lengthPerBlock();
64  }
65 
66  __device__ __host__ int
68  return min(codec1.decodeArrayParallel_threadsPerBlock(),codec2.decodeArrayParallel_threadsPerBlock());
69  }
70 
71  __device__ __host__ int
73  return max(codec1.decodeArrayParallel_threadLoad(),codec2.decodeArrayParallel_threadLoad());
74  }
75 };
76 
77 } // namespace compression
78 } // namespace genie
79 
80 #endif
This is the top-level namespace of the project.
const uint32_t * decodeArray(const uint32_t *in, const size_t length, uint32_t *out, size_t &nvalue)
__device__ __host__ int decodeArrayParallel_threadLoad()
__device__ __host__ int decodeArrayParallel_threadsPerBlock()
__device__ __host__ int decodeArrayParallel_minEffectiveLength()
__device__ __host__ int decodeArrayParallel_lengthPerBlock()
__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)
__device__ __host__ int decodeArrayParallel_maxBlocks()