mesh-rb 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/ext/mesh/extconf.rb +22 -4
- data/ext/mesh/mesh.tar.gz +0 -0
- data/lib/mesh/version.rb +1 -1
- data/mesh.gemspec +3 -2
- metadata +4 -120
- data/ext/mesh/mesh/.bazelrc +0 -20
- data/ext/mesh/mesh/.bazelversion +0 -1
- data/ext/mesh/mesh/.clang-format +0 -15
- data/ext/mesh/mesh/.dockerignore +0 -5
- data/ext/mesh/mesh/.editorconfig +0 -16
- data/ext/mesh/mesh/.gitattributes +0 -4
- data/ext/mesh/mesh/.github/workflows/main.yml +0 -144
- data/ext/mesh/mesh/.gitignore +0 -51
- data/ext/mesh/mesh/AUTHORS +0 -5
- data/ext/mesh/mesh/CMakeLists.txt +0 -270
- data/ext/mesh/mesh/CODE_OF_CONDUCT.md +0 -77
- data/ext/mesh/mesh/Dockerfile +0 -30
- data/ext/mesh/mesh/LICENSE +0 -201
- data/ext/mesh/mesh/Makefile +0 -81
- data/ext/mesh/mesh/README.md +0 -97
- data/ext/mesh/mesh/WORKSPACE +0 -50
- data/ext/mesh/mesh/bazel +0 -350
- data/ext/mesh/mesh/mesh-pldi19-powers.pdf +0 -0
- data/ext/mesh/mesh/src/BUILD +0 -222
- data/ext/mesh/mesh/src/CMakeLists.txt +0 -85
- data/ext/mesh/mesh/src/bitmap.h +0 -590
- data/ext/mesh/mesh/src/cheap_heap.h +0 -170
- data/ext/mesh/mesh/src/common.h +0 -377
- data/ext/mesh/mesh/src/copts.bzl +0 -31
- data/ext/mesh/mesh/src/d_assert.cc +0 -75
- data/ext/mesh/mesh/src/fixed_array.h +0 -124
- data/ext/mesh/mesh/src/global_heap.cc +0 -547
- data/ext/mesh/mesh/src/global_heap.h +0 -569
- data/ext/mesh/mesh/src/gnu_wrapper.cc +0 -75
- data/ext/mesh/mesh/src/internal.h +0 -356
- data/ext/mesh/mesh/src/libmesh.cc +0 -239
- data/ext/mesh/mesh/src/mac_wrapper.cc +0 -528
- data/ext/mesh/mesh/src/measure_rss.cc +0 -44
- data/ext/mesh/mesh/src/measure_rss.h +0 -20
- data/ext/mesh/mesh/src/meshable_arena.cc +0 -776
- data/ext/mesh/mesh/src/meshable_arena.h +0 -309
- data/ext/mesh/mesh/src/meshing.h +0 -60
- data/ext/mesh/mesh/src/mini_heap.h +0 -532
- data/ext/mesh/mesh/src/mmap_heap.h +0 -104
- data/ext/mesh/mesh/src/one_way_mmap_heap.h +0 -77
- data/ext/mesh/mesh/src/partitioned_heap.h +0 -111
- data/ext/mesh/mesh/src/plasma/mesh.h +0 -33
- data/ext/mesh/mesh/src/real.cc +0 -52
- data/ext/mesh/mesh/src/real.h +0 -36
- data/ext/mesh/mesh/src/rng/mwc.h +0 -296
- data/ext/mesh/mesh/src/rng/mwc64.h +0 -58
- data/ext/mesh/mesh/src/rpl_printf.c +0 -1991
- data/ext/mesh/mesh/src/runtime.cc +0 -393
- data/ext/mesh/mesh/src/runtime.h +0 -114
- data/ext/mesh/mesh/src/shuffle_vector.h +0 -287
- data/ext/mesh/mesh/src/size_classes.def +0 -251
- data/ext/mesh/mesh/src/static/if.h +0 -36
- data/ext/mesh/mesh/src/static/log.h +0 -43
- data/ext/mesh/mesh/src/testing/benchmark/local_refill.cc +0 -103
- data/ext/mesh/mesh/src/testing/big-alloc.c +0 -28
- data/ext/mesh/mesh/src/testing/fragmenter.cc +0 -128
- data/ext/mesh/mesh/src/testing/global-large-stress.cc +0 -25
- data/ext/mesh/mesh/src/testing/local-alloc.c +0 -16
- data/ext/mesh/mesh/src/testing/meshing_benchmark.cc +0 -189
- data/ext/mesh/mesh/src/testing/thread.cc +0 -35
- data/ext/mesh/mesh/src/testing/unit/alignment.cc +0 -56
- data/ext/mesh/mesh/src/testing/unit/bitmap_test.cc +0 -274
- data/ext/mesh/mesh/src/testing/unit/concurrent_mesh_test.cc +0 -185
- data/ext/mesh/mesh/src/testing/unit/mesh_test.cc +0 -143
- data/ext/mesh/mesh/src/testing/unit/rng_test.cc +0 -22
- data/ext/mesh/mesh/src/testing/unit/size_class_test.cc +0 -66
- data/ext/mesh/mesh/src/testing/unit/triple_mesh_test.cc +0 -285
- data/ext/mesh/mesh/src/testing/userfaultfd-kernel-copy.cc +0 -164
- data/ext/mesh/mesh/src/thread_local_heap.cc +0 -163
- data/ext/mesh/mesh/src/thread_local_heap.h +0 -268
- data/ext/mesh/mesh/src/wrapper.cc +0 -433
- data/ext/mesh/mesh/support/export_mesh.cmake +0 -28
- data/ext/mesh/mesh/support/gen-size-classes +0 -57
- data/ext/mesh/mesh/support/install_all_configs +0 -33
- data/ext/mesh/mesh/support/remove_export_mesh.cmake +0 -48
- data/ext/mesh/mesh/support/update-bazelisk +0 -8
- data/ext/mesh/mesh/theory/32m80.png +0 -0
- data/ext/mesh/mesh/theory/64m80ind.png +0 -0
- data/ext/mesh/mesh/theory/bound_comparison.py +0 -67
- data/ext/mesh/mesh/theory/bounds/impdeg+1 +0 -135
- data/ext/mesh/mesh/theory/choose.py +0 -43
- data/ext/mesh/mesh/theory/common.py +0 -42
- data/ext/mesh/mesh/theory/compute_exp_Y.py +0 -134
- data/ext/mesh/mesh/theory/createRandomString.py +0 -69
- data/ext/mesh/mesh/theory/deg_bound_check.py +0 -100
- data/ext/mesh/mesh/theory/degcheck.py +0 -47
- data/ext/mesh/mesh/theory/dumps/32,1,80,dumb.txt +0 -81
- data/ext/mesh/mesh/theory/dumps/32,2,80,dumb.txt +0 -81
- data/ext/mesh/mesh/theory/dumps/32,3,80,dumb.txt +0 -81
- data/ext/mesh/mesh/theory/dumps/32,4,80,dumb.txt +0 -81
- data/ext/mesh/mesh/theory/dumps/32,5,80,dumb.txt +0 -81
- data/ext/mesh/mesh/theory/dumps/32,6,80,dumb.txt +0 -81
- data/ext/mesh/mesh/theory/dumps/32,7,80,dumb.txt +0 -81
- data/ext/mesh/mesh/theory/dumps/32,8,80,dumb.txt +0 -81
- data/ext/mesh/mesh/theory/dumps/32,9,80,dumb.txt +0 -81
- data/ext/mesh/mesh/theory/experiment.py +0 -303
- data/ext/mesh/mesh/theory/experiment_raw_results/.gitignore +0 -0
- data/ext/mesh/mesh/theory/greedy_experiment.py +0 -66
- data/ext/mesh/mesh/theory/greedy_experiment_copy.py +0 -46
- data/ext/mesh/mesh/theory/greedy_experiment_q.py +0 -75
- data/ext/mesh/mesh/theory/makeGraph.py +0 -64
- data/ext/mesh/mesh/theory/manyreps.png +0 -0
- data/ext/mesh/mesh/theory/manystrings.png +0 -0
- data/ext/mesh/mesh/theory/match_vs_color_experiment.py +0 -94
- data/ext/mesh/mesh/theory/maxmatch_vs_E[Y].py +0 -162
- data/ext/mesh/mesh/theory/maxmatch_vs_greedymatch.py +0 -96
- data/ext/mesh/mesh/theory/maxvdeg+1imp++32,80.png +0 -0
- data/ext/mesh/mesh/theory/mesh_util.py +0 -322
- data/ext/mesh/mesh/theory/meshers.py +0 -452
- data/ext/mesh/mesh/theory/meshingBenchmark.py +0 -96
- data/ext/mesh/mesh/theory/occupancyComparison.py +0 -133
- data/ext/mesh/mesh/theory/randmatch_vs_greedymatch.py +0 -97
- data/ext/mesh/mesh/theory/randmatch_vs_greedymatch_q.py +0 -103
- data/ext/mesh/mesh/theory/randmatch_vs_greedymatch_time.py +0 -117
- data/ext/mesh/mesh/theory/read_mesh_dump.py +0 -82
- data/ext/mesh/mesh/theory/test.py +0 -70
- data/ext/mesh/mesh/tools/bazel +0 -1
@@ -1,287 +0,0 @@
|
|
1
|
-
// -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil -*-
|
2
|
-
// Copyright 2019 The Mesh Authors. All rights reserved.
|
3
|
-
// Use of this source code is governed by the Apache License,
|
4
|
-
// Version 2.0, that can be found in the LICENSE file.
|
5
|
-
|
6
|
-
#pragma once
|
7
|
-
#ifndef MESH_SHUFFLE_VECTOR_H
|
8
|
-
#define MESH_SHUFFLE_VECTOR_H
|
9
|
-
|
10
|
-
#include <iterator>
|
11
|
-
#include <random>
|
12
|
-
#include <utility>
|
13
|
-
|
14
|
-
#include "rng/mwc.h"
|
15
|
-
|
16
|
-
#include "internal.h"
|
17
|
-
|
18
|
-
#include "mini_heap.h"
|
19
|
-
|
20
|
-
using mesh::debug;
|
21
|
-
|
22
|
-
namespace mesh {
|
23
|
-
|
24
|
-
namespace sv {
|
25
|
-
class Entry {
|
26
|
-
public:
|
27
|
-
Entry() noexcept : _mhOffset{0}, _bitOffset{0} {
|
28
|
-
}
|
29
|
-
|
30
|
-
explicit Entry(uint8_t mhOff, uint8_t bitOff) : _mhOffset{mhOff}, _bitOffset{bitOff} {
|
31
|
-
}
|
32
|
-
|
33
|
-
Entry(const Entry &rhs) = default;
|
34
|
-
|
35
|
-
constexpr Entry(Entry &&rhs) = default;
|
36
|
-
|
37
|
-
Entry &operator=(const Entry &rhs) = default;
|
38
|
-
|
39
|
-
bool operator==(const Entry &rhs) const {
|
40
|
-
return _mhOffset == rhs._mhOffset && _bitOffset == rhs._bitOffset;
|
41
|
-
}
|
42
|
-
|
43
|
-
inline uint8_t ATTRIBUTE_ALWAYS_INLINE miniheapOffset() const {
|
44
|
-
return _mhOffset;
|
45
|
-
}
|
46
|
-
|
47
|
-
inline uint8_t ATTRIBUTE_ALWAYS_INLINE bit() const {
|
48
|
-
return _bitOffset;
|
49
|
-
}
|
50
|
-
|
51
|
-
private:
|
52
|
-
uint8_t _mhOffset;
|
53
|
-
uint8_t _bitOffset;
|
54
|
-
};
|
55
|
-
static_assert(sizeof(Entry) == 2, "Entry too big!");
|
56
|
-
} // namespace sv
|
57
|
-
|
58
|
-
class ShuffleVector {
|
59
|
-
private:
|
60
|
-
DISALLOW_COPY_AND_ASSIGN(ShuffleVector);
|
61
|
-
|
62
|
-
public:
|
63
|
-
ShuffleVector() : _prng(internal::seed(), internal::seed()) {
|
64
|
-
// set initialized = false;
|
65
|
-
}
|
66
|
-
|
67
|
-
~ShuffleVector() {
|
68
|
-
d_assert(_attachedMiniheaps.size() == 0);
|
69
|
-
}
|
70
|
-
|
71
|
-
// post: list has the index of all bits set to 1 in it, in a random order
|
72
|
-
inline uint32_t ATTRIBUTE_ALWAYS_INLINE refillFrom(uint8_t mhOffset, internal::Bitmap &bitmap) {
|
73
|
-
d_assert(_maxCount > 0);
|
74
|
-
d_assert_msg(_maxCount <= kMaxShuffleVectorLength, "objCount? %zu <= %zu", _maxCount, kMaxShuffleVectorLength);
|
75
|
-
|
76
|
-
if (isFull()) {
|
77
|
-
return 0;
|
78
|
-
}
|
79
|
-
|
80
|
-
// d_assert(_maxCount == _attachedMiniheap->maxCount());
|
81
|
-
|
82
|
-
internal::RelaxedFixedBitmap newBitmap{static_cast<uint32_t>(_maxCount)};
|
83
|
-
newBitmap.setAll(_maxCount);
|
84
|
-
|
85
|
-
internal::RelaxedFixedBitmap localBits{static_cast<uint32_t>(_maxCount)};
|
86
|
-
bitmap.setAndExchangeAll(localBits.mut_bits(), newBitmap.bits());
|
87
|
-
localBits.invert();
|
88
|
-
|
89
|
-
uint32_t allocCount = 0;
|
90
|
-
|
91
|
-
const uint32_t maxCount = static_cast<uint32_t>(_maxCount);
|
92
|
-
for (auto const &i : localBits) {
|
93
|
-
// FIXME: this incredibly lurky conditional is because
|
94
|
-
// RelaxedFixedBitmap iterates over all 256 bits it has,
|
95
|
-
// regardless of the _maxCount set in the constructor -- we
|
96
|
-
// should fix that.
|
97
|
-
if (i >= maxCount) {
|
98
|
-
break;
|
99
|
-
}
|
100
|
-
|
101
|
-
if (unlikely(isFull())) {
|
102
|
-
// TODO: we don't have any more space in our shuffle vector
|
103
|
-
// for these bits we've pulled out of the MiniHeap's bitmap,
|
104
|
-
// so we need to set them as free again. we should measure
|
105
|
-
// how often this happens, as its gonna be slow
|
106
|
-
refillFullSlowpath(bitmap, i);
|
107
|
-
} else {
|
108
|
-
_off--;
|
109
|
-
d_assert(_off >= 0);
|
110
|
-
d_assert(_off < _maxCount);
|
111
|
-
_list[_off] = sv::Entry{mhOffset, static_cast<uint8_t>(i)};
|
112
|
-
allocCount++;
|
113
|
-
}
|
114
|
-
}
|
115
|
-
|
116
|
-
return allocCount;
|
117
|
-
}
|
118
|
-
|
119
|
-
void ATTRIBUTE_NEVER_INLINE refillFullSlowpath(internal::Bitmap &bitmap, size_t i) {
|
120
|
-
bitmap.unset(i);
|
121
|
-
}
|
122
|
-
|
123
|
-
FixedArray<MiniHeap, kMaxMiniheapsPerShuffleVector> &miniheaps() {
|
124
|
-
return _attachedMiniheaps;
|
125
|
-
}
|
126
|
-
|
127
|
-
void refillMiniheaps() {
|
128
|
-
while (_off < _maxCount) {
|
129
|
-
const auto entry = pop();
|
130
|
-
_attachedMiniheaps[entry.miniheapOffset()]->freeOff(entry.bit());
|
131
|
-
}
|
132
|
-
}
|
133
|
-
|
134
|
-
inline bool isFull() const {
|
135
|
-
return _off <= 0;
|
136
|
-
}
|
137
|
-
|
138
|
-
inline bool isExhausted() const {
|
139
|
-
return _off >= _maxCount;
|
140
|
-
}
|
141
|
-
|
142
|
-
inline size_t maxCount() const {
|
143
|
-
return _maxCount;
|
144
|
-
}
|
145
|
-
|
146
|
-
inline bool ATTRIBUTE_ALWAYS_INLINE localRefill() {
|
147
|
-
uint32_t addedCapacity = 0;
|
148
|
-
const auto miniheapCount = _attachedMiniheaps.size();
|
149
|
-
for (uint32_t i = 0; i < miniheapCount && !isFull(); i++, _attachedOff++) {
|
150
|
-
if (_attachedOff >= miniheapCount) {
|
151
|
-
_attachedOff = 0;
|
152
|
-
}
|
153
|
-
|
154
|
-
auto mh = _attachedMiniheaps[_attachedOff];
|
155
|
-
if (mh->isFull()) {
|
156
|
-
continue;
|
157
|
-
}
|
158
|
-
|
159
|
-
const auto allocCount = refillFrom(_attachedOff, mh->writableBitmap());
|
160
|
-
addedCapacity |= allocCount;
|
161
|
-
}
|
162
|
-
|
163
|
-
if (addedCapacity > 0) {
|
164
|
-
if (kEnableShuffleOnInit) {
|
165
|
-
internal::mwcShuffle(&_list[_off], &_list[_maxCount], _prng);
|
166
|
-
}
|
167
|
-
return true;
|
168
|
-
}
|
169
|
-
|
170
|
-
return false;
|
171
|
-
}
|
172
|
-
|
173
|
-
// number of items in the list
|
174
|
-
inline uint32_t ATTRIBUTE_ALWAYS_INLINE length() const {
|
175
|
-
return _maxCount - _off;
|
176
|
-
}
|
177
|
-
|
178
|
-
// Pushing an element onto the freelist does a round of the
|
179
|
-
// Fisher-Yates shuffle if randomization level is >= 2.
|
180
|
-
inline void ATTRIBUTE_ALWAYS_INLINE push(sv::Entry entry) {
|
181
|
-
d_assert(_off > 0); // we must have at least 1 free space in the list
|
182
|
-
|
183
|
-
_off--;
|
184
|
-
_list[_off] = entry;
|
185
|
-
|
186
|
-
if (kEnableShuffleOnFree) {
|
187
|
-
size_t swapOff = _prng.inRange(_off, maxCount() - 1);
|
188
|
-
std::swap(_list[_off], _list[swapOff]);
|
189
|
-
}
|
190
|
-
}
|
191
|
-
|
192
|
-
inline sv::Entry ATTRIBUTE_ALWAYS_INLINE pop() {
|
193
|
-
d_assert(_off >= 0);
|
194
|
-
d_assert(_off < _maxCount);
|
195
|
-
|
196
|
-
auto val = _list[_off];
|
197
|
-
_off++;
|
198
|
-
|
199
|
-
return val;
|
200
|
-
}
|
201
|
-
|
202
|
-
inline void ATTRIBUTE_ALWAYS_INLINE free(MiniHeap *mh, void *ptr) {
|
203
|
-
// const auto ptrval = reinterpret_cast<uintptr_t>(ptr);
|
204
|
-
// const size_t off = (ptrval - _start) / _objectSize;
|
205
|
-
// const size_t off = (ptrval - _start) * _objectSizeReciprocal;
|
206
|
-
const size_t off = mh->getUnmeshedOff(reinterpret_cast<const void *>(_arenaBegin), ptr);
|
207
|
-
// hard_assert_msg(off == off2, "%zu != %zu", off, off2);
|
208
|
-
|
209
|
-
d_assert(off < 256);
|
210
|
-
|
211
|
-
if (likely(_off > 0)) {
|
212
|
-
push(sv::Entry{mh->svOffset(), static_cast<uint8_t>(off)});
|
213
|
-
} else {
|
214
|
-
freeFullSlowpath(mh, off);
|
215
|
-
}
|
216
|
-
}
|
217
|
-
|
218
|
-
void ATTRIBUTE_NEVER_INLINE freeFullSlowpath(MiniHeap *mh, size_t off) {
|
219
|
-
mh->freeOff(off);
|
220
|
-
}
|
221
|
-
|
222
|
-
// an attach takes ownership of the reference to mh
|
223
|
-
inline void reinit() {
|
224
|
-
_off = _maxCount;
|
225
|
-
_attachedOff = 0;
|
226
|
-
|
227
|
-
internal::mwcShuffle(_attachedMiniheaps.array_begin(), _attachedMiniheaps.array_end(), _prng);
|
228
|
-
|
229
|
-
for (size_t i = 0; i < _attachedMiniheaps.size(); i++) {
|
230
|
-
const auto mh = _attachedMiniheaps[i];
|
231
|
-
_start[i] = mh->getSpanStart(_arenaBegin);
|
232
|
-
mh->setSvOffset(i);
|
233
|
-
d_assert(mh->isAttached());
|
234
|
-
}
|
235
|
-
|
236
|
-
const bool addedCapacity = localRefill();
|
237
|
-
d_assert(addedCapacity);
|
238
|
-
}
|
239
|
-
|
240
|
-
inline void *ATTRIBUTE_ALWAYS_INLINE ptrFromOffset(sv::Entry off) const {
|
241
|
-
d_assert(off.miniheapOffset() < _attachedMiniheaps.size());
|
242
|
-
return reinterpret_cast<void *>(_start[off.miniheapOffset()] + off.bit() * _objectSize);
|
243
|
-
}
|
244
|
-
|
245
|
-
inline void *ATTRIBUTE_ALWAYS_INLINE malloc() {
|
246
|
-
d_assert(!isExhausted());
|
247
|
-
const auto off = pop();
|
248
|
-
return ptrFromOffset(off);
|
249
|
-
}
|
250
|
-
|
251
|
-
inline size_t getSize() {
|
252
|
-
return _objectSize;
|
253
|
-
}
|
254
|
-
|
255
|
-
// called once, on initialization of ThreadLocalHeap
|
256
|
-
inline void initialInit(const char *arenaBegin, uint32_t sz) {
|
257
|
-
_arenaBegin = arenaBegin;
|
258
|
-
_objectSize = sz;
|
259
|
-
_objectSizeReciprocal = 1.0 / (float)sz;
|
260
|
-
_maxCount = max(kPageSize / sz, kMinStringLen);
|
261
|
-
// initially, we are unattached and therefor have no capacity.
|
262
|
-
// Setting _off to _maxCount causes isExhausted() to return true
|
263
|
-
// so that we don't separately have to check !isAttached() in the
|
264
|
-
// malloc fastpath.
|
265
|
-
_off = _maxCount;
|
266
|
-
}
|
267
|
-
|
268
|
-
private:
|
269
|
-
uintptr_t _start[kMaxMiniheapsPerShuffleVector]; // 32 32
|
270
|
-
const char *_arenaBegin; // 8 40
|
271
|
-
int16_t _maxCount{0}; // 2 42
|
272
|
-
int16_t _off{0}; // 2 44
|
273
|
-
uint32_t _objectSize{0}; // 4 48
|
274
|
-
FixedArray<MiniHeap, kMaxMiniheapsPerShuffleVector> _attachedMiniheaps{}; // 36 128
|
275
|
-
MWC _prng; // 36 84
|
276
|
-
float _objectSizeReciprocal{0.0}; // 4 88
|
277
|
-
uint32_t _attachedOff{0}; //
|
278
|
-
sv::Entry _list[kMaxShuffleVectorLength] CACHELINE_ALIGNED; // 512 640
|
279
|
-
};
|
280
|
-
|
281
|
-
static_assert(HL::gcd<sizeof(ShuffleVector), CACHELINE_SIZE>::value == CACHELINE_SIZE,
|
282
|
-
"ShuffleVector not multiple of cacheline size!");
|
283
|
-
// FIXME should fit in 640
|
284
|
-
// static_assert(sizeof(ShuffleVector) == 704, "ShuffleVector not expected size!");
|
285
|
-
} // namespace mesh
|
286
|
-
|
287
|
-
#endif // MESH_SHUFFLE_VECTOR_H
|
@@ -1,251 +0,0 @@
|
|
1
|
-
// small size classes
|
2
|
-
1, // 0 -> 16
|
3
|
-
1, // 8 -> 16
|
4
|
-
1, // 16 -> 16
|
5
|
-
2, // 24 -> 32
|
6
|
-
2, // 32 -> 32
|
7
|
-
3, // 40 -> 48
|
8
|
-
3, // 48 -> 48
|
9
|
-
4, // 56 -> 64
|
10
|
-
4, // 64 -> 64
|
11
|
-
5, // 72 -> 80
|
12
|
-
5, // 80 -> 80
|
13
|
-
6, // 88 -> 96
|
14
|
-
6, // 96 -> 96
|
15
|
-
7, // 104 -> 112
|
16
|
-
7, // 112 -> 112
|
17
|
-
8, // 120 -> 128
|
18
|
-
8, // 128 -> 128
|
19
|
-
9, // 136 -> 160
|
20
|
-
9, // 144 -> 160
|
21
|
-
9, // 152 -> 160
|
22
|
-
9, // 160 -> 160
|
23
|
-
10, // 168 -> 192
|
24
|
-
10, // 176 -> 192
|
25
|
-
10, // 184 -> 192
|
26
|
-
10, // 192 -> 192
|
27
|
-
11, // 200 -> 224
|
28
|
-
11, // 208 -> 224
|
29
|
-
11, // 216 -> 224
|
30
|
-
11, // 224 -> 224
|
31
|
-
12, // 232 -> 256
|
32
|
-
12, // 240 -> 256
|
33
|
-
12, // 248 -> 256
|
34
|
-
12, // 256 -> 256
|
35
|
-
13, // 264 -> 320
|
36
|
-
13, // 272 -> 320
|
37
|
-
13, // 280 -> 320
|
38
|
-
13, // 288 -> 320
|
39
|
-
13, // 296 -> 320
|
40
|
-
13, // 304 -> 320
|
41
|
-
13, // 312 -> 320
|
42
|
-
13, // 320 -> 320
|
43
|
-
14, // 328 -> 384
|
44
|
-
14, // 336 -> 384
|
45
|
-
14, // 344 -> 384
|
46
|
-
14, // 352 -> 384
|
47
|
-
14, // 360 -> 384
|
48
|
-
14, // 368 -> 384
|
49
|
-
14, // 376 -> 384
|
50
|
-
14, // 384 -> 384
|
51
|
-
15, // 392 -> 448
|
52
|
-
15, // 400 -> 448
|
53
|
-
15, // 408 -> 448
|
54
|
-
15, // 416 -> 448
|
55
|
-
15, // 424 -> 448
|
56
|
-
15, // 432 -> 448
|
57
|
-
15, // 440 -> 448
|
58
|
-
15, // 448 -> 448
|
59
|
-
16, // 456 -> 512
|
60
|
-
16, // 464 -> 512
|
61
|
-
16, // 472 -> 512
|
62
|
-
16, // 480 -> 512
|
63
|
-
16, // 488 -> 512
|
64
|
-
16, // 496 -> 512
|
65
|
-
16, // 504 -> 512
|
66
|
-
16, // 512 -> 512
|
67
|
-
17, // 520 -> 640
|
68
|
-
17, // 528 -> 640
|
69
|
-
17, // 536 -> 640
|
70
|
-
17, // 544 -> 640
|
71
|
-
17, // 552 -> 640
|
72
|
-
17, // 560 -> 640
|
73
|
-
17, // 568 -> 640
|
74
|
-
17, // 576 -> 640
|
75
|
-
17, // 584 -> 640
|
76
|
-
17, // 592 -> 640
|
77
|
-
17, // 600 -> 640
|
78
|
-
17, // 608 -> 640
|
79
|
-
17, // 616 -> 640
|
80
|
-
17, // 624 -> 640
|
81
|
-
17, // 632 -> 640
|
82
|
-
17, // 640 -> 640
|
83
|
-
18, // 648 -> 768
|
84
|
-
18, // 656 -> 768
|
85
|
-
18, // 664 -> 768
|
86
|
-
18, // 672 -> 768
|
87
|
-
18, // 680 -> 768
|
88
|
-
18, // 688 -> 768
|
89
|
-
18, // 696 -> 768
|
90
|
-
18, // 704 -> 768
|
91
|
-
18, // 712 -> 768
|
92
|
-
18, // 720 -> 768
|
93
|
-
18, // 728 -> 768
|
94
|
-
18, // 736 -> 768
|
95
|
-
18, // 744 -> 768
|
96
|
-
18, // 752 -> 768
|
97
|
-
18, // 760 -> 768
|
98
|
-
18, // 768 -> 768
|
99
|
-
19, // 776 -> 896
|
100
|
-
19, // 784 -> 896
|
101
|
-
19, // 792 -> 896
|
102
|
-
19, // 800 -> 896
|
103
|
-
19, // 808 -> 896
|
104
|
-
19, // 816 -> 896
|
105
|
-
19, // 824 -> 896
|
106
|
-
19, // 832 -> 896
|
107
|
-
19, // 840 -> 896
|
108
|
-
19, // 848 -> 896
|
109
|
-
19, // 856 -> 896
|
110
|
-
19, // 864 -> 896
|
111
|
-
19, // 872 -> 896
|
112
|
-
19, // 880 -> 896
|
113
|
-
19, // 888 -> 896
|
114
|
-
19, // 896 -> 896
|
115
|
-
20, // 904 -> 1024
|
116
|
-
20, // 912 -> 1024
|
117
|
-
20, // 920 -> 1024
|
118
|
-
20, // 928 -> 1024
|
119
|
-
20, // 936 -> 1024
|
120
|
-
20, // 944 -> 1024
|
121
|
-
20, // 952 -> 1024
|
122
|
-
20, // 960 -> 1024
|
123
|
-
20, // 968 -> 1024
|
124
|
-
20, // 976 -> 1024
|
125
|
-
20, // 984 -> 1024
|
126
|
-
20, // 992 -> 1024
|
127
|
-
20, // 1000 -> 1024
|
128
|
-
20, // 1008 -> 1024
|
129
|
-
20, // 1016 -> 1024
|
130
|
-
20, // 1024 -> 1024
|
131
|
-
// large size classes
|
132
|
-
21, // 1152 -> 2048
|
133
|
-
21, // 1280 -> 2048
|
134
|
-
21, // 1408 -> 2048
|
135
|
-
21, // 1536 -> 2048
|
136
|
-
21, // 1664 -> 2048
|
137
|
-
21, // 1792 -> 2048
|
138
|
-
21, // 1920 -> 2048
|
139
|
-
21, // 2048 -> 2048
|
140
|
-
22, // 2176 -> 4096
|
141
|
-
22, // 2304 -> 4096
|
142
|
-
22, // 2432 -> 4096
|
143
|
-
22, // 2560 -> 4096
|
144
|
-
22, // 2688 -> 4096
|
145
|
-
22, // 2816 -> 4096
|
146
|
-
22, // 2944 -> 4096
|
147
|
-
22, // 3072 -> 4096
|
148
|
-
22, // 3200 -> 4096
|
149
|
-
22, // 3328 -> 4096
|
150
|
-
22, // 3456 -> 4096
|
151
|
-
22, // 3584 -> 4096
|
152
|
-
22, // 3712 -> 4096
|
153
|
-
22, // 3840 -> 4096
|
154
|
-
22, // 3968 -> 4096
|
155
|
-
22, // 4096 -> 4096
|
156
|
-
23, // 4224 -> 8192
|
157
|
-
23, // 4352 -> 8192
|
158
|
-
23, // 4480 -> 8192
|
159
|
-
23, // 4608 -> 8192
|
160
|
-
23, // 4736 -> 8192
|
161
|
-
23, // 4864 -> 8192
|
162
|
-
23, // 4992 -> 8192
|
163
|
-
23, // 5120 -> 8192
|
164
|
-
23, // 5248 -> 8192
|
165
|
-
23, // 5376 -> 8192
|
166
|
-
23, // 5504 -> 8192
|
167
|
-
23, // 5632 -> 8192
|
168
|
-
23, // 5760 -> 8192
|
169
|
-
23, // 5888 -> 8192
|
170
|
-
23, // 6016 -> 8192
|
171
|
-
23, // 6144 -> 8192
|
172
|
-
23, // 6272 -> 8192
|
173
|
-
23, // 6400 -> 8192
|
174
|
-
23, // 6528 -> 8192
|
175
|
-
23, // 6656 -> 8192
|
176
|
-
23, // 6784 -> 8192
|
177
|
-
23, // 6912 -> 8192
|
178
|
-
23, // 7040 -> 8192
|
179
|
-
23, // 7168 -> 8192
|
180
|
-
23, // 7296 -> 8192
|
181
|
-
23, // 7424 -> 8192
|
182
|
-
23, // 7552 -> 8192
|
183
|
-
23, // 7680 -> 8192
|
184
|
-
23, // 7808 -> 8192
|
185
|
-
23, // 7936 -> 8192
|
186
|
-
23, // 8064 -> 8192
|
187
|
-
23, // 8192 -> 8192
|
188
|
-
24, // 8320 -> 16384
|
189
|
-
24, // 8448 -> 16384
|
190
|
-
24, // 8576 -> 16384
|
191
|
-
24, // 8704 -> 16384
|
192
|
-
24, // 8832 -> 16384
|
193
|
-
24, // 8960 -> 16384
|
194
|
-
24, // 9088 -> 16384
|
195
|
-
24, // 9216 -> 16384
|
196
|
-
24, // 9344 -> 16384
|
197
|
-
24, // 9472 -> 16384
|
198
|
-
24, // 9600 -> 16384
|
199
|
-
24, // 9728 -> 16384
|
200
|
-
24, // 9856 -> 16384
|
201
|
-
24, // 9984 -> 16384
|
202
|
-
24, // 10112 -> 16384
|
203
|
-
24, // 10240 -> 16384
|
204
|
-
24, // 10368 -> 16384
|
205
|
-
24, // 10496 -> 16384
|
206
|
-
24, // 10624 -> 16384
|
207
|
-
24, // 10752 -> 16384
|
208
|
-
24, // 10880 -> 16384
|
209
|
-
24, // 11008 -> 16384
|
210
|
-
24, // 11136 -> 16384
|
211
|
-
24, // 11264 -> 16384
|
212
|
-
24, // 11392 -> 16384
|
213
|
-
24, // 11520 -> 16384
|
214
|
-
24, // 11648 -> 16384
|
215
|
-
24, // 11776 -> 16384
|
216
|
-
24, // 11904 -> 16384
|
217
|
-
24, // 12032 -> 16384
|
218
|
-
24, // 12160 -> 16384
|
219
|
-
24, // 12288 -> 16384
|
220
|
-
24, // 12416 -> 16384
|
221
|
-
24, // 12544 -> 16384
|
222
|
-
24, // 12672 -> 16384
|
223
|
-
24, // 12800 -> 16384
|
224
|
-
24, // 12928 -> 16384
|
225
|
-
24, // 13056 -> 16384
|
226
|
-
24, // 13184 -> 16384
|
227
|
-
24, // 13312 -> 16384
|
228
|
-
24, // 13440 -> 16384
|
229
|
-
24, // 13568 -> 16384
|
230
|
-
24, // 13696 -> 16384
|
231
|
-
24, // 13824 -> 16384
|
232
|
-
24, // 13952 -> 16384
|
233
|
-
24, // 14080 -> 16384
|
234
|
-
24, // 14208 -> 16384
|
235
|
-
24, // 14336 -> 16384
|
236
|
-
24, // 14464 -> 16384
|
237
|
-
24, // 14592 -> 16384
|
238
|
-
24, // 14720 -> 16384
|
239
|
-
24, // 14848 -> 16384
|
240
|
-
24, // 14976 -> 16384
|
241
|
-
24, // 15104 -> 16384
|
242
|
-
24, // 15232 -> 16384
|
243
|
-
24, // 15360 -> 16384
|
244
|
-
24, // 15488 -> 16384
|
245
|
-
24, // 15616 -> 16384
|
246
|
-
24, // 15744 -> 16384
|
247
|
-
24, // 15872 -> 16384
|
248
|
-
24, // 16000 -> 16384
|
249
|
-
24, // 16128 -> 16384
|
250
|
-
24, // 16256 -> 16384
|
251
|
-
24, // 16384 -> 16384
|