Skip to content

Commit 55a96e6

Browse files
authored
Packed tuple (#4469)
1 parent e884754 commit 55a96e6

File tree

6 files changed

+1149
-0
lines changed

6 files changed

+1149
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
#pragma once
2+
3+
#include <ydb/library/yql/utils/simd/simd.h>
4+
5+
namespace NKikimr {
6+
namespace NMiniKQL {
7+
namespace NPackedTuple {
8+
9+
10+
11+
// Calculates CRC32 of data using hardware acceleration instruction (Size <= 16)
12+
template<typename TTraits, ui32 Size> ui32 CalculateCRC32(const ui8 * data, ui32 initHash = 0) {
13+
static_assert(Size <= 16, "Size for template CRC32 calculation should be <= 16 !");
14+
15+
using TSimdI8 = TTraits::TSimdI8;
16+
17+
ui32 hash = initHash;
18+
19+
if constexpr (Size == 1 ) {
20+
hash = TSimdI8::CRC32u8(hash, *(ui8*) data);
21+
}
22+
23+
if constexpr (Size == 2 ) {
24+
hash = TSimdI8::CRC32u16(hash, *(ui16*) data);
25+
}
26+
27+
if constexpr (Size == 3 ) {
28+
29+
hash = TSimdI8::CRC32u16(hash, *(ui16*) data);
30+
hash = TSimdI8::CRC32u8(hash, *(ui8*) (data+2));
31+
}
32+
33+
if constexpr (Size == 4 ) {
34+
hash = TSimdI8::CRC32u32(hash, *(ui32*) data);
35+
}
36+
37+
if constexpr (Size == 5 ) {
38+
hash = TSimdI8::CRC32u32(hash, *(ui32*) data);
39+
hash = TSimdI8::CRC32u8(hash, *(ui8*) (data+4));
40+
}
41+
42+
if constexpr (Size == 6 ) {
43+
hash = TSimdI8::CRC32u32(hash, *(ui32*) data);
44+
hash = TSimdI8::CRC32u16(hash, *(ui16*) (data+4));
45+
}
46+
47+
if constexpr (Size == 7 ) {
48+
hash = TSimdI8::CRC32u32(hash, *(ui32*) data);
49+
hash = TSimdI8::CRC32u16(hash, *(ui16*) (data+4));
50+
hash = TSimdI8::CRC32u8(hash, *(ui8*) (data+6));
51+
}
52+
53+
if constexpr (Size == 8 ) {
54+
hash = TSimdI8::CRC32u64(hash, *(ui64*) data);
55+
}
56+
57+
if constexpr (Size == 9 ) {
58+
hash = TSimdI8::CRC32u64(hash, *(ui64*) data);
59+
hash = TSimdI8::CRC32u8(hash, *(ui8*) (data+8));
60+
}
61+
62+
if constexpr (Size == 10 ) {
63+
hash = TSimdI8::CRC32u64(hash, *(ui64*) data);
64+
hash = TSimdI8::CRC32u16(hash, *(ui16*) (data+8));
65+
}
66+
67+
if constexpr (Size == 11 ) {
68+
hash = TSimdI8::CRC32u64(hash, *(ui64*) data);
69+
hash = TSimdI8::CRC32u16(hash, *(ui16*) (data+8));
70+
hash = TSimdI8::CRC32u8(hash, *(ui8*) (data+10));
71+
}
72+
73+
if constexpr (Size == 12 ) {
74+
hash = TSimdI8::CRC32u64(hash, *(ui64*) data);
75+
hash = TSimdI8::CRC32u32(hash, *(ui32*) (data+8));
76+
}
77+
78+
if constexpr (Size == 13 ) {
79+
hash = TSimdI8::CRC32u64(hash, *(ui64*) data);
80+
hash = TSimdI8::CRC32u32(hash, *(ui32*) (data+8));
81+
hash = TSimdI8::CRC32u8(hash, *(ui8*) (data+12));
82+
}
83+
84+
if constexpr (Size == 14 ) {
85+
hash = TSimdI8::CRC32u64(hash, *(ui64*) data);
86+
hash = TSimdI8::CRC32u32(hash, *(ui32*) (data+8));
87+
hash = TSimdI8::CRC32u16(hash, *(ui16*) (data+12));
88+
}
89+
90+
if constexpr (Size == 15 ) {
91+
hash = TSimdI8::CRC32u64(hash, *(ui64*) data);
92+
hash = TSimdI8::CRC32u32(hash, *(ui32*) (data+8));
93+
hash = TSimdI8::CRC32u16(hash, *(ui16*) (data+12));
94+
hash = TSimdI8::CRC32u8(hash, *(ui8*) (data+14));
95+
}
96+
97+
if constexpr (Size == 16 ) {
98+
hash = TSimdI8::CRC32u64(hash, *(ui64*) data);
99+
hash = TSimdI8::CRC32u64(hash, *(ui64*) (data+8));
100+
}
101+
102+
return hash;
103+
104+
}
105+
106+
107+
template <typename TTraits>
108+
inline ui32 CalculateCRC32(const ui8 * data, ui32 size, ui32 hash = 0 ) {
109+
110+
using TSimdI8 = TTraits::TSimdI8;
111+
112+
while (size >= 8) {
113+
hash = TSimdI8::CRC32u64(hash, ReadUnaligned<ui64>(data));
114+
size -= 8;
115+
data += 8;
116+
}
117+
118+
switch(size) {
119+
case 7:
120+
hash = TSimdI8::CRC32u32(hash, ReadUnaligned<ui32>(data));
121+
data += 4;
122+
[[fallthrough]];
123+
case 3:
124+
hash = TSimdI8::CRC32u16(hash, ReadUnaligned<ui16>(data));
125+
data += 2;
126+
[[fallthrough]];
127+
case 1:
128+
hash = TSimdI8::CRC32u8(hash, ReadUnaligned<ui8>(data));
129+
break;
130+
case 6:
131+
hash = TSimdI8::CRC32u32(hash, ReadUnaligned<ui32>(data));
132+
data += 4;
133+
[[fallthrough]];
134+
case 2:
135+
hash = TSimdI8::CRC32u16(hash, ReadUnaligned<ui16>(data));
136+
break;
137+
case 5:
138+
hash = TSimdI8::CRC32u32(hash, ReadUnaligned<ui32>(data));
139+
data += 4;
140+
hash = TSimdI8::CRC32u8(hash, ReadUnaligned<ui8>(data));
141+
break;
142+
case 4:
143+
hash = TSimdI8::CRC32u32(hash, ReadUnaligned<ui32>(data));
144+
break;
145+
case 0:
146+
break;
147+
}
148+
return hash;
149+
150+
}
151+
}
152+
153+
}
154+
155+
}

0 commit comments

Comments
 (0)