[med-svn] [Git][med-team/xenium][upstream] New upstream version 0.0+git20200720.e62d4d5+dfsg
Andreas Tille
gitlab at salsa.debian.org
Tue Jul 21 21:27:14 BST 2020
Andreas Tille pushed to branch upstream at Debian Med / xenium
Commits:
79581767 by Andreas Tille at 2020-07-21T09:44:56+02:00
New upstream version 0.0+git20200720.e62d4d5+dfsg
- - - - -
12 changed files:
- azure-pipelines.yml
- benchmarks/config.hpp
- + benchmarks/examples/hash_map.json
- benchmarks/examples/queue.json
- − benchmarks/hash_map.json
- benchmarks/hash_map_benchmark.cpp
- benchmarks/hash_maps.hpp
- benchmarks/main.cpp
- xenium/backoff.hpp
- + xenium/detail/hardware.hpp
- xenium/kirsch_bounded_kfifo_queue.hpp
- xenium/kirsch_kfifo_queue.hpp
Changes:
=====================================
azure-pipelines.yml
=====================================
@@ -3,30 +3,44 @@ stages:
jobs:
- job: BuildLinux
displayName: 'Build Linux'
- pool:
- vmImage: 'ubuntu-18.04'
strategy:
matrix:
gcc8-Release:
compiler: g++-8
buildConfiguration: Release
+ image: 'ubuntu-18.04'
gcc8-Debug:
compiler: g++-8
buildConfiguration: Debug
+ image: 'ubuntu-18.04'
clang8-Release:
compiler: clang++-8
buildConfiguration: Release
+ image: 'ubuntu-18.04'
clang8-Debug:
compiler: clang++-8
buildConfiguration: Debug
+ image: 'ubuntu-18.04'
clang9-Release:
compiler: clang++-9
buildConfiguration: Release
+ image: 'ubuntu-18.04'
clang9-Debug:
compiler: clang++-9
buildConfiguration: Debug
+ image: 'ubuntu-18.04'
+ clang10-Mac-Debug:
+ compiler: clang++
+ buildConfiguration: Debug
+ image: macOS-10.15
+ clang10-Mac-Release:
+ compiler: clang++
+ buildConfiguration: Release
+ image: macOS-10.15
+ pool:
+ vmImage: $(image)
steps:
- script: |
sudo apt-get update -y
@@ -35,10 +49,11 @@ stages:
condition: eq(variables['compiler'], 'g++-8')
- script: |
+ $(compiler) --version
git submodule update --init --recursive
mkdir $(Build.BinariesDirectory)/build
cd $(Build.BinariesDirectory)/build
- cmake $(Build.SourcesDirectory) -DCMAKE_CXX_COMPILER=$(compiler) -DCMAKE_BUILD_TYPE=$(buildConfiguration) -DCMAKE_CXX_FLAGS="-fsanitize=thread"
+ cmake $(Build.SourcesDirectory) -DCMAKE_CXX_COMPILER=$(compiler) -DCMAKE_CXX_STANDARD=17 -DCMAKE_BUILD_TYPE=$(buildConfiguration) -DCMAKE_CXX_FLAGS="-fsanitize=thread"
displayName: 'Prepare build'
- script: make -j 4
@@ -49,6 +64,10 @@ stages:
workingDirectory: $(Build.BinariesDirectory)/build
displayName: 'Run tests'
+ - publish: $(Build.BinariesDirectory)/build/benchmark
+ artifact: benchmark
+ condition: and(eq(variables.compiler, 'g++-8'), eq(variables.buildConfiguration, 'Release'))
+
- task: PublishTestResults at 2
inputs:
testResultsFormat: 'JUnit'
@@ -97,6 +116,34 @@ stages:
testResultsFormat: 'JUnit'
testResultsFiles: $(Build.BinariesDirectory)\build\$(buildConfiguration)\gtest.log
+############################################################
+
+ - stage: BenchmarkSmokeTest
+ condition: succeeded()
+ jobs:
+ - job: BenchmarkSmokeTest
+ displayName: 'Benchmark smoke tests'
+ pool:
+ vmImage: 'Ubuntu-16.04'
+ steps:
+ - task: DownloadPipelineArtifact at 2
+ inputs:
+ artifact: benchmark
+ path: benchmarks/examples
+ - script: |
+ cd benchmarks/examples
+ chmod +x benchmark
+ set -e
+ for QUEUE in ramalhete michael_scott vyukov_bounded kirsch_kfifo kirsch_bounded_kfifo; do
+ ./benchmark queue.json -- "ds=(queues.$QUEUE)" warmup.rounds=0 rounds=1 runtime=500
+ done
+ for RECLAIMER in EBR NEBR DEBRA QSBR static-HP dynamic-HP; do
+ ./benchmark queue.json -- "ds.reclaimer=(reclaimers.$RECLAIMER)" warmup.rounds=0 rounds=1 runtime=500
+ done
+ for HASHMAP in vyukov harris_michael; do
+ ./benchmark hash_map.json -- "ds=(hash_maps.$HASHMAP)" warmup.rounds=0 rounds=1 runtime=500
+ done
+
############################################################
- stage: Documentation
@@ -115,7 +162,7 @@ stages:
doxygen
displayName: build doxygen
- script: |
- cd doc/html
+ cd doc/html
git init
git checkout --orphan gh-pages
git add .
=====================================
benchmarks/config.hpp
=====================================
@@ -27,7 +27,7 @@
#define WITH_CDS_BASKET_QUEUE
#define WITH_CDS_SEGMENTED_QUEUE
- #define WITH_CDS_MICHAEL_MAP
+ #define WITH_CDS_MICHAEL_HASHMAP
#define WITH_CDS_FELDMAN_HASHMAP
#endif
=====================================
benchmarks/examples/hash_map.json
=====================================
@@ -0,0 +1,63 @@
+{
+ "reclaimers": {
+ "EBR": {
+ "type": "generic_epoch_based",
+ "scan_strategy": { "type": "all_threads" },
+ "region_extension": "none"
+ },
+ "NEBR": {
+ "type": "generic_epoch_based",
+ "scan_strategy": { "type": "all_threads" },
+ "region_extension": "eager"
+ },
+ "DEBRA": {
+ "type": "generic_epoch_based",
+ "scan_strategy": { "type": "one_threads" },
+ "region_extension": "eager"
+ },
+ "QSBR": {
+ "type": "quiescent_state_based"
+ },
+ "static-HP": {
+ "type": "hazard_pointer",
+ "allocation_strategy": { "type": "static"}
+ },
+ "dynamic-HP": {
+ "type": "hazard_pointer",
+ "allocation_strategy": { "type": "dynamic"}
+ },
+ },
+ "hash_maps": {
+ "vyukov": {
+ "type": "vyukov_hash_map",
+ "reclaimer": (reclaimers.EBR)
+ },
+ "harris_michael" : {
+ "type": "harris_michael_hash_map",
+ "reclaimer": (reclaimers.EBR)
+ },
+ "cds-MichaelHashMap" : {
+ "type": "cds::MichaelHashMap",
+ "gc": "HP",
+ "nMaxItemCount": 512,
+ "nLoadFactor": 1
+ },
+ "cds-FeldmanHashMap": {
+ "type": "cds::FeldmanHashMap",
+ "gc": "HP"
+ }
+ },
+ "type": "hash_map",
+ "ds": (hash_maps.vyukov),
+ "warmup": {
+ "rounds": 1,
+ "runtime": 200
+ },
+ "rounds": 4,
+ "runtime": 1000,
+ "threads": {
+ "mixed": {
+ "count": 4
+ }
+ }
+}
\ No newline at end of file
=====================================
benchmarks/examples/queue.json
=====================================
@@ -12,8 +12,8 @@
},
"DEBRA": {
"type": "generic_epoch_based",
- "scan_strategy": { "type": "one_threads" },
- "region_extension": "eager"
+ "scan_strategy": { "type": "one_thread" },
+ "region_extension": "none"
},
"QSBR": {
"type": "quiescent_state_based"
@@ -38,7 +38,8 @@
},
"vyukov_bounded" : {
"type": "vyukov_bounded_queue",
- "size": 256
+ "size": 256,
+ "weak": false
},
"kirsch_kfifo" : {
"type": "kirsch_kfifo_queue",
=====================================
benchmarks/hash_map.json deleted
=====================================
@@ -1,20 +0,0 @@
-{
- "type": "hash_map",
- "ds": {
- "type": "vyukov_hash_map",
- "reclaimer": {
- "type": "epoch_based"
- }
- },
- "warmup": {
- "rounds": 1,
- "runtime": 200
- },
- "rounds": 4,
- "runtime": 1000,
- "threads": {
- "mixed": {
- "count": 4
- }
- }
-}
\ No newline at end of file
=====================================
benchmarks/hash_map_benchmark.cpp
=====================================
@@ -199,10 +199,10 @@ namespace {
#endif
#endif
-#ifdef WITH_CDS_MICHAEL_MAP
+#ifdef WITH_CDS_MICHAEL_HASHMAP
make_benchmark_builder<
cds::container::MichaelHashMap<cds::gc::HP,
- cds::container::MichaelKVList< cds::gc::HP, int, int>>>(),
+ cds::container::MichaelKVList< cds::gc::HP, QUEUE_ITEM, QUEUE_ITEM>>>(),
#endif
#ifdef WITH_CDS_FELDMAN_HASHMAP
=====================================
benchmarks/hash_maps.hpp
=====================================
@@ -88,17 +88,18 @@ namespace {
#include <cds/gc/dhp.h>
#endif
-#ifdef WITH_CDS_MICHAEL_MAP
+#ifdef WITH_CDS_MICHAEL_HASHMAP
#include <cds/container/michael_kvlist_hp.h>
#include <cds/container/michael_map.h>
-template <class GC, class List, class Traits>
-struct descriptor<cds::container::MichaelHashMap<GC, List, Traits>> {
+template <class List, class Traits>
+struct descriptor<cds::container::MichaelHashMap<cds::gc::HP, List, Traits>> {
static tao::json::value generate() {
return {
- {"type", "cds::MichaelMap"},
+ {"type", "cds::MichaelHashMap"},
{"nMaxItemCount", DYNAMIC_PARAM},
- {"nLoadFactor", DYNAMIC_PARAM}
+ {"nLoadFactor", DYNAMIC_PARAM},
+ {"gc", "HP"}
};
}
};
@@ -140,10 +141,13 @@ namespace {
#include <cds/container/feldman_hashmap_dhp.h>
#include <cds/container/feldman_hashmap_rcu.h>
-template <class GC, class Key, class T, class Traits>
-struct descriptor<cds::container::FeldmanHashMap<GC, Key, T, Traits>> {
+template <class Key, class T, class Traits>
+struct descriptor<cds::container::FeldmanHashMap<cds::gc::HP, Key, T, Traits>> {
static tao::json::value generate() {
- return {{"type", "cds::FeldmanHashMap"}};
+ return {
+ {"type", "cds::FeldmanHashMap"},
+ {"gc", "HP"}
+ };
}
};
=====================================
benchmarks/main.cpp
=====================================
@@ -85,7 +85,8 @@ bool objects_match(const tao::config::value::object_t& config, const tao::json::
bool scalars_match(const tao::config::value& config, const tao::json::value& descriptor) {
if (config.is_string() != descriptor.is_string() ||
- config.is_integer() != descriptor.is_integer()) {
+ config.is_integer() != descriptor.is_integer() ||
+ config.is_boolean() != descriptor.is_boolean()) {
return false;
}
@@ -95,6 +96,9 @@ bool scalars_match(const tao::config::value& config, const tao::json::value& des
if (config.is_string())
return config.get_string() == descriptor.get_string();
+ if (config.is_boolean())
+ return config.get_boolean() == descriptor.get_boolean();
+
throw std::runtime_error("Found unexpected type in config.");
}
=====================================
xenium/backoff.hpp
=====================================
@@ -6,15 +6,9 @@
#ifndef XENIUM_BACKOFF_HPP
#define XENIUM_BACKOFF_HPP
-#include <xenium/detail/port.hpp>
+#include <xenium/detail/hardware.hpp>
#include <algorithm>
-#ifdef XENIUM_ARCH_X86
-#include <emmintrin.h>
-#else
-#include <thread>
-#endif
-
namespace xenium {
/**
* @brief Dummy backoff strategy that does nothing.
@@ -24,26 +18,24 @@ struct no_backoff
void operator()() {}
};
+/**
+ * @brief Simple backoff strategy that always perfoms a single `hardware_pause` operation.
+ */
+struct single_backoff
+{
+ void operator()() { detail::hardware_pause(); }
+};
+
template <unsigned Max>
struct exponential_backoff {
static_assert(Max > 0, "Max must be greater than zero. If you don't want to backoff use the `no_backoff` class.");
void operator()() {
for (unsigned i = 0; i < count; ++i)
- do_backoff();
+ detail::hardware_pause();
count = std::min(Max, count * 2);
}
-private:
- void do_backoff() {
-#ifdef XENIUM_ARCH_X86
- _mm_pause();
-#else
- #warning "No backoff implementation available."
- std::this_thread::yield();
-#endif
- }
-
unsigned count = 1;
};
=====================================
xenium/detail/hardware.hpp
=====================================
@@ -0,0 +1,32 @@
+//
+// Copyright (c) 2018-2020 Manuel Pöter.
+// Licensed under the MIT License. See LICENSE file in the project root for full license information.
+//
+
+#ifndef XENIUM_DETAILS_HARDWARE_HPP
+#define XENIUM_DETAILS_HARDWARE_HPP
+
+#include <xenium/detail/port.hpp>
+
+#if defined(XENIUM_ARCH_X86)
+#include <emmintrin.h>
+#elif defined(XENIUM_ARCH_SPARC)
+#include <synch.h>
+#endif
+
+namespace xenium { namespace detail {
+ inline void hardware_pause() {
+ // TODO - add pause implementations for ARM + Power
+#if defined(XENIUM_ARCH_X86)
+ _mm_pause();
+#elif defined(XENIUM_ARCH_SPARC)
+ smt_pause();
+#else
+ #warning "No hardware_pause implementation available - falling back to local volatile noop."
+ // this effectively prevents the compiler from optimizing away the whole backoff operation
+ volatile int x = 0;
+ (void)x;
+#endif
+ }
+}}
+#endif
=====================================
xenium/kirsch_bounded_kfifo_queue.hpp
=====================================
@@ -13,6 +13,7 @@
#include <xenium/detail/pointer_queue_traits.hpp>
+#include <algorithm>
#include <atomic>
#include <cstdint>
@@ -99,16 +100,16 @@ namespace xenium {
private:
struct marked_idx {
marked_idx() = default;
- marked_idx(uint64_t val, uint64_t mark) { val_ = val | (mark << bits); }
+ marked_idx(uint64_t val, uint64_t mark) noexcept { val_ = val | (mark << bits); }
- uint64_t get() const { return val_ & val_mask; }
- uint64_t mark() const { return val_ >> bits; }
- bool operator==(const marked_idx& other) const { return this->val_ == other.val_; }
- bool operator!=(const marked_idx& other) const { return this->val_ != other.val_; }
+ uint64_t get() const noexcept { return val_ & val_mask; }
+ uint64_t mark() const noexcept { return val_ >> bits; }
+ bool operator==(const marked_idx& other) const noexcept { return this->val_ == other.val_; }
+ bool operator!=(const marked_idx& other) const noexcept { return this->val_ != other.val_; }
private:
static constexpr unsigned bits = 16;
static constexpr uint64_t val_mask = (static_cast<uint64_t>(1) << bits) - 1;
- uint64_t val_;
+ uint64_t val_ = 0;
};
template <bool Empty>
@@ -134,7 +135,7 @@ namespace xenium {
k_(k),
head_(),
tail_(),
- queue_(new entry[k * num_segments])
+ queue_(new entry[k * num_segments]())
{}
template <class T, class... Policies>
=====================================
xenium/kirsch_kfifo_queue.hpp
=====================================
@@ -13,6 +13,7 @@
#include <xenium/detail/pointer_queue_traits.hpp>
+#include <algorithm>
#include <atomic>
#include <cstdint>
View it on GitLab: https://salsa.debian.org/med-team/xenium/-/commit/795817677e827a8c380a58fe48c3313151e8a871
--
View it on GitLab: https://salsa.debian.org/med-team/xenium/-/commit/795817677e827a8c380a58fe48c3313151e8a871
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-med-commit/attachments/20200721/d4d5701b/attachment-0001.html>
More information about the debian-med-commit
mailing list