Compare commits
68 Commits
Author | SHA1 | Date | |
---|---|---|---|
c11b4714b5 | |||
bc13094406 | |||
c9d742b696 | |||
795ae7cb01 | |||
849e2d3e5c | |||
1560037680 | |||
764c31bbc8 | |||
ee3361952a | |||
8a04e57353 | |||
7f86fdee66 | |||
442755d0a6 | |||
e15b3bb137 | |||
311794c37e | |||
dfa178ba19 | |||
a16d18edfe | |||
2b60287448 | |||
0a9ac59676 | |||
e3a77ed773 | |||
cdf9a8a7b0 | |||
305dfdd52f | |||
7261c91492 | |||
f11720f5ae | |||
e2b7298af5 | |||
8e1e344f4b | |||
3634b6a59b | |||
a3cc14c807 | |||
55b3275434 | |||
3a5b86ed9e | |||
159f2eef74 | |||
2952abe811 | |||
ce54746a4a | |||
b15959d62c | |||
b009de1c2b | |||
55a230c75e | |||
0711ec3831 | |||
0280bd77e5 | |||
359f6f0042 | |||
aa8504ddba | |||
fb7cf18f9b | |||
b808b97940 | |||
e480f66846 | |||
d5bc9221a0 | |||
9d23b81d6f | |||
0740dcad43 | |||
176df61321 | |||
0a850f22e9 | |||
479b39d055 | |||
482408d725 | |||
45995e3307 | |||
359b0b29ff | |||
54e47ebd40 | |||
1c9dda68a6 | |||
142455dd28 | |||
567d385fbd | |||
8a44055533 | |||
62516825d1 | |||
3d592bd6a9 | |||
f5f5fb620b | |||
e3d1b2e842 | |||
9f8800af16 | |||
182c065c8e | |||
2dba0d5be3 | |||
a1dfdf355c | |||
15919cb1c4 | |||
5ed9003a83 | |||
84c6a2bfc2 | |||
b5772a6aa0 | |||
e6c39981b9 |
@@ -1,7 +1,7 @@
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
project(
|
||||
conflict-set
|
||||
VERSION 0.0.10
|
||||
VERSION 0.0.13
|
||||
DESCRIPTION
|
||||
"A data structure for optimistic concurrency control on ranges of bitwise-lexicographically-ordered keys."
|
||||
HOMEPAGE_URL "https://git.weaselab.dev/weaselab/conflict-set"
|
||||
@@ -31,14 +31,12 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||
"MinSizeRel" "RelWithDebInfo")
|
||||
endif()
|
||||
|
||||
add_compile_options(
|
||||
-fdata-sections
|
||||
-ffunction-sections
|
||||
-Wswitch-enum
|
||||
-Werror=switch-enum
|
||||
-fPIC
|
||||
-g
|
||||
-fno-omit-frame-pointer)
|
||||
add_compile_options(-fdata-sections -ffunction-sections -Wswitch-enum
|
||||
-Werror=switch-enum -fPIC)
|
||||
if(NOT APPLE)
|
||||
# This causes some versions of clang to crash on macos
|
||||
add_compile_options(-g -fno-omit-frame-pointer)
|
||||
endif()
|
||||
|
||||
set(full_relro_flags "-pie;LINKER:-z,relro,-z,now,-z,noexecstack")
|
||||
cmake_push_check_state()
|
||||
@@ -278,9 +276,15 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR AND BUILD_TESTING)
|
||||
|
||||
find_program(VALGRIND_EXE valgrind)
|
||||
if(VALGRIND_EXE AND NOT CMAKE_CROSSCOMPILING)
|
||||
add_test(NAME conflict_set_blackbox_valgrind
|
||||
COMMAND ${VALGRIND_EXE} --error-exitcode=99 --
|
||||
$<TARGET_FILE:driver> ${CORPUS_TESTS})
|
||||
list(LENGTH CORPUS_TESTS len)
|
||||
math(EXPR last "${len} - 1")
|
||||
set(partition_size 100)
|
||||
foreach(i RANGE 0 ${last} ${partition_size})
|
||||
list(SUBLIST CORPUS_TESTS ${i} ${partition_size} partition)
|
||||
add_test(NAME conflict_set_blackbox_valgrind_${i}
|
||||
COMMAND ${VALGRIND_EXE} --error-exitcode=99 --
|
||||
$<TARGET_FILE:driver> ${partition})
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
# api smoke tests
|
||||
|
1313
ConflictSet.cpp
1313
ConflictSet.cpp
File diff suppressed because it is too large
Load Diff
14
Internal.h
14
Internal.h
@@ -20,7 +20,6 @@ using namespace weaselab;
|
||||
#include <thread>
|
||||
#include <unordered_set>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include <callgrind.h>
|
||||
|
||||
@@ -273,6 +272,16 @@ template <class T> struct Vector {
|
||||
size_ += slice.size();
|
||||
}
|
||||
|
||||
// Caller must write to the returned slice
|
||||
std::span<T> unsafePrepareAppend(int appendSize) {
|
||||
if (size_ + appendSize > capacity) {
|
||||
grow(std::max<int>(size_ + appendSize, capacity * 2));
|
||||
}
|
||||
auto result = std::span<T>(t + size_, appendSize);
|
||||
size_ += appendSize;
|
||||
return result;
|
||||
}
|
||||
|
||||
void push_back(const T &t) { append(std::span<const T>(&t, 1)); }
|
||||
|
||||
T *begin() { return t; }
|
||||
@@ -738,7 +747,10 @@ struct TestDriver {
|
||||
fprintf(stderr, "%p Set oldest version: %" PRId64 "\n", this,
|
||||
oldestVersion);
|
||||
#endif
|
||||
CALLGRIND_START_INSTRUMENTATION;
|
||||
cs.setOldestVersion(oldestVersion);
|
||||
CALLGRIND_STOP_INSTRUMENTATION;
|
||||
|
||||
if constexpr (kEnableAssertions) {
|
||||
refImpl.setOldestVersion(oldestVersion);
|
||||
}
|
||||
|
28
Jenkinsfile
vendored
28
Jenkinsfile
vendored
@@ -48,6 +48,17 @@ pipeline {
|
||||
recordIssues(tools: [clang()])
|
||||
}
|
||||
}
|
||||
stage('64 bit versions') {
|
||||
agent {
|
||||
dockerfile {
|
||||
args '-v /home/jenkins/ccache:/ccache'
|
||||
reuseNode true
|
||||
}
|
||||
}
|
||||
steps {
|
||||
CleanBuildAndTest("-DCMAKE_CXX_FLAGS=-DUSE_64_BIT=1")
|
||||
}
|
||||
}
|
||||
stage('Debug') {
|
||||
agent {
|
||||
dockerfile {
|
||||
@@ -117,15 +128,18 @@ pipeline {
|
||||
}
|
||||
}
|
||||
steps {
|
||||
script {
|
||||
filter_args = "-f ConflictSet.cpp -f LongestCommonPrefix.h"
|
||||
}
|
||||
CleanBuildAndTest("-DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_C_FLAGS=--coverage -DCMAKE_CXX_FLAGS=--coverage -DCMAKE_BUILD_TYPE=Debug -DDISABLE_TSAN=ON")
|
||||
sh '''
|
||||
gcovr -f ConflictSet.cpp --cobertura > build/coverage.xml
|
||||
'''
|
||||
sh """
|
||||
gcovr ${filter_args} --cobertura > build/coverage.xml
|
||||
"""
|
||||
recordCoverage qualityGates: [[criticality: 'NOTE', metric: 'MODULE']], tools: [[parser: 'COBERTURA', pattern: 'build/coverage.xml']]
|
||||
sh '''
|
||||
gcovr -f ConflictSet.cpp
|
||||
gcovr -f ConflictSet.cpp --fail-under-line 100 > /dev/null
|
||||
'''
|
||||
sh """
|
||||
gcovr ${filter_args}
|
||||
gcovr ${filter_args} --fail-under-line 100 > /dev/null
|
||||
"""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
185
LongestCommonPrefix.h
Normal file
185
LongestCommonPrefix.h
Normal file
@@ -0,0 +1,185 @@
|
||||
#pragma once
|
||||
|
||||
#include <assert.h>
|
||||
#include <bit>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef HAS_AVX
|
||||
#include <immintrin.h>
|
||||
#elif HAS_ARM_NEON
|
||||
#include <arm_neon.h>
|
||||
#endif
|
||||
|
||||
#ifndef __SANITIZE_THREAD__
|
||||
#if defined(__has_feature)
|
||||
#if __has_feature(thread_sanitizer)
|
||||
#define __SANITIZE_THREAD__
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(HAS_AVX) || defined(HAS_ARM_NEON)
|
||||
constexpr int kStride = 64;
|
||||
#else
|
||||
constexpr int kStride = 16;
|
||||
#endif
|
||||
|
||||
constexpr int kUnrollFactor = 4;
|
||||
|
||||
inline bool compareStride(const uint8_t *ap, const uint8_t *bp) {
|
||||
#if defined(HAS_ARM_NEON)
|
||||
static_assert(kStride == 64);
|
||||
uint8x16_t x[4]; // GCOVR_EXCL_LINE
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
x[i] = vceqq_u8(vld1q_u8(ap + i * 16), vld1q_u8(bp + i * 16));
|
||||
}
|
||||
auto results = vreinterpretq_u16_u8(
|
||||
vandq_u8(vandq_u8(x[0], x[1]), vandq_u8(x[2], x[3])));
|
||||
bool eq = vget_lane_u64(vreinterpret_u64_u8(vshrn_n_u16(results, 4)), 0) ==
|
||||
uint64_t(-1);
|
||||
#elif defined(HAS_AVX)
|
||||
static_assert(kStride == 64);
|
||||
__m128i x[4]; // GCOVR_EXCL_LINE
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
x[i] = _mm_cmpeq_epi8(_mm_loadu_si128((__m128i *)(ap + i * 16)),
|
||||
_mm_loadu_si128((__m128i *)(bp + i * 16)));
|
||||
}
|
||||
auto eq =
|
||||
_mm_movemask_epi8(_mm_and_si128(_mm_and_si128(x[0], x[1]),
|
||||
_mm_and_si128(x[2], x[3]))) == 0xffff;
|
||||
#else
|
||||
// Hope it gets vectorized
|
||||
auto eq = memcmp(ap, bp, kStride) == 0;
|
||||
#endif
|
||||
return eq;
|
||||
}
|
||||
|
||||
// Precondition: ap[:kStride] != bp[:kStride]
|
||||
inline int firstNeqStride(const uint8_t *ap, const uint8_t *bp) {
|
||||
#if defined(HAS_AVX)
|
||||
static_assert(kStride == 64);
|
||||
uint64_t c[kStride / 16]; // GCOVR_EXCL_LINE
|
||||
for (int i = 0; i < kStride; i += 16) {
|
||||
const auto a = _mm_loadu_si128((__m128i *)(ap + i));
|
||||
const auto b = _mm_loadu_si128((__m128i *)(bp + i));
|
||||
const auto compared = _mm_cmpeq_epi8(a, b);
|
||||
c[i / 16] = _mm_movemask_epi8(compared) & 0xffff;
|
||||
}
|
||||
return std::countr_zero(~(c[0] | c[1] << 16 | c[2] << 32 | c[3] << 48));
|
||||
#elif defined(HAS_ARM_NEON)
|
||||
static_assert(kStride == 64);
|
||||
for (int i = 0; i < kStride; i += 16) {
|
||||
// 0xff for each match
|
||||
uint16x8_t results =
|
||||
vreinterpretq_u16_u8(vceqq_u8(vld1q_u8(ap + i), vld1q_u8(bp + i)));
|
||||
// 0xf for each mismatch
|
||||
uint64_t bitfield =
|
||||
~vget_lane_u64(vreinterpret_u64_u8(vshrn_n_u16(results, 4)), 0);
|
||||
if (bitfield) {
|
||||
return i + (std::countr_zero(bitfield) >> 2);
|
||||
}
|
||||
}
|
||||
__builtin_unreachable(); // GCOVR_EXCL_LINE
|
||||
#else
|
||||
int i = 0;
|
||||
for (; i < kStride - 1; ++i) {
|
||||
if (*ap++ != *bp++) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return i;
|
||||
#endif
|
||||
}
|
||||
|
||||
// This gets covered in local development
|
||||
// GCOVR_EXCL_START
|
||||
#if defined(HAS_AVX) && !defined(__SANITIZE_THREAD__)
|
||||
__attribute__((target("avx512f,avx512bw"))) inline int
|
||||
longestCommonPrefix(const uint8_t *ap, const uint8_t *bp, int cl) {
|
||||
int i = 0;
|
||||
int end = cl & ~63;
|
||||
while (i < end) {
|
||||
const uint64_t eq =
|
||||
_mm512_cmpeq_epi8_mask(_mm512_loadu_epi8(ap), _mm512_loadu_epi8(bp));
|
||||
if (eq != uint64_t(-1)) {
|
||||
return i + std::countr_one(eq);
|
||||
}
|
||||
i += 64;
|
||||
ap += 64;
|
||||
bp += 64;
|
||||
}
|
||||
if (i < cl) {
|
||||
const uint64_t mask = (uint64_t(1) << (cl - i)) - 1;
|
||||
const uint64_t eq = _mm512_cmpeq_epi8_mask(
|
||||
_mm512_maskz_loadu_epi8(mask, ap), _mm512_maskz_loadu_epi8(mask, bp));
|
||||
return i + std::countr_one(eq & mask);
|
||||
}
|
||||
assert(i == cl);
|
||||
return i;
|
||||
}
|
||||
__attribute__((target("default")))
|
||||
#endif
|
||||
// GCOVR_EXCL_STOP
|
||||
|
||||
inline int
|
||||
longestCommonPrefix(const uint8_t *ap, const uint8_t *bp, int cl) {
|
||||
if (!(cl >= 0)) {
|
||||
__builtin_unreachable(); // GCOVR_EXCL_LINE
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
int end;
|
||||
|
||||
// kStride * kUnrollCount at a time
|
||||
end = cl & ~(kStride * kUnrollFactor - 1);
|
||||
while (i < end) {
|
||||
for (int j = 0; j < kUnrollFactor; ++j) {
|
||||
if (!compareStride(ap, bp)) {
|
||||
return i + firstNeqStride(ap, bp);
|
||||
}
|
||||
i += kStride;
|
||||
ap += kStride;
|
||||
bp += kStride;
|
||||
}
|
||||
}
|
||||
|
||||
// kStride at a time
|
||||
end = cl & ~(kStride - 1);
|
||||
while (i < end) {
|
||||
if (!compareStride(ap, bp)) {
|
||||
return i + firstNeqStride(ap, bp);
|
||||
}
|
||||
i += kStride;
|
||||
ap += kStride;
|
||||
bp += kStride;
|
||||
}
|
||||
|
||||
// word at a time
|
||||
end = cl & ~(sizeof(uint64_t) - 1);
|
||||
while (i < end) {
|
||||
uint64_t a; // GCOVR_EXCL_LINE
|
||||
uint64_t b; // GCOVR_EXCL_LINE
|
||||
memcpy(&a, ap, 8);
|
||||
memcpy(&b, bp, 8);
|
||||
const auto mismatched = a ^ b;
|
||||
if (mismatched) {
|
||||
return i + std::countr_zero(mismatched) / 8;
|
||||
}
|
||||
i += 8;
|
||||
ap += 8;
|
||||
bp += 8;
|
||||
}
|
||||
|
||||
// byte at a time
|
||||
while (i < cl) {
|
||||
if (*ap != *bp) {
|
||||
break;
|
||||
}
|
||||
++ap;
|
||||
++bp;
|
||||
++i;
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
20
README.md
20
README.md
@@ -24,15 +24,15 @@ Hardware for all benchmarks is an AMD Ryzen 9 7900 with (2x32GB) 5600MT/s CL28-3
|
||||
|
||||
| ns/op | op/s | err% | ins/op | cyc/op | IPC | bra/op | miss% | total | benchmark
|
||||
|--------------------:|--------------------:|--------:|----------------:|----------------:|-------:|---------------:|--------:|----------:|:----------
|
||||
| 12.42 | 80,500,398.66 | 0.8% | 180.38 | 61.57 | 2.930 | 41.51 | 0.4% | 0.01 | `point reads`
|
||||
| 15.17 | 65,917,580.99 | 0.2% | 279.47 | 74.95 | 3.729 | 55.54 | 0.3% | 0.01 | `prefix reads`
|
||||
| 38.16 | 26,202,393.91 | 0.1% | 803.07 | 189.13 | 4.246 | 141.68 | 0.2% | 0.01 | `range reads`
|
||||
| 20.20 | 49,504,615.44 | 0.4% | 363.00 | 100.35 | 3.617 | 49.81 | 0.3% | 0.01 | `point writes`
|
||||
| 41.99 | 23,816,559.99 | 0.3% | 799.27 | 209.63 | 3.813 | 154.32 | 0.1% | 0.01 | `prefix writes`
|
||||
| 46.28 | 21,607,605.88 | 1.5% | 953.79 | 231.47 | 4.121 | 168.34 | 0.0% | 0.01 | `range writes`
|
||||
| 80.99 | 12,347,449.98 | 0.9% | 1,501.97 | 406.50 | 3.695 | 281.89 | 0.1% | 0.01 | `monotonic increasing point writes`
|
||||
| 318,010.00 | 3,144.56 | 1.0% | 3,994,511.50 | 1,657,831.50 | 2.409 | 805,969.50 | 0.0% | 0.01 | `worst case for radix tree`
|
||||
| 75.85 | 13,183,612.56 | 0.5% | 1,590.01 | 385.64 | 4.123 | 258.00 | 0.0% | 0.01 | `create and destroy`
|
||||
| 11.18 | 89,455,125.34 | 0.6% | 185.37 | 57.08 | 3.248 | 41.51 | 0.4% | 0.01 | `point reads`
|
||||
| 14.53 | 68,800,688.89 | 0.4% | 282.41 | 74.80 | 3.776 | 55.06 | 0.3% | 0.01 | `prefix reads`
|
||||
| 36.54 | 27,367,576.87 | 0.2% | 798.06 | 188.90 | 4.225 | 141.69 | 0.2% | 0.01 | `range reads`
|
||||
| 16.69 | 59,912,106.02 | 0.6% | 314.57 | 86.29 | 3.645 | 39.84 | 0.4% | 0.01 | `point writes`
|
||||
| 30.09 | 33,235,744.07 | 0.5% | 591.33 | 155.92 | 3.793 | 82.69 | 0.2% | 0.01 | `prefix writes`
|
||||
| 35.77 | 27,956,388.03 | 1.4% | 682.25 | 187.63 | 3.636 | 96.12 | 0.1% | 0.01 | `range writes`
|
||||
| 74.04 | 13,505,408.41 | 2.7% | 1,448.95 | 392.10 | 3.695 | 260.53 | 0.1% | 0.01 | `monotonic increasing point writes`
|
||||
| 330,984.50 | 3,021.29 | 1.9% | 3,994,153.50 | 1,667,309.00 | 2.396 | 806,019.50 | 0.0% | 0.01 | `worst case for radix tree`
|
||||
| 92.46 | 10,814,961.65 | 0.5% | 1,800.00 | 463.41 | 3.884 | 297.00 | 0.0% | 0.01 | `create and destroy`
|
||||
|
||||
# "Real data" test
|
||||
|
||||
@@ -47,7 +47,7 @@ Check: 4.47891 seconds, 364.05 MB/s, Add: 4.55599 seconds, 123.058 MB/s, Gc rati
|
||||
## radix tree
|
||||
|
||||
```
|
||||
Check: 0.963721 seconds, 1691.93 MB/s, Add: 1.3288 seconds, 421.924 MB/s, Gc ratio: 42.8819%
|
||||
Check: 0.953012 seconds, 1710.94 MB/s, Add: 1.30025 seconds, 431.188 MB/s, Gc ratio: 43.9816%, Peak idle memory: 2.28375e+06
|
||||
```
|
||||
|
||||
## hash table
|
||||
|
148
ServerBench.cpp
148
ServerBench.cpp
@@ -6,11 +6,15 @@
|
||||
#include <string.h>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/uio.h>
|
||||
#include <thread>
|
||||
#include <unistd.h>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "ConflictSet.h"
|
||||
#include "third_party/nadeau.h"
|
||||
@@ -20,8 +24,8 @@ std::atomic<int64_t> transactions;
|
||||
constexpr int kBaseSearchDepth = 32;
|
||||
constexpr int kWindowSize = 10000000;
|
||||
|
||||
std::basic_string<uint8_t> numToKey(int64_t num) {
|
||||
std::basic_string<uint8_t> result;
|
||||
std::string numToKey(int64_t num) {
|
||||
std::string result;
|
||||
result.resize(kBaseSearchDepth + sizeof(int64_t));
|
||||
memset(result.data(), 0, kBaseSearchDepth);
|
||||
int64_t be = __builtin_bswap64(num);
|
||||
@@ -41,13 +45,13 @@ void workload(weaselab::ConflictSet *cs) {
|
||||
auto pointK = numToKey(pointRv);
|
||||
weaselab::ConflictSet::ReadRange reads[] = {
|
||||
{
|
||||
{pointK.data(), int(pointK.size())},
|
||||
{(const uint8_t *)pointK.data(), int(pointK.size())},
|
||||
{nullptr, 0},
|
||||
pointRv,
|
||||
},
|
||||
{
|
||||
{beginK.data(), int(beginK.size())},
|
||||
{endK.data(), int(endK.size())},
|
||||
{(const uint8_t *)beginK.data(), int(beginK.size())},
|
||||
{(const uint8_t *)endK.data(), int(endK.size())},
|
||||
version - 2,
|
||||
},
|
||||
};
|
||||
@@ -66,7 +70,7 @@ void workload(weaselab::ConflictSet *cs) {
|
||||
{
|
||||
weaselab::ConflictSet::WriteRange w;
|
||||
auto k = numToKey(version);
|
||||
w.begin.p = k.data();
|
||||
w.begin.p = (const uint8_t *)k.data();
|
||||
w.end.len = 0;
|
||||
if (version % (kWindowSize / 2) == 0) {
|
||||
for (int l = 0; l <= k.size(); ++l) {
|
||||
@@ -76,6 +80,14 @@ void workload(weaselab::ConflictSet *cs) {
|
||||
} else {
|
||||
w.begin.len = k.size();
|
||||
cs->addWrites(&w, 1, version);
|
||||
int64_t beginN = version - kWindowSize + rand() % kWindowSize;
|
||||
auto b = numToKey(beginN);
|
||||
auto e = numToKey(beginN + 1000);
|
||||
w.begin.p = (const uint8_t *)b.data();
|
||||
w.begin.len = b.size();
|
||||
w.end.p = (const uint8_t *)e.data();
|
||||
w.end.len = e.size();
|
||||
cs->addWrites(&w, 1, version);
|
||||
}
|
||||
}
|
||||
// GC
|
||||
@@ -156,6 +168,68 @@ double toSeconds(timeval t) {
|
||||
return double(t.tv_sec) + double(t.tv_usec) * 1e-6;
|
||||
}
|
||||
|
||||
#ifdef __linux__
|
||||
#include <linux/perf_event.h>
|
||||
struct PerfCounter {
|
||||
PerfCounter(int type, int config, const std::string &labels = {},
|
||||
int groupLeaderFd = -1)
|
||||
: labels(labels) {
|
||||
struct perf_event_attr pe;
|
||||
|
||||
memset(&pe, 0, sizeof(pe));
|
||||
pe.type = type;
|
||||
pe.size = sizeof(pe);
|
||||
pe.config = config;
|
||||
pe.inherit = 1;
|
||||
pe.exclude_kernel = 1;
|
||||
pe.exclude_hv = 1;
|
||||
|
||||
fd = perf_event_open(&pe, 0, -1, groupLeaderFd, 0);
|
||||
if (fd < 0 && errno != ENOENT && errno != EINVAL) {
|
||||
perror(labels.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
int64_t total() const {
|
||||
int64_t count;
|
||||
if (read(fd, &count, sizeof(count)) != sizeof(count)) {
|
||||
perror("read instructions from perf");
|
||||
abort();
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
PerfCounter(PerfCounter &&other)
|
||||
: fd(std::exchange(other.fd, -1)), labels(std::move(other.labels)) {}
|
||||
PerfCounter &operator=(PerfCounter &&other) {
|
||||
fd = std::exchange(other.fd, -1);
|
||||
labels = std::move(other.labels);
|
||||
return *this;
|
||||
}
|
||||
|
||||
~PerfCounter() {
|
||||
if (fd >= 0) {
|
||||
close(fd);
|
||||
}
|
||||
}
|
||||
|
||||
bool ok() const { return fd >= 0; }
|
||||
const std::string &getLabels() const { return labels; }
|
||||
int getFd() const { return fd; }
|
||||
|
||||
private:
|
||||
int fd;
|
||||
std::string labels;
|
||||
static long perf_event_open(struct perf_event_attr *hw_event, pid_t pid,
|
||||
int cpu, int group_fd, unsigned long flags) {
|
||||
int ret;
|
||||
|
||||
ret = syscall(SYS_perf_event_open, hw_event, pid, cpu, group_fd, flags);
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
if (argc != 3) {
|
||||
goto fail;
|
||||
@@ -168,6 +242,50 @@ int main(int argc, char **argv) {
|
||||
int metricsCount;
|
||||
cs.getMetricsV1(&metrics, &metricsCount);
|
||||
|
||||
#ifdef __linux__
|
||||
PerfCounter instructions{PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS};
|
||||
PerfCounter cycles{PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES, "",
|
||||
instructions.getFd()};
|
||||
|
||||
std::vector<PerfCounter> cacheCounters;
|
||||
for (auto [id, idStr] : std::initializer_list<std::pair<int, std::string>>{
|
||||
{PERF_COUNT_HW_CACHE_L1D, "l1d"},
|
||||
{PERF_COUNT_HW_CACHE_L1I, "l1i"},
|
||||
{PERF_COUNT_HW_CACHE_LL, "ll"},
|
||||
{PERF_COUNT_HW_CACHE_DTLB, "dtlb"},
|
||||
{PERF_COUNT_HW_CACHE_ITLB, "itlb"},
|
||||
{PERF_COUNT_HW_CACHE_BPU, "bpu"},
|
||||
{PERF_COUNT_HW_CACHE_NODE, "node"},
|
||||
}) {
|
||||
for (auto [op, opStr] :
|
||||
std::initializer_list<std::pair<int, std::string>>{
|
||||
{PERF_COUNT_HW_CACHE_OP_READ, "read"},
|
||||
{PERF_COUNT_HW_CACHE_OP_WRITE, "write"},
|
||||
{PERF_COUNT_HW_CACHE_OP_PREFETCH, "prefetch"},
|
||||
}) {
|
||||
int groupLeaderFd = -1;
|
||||
for (auto [result, resultStr] :
|
||||
std::initializer_list<std::pair<int, std::string>>{
|
||||
{PERF_COUNT_HW_CACHE_RESULT_MISS, "miss"},
|
||||
{PERF_COUNT_HW_CACHE_RESULT_ACCESS, "access"},
|
||||
}) {
|
||||
auto labels = "{id=\"" + idStr + "\", op=\"" + opStr +
|
||||
"\", result=\"" + resultStr + "\"}";
|
||||
cacheCounters.emplace_back(PERF_TYPE_HW_CACHE,
|
||||
id | (op << 8) | (result << 16), labels,
|
||||
groupLeaderFd);
|
||||
if (!cacheCounters.back().ok()) {
|
||||
cacheCounters.pop_back();
|
||||
} else {
|
||||
if (groupLeaderFd == -1) {
|
||||
groupLeaderFd = cacheCounters.back().getFd();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
auto w = std::thread{workload, &cs};
|
||||
|
||||
for (;;) {
|
||||
@@ -195,6 +313,24 @@ int main(int argc, char **argv) {
|
||||
"transactions_total ";
|
||||
body += std::to_string(transactions.load(std::memory_order_relaxed));
|
||||
body += "\n";
|
||||
#ifdef __linux__
|
||||
body += "# HELP instructions_total Total number of instructions\n"
|
||||
"# TYPE instructions_total counter\n"
|
||||
"instructions_total ";
|
||||
body += std::to_string(instructions.total());
|
||||
body += "\n";
|
||||
body += "# HELP cycles_total Total number of cycles\n"
|
||||
"# TYPE cycles_total counter\n"
|
||||
"cycles_total ";
|
||||
body += std::to_string(cycles.total());
|
||||
body += "\n";
|
||||
body += "# HELP cache_event_total Total number of cache events\n"
|
||||
"# TYPE cache_event_total counter\n";
|
||||
for (const auto &counter : cacheCounters) {
|
||||
body += "cache_event_total" + counter.getLabels() + " " +
|
||||
std::to_string(counter.total()) + "\n";
|
||||
}
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < metricsCount; ++i) {
|
||||
body += "# HELP ";
|
||||
|
81
SkipList.cpp
81
SkipList.cpp
@@ -25,6 +25,7 @@
|
||||
|
||||
#include <algorithm>
|
||||
#include <span>
|
||||
#include <vector>
|
||||
|
||||
std::span<const uint8_t> keyAfter(Arena &arena, std::span<const uint8_t> key) {
|
||||
auto result =
|
||||
@@ -115,15 +116,6 @@ bool operator==(const KeyInfo &lhs, const KeyInfo &rhs) {
|
||||
return !(lhs < rhs || rhs < lhs);
|
||||
}
|
||||
|
||||
void swapSort(std::vector<KeyInfo> &points, int a, int b) {
|
||||
if (points[b] < points[a]) {
|
||||
KeyInfo temp;
|
||||
temp = points[a];
|
||||
points[a] = points[b];
|
||||
points[b] = temp;
|
||||
}
|
||||
}
|
||||
|
||||
struct SortTask {
|
||||
int begin;
|
||||
int size;
|
||||
@@ -183,13 +175,6 @@ void sortPoints(std::vector<KeyInfo> &points) {
|
||||
}
|
||||
}
|
||||
|
||||
static thread_local uint32_t g_seed = 0;
|
||||
|
||||
static inline int skfastrand() {
|
||||
g_seed = g_seed * 1664525L + 1013904223L;
|
||||
return g_seed;
|
||||
}
|
||||
|
||||
static int compare(const StringRef &a, const StringRef &b) {
|
||||
int c = memcmp(a.data(), b.data(), std::min(a.size(), b.size()));
|
||||
if (c < 0)
|
||||
@@ -215,20 +200,24 @@ struct ReadConflictRange {
|
||||
}
|
||||
};
|
||||
|
||||
static constexpr int MaxLevels = 26;
|
||||
|
||||
struct RandomLevel {
|
||||
explicit RandomLevel(uint32_t seed) : seed(seed) {}
|
||||
|
||||
int next() {
|
||||
int result = __builtin_clz(seed | (uint32_t(-1) >> (MaxLevels - 1)));
|
||||
seed = seed * 1664525L + 1013904223L;
|
||||
return result;
|
||||
}
|
||||
|
||||
private:
|
||||
uint32_t seed;
|
||||
};
|
||||
|
||||
class SkipList {
|
||||
private:
|
||||
static constexpr int MaxLevels = 26;
|
||||
|
||||
int randomLevel() const {
|
||||
uint32_t i = uint32_t(skfastrand()) >> (32 - (MaxLevels - 1));
|
||||
int level = 0;
|
||||
while (i & 1) {
|
||||
i >>= 1;
|
||||
level++;
|
||||
}
|
||||
assert(level < MaxLevels);
|
||||
return level;
|
||||
}
|
||||
RandomLevel randomLevel{0};
|
||||
|
||||
// Represent a node in the SkipList. The node has multiple (i.e., level)
|
||||
// pointers to other nodes, and keeps a record of the max versions for each
|
||||
@@ -426,18 +415,23 @@ public:
|
||||
}
|
||||
void swap(SkipList &other) { std::swap(header, other.header); }
|
||||
|
||||
void addConflictRanges(const Finger *fingers, int rangeCount,
|
||||
Version version) {
|
||||
// Returns the change in the number of entries
|
||||
int64_t addConflictRanges(const Finger *fingers, int rangeCount,
|
||||
Version version) {
|
||||
int64_t result = rangeCount;
|
||||
for (int r = rangeCount - 1; r >= 0; r--) {
|
||||
const Finger &startF = fingers[r * 2];
|
||||
const Finger &endF = fingers[r * 2 + 1];
|
||||
|
||||
if (endF.found() == nullptr)
|
||||
if (endF.found() == nullptr) {
|
||||
++result;
|
||||
insert(endF, endF.finger[0]->getMaxVersion(0));
|
||||
}
|
||||
|
||||
remove(startF, endF);
|
||||
result -= remove(startF, endF);
|
||||
insert(startF, version);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void detectConflicts(ReadConflictRange *ranges, int count,
|
||||
@@ -567,9 +561,10 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
void remove(const Finger &start, const Finger &end) {
|
||||
// Returns the number of entries removed
|
||||
int64_t remove(const Finger &start, const Finger &end) {
|
||||
if (start.finger[0] == end.finger[0])
|
||||
return;
|
||||
return 0;
|
||||
|
||||
Node *x = start.finger[0]->getNext(0);
|
||||
|
||||
@@ -578,17 +573,20 @@ private:
|
||||
if (start.finger[i] != end.finger[i])
|
||||
start.finger[i]->setNext(i, end.finger[i]->getNext(i));
|
||||
|
||||
int64_t result = 0;
|
||||
while (true) {
|
||||
Node *next = x->getNext(0);
|
||||
x->destroy();
|
||||
++result;
|
||||
if (x == end.finger[0])
|
||||
break;
|
||||
x = next;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void insert(const Finger &f, Version version) {
|
||||
int level = randomLevel();
|
||||
int level = randomLevel.next();
|
||||
// std::cout << std::string((const char*)value,length) << " level: " <<
|
||||
// level << std::endl;
|
||||
Node *x = Node::create(f.value, level);
|
||||
@@ -704,8 +702,6 @@ private:
|
||||
};
|
||||
};
|
||||
|
||||
struct SkipListConflictSet {};
|
||||
|
||||
struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
||||
Impl(int64_t oldestVersion)
|
||||
: oldestVersion(oldestVersion), newestVersion(oldestVersion),
|
||||
@@ -775,17 +771,20 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
||||
StringRef values[stripeSize];
|
||||
int64_t writeVersions[stripeSize / 2];
|
||||
int ss = stringCount - (stripes - 1) * stripeSize;
|
||||
int64_t entryDelta = 0;
|
||||
for (int s = stripes - 1; s >= 0; s--) {
|
||||
for (int i = 0; i * 2 < ss; ++i) {
|
||||
const auto &w = combinedWriteConflictRanges[s * stripeSize / 2 + i];
|
||||
values[i * 2] = w.first;
|
||||
values[i * 2 + 1] = w.second;
|
||||
keyUpdates += 3;
|
||||
}
|
||||
skipList.find(values, fingers, temp, ss);
|
||||
skipList.addConflictRanges(fingers, ss / 2, writeVersion);
|
||||
entryDelta += skipList.addConflictRanges(fingers, ss / 2, writeVersion);
|
||||
ss = stripeSize;
|
||||
}
|
||||
|
||||
// Run gc at least 200% the rate we're inserting entries
|
||||
keyUpdates += std::max<int64_t>(entryDelta, 0) * 2;
|
||||
}
|
||||
|
||||
void setOldestVersion(int64_t oldestVersion) {
|
||||
@@ -795,7 +794,7 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
||||
int temp;
|
||||
std::span<const uint8_t> key = removalKey;
|
||||
skipList.find(&key, &finger, &temp, 1);
|
||||
skipList.removeBefore(oldestVersion, finger, std::exchange(keyUpdates, 10));
|
||||
skipList.removeBefore(oldestVersion, finger, std::exchange(keyUpdates, 0));
|
||||
removalArena = Arena();
|
||||
removalKey = copyToArena(
|
||||
removalArena, {finger.getValue().data(), finger.getValue().size()});
|
||||
@@ -804,7 +803,7 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
||||
int64_t totalBytes = 0;
|
||||
|
||||
private:
|
||||
int64_t keyUpdates = 10;
|
||||
int64_t keyUpdates = 0;
|
||||
Arena removalArena;
|
||||
std::span<const uint8_t> removalKey;
|
||||
int64_t oldestVersion;
|
||||
|
BIN
corpus/00c9af5b41b4ae33c12623b6683b5a0315a6a4d4
Normal file
BIN
corpus/00c9af5b41b4ae33c12623b6683b5a0315a6a4d4
Normal file
Binary file not shown.
BIN
corpus/0164e1ae452d063faa26b90d924f52189f268011
Normal file
BIN
corpus/0164e1ae452d063faa26b90d924f52189f268011
Normal file
Binary file not shown.
BIN
corpus/0325e533cf35c1e7ac95326c9b189911deffb27e
Normal file
BIN
corpus/0325e533cf35c1e7ac95326c9b189911deffb27e
Normal file
Binary file not shown.
BIN
corpus/038c312d57a8f6fd53a629f2819237fb5f88da51
Normal file
BIN
corpus/038c312d57a8f6fd53a629f2819237fb5f88da51
Normal file
Binary file not shown.
BIN
corpus/04239a60051c9a1779d9a896b84eff01f272f191
Normal file
BIN
corpus/04239a60051c9a1779d9a896b84eff01f272f191
Normal file
Binary file not shown.
BIN
corpus/043cb17815ddb8f3242a3c3dbf8e7c52263b0e30
Normal file
BIN
corpus/043cb17815ddb8f3242a3c3dbf8e7c52263b0e30
Normal file
Binary file not shown.
BIN
corpus/04aae30fd4c1fa9678360ee983a87c11b2d687b4
Normal file
BIN
corpus/04aae30fd4c1fa9678360ee983a87c11b2d687b4
Normal file
Binary file not shown.
BIN
corpus/05a091a7d5e921098504585a4201967860d310c6
Normal file
BIN
corpus/05a091a7d5e921098504585a4201967860d310c6
Normal file
Binary file not shown.
BIN
corpus/05b04a01fa702668fc100f7988f01cfd52915afd
Normal file
BIN
corpus/05b04a01fa702668fc100f7988f01cfd52915afd
Normal file
Binary file not shown.
BIN
corpus/07859ccfb5f61cf15ab6aa01207ba71af1a767e6
Normal file
BIN
corpus/07859ccfb5f61cf15ab6aa01207ba71af1a767e6
Normal file
Binary file not shown.
BIN
corpus/090e0af733a378279f9781f66a1615c0624862a1
Normal file
BIN
corpus/090e0af733a378279f9781f66a1615c0624862a1
Normal file
Binary file not shown.
BIN
corpus/0a0d13abb457f88bc0e9964f52ea5019ddb904db
Normal file
BIN
corpus/0a0d13abb457f88bc0e9964f52ea5019ddb904db
Normal file
Binary file not shown.
BIN
corpus/0b2bceb19aee5dd7b6d2fcc05a435c81116d06ef
Normal file
BIN
corpus/0b2bceb19aee5dd7b6d2fcc05a435c81116d06ef
Normal file
Binary file not shown.
BIN
corpus/0b724429644597a0c8feb3d95dced0c2a48e5ed0
Normal file
BIN
corpus/0b724429644597a0c8feb3d95dced0c2a48e5ed0
Normal file
Binary file not shown.
BIN
corpus/0c7354a5cee7966f239e458621f9b264f4b6f30e
Normal file
BIN
corpus/0c7354a5cee7966f239e458621f9b264f4b6f30e
Normal file
Binary file not shown.
BIN
corpus/0ce9c3bafcb3f3fd1909a66cef04783813fdbe97
Normal file
BIN
corpus/0ce9c3bafcb3f3fd1909a66cef04783813fdbe97
Normal file
Binary file not shown.
BIN
corpus/0da7d6000805c1f25907f3a2e8499ee119673f28
Normal file
BIN
corpus/0da7d6000805c1f25907f3a2e8499ee119673f28
Normal file
Binary file not shown.
BIN
corpus/0f07620da89e8e85aa32907fc6678cf38bc8801f
Normal file
BIN
corpus/0f07620da89e8e85aa32907fc6678cf38bc8801f
Normal file
Binary file not shown.
BIN
corpus/0f35cf72c8ce773274cdc6d5c08bc2576a74b945
Normal file
BIN
corpus/0f35cf72c8ce773274cdc6d5c08bc2576a74b945
Normal file
Binary file not shown.
BIN
corpus/10838bd79f36f824c41afa600c86f176f213ff79
Normal file
BIN
corpus/10838bd79f36f824c41afa600c86f176f213ff79
Normal file
Binary file not shown.
BIN
corpus/10d1bd7655fc06e36085fce25bbe3362b29a9783
Normal file
BIN
corpus/10d1bd7655fc06e36085fce25bbe3362b29a9783
Normal file
Binary file not shown.
BIN
corpus/119c75695f1b7fec2b57de3234fcb59bd20c5bbb
Normal file
BIN
corpus/119c75695f1b7fec2b57de3234fcb59bd20c5bbb
Normal file
Binary file not shown.
BIN
corpus/11f6db96f711313df1106ceeb011073ae70ee496
Normal file
BIN
corpus/11f6db96f711313df1106ceeb011073ae70ee496
Normal file
Binary file not shown.
BIN
corpus/132fad7a17c6495a057f56a24e3249ec46249bdc
Normal file
BIN
corpus/132fad7a17c6495a057f56a24e3249ec46249bdc
Normal file
Binary file not shown.
BIN
corpus/134be17afe8ab5ca62ce76cfafd523b581e90bb9
Normal file
BIN
corpus/134be17afe8ab5ca62ce76cfafd523b581e90bb9
Normal file
Binary file not shown.
BIN
corpus/13fc09a23701cb6c66e26480926f8fdfa9b0bbd4
Normal file
BIN
corpus/13fc09a23701cb6c66e26480926f8fdfa9b0bbd4
Normal file
Binary file not shown.
BIN
corpus/158d2f871afe1bf811833d07a03415d89a868efe
Normal file
BIN
corpus/158d2f871afe1bf811833d07a03415d89a868efe
Normal file
Binary file not shown.
BIN
corpus/15f6e61dd6edef971d7c79bef0d14069b0a75c77
Normal file
BIN
corpus/15f6e61dd6edef971d7c79bef0d14069b0a75c77
Normal file
Binary file not shown.
BIN
corpus/16946b8d264a686b091def79de1bfb866a76b167
Normal file
BIN
corpus/16946b8d264a686b091def79de1bfb866a76b167
Normal file
Binary file not shown.
BIN
corpus/172b5521ec42c012938eb2072b65a5867f076a00
Normal file
BIN
corpus/172b5521ec42c012938eb2072b65a5867f076a00
Normal file
Binary file not shown.
BIN
corpus/17755f00a3ba63466403029710717edd74f85d2b
Normal file
BIN
corpus/17755f00a3ba63466403029710717edd74f85d2b
Normal file
Binary file not shown.
BIN
corpus/17df336a0f56637288409df17b3d78ee712e835b
Normal file
BIN
corpus/17df336a0f56637288409df17b3d78ee712e835b
Normal file
Binary file not shown.
BIN
corpus/1a591c014514af4b723cc6f5f0753319fa57b925
Normal file
BIN
corpus/1a591c014514af4b723cc6f5f0753319fa57b925
Normal file
Binary file not shown.
BIN
corpus/1ab0a409dbf44496ea9d7027ba8898805f396140
Normal file
BIN
corpus/1ab0a409dbf44496ea9d7027ba8898805f396140
Normal file
Binary file not shown.
BIN
corpus/1ac23fb78ff1d7ea8b6ca0e63184fbbc9199e68c
Normal file
BIN
corpus/1ac23fb78ff1d7ea8b6ca0e63184fbbc9199e68c
Normal file
Binary file not shown.
BIN
corpus/1b8c9a3fdf96a2c0ec6c3c0fcf78c9ecb20a5962
Normal file
BIN
corpus/1b8c9a3fdf96a2c0ec6c3c0fcf78c9ecb20a5962
Normal file
Binary file not shown.
BIN
corpus/1ce3c082d69e7b494e648186d23562d60808c096
Normal file
BIN
corpus/1ce3c082d69e7b494e648186d23562d60808c096
Normal file
Binary file not shown.
BIN
corpus/1d1be308eaaa98322da864cbd2ff16d154f6a01a
Normal file
BIN
corpus/1d1be308eaaa98322da864cbd2ff16d154f6a01a
Normal file
Binary file not shown.
BIN
corpus/1e656ebd6c39b9fd6bea8c1bdaf12fe92642d507
Normal file
BIN
corpus/1e656ebd6c39b9fd6bea8c1bdaf12fe92642d507
Normal file
Binary file not shown.
BIN
corpus/1e7430360594743dae681f79880d275d6178b76a
Normal file
BIN
corpus/1e7430360594743dae681f79880d275d6178b76a
Normal file
Binary file not shown.
BIN
corpus/1f2dc3e792880d8e7fe51e9b0d2d71ed07b30dd0
Normal file
BIN
corpus/1f2dc3e792880d8e7fe51e9b0d2d71ed07b30dd0
Normal file
Binary file not shown.
BIN
corpus/2141828fbf5049e21a703dac83d5726fdf32aaaf
Normal file
BIN
corpus/2141828fbf5049e21a703dac83d5726fdf32aaaf
Normal file
Binary file not shown.
BIN
corpus/21540fec17d78467a6fe450592da42ca03e8e268
Normal file
BIN
corpus/21540fec17d78467a6fe450592da42ca03e8e268
Normal file
Binary file not shown.
BIN
corpus/2171f6a0942d0ad29e1e2f163c0193228ab83e37
Normal file
BIN
corpus/2171f6a0942d0ad29e1e2f163c0193228ab83e37
Normal file
Binary file not shown.
BIN
corpus/233112524bdcd6f77d4d51c080039bf1e1358bc2
Normal file
BIN
corpus/233112524bdcd6f77d4d51c080039bf1e1358bc2
Normal file
Binary file not shown.
BIN
corpus/236aae2fbf5a1c6716650bdc0187aadebd0fd4eb
Normal file
BIN
corpus/236aae2fbf5a1c6716650bdc0187aadebd0fd4eb
Normal file
Binary file not shown.
BIN
corpus/24e62107b4170fb2ae39736ebf50046f1edf0836
Normal file
BIN
corpus/24e62107b4170fb2ae39736ebf50046f1edf0836
Normal file
Binary file not shown.
BIN
corpus/253fb84659e9d2ebdb9d57b10dea811f4179bf4b
Normal file
BIN
corpus/253fb84659e9d2ebdb9d57b10dea811f4179bf4b
Normal file
Binary file not shown.
BIN
corpus/257aeff186a0d62a1ea7de076ec3810370cda9d7
Normal file
BIN
corpus/257aeff186a0d62a1ea7de076ec3810370cda9d7
Normal file
Binary file not shown.
BIN
corpus/26c5d8fcbc341f7f1ed4e40de241d72dadc3f395
Normal file
BIN
corpus/26c5d8fcbc341f7f1ed4e40de241d72dadc3f395
Normal file
Binary file not shown.
BIN
corpus/26d331a3454e797f80079f672fc465d5ea482b4b
Normal file
BIN
corpus/26d331a3454e797f80079f672fc465d5ea482b4b
Normal file
Binary file not shown.
BIN
corpus/28ef0e90abb263ba353b918374e9062a16afdfb8
Normal file
BIN
corpus/28ef0e90abb263ba353b918374e9062a16afdfb8
Normal file
Binary file not shown.
BIN
corpus/29ae192a6404273b14be44d0f06d354e9eb5084b
Normal file
BIN
corpus/29ae192a6404273b14be44d0f06d354e9eb5084b
Normal file
Binary file not shown.
BIN
corpus/29bef5af0375285e6b58fc608f39e26d7fcea507
Normal file
BIN
corpus/29bef5af0375285e6b58fc608f39e26d7fcea507
Normal file
Binary file not shown.
BIN
corpus/29dc0ea3cb06047a82042a6003d02c8055a85254
Normal file
BIN
corpus/29dc0ea3cb06047a82042a6003d02c8055a85254
Normal file
Binary file not shown.
BIN
corpus/2a32a3d39a663771bda1be99ecfbe55ff780d2b2
Normal file
BIN
corpus/2a32a3d39a663771bda1be99ecfbe55ff780d2b2
Normal file
Binary file not shown.
BIN
corpus/2aa2ab713a18bc86e886777cf6008a871e590688
Normal file
BIN
corpus/2aa2ab713a18bc86e886777cf6008a871e590688
Normal file
Binary file not shown.
1
corpus/2ae810daa467ba2bd354e835491a8b3026525764
Normal file
1
corpus/2ae810daa467ba2bd354e835491a8b3026525764
Normal file
@@ -0,0 +1 @@
|
||||
:<15><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:::::
|
BIN
corpus/2c10fee8ed419936045762ec8b917e0d4a9760df
Normal file
BIN
corpus/2c10fee8ed419936045762ec8b917e0d4a9760df
Normal file
Binary file not shown.
BIN
corpus/2d74492e45925f685ebcd3e3d1323504245daa2f
Normal file
BIN
corpus/2d74492e45925f685ebcd3e3d1323504245daa2f
Normal file
Binary file not shown.
BIN
corpus/2d7ec7062763680f13772f7670f25dbd7077574d
Normal file
BIN
corpus/2d7ec7062763680f13772f7670f25dbd7077574d
Normal file
Binary file not shown.
BIN
corpus/2e28e709dc7a313255964e2c21d3c8c9b6c3ef1d
Normal file
BIN
corpus/2e28e709dc7a313255964e2c21d3c8c9b6c3ef1d
Normal file
Binary file not shown.
BIN
corpus/3048c606615cd2ca599de803f534fdeb961b9439
Normal file
BIN
corpus/3048c606615cd2ca599de803f534fdeb961b9439
Normal file
Binary file not shown.
BIN
corpus/314dac4fdc9bb4896b5aacadfbbfe408899732e8
Normal file
BIN
corpus/314dac4fdc9bb4896b5aacadfbbfe408899732e8
Normal file
Binary file not shown.
BIN
corpus/31bf521be5d9f9e7d99e1384b9ffe26197324c37
Normal file
BIN
corpus/31bf521be5d9f9e7d99e1384b9ffe26197324c37
Normal file
Binary file not shown.
BIN
corpus/322e7b4fe43ae5977f74a882984404dee9ee7e90
Normal file
BIN
corpus/322e7b4fe43ae5977f74a882984404dee9ee7e90
Normal file
Binary file not shown.
BIN
corpus/3276a649b804693762b06581bf459b2f2accc03e
Normal file
BIN
corpus/3276a649b804693762b06581bf459b2f2accc03e
Normal file
Binary file not shown.
BIN
corpus/3328522dbba9d1d88befc4edf7ddf3a28d0c1e18
Normal file
BIN
corpus/3328522dbba9d1d88befc4edf7ddf3a28d0c1e18
Normal file
Binary file not shown.
BIN
corpus/33ea991ae4abe2b9bb1fa19028543d1d01411148
Normal file
BIN
corpus/33ea991ae4abe2b9bb1fa19028543d1d01411148
Normal file
Binary file not shown.
BIN
corpus/33ec7c523e4e73126edac3d32e2e9737b3839203
Normal file
BIN
corpus/33ec7c523e4e73126edac3d32e2e9737b3839203
Normal file
Binary file not shown.
BIN
corpus/3460a3af48f48e6657998179b974d8eccd618dd2
Normal file
BIN
corpus/3460a3af48f48e6657998179b974d8eccd618dd2
Normal file
Binary file not shown.
BIN
corpus/34a4d2436527e903d806a63c002cea88522f3a5e
Normal file
BIN
corpus/34a4d2436527e903d806a63c002cea88522f3a5e
Normal file
Binary file not shown.
BIN
corpus/34b90ac8d0d24842c6e3634d5d4b40a4eb0e1ed1
Normal file
BIN
corpus/34b90ac8d0d24842c6e3634d5d4b40a4eb0e1ed1
Normal file
Binary file not shown.
BIN
corpus/351af0b05e0c3f3c74954de9f5aa64d292d1dcab
Normal file
BIN
corpus/351af0b05e0c3f3c74954de9f5aa64d292d1dcab
Normal file
Binary file not shown.
BIN
corpus/3530208307bb7a980d56987edbf1783c72ca2444
Normal file
BIN
corpus/3530208307bb7a980d56987edbf1783c72ca2444
Normal file
Binary file not shown.
BIN
corpus/35382c7ae1f09972f9c6829e585cf10503917411
Normal file
BIN
corpus/35382c7ae1f09972f9c6829e585cf10503917411
Normal file
Binary file not shown.
BIN
corpus/35df5d1e51e37343461d1246ea693ea55ae46413
Normal file
BIN
corpus/35df5d1e51e37343461d1246ea693ea55ae46413
Normal file
Binary file not shown.
BIN
corpus/35e6c44a434a927dbd99a1bb6ddecbd0ecb45754
Normal file
BIN
corpus/35e6c44a434a927dbd99a1bb6ddecbd0ecb45754
Normal file
Binary file not shown.
BIN
corpus/36ae24ff8ae3dae3302e12bcb2acbb7e2574a148
Normal file
BIN
corpus/36ae24ff8ae3dae3302e12bcb2acbb7e2574a148
Normal file
Binary file not shown.
BIN
corpus/39184f515f2417da12ee98d262810085755d846e
Normal file
BIN
corpus/39184f515f2417da12ee98d262810085755d846e
Normal file
Binary file not shown.
BIN
corpus/3928db1fdf00d2056135391cb188fcbe804d5ec8
Normal file
BIN
corpus/3928db1fdf00d2056135391cb188fcbe804d5ec8
Normal file
Binary file not shown.
BIN
corpus/3a5cb027cf0d324ad95683dd26c4fee6bfa322c3
Normal file
BIN
corpus/3a5cb027cf0d324ad95683dd26c4fee6bfa322c3
Normal file
Binary file not shown.
BIN
corpus/3ba58d43a24139a702c6d5c83ce3cc9f82bac804
Normal file
BIN
corpus/3ba58d43a24139a702c6d5c83ce3cc9f82bac804
Normal file
Binary file not shown.
BIN
corpus/3bbcd74622cdf41760e234c1cd861b61c4305840
Normal file
BIN
corpus/3bbcd74622cdf41760e234c1cd861b61c4305840
Normal file
Binary file not shown.
BIN
corpus/3bed999a619dbe2eedee03ad5a2d2e8cdbef62f8
Normal file
BIN
corpus/3bed999a619dbe2eedee03ad5a2d2e8cdbef62f8
Normal file
Binary file not shown.
BIN
corpus/3c07b3837fed49692b1fe1b9c1f878d135f3ecda
Normal file
BIN
corpus/3c07b3837fed49692b1fe1b9c1f878d135f3ecda
Normal file
Binary file not shown.
BIN
corpus/3c1f7d9c07946d7dd34d13246ceca500bd7b2c50
Normal file
BIN
corpus/3c1f7d9c07946d7dd34d13246ceca500bd7b2c50
Normal file
Binary file not shown.
BIN
corpus/3c74b098773c633bb593dc139aaef296e59bd766
Normal file
BIN
corpus/3c74b098773c633bb593dc139aaef296e59bd766
Normal file
Binary file not shown.
BIN
corpus/3d84be86223ee1047117c8b96dc8a582ef21ff38
Normal file
BIN
corpus/3d84be86223ee1047117c8b96dc8a582ef21ff38
Normal file
Binary file not shown.
BIN
corpus/3d931de827b1030b3e1d35b36a35395b332d80a9
Normal file
BIN
corpus/3d931de827b1030b3e1d35b36a35395b332d80a9
Normal file
Binary file not shown.
BIN
corpus/3db73b996b015cf7eb099e36a0c20488d2a3c3f2
Normal file
BIN
corpus/3db73b996b015cf7eb099e36a0c20488d2a3c3f2
Normal file
Binary file not shown.
BIN
corpus/3df34e97d1b2ebaec718fb8137e7b797153ac48b
Normal file
BIN
corpus/3df34e97d1b2ebaec718fb8137e7b797153ac48b
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user