From 77c5d64e3e43d8b64bcf5f06af29915d64bf1254 Mon Sep 17 00:00:00 2001 From: Wentao Cai Date: Sun, 4 Oct 2020 17:30:20 -0400 Subject: [PATCH] Montage version 1.0 --- .gitattributes | 1 + .gitignore | 9 + .gitmodules | 0 LICENSE | 27 + Makefile | 551 ++++ README.md | 235 ++ data/mt_graph_plotting.R | 134 + data/mt_map_plotting.R | 101 + data/mt_queue_plotting.R | 102 + data/rec_orkut_plotting.R | 85 + data/sz_map_plotting.R | 100 + data/sz_queue_plotting.R | 100 + data/threadcached_plotting.R | 59 + ext/README.md | 138 + ext/libitm/libitm.so | Bin 0 -> 133496 bytes ext/mnemosyne-gcc/Doxyfile | 1252 +++++++++ ext/mnemosyne-gcc/README.md | 165 ++ ext/mnemosyne-gcc/doxypage | 281 ++ ext/mnemosyne-gcc/mne.diff | 181 ++ ext/mnemosyne-gcc/usermode/.gitignore | 25 + ext/mnemosyne-gcc/usermode/COPYING | 339 +++ ext/mnemosyne-gcc/usermode/Makefile | 5 + ext/mnemosyne-gcc/usermode/SConstruct | 114 + ext/mnemosyne-gcc/usermode/bench/SConscript | 26 + ext/mnemosyne-gcc/usermode/bench/doxypage | 274 ++ .../usermode/bench/stamp-kozy/AUTHORS | 36 + .../usermode/bench/stamp-kozy/LICENSE | 55 + .../usermode/bench/stamp-kozy/README.md | 83 + .../usermode/bench/stamp-kozy/SConscript | 35 + .../usermode/bench/stamp-kozy/VERSIONS | 96 + .../bench/stamp-kozy/common/Defines.common.mk | 31 + .../stamp-kozy/common/Defines.common.otm.mk | 46 + .../bench/stamp-kozy/common/Makefile.common | 19 + .../bench/stamp-kozy/common/Makefile.seq | 30 + .../bench/stamp-kozy/common/Makefile.stm | 39 + .../bench/stamp-kozy/common/Makefile.stm.otm | 55 + .../bench/stamp-kozy/lib/LEGALNOTICE.rbtree | 15 + .../bench/stamp-kozy/lib/LICENSE.rbtree | 33 + .../usermode/bench/stamp-kozy/lib/Makefile | 123 + .../usermode/bench/stamp-kozy/lib/avltree.c | 756 ++++++ .../usermode/bench/stamp-kozy/lib/avltree.h | 158 ++ .../usermode/bench/stamp-kozy/lib/bitmap.c | 468 ++++ .../usermode/bench/stamp-kozy/lib/bitmap.h | 243 ++ .../usermode/bench/stamp-kozy/lib/hash.c | 118 + .../usermode/bench/stamp-kozy/lib/hash.h | 114 + .../usermode/bench/stamp-kozy/lib/hashtable.c | 966 +++++++ .../usermode/bench/stamp-kozy/lib/hashtable.h | 360 +++ .../usermode/bench/stamp-kozy/lib/heap.c | 524 ++++ .../usermode/bench/stamp-kozy/lib/heap.h | 157 ++ .../usermode/bench/stamp-kozy/lib/list.c | 995 +++++++ .../usermode/bench/stamp-kozy/lib/list.h | 376 +++ .../usermode/bench/stamp-kozy/lib/map.h | 331 +++ .../usermode/bench/stamp-kozy/lib/memory.c | 457 ++++ .../usermode/bench/stamp-kozy/lib/memory.h | 131 + .../usermode/bench/stamp-kozy/lib/mt19937ar.c | 274 ++ .../usermode/bench/stamp-kozy/lib/mt19937ar.h | 188 ++ .../usermode/bench/stamp-kozy/lib/pair.c | 235 ++ .../usermode/bench/stamp-kozy/lib/pair.h | 170 ++ .../usermode/bench/stamp-kozy/lib/ptm/tm.h | 294 +++ .../usermode/bench/stamp-kozy/lib/queue.c | 591 +++++ .../usermode/bench/stamp-kozy/lib/queue.h | 241 ++ .../usermode/bench/stamp-kozy/lib/random.c | 217 ++ .../usermode/bench/stamp-kozy/lib/random.h | 164 ++ .../usermode/bench/stamp-kozy/lib/rbtree.c | 1680 ++++++++++++ .../usermode/bench/stamp-kozy/lib/rbtree.h | 254 ++ .../usermode/bench/stamp-kozy/lib/set.h | 112 + .../usermode/bench/stamp-kozy/lib/thread.c | 425 +++ .../usermode/bench/stamp-kozy/lib/thread.h | 240 ++ .../usermode/bench/stamp-kozy/lib/timer.h | 96 + .../usermode/bench/stamp-kozy/lib/tm_common.h | 109 + .../usermode/bench/stamp-kozy/lib/types.h | 112 + .../usermode/bench/stamp-kozy/lib/utility.h | 114 + .../usermode/bench/stamp-kozy/lib/vector.c | 434 ++++ .../usermode/bench/stamp-kozy/lib/vector.h | 226 ++ .../usermode/examples/SConscript | 29 + .../usermode/examples/simple/.gitignore | 2 + .../usermode/examples/simple/SConscript | 19 + .../usermode/examples/simple/main.c | 78 + .../usermode/examples/simple/pvar.c | 4 + .../usermode/examples/simple/pvar.h | 64 + ext/mnemosyne-gcc/usermode/init_vacation.sh | 14 + .../usermode/library/__init__.py | 1 + .../usermode/library/atomic_ops/AUTHORS | 4 + .../usermode/library/atomic_ops/COPYING | 340 +++ .../usermode/library/atomic_ops/README | 2 + .../atomic_ops/aligned_atomic_load_store.h | 46 + .../atomic_ops/all_acquire_release_volatile.h | 168 ++ .../usermode/library/atomic_ops/ao_t_is_int.h | 126 + .../usermode/library/atomic_ops/atomic_ops.h | 348 +++ .../library/atomic_ops/generalize-small.h | 1724 ++++++++++++ .../usermode/library/atomic_ops/generalize.h | 1355 ++++++++++ .../usermode/library/atomic_ops/ia64.h | 297 +++ .../library/atomic_ops/ordered_except_wr.h | 100 + .../usermode/library/atomic_ops/powerpc.h | 346 +++ .../library/atomic_ops/read_ordered.h | 100 + .../usermode/library/atomic_ops/sparc.h | 72 + .../library/atomic_ops/standard_ao_double_t.h | 25 + .../atomic_ops/test_and_set_t_is_ao_t.h | 36 + .../atomic_ops/test_and_set_t_is_char.h | 38 + .../usermode/library/atomic_ops/x86.h | 175 ++ .../usermode/library/atomic_ops/x86_64.h | 183 ++ .../usermode/library/common/SConscript | 15 + .../usermode/library/common/chhash.c | 368 +++ .../usermode/library/common/chhash.h | 72 + .../usermode/library/common/config_generic.c | 234 ++ .../usermode/library/common/config_generic.h | 99 + .../library/common/cuckoo_hash/CHash.c | 233 ++ .../library/common/cuckoo_hash/CHash.h | 70 + .../library/common/cuckoo_hash/CHash_inline.h | 152 ++ .../library/common/cuckoo_hash/Common.h | 197 ++ .../common/cuckoo_hash/Common_inline.h | 66 + .../library/common/cuckoo_hash/PointerHash.c | 170 ++ .../library/common/cuckoo_hash/PointerHash.h | 55 + .../common/cuckoo_hash/PointerHashInline.h | 355 +++ .../common/cuckoo_hash/PointerHash_inline.h | 162 ++ .../common/cuckoo_hash/PointerHash_struct.h | 29 + .../common/cuckoo_hash/PointerSetHash.c | 169 ++ .../common/cuckoo_hash/PointerSetHash.h | 55 + .../common/cuckoo_hash/PointerSetHashInline.h | 347 +++ .../cuckoo_hash/PointerSetHash_inline.h | 155 ++ .../cuckoo_hash/PointerSetHash_struct.h | 28 + .../common/cuckoo_hash/PortableStdint.h | 799 ++++++ .../usermode/library/common/debug.c | 216 ++ .../usermode/library/common/debug.h | 104 + .../usermode/library/common/hrtime.h | 80 + .../usermode/library/common/list.h | 596 +++++ .../usermode/library/common/mtypes.h | 8 + .../usermode/library/common/plist.h | 206 ++ .../usermode/library/common/pm_instr.h | 448 ++++ .../usermode/library/common/ptx.h | 11 + .../usermode/library/common/red_black_tree.c | 751 ++++++ .../usermode/library/common/red_black_tree.h | 67 + .../usermode/library/common/result.h | 48 + .../usermode/library/common/spinlock.h | 109 + .../usermode/library/common/stack.c | 85 + .../usermode/library/common/stack.h | 41 + .../usermode/library/common/stats_generic.c | 477 ++++ .../usermode/library/common/stats_generic.h | 213 ++ .../usermode/library/common/ut_barrier.h | 135 + .../usermode/library/common/util.h | 59 + .../library/configuration/__init__.py | 1 + .../library/configuration/default/mcore.py | 14 + .../configuration/default/mnemosyne.py | 40 + .../library/configuration/default/mtm.py | 268 ++ .../library/configuration/default/pmalloc.py | 17 + .../library/configuration/default/test.py | 0 .../usermode/library/configuration/helper.py | 76 + .../usermode/library/configuration/mcore.py | 56 + .../library/configuration/mnemosyne.py | 144 + .../usermode/library/configuration/mtm.py | 113 + .../usermode/library/configuration/pmalloc.py | 59 + .../usermode/library/configuration/test.py | 54 + .../usermode/library/libconfig++.so.8.0.0 | Bin 0 -> 87408 bytes .../usermode/library/libconfig.so.8 | 1 + ext/mnemosyne-gcc/usermode/library/libimf.so | Bin 0 -> 2680404 bytes .../usermode/library/libintlc.so.5 | Bin 0 -> 269550 bytes .../usermode/library/libmemcached.so.6 | 1 + .../usermode/library/libmemcached.so.6.0.0 | Bin 0 -> 483498 bytes ext/mnemosyne-gcc/usermode/library/libsvml.so | Bin 0 -> 922974 bytes .../usermode/library/mcore/SConscript | 75 + .../usermode/library/mcore/include/config.h | 55 + .../usermode/library/mcore/include/files.h | 72 + .../library/mcore/include/hal/pcm_i.h | 803 ++++++ .../usermode/library/mcore/include/init.h | 47 + .../usermode/library/mcore/include/log.h | 49 + .../library/mcore/include/log/log_i.h | 212 ++ .../library/mcore/include/log/logtrunc.h | 42 + .../library/mcore/include/log/phlog_base.h | 336 +++ .../library/mcore/include/log/phlog_tornbit.h | 581 +++++ .../library/mcore/include/log/staticlogs.h | 40 + .../usermode/library/mcore/include/mcore_i.h | 75 + .../library/mcore/include/mnemosyne.h | 101 + .../usermode/library/mcore/include/module.h | 70 + .../usermode/library/mcore/include/pcm.h | 47 + .../library/mcore/include/pregionlayout.h | 95 + .../mcore/include/reincarnation_callback.h | 56 + .../usermode/library/mcore/include/segment.h | 116 + .../usermode/library/mcore/include/thrdesc.h | 37 + .../usermode/library/mcore/src/config.c | 73 + .../usermode/library/mcore/src/files.c | 78 + .../usermode/library/mcore/src/hal/pcm.c | 556 ++++ .../usermode/library/mcore/src/init.c | 234 ++ .../usermode/library/mcore/src/log/logtrunc.c | 218 ++ .../usermode/library/mcore/src/log/mgr.c | 503 ++++ .../library/mcore/src/log/phlog_base.c | 138 + .../library/mcore/src/log/phlog_tornbit.c | 253 ++ .../usermode/library/mcore/src/module.c | 277 ++ .../mcore/src/reincarnation_callback.c | 79 + .../usermode/library/mcore/src/segment.c | 904 +++++++ .../usermode/library/mnemosyne_vars.h | 69 + .../usermode/library/mtm/SConscript | 92 + .../usermode/library/mtm/include/atomic.h | 102 + .../usermode/library/mtm/include/cm.h | 198 ++ .../usermode/library/mtm/include/config.h | 49 + .../usermode/library/mtm/include/gc.h | 86 + .../usermode/library/mtm/include/init.h | 41 + .../usermode/library/mtm/include/itm.h | 524 ++++ .../usermode/library/mtm/include/local.h | 20 + .../usermode/library/mtm/include/locks.h | 164 ++ .../library/mtm/include/mode/common/barrier.h | 171 ++ .../mtm/include/mode/common/beginend.h | 40 + .../library/mtm/include/mode/common/mask.h | 103 + .../library/mtm/include/mode/common/memcpy.h | 149 ++ .../library/mtm/include/mode/common/memset.h | 72 + .../library/mtm/include/mode/common/rwset.h | 228 ++ .../library/mtm/include/mode/dtable.h | 90 + .../usermode/library/mtm/include/mode/mode.h | 81 + .../include/mode/pwb-common/#beginend-bits.h# | 443 ++++ .../include/mode/pwb-common/barrier-bits.h | 784 ++++++ .../mtm/include/mode/pwb-common/barrier.h | 44 + .../include/mode/pwb-common/beginend-bits.h | 443 ++++ .../mtm/include/mode/pwb-common/locks.h | 45 + .../library/mtm/include/mode/pwb-common/pwb.h | 46 + .../mtm/include/mode/pwb-common/pwb_i.h | 135 + .../mtm/include/mode/pwb-common/tmlog.h | 39 + .../mtm/include/mode/pwb-common/tmlog_base.h | 153 ++ .../include/mode/pwb-common/tmlog_tornbit.h | 150 ++ .../library/mtm/include/mode/pwbetl/barrier.h | 39 + .../mtm/include/mode/pwbetl/beginend.h | 43 + .../library/mtm/include/mode/pwbetl/memcpy.h | 38 + .../library/mtm/include/mode/pwbetl/memset.h | 38 + .../library/mtm/include/mode/pwbetl/pwb_i.h | 63 + .../library/mtm/include/mode/pwbetl/pwbetl.h | 50 + .../usermode/library/mtm/include/mtm.h | 73 + .../usermode/library/mtm/include/mtm_i.h | 576 ++++ .../usermode/library/mtm/include/stats.h | 226 ++ .../mtm/include/sysdeps/linux/rwlock.h | 52 + .../library/mtm/include/sysdeps/x86/target.h | 159 ++ .../usermode/library/mtm/include/tm_def.h | 60 + .../library/mtm/include/transactions.h | 52 + .../usermode/library/mtm/include/txlock.h | 223 ++ .../usermode/library/mtm/include/useraction.h | 45 + .../usermode/library/mtm/src/config.c | 75 + .../usermode/library/mtm/src/gc.c | 482 ++++ .../usermode/library/mtm/src/gcc-abi.c | 532 ++++ .../usermode/library/mtm/src/init.c | 448 ++++ .../usermode/library/mtm/src/local.c | 197 ++ .../library/mtm/src/mode/common/common.c | 53 + .../usermode/library/mtm/src/mode/mode.c | 82 + .../library/mtm/src/mode/pwb-common/pwb.c | 68 + .../mtm/src/mode/pwb-common/tmlog_base.c | 387 +++ .../mtm/src/mode/pwb-common/tmlog_tornbit.c | 412 +++ .../library/mtm/src/mode/pwbetl/barrier.c | 76 + .../library/mtm/src/mode/pwbetl/beginend.c | 132 + .../library/mtm/src/mode/pwbetl/memcpy.c | 38 + .../library/mtm/src/mode/pwbetl/memset.c | 37 + .../library/mtm/src/mode/pwbetl/pwbetl.c | 120 + .../usermode/library/mtm/src/mtm.c | 61 + .../usermode/library/mtm/src/stats.c | 470 ++++ .../library/mtm/src/sysdeps/linux/rwlock.c | 78 + .../library/mtm/src/sysdeps/x86/arch.S | 82 + .../library/mtm/src/sysdeps/x86/sjlj.S | 42 + .../usermode/library/mtm/src/txlock.c | 60 + .../usermode/library/mtm/src/useraction.c | 157 ++ .../usermode/library/pmalloc/SConscript | 77 + .../library/pmalloc/include/arch-specific.h | 92 + .../usermode/library/pmalloc/include/block.h | 151 ++ .../usermode/library/pmalloc/include/config.h | 101 + .../library/pmalloc/include/genalloc.h | 90 + .../library/pmalloc/include/heapstats.h | 173 ++ .../library/pmalloc/include/hoardheap.h | 458 ++++ .../library/pmalloc/include/pdlmalloc.h | 45 + .../library/pmalloc/include/persistentheap.h | 281 ++ .../pmalloc/include/persistentsuperblock.h | 236 ++ .../library/pmalloc/include/pmalloc.h | 58 + .../library/pmalloc/include/processheap.h | 227 ++ .../library/pmalloc/include/superblock.h | 363 +++ .../library/pmalloc/include/threadheap.h | 180 ++ .../usermode/library/pmalloc/include/timer.h | 208 ++ .../library/pmalloc/include/txmutex.h | 143 + .../library/pmalloc/include/vhalloc.h | 44 + .../library/pmalloc/include/vistaheap.h | 68 + .../library/pmalloc/src/#pdlmalloc.c# | 1318 ++++++++++ .../usermode/library/pmalloc/src/AUTHORS | 4 + .../usermode/library/pmalloc/src/COPYING | 466 ++++ .../usermode/library/pmalloc/src/ChangeLog | 1486 +++++++++++ .../usermode/library/pmalloc/src/README | 116 + .../library/pmalloc/src/arch-specific.cpp | 247 ++ .../library/pmalloc/src/gen_sizeclass.py | 37 + .../library/pmalloc/src/hoardheap.cpp | 562 ++++ .../library/pmalloc/src/malloc-test.c | 456 ++++ .../library/pmalloc/src/mallocwrap.cpp | 75 + .../usermode/library/pmalloc/src/mytest.cpp | 30 + .../usermode/library/pmalloc/src/pdlmalloc.c | 1319 ++++++++++ .../library/pmalloc/src/persistentheap.cpp | 258 ++ .../library/pmalloc/src/processheap.cpp | 142 + .../library/pmalloc/src/superblock.cpp | 159 ++ .../library/pmalloc/src/threadheap.cpp | 107 + .../usermode/library/pmalloc/src/vhalloc.c | 170 ++ .../usermode/library/pmalloc/src/vistaheap.c | 355 +++ .../usermode/library/pmalloc/src/wrapper.cpp | 199 ++ ext/mnemosyne-gcc/usermode/mnemosyne.ini | 6 + ext/mnemosyne-gcc/usermode/run.cnf | 6 + ext/mnemosyne-gcc/usermode/run.sh | 43 + ext/mnemosyne-gcc/usermode/run_vacation.sh | 13 + .../usermode/site_scons/unit_test.py | 50 + ext/mnemosyne-gcc/usermode/test/SConscript | 47 + .../usermode/test/common/memrandom.h | 66 + .../usermode/test/common/unittest.h | 116 + .../usermode/test/malloc/SConscript | 17 + .../test/malloc/large-malloc_free.test.cxx | 56 + .../usermode/test/malloc/main.cxx | 48 + .../test/malloc/simple-malloc_free.test.cxx | 56 + .../usermode/test/mtm/SConscript | 16 + .../mtm/nonvolatile_write_set.fixtures.cxx | 57 + .../mtm/nonvolatile_write_set.fixtures.hxx | 59 + .../mtm/nonvolatile_write_set.helpers.cxx | 86 + .../mtm/nonvolatile_write_set.helpers.hxx | 83 + .../test/mtm/nonvolatile_write_set.tests.cxx | 69 + .../usermode/test/pmap/SConscript | 16 + ext/mnemosyne-gcc/usermode/test/pmap/main.cxx | 47 + .../usermode/test/pmap/write_read.test.cxx | 62 + .../usermode/test/rawlog/SConscript | 16 + .../usermode/test/rawlog/main.cxx | 61 + .../rawlog/random_read_write_log.test.cxx | 85 + .../test/rawlog/rawlog_tornbit.helper.cxx | 66 + .../test/rawlog/rawlog_tornbit.helper.h | 83 + .../usermode/test/rawlog/sequence.helper.h | 162 ++ .../usermode/test/tmlog/SConscript | 18 + .../usermode/test/tmlog/main.cxx | 44 + ext/mnemosyne-gcc/usermode/tool/SConscript | 24 + .../usermode/tool/bandwidth-pcm/SConscript | 15 + .../usermode/tool/bandwidth-pcm/main.c | 668 +++++ .../usermode/tool/bandwidth-ram/COPYING | 340 +++ .../usermode/tool/bandwidth-ram/Makefile | 16 + .../usermode/tool/bandwidth-ram/README | 43 + .../usermode/tool/bandwidth-ram/main.c | 573 ++++ .../usermode/tool/bandwidth-ram/routines32.s | 152 ++ .../usermode/tool/bandwidth-ram/routines64.s | 309 +++ .../linker_script_persistent_segment_m32 | 234 ++ .../linker_script_persistent_segment_m64 | 255 ++ ext/mnemosyne-gcc/usermode/tool/linker/shdr.c | 85 + .../Immutable-Datastructure-c++/.travis.yml | 82 + .../Immutable-Datastructure-c++/LICENSE | 23 + .../Immutable-Datastructure-c++/default.nix | 14 + .../Immutable-Datastructure-c++/immer/:w | 832 ++++++ .../immer/algorithm.hpp | 214 ++ .../immer/array.hpp | 346 +++ .../immer/array_transient.hpp | 212 ++ .../Immutable-Datastructure-c++/immer/box.hpp | 184 ++ .../immer/concurrent_map.hpp | 60 + .../immer/concurrent_vector.hpp | 73 + .../immer/config.hpp | 58 + .../immer/detail/arrays/no_capacity.hpp | 200 ++ .../immer/detail/arrays/node.hpp | 138 + .../immer/detail/arrays/with_capacity.hpp | 301 +++ .../immer/detail/combine_standard_layout.hpp | 196 ++ .../immer/detail/hamts/bits.hpp | 55 + .../immer/detail/hamts/champ.hpp | 492 ++++ .../immer/detail/hamts/champ_iterator.hpp | 143 + .../immer/detail/hamts/node.hpp | 867 +++++++ .../immer/detail/iterator_facade.hpp | 202 ++ .../immer/detail/list/list.hpp | 252 ++ .../immer/detail/rbts/bits.hpp | 33 + .../immer/detail/rbts/node.hpp | 980 +++++++ .../immer/detail/rbts/operations.hpp | 2308 +++++++++++++++++ .../immer/detail/rbts/perf.data | Bin 0 -> 136858 bytes .../immer/detail/rbts/perf.data.old | Bin 0 -> 155698 bytes .../immer/detail/rbts/position.hpp | 1838 +++++++++++++ .../immer/detail/rbts/rbtree.hpp | 571 ++++ .../immer/detail/rbts/rbtree_iterator.hpp | 100 + .../immer/detail/rbts/rrbtree.hpp | 1282 +++++++++ .../immer/detail/rbts/rrbtree_iterator.hpp | 100 + .../immer/detail/rbts/visitor.hpp | 83 + .../immer/detail/ref_count_base.hpp | 36 + .../immer/detail/type_traits.hpp | 191 ++ .../immer/detail/util.hpp | 216 ++ .../experimental/detail/dvektor_impl.hpp | 512 ++++ .../immer/experimental/dvektor.hpp | 63 + .../immer/flex_vector.hpp | 502 ++++ .../immer/flex_vector_transient.hpp | 232 ++ .../immer/heap/cpp_heap.hpp | 41 + .../immer/heap/debug_size_heap.hpp | 50 + .../immer/heap/free_list_heap.hpp | 83 + .../immer/heap/free_list_node.hpp | 25 + .../immer/heap/gc_heap.hpp | 130 + .../immer/heap/heap_policy.hpp | 148 ++ .../immer/heap/identity_heap.hpp | 34 + .../immer/heap/malloc_heap.hpp | 47 + .../immer/heap/nvm_malloc_heap.hpp | 142 + .../immer/heap/pmalloc_heap.hpp | 50 + .../immer/heap/split_heap.hpp | 41 + .../immer/heap/tags.hpp | 15 + .../heap/thread_local_free_list_heap.hpp | 55 + .../immer/heap/unsafe_free_list_heap.hpp | 108 + .../immer/heap/with_data.hpp | 43 + .../Immutable-Datastructure-c++/immer/map.hpp | 378 +++ .../immer/map_transient.hpp | 29 + .../immer/memory_policy.hpp | 149 ++ .../immer/nvm_utils.hpp | 114 + .../immer/queue.hpp | 90 + .../immer/refcount/enable_intrusive_ptr.hpp | 37 + .../immer/refcount/no_refcount_policy.hpp | 30 + .../immer/refcount/refcount_policy.hpp | 52 + .../immer/refcount/unsafe_refcount_policy.hpp | 36 + .../Immutable-Datastructure-c++/immer/set.hpp | 199 ++ .../immer/set_transient.hpp | 28 + .../immer/transience/gc_transience_policy.hpp | 110 + .../immer/transience/no_transience_policy.hpp | 48 + .../immer/unordered_map.hpp | 263 ++ .../immer/vector.hpp | 407 +++ .../immer/vector_transient.hpp | 216 ++ ext/mod-single-repo/LICENSE | 2 + ext/mod-single-repo/mod.diff | 158 ++ ext/mod-single-repo/nvm_malloc/.gitignore | 1 + ext/mod-single-repo/nvm_malloc/LICENSE | 139 + ext/mod-single-repo/nvm_malloc/Makefile | 41 + ext/mod-single-repo/nvm_malloc/README.md | 198 ++ .../nvm_malloc/benchmark/Makefile | 33 + .../nvm_malloc/benchmark/run_benchmarks.py | 170 ++ .../benchmark/src/bench_alloc_free.cpp | 61 + .../benchmark/src/bench_alloc_free_alloc.cpp | 65 + .../benchmark/src/bench_fastalloc.cpp | 57 + .../benchmark/src/bench_linkedlist.cpp | 79 + .../benchmark/src/bench_recovery.cpp | 102 + .../nvm_malloc/benchmark/src/common.cpp | 9 + .../nvm_malloc/benchmark/src/common.h | 169 ++ ext/mod-single-repo/nvm_malloc/compile.sh | 2 + ext/mod-single-repo/nvm_malloc/src/arena.c | 491 ++++ ext/mod-single-repo/nvm_malloc/src/arena.h | 25 + ext/mod-single-repo/nvm_malloc/src/chunk.c | 217 ++ ext/mod-single-repo/nvm_malloc/src/chunk.h | 18 + .../nvm_malloc/src/nvm_malloc.c | 817 ++++++ .../nvm_malloc/src/nvm_malloc.h | 47 + .../nvm_malloc/src/object_table.c | 258 ++ .../nvm_malloc/src/object_table.h | 24 + ext/mod-single-repo/nvm_malloc/src/types.h | 196 ++ ext/mod-single-repo/nvm_malloc/src/util.c | 90 + ext/mod-single-repo/nvm_malloc/src/util.h | 48 + .../nvm_malloc/ulib-svn/AUTHORS | 1 + .../nvm_malloc/ulib-svn/CHANGELOG | 8 + .../nvm_malloc/ulib-svn/Makefile | 22 + .../nvm_malloc/ulib-svn/README | 114 + .../nvm_malloc/ulib-svn/VERSION | 1 + .../nvm_malloc/ulib-svn/lib/Makefile | 18 + .../nvm_malloc/ulib-svn/lib/__.SYMDEF SORTED | Bin 0 -> 48 bytes .../nvm_malloc/ulib-svn/lib/makedll.bat | 29 + .../nvm_malloc/ulib-svn/perf/Makefile | 7 + .../nvm_malloc/ulib-svn/perf/avl/libavl/avl.c | 889 +++++++ .../nvm_malloc/ulib-svn/perf/avl/libavl/avl.h | 120 + .../ulib-svn/perf/avl/libavl/avl_bench.cpp | 65 + .../ulib-svn/perf/avl/libavl/result | 3 + .../ulib-svn/perf/avl/solaris/avl.c | 1029 ++++++++ .../ulib-svn/perf/avl/solaris/avl.h | 315 +++ .../ulib-svn/perf/avl/solaris/avl_bench.cpp | 67 + .../ulib-svn/perf/avl/solaris/avl_impl.h | 163 ++ .../ulib-svn/perf/avl/solaris/result | 3 + .../nvm_malloc/ulib-svn/perf/avl/ulib/result | 5 + .../nvm_malloc/ulib-svn/perf/hashmap/Makefile | 28 + .../ulib-svn/perf/hashmap/hash_perf.cpp | 218 ++ .../ulib-svn/perf/mapreduce/Makefile | 21 + .../ulib-svn/perf/mapreduce/mr_bench.cpp | 177 ++ .../nvm_malloc/ulib-svn/rules.mk | 46 + .../nvm_malloc/ulib-svn/src/Makefile | 11 + .../nvm_malloc/ulib-svn/src/base/Makefile | 7 + .../nvm_malloc/ulib-svn/src/base/bitmap.c | 1050 ++++++++ .../nvm_malloc/ulib-svn/src/base/bitmap.h | 304 +++ .../nvm_malloc/ulib-svn/src/base/crypt_aes.c | 1328 ++++++++++ .../nvm_malloc/ulib-svn/src/base/crypt_aes.h | 93 + .../nvm_malloc/ulib-svn/src/base/crypt_md5.c | 277 ++ .../nvm_malloc/ulib-svn/src/base/crypt_md5.h | 78 + .../nvm_malloc/ulib-svn/src/base/crypt_rc4.c | 65 + .../nvm_malloc/ulib-svn/src/base/crypt_rc4.h | 51 + .../nvm_malloc/ulib-svn/src/base/crypt_sha1.c | 323 +++ .../nvm_malloc/ulib-svn/src/base/crypt_sha1.h | 78 + .../ulib-svn/src/base/crypt_sha256.c | 459 ++++ .../ulib-svn/src/base/crypt_sha256.h | 57 + .../ulib-svn/src/base/hash_chain_prot.h | 421 +++ .../nvm_malloc/ulib-svn/src/base/hash_func.c | 595 +++++ .../nvm_malloc/ulib-svn/src/base/hash_func.h | 66 + .../ulib-svn/src/base/hash_open_prot.h | 330 +++ .../nvm_malloc/ulib-svn/src/base/heap_prot.h | 103 + .../nvm_malloc/ulib-svn/src/base/list.h | 760 ++++++ .../nvm_malloc/ulib-svn/src/base/math_bit.h | 523 ++++ .../nvm_malloc/ulib-svn/src/base/math_bn.c | 40 + .../nvm_malloc/ulib-svn/src/base/math_bn.h | 40 + .../ulib-svn/src/base/math_factorial.h | 71 + .../nvm_malloc/ulib-svn/src/base/math_gcd.c | 75 + .../nvm_malloc/ulib-svn/src/base/math_gcd.h | 45 + .../nvm_malloc/ulib-svn/src/base/math_lcm.c | 37 + .../nvm_malloc/ulib-svn/src/base/math_lcm.h | 40 + .../ulib-svn/src/base/math_rand_prot.h | 159 ++ .../ulib-svn/src/base/search_line.c | 126 + .../ulib-svn/src/base/search_line.h | 63 + .../ulib-svn/src/base/sort_heap_prot.h | 41 + .../nvm_malloc/ulib-svn/src/base/sort_list.c | 174 ++ .../nvm_malloc/ulib-svn/src/base/sort_list.h | 78 + .../ulib-svn/src/base/sort_median_prot.h | 70 + .../nvm_malloc/ulib-svn/src/base/str_util.c | 64 + .../nvm_malloc/ulib-svn/src/base/str_util.h | 48 + .../nvm_malloc/ulib-svn/src/base/tree.c | 785 ++++++ .../nvm_malloc/ulib-svn/src/base/tree.h | 285 ++ .../nvm_malloc/ulib-svn/src/base/tree_util.c | 114 + .../nvm_malloc/ulib-svn/src/base/tree_util.h | 65 + .../nvm_malloc/ulib-svn/src/base/ulib_ver.c | 42 + .../nvm_malloc/ulib-svn/src/base/ulib_ver.h | 42 + .../nvm_malloc/ulib-svn/src/base/util_algo.h | 181 ++ .../ulib-svn/src/base/util_hexdump.c | 171 ++ .../ulib-svn/src/base/util_hexdump.h | 141 + .../nvm_malloc/ulib-svn/src/base/util_log.h | 52 + .../nvm_malloc/ulib-svn/src/base/util_timer.h | 48 + .../nvm_malloc/ulib-svn/src/ext1/Makefile | 15 + .../ulib-svn/src/ext1/bloom_filter/Makefile | 7 + .../ulib-svn/src/ext1/bloom_filter/bfilter.c | 117 + .../ulib-svn/src/ext1/bloom_filter/bfilter.h | 55 + .../nvm_malloc/ulib-svn/src/ext1/c++/Makefile | 6 + .../ulib-svn/src/ext1/c++/hash_chain.h | 303 +++ .../ulib-svn/src/ext1/c++/hash_open.h | 567 ++++ .../ulib-svn/src/ext1/c++/util_class.h | 46 + .../ulib-svn/src/ext1/comb/Makefile | 7 + .../ulib-svn/src/ext1/comb/math_comb.c | 76 + .../ulib-svn/src/ext1/comb/math_comb.h | 75 + .../ulib-svn/src/ext1/console/Makefile | 7 + .../ulib-svn/src/ext1/console/util_argv.c | 110 + .../ulib-svn/src/ext1/console/util_argv.h | 59 + .../ulib-svn/src/ext1/console/util_console.c | 201 ++ .../ulib-svn/src/ext1/console/util_console.h | 64 + .../nvm_malloc/ulib-svn/src/ext1/rng/Makefile | 7 + .../ulib-svn/src/ext1/rng/math_rng_gamma.c | 66 + .../ulib-svn/src/ext1/rng/math_rng_gamma.h | 48 + .../ulib-svn/src/ext1/rng/math_rng_normal.c | 186 ++ .../ulib-svn/src/ext1/rng/math_rng_normal.h | 49 + .../ulib-svn/src/ext1/rng/math_rng_zipf.c | 60 + .../ulib-svn/src/ext1/rng/math_rng_zipf.h | 61 + .../nvm_malloc/ulib-svn/src/ext2/Makefile | 13 + .../ulib-svn/src/ext2/mapreduce/Makefile | 7 + .../src/ext2/mapreduce/mr_dataset.cpp | 64 + .../ulib-svn/src/ext2/mapreduce/mr_dataset.h | 252 ++ .../ulib-svn/src/ext2/mapreduce/mr_engine.h | 333 +++ .../ulib-svn/src/ext2/mapreduce/mr_interm.h | 96 + .../ulib-svn/src/ext2/osdep/Makefile | 6 + .../src/ext2/osdep/os_atomic_intel64.h | 130 + .../ulib-svn/src/ext2/osdep/os_rdtsc.h | 79 + .../ulib-svn/src/ext2/osdep/os_spinlock.h | 463 ++++ .../ulib-svn/src/ext2/reentrant/Makefile | 6 + .../src/ext2/reentrant/hash_chain_r.h | 176 ++ .../src/ext2/reentrant/hash_multi_r.h | 340 +++ .../src/ext2/reentrant/os_regionlock.h | 172 ++ .../ulib-svn/src/ext2/reentrant/os_typelock.h | 469 ++++ .../ulib-svn/src/ext2/thread/Makefile | 7 + .../ulib-svn/src/ext2/thread/os_thread.cpp | 45 + .../ulib-svn/src/ext2/thread/os_thread.h | 109 + .../nvm_malloc/ulib-svn/test/Makefile | 26 + .../nvm_malloc/ulib-svn/test/aes.cpp | 95 + .../nvm_malloc/ulib-svn/test/atomic.cpp | 51 + .../nvm_malloc/ulib-svn/test/avl_bench.cpp | 70 + .../nvm_malloc/ulib-svn/test/bfilter.cpp | 21 + .../ulib-svn/test/bfilter_bench.cpp | 87 + .../nvm_malloc/ulib-svn/test/bit.cpp | 39 + .../nvm_malloc/ulib-svn/test/bitmap.cpp | 24 + .../nvm_malloc/ulib-svn/test/bn.cpp | 15 + .../nvm_malloc/ulib-svn/test/comb.cpp | 72 + .../nvm_malloc/ulib-svn/test/console.cpp | 56 + .../nvm_malloc/ulib-svn/test/factorial.cpp | 37 + .../nvm_malloc/ulib-svn/test/fpr.cpp | 41 + .../nvm_malloc/ulib-svn/test/gamma_rng.cpp | 25 + .../nvm_malloc/ulib-svn/test/gcd.cpp | 21 + .../nvm_malloc/ulib-svn/test/hash_chain.cpp | 65 + .../ulib-svn/test/hash_chain_bench.cpp | 81 + .../ulib-svn/test/hash_chain_prot.cpp | 105 + .../ulib-svn/test/hash_chain_prot_bench.cpp | 91 + .../nvm_malloc/ulib-svn/test/hash_chain_r.cpp | 115 + .../ulib-svn/test/hash_chain_r1.cpp | 65 + .../ulib-svn/test/hash_chain_r_bench.cpp | 82 + .../test/hash_chain_r_workload_shared.cpp | 128 + .../test/hash_chain_workload_indep.cpp | 140 + .../nvm_malloc/ulib-svn/test/hash_func.cpp | 63 + .../ulib-svn/test/hash_func_perf.cpp | 48 + .../test/hash_multi_r_workload_shared.cpp | 129 + .../ulib-svn/test/hash_multihash_r.cpp | 122 + .../ulib-svn/test/hash_multihash_r_bench.cpp | 81 + .../nvm_malloc/ulib-svn/test/hash_open.cpp | 103 + .../ulib-svn/test/hash_open_prot_bench.cpp | 91 + .../nvm_malloc/ulib-svn/test/heapsort.cpp | 24 + .../nvm_malloc/ulib-svn/test/hweight.cpp | 64 + .../nvm_malloc/ulib-svn/test/hweight_mult.cpp | 65 + .../nvm_malloc/ulib-svn/test/hweight_perf.cpp | 92 + .../ulib-svn/test/hweight_perf_mult.cpp | 45 + .../ulib-svn/test/int_hash_perf.cpp | 73 + .../nvm_malloc/ulib-svn/test/lcm.cpp | 13 + .../nvm_malloc/ulib-svn/test/list.cpp | 47 + .../nvm_malloc/ulib-svn/test/listsort.cpp | 71 + .../nvm_malloc/ulib-svn/test/log.cpp | 13 + .../nvm_malloc/ulib-svn/test/md5.cpp | 26 + .../nvm_malloc/ulib-svn/test/median.cpp | 39 + .../nvm_malloc/ulib-svn/test/normal_rng.cpp | 22 + .../nvm_malloc/ulib-svn/test/rand.cpp | 36 + .../nvm_malloc/ulib-svn/test/rand_inv.cpp | 14 + .../nvm_malloc/ulib-svn/test/rc4.cpp | 53 + .../nvm_malloc/ulib-svn/test/rdtsc.cpp | 18 + .../nvm_malloc/ulib-svn/test/run_all_test.sh | 10 + .../nvm_malloc/ulib-svn/test/search_line.cpp | 28 + .../nvm_malloc/ulib-svn/test/search_line.data | 3 + .../nvm_malloc/ulib-svn/test/set_bench.cpp | 65 + .../nvm_malloc/ulib-svn/test/sha1.cpp | 24 + .../nvm_malloc/ulib-svn/test/sha256.cpp | 31 + .../nvm_malloc/ulib-svn/test/spinlock.cpp | 320 +++ .../nvm_malloc/ulib-svn/test/splay_bench.cpp | 67 + .../ulib-svn/test/splay_np_bench.cpp | 58 + .../nvm_malloc/ulib-svn/test/str_util.cpp | 28 + .../nvm_malloc/ulib-svn/test/thread.cpp | 36 + .../nvm_malloc/ulib-svn/test/tree.cpp | 81 + .../nvm_malloc/ulib-svn/test/version.cpp | 11 + .../nvm_malloc/ulib-svn/test/zipf_rng.cpp | 27 + ext/pronto-v1.1/pronto.diff | 219 ++ ext/pronto-v1.1/src/.gitignore | 4 + ext/pronto-v1.1/src/Makefile | 105 + ext/pronto-v1.1/src/ckpt_alloc.cpp | 1102 ++++++++ ext/pronto-v1.1/src/ckpt_alloc.hpp | 219 ++ ext/pronto-v1.1/src/context.cpp | 100 + ext/pronto-v1.1/src/cpu_info.cpp | 69 + ext/pronto-v1.1/src/nv_catalog.cpp | 73 + ext/pronto-v1.1/src/nv_catalog.hpp | 41 + ext/pronto-v1.1/src/nv_factory.cpp | 35 + ext/pronto-v1.1/src/nv_factory.hpp | 50 + ext/pronto-v1.1/src/nv_log.cpp | 111 + ext/pronto-v1.1/src/nv_log.hpp | 34 + ext/pronto-v1.1/src/nv_object.cpp | 208 ++ ext/pronto-v1.1/src/nv_object.hpp | 120 + ext/pronto-v1.1/src/nvm_manager.cpp | 381 +++ ext/pronto-v1.1/src/nvm_manager.hpp | 80 + ext/pronto-v1.1/src/persister.cpp | 101 + ext/pronto-v1.1/src/persister.hpp | 4 + ext/pronto-v1.1/src/recovery_context.hpp | 73 + ext/pronto-v1.1/src/savitar.hpp | 48 + ext/pronto-v1.1/src/snapshot.cpp | 637 +++++ ext/pronto-v1.1/src/snapshot.hpp | 75 + ext/pronto-v1.1/src/stl_alloc.hpp | 48 + ext/pronto-v1.1/src/thread.cpp | 391 +++ ext/pronto-v1.1/src/thread.hpp | 45 + ext/ralloc/LICENSE | 21 + ext/ralloc/Makefile | 31 + ext/ralloc/README.md | 160 ++ ext/ralloc/SConscript | 25 + ext/ralloc/TODO | 59 + ext/ralloc/data/genfigs.R | 285 ++ ext/ralloc/data/mm-uncached/genfigs.R | 145 ++ ext/ralloc/data/uncached+dax/genfigs.R | 145 ++ ext/ralloc/ralloc.diff | 550 ++++ ext/ralloc/src/AllocatorMacro.hpp | 1 + ext/ralloc/src/BaseMeta.cpp | 1107 ++++++++ ext/ralloc/src/BaseMeta.hpp | 574 ++++ ext/ralloc/src/README.md | 35 + ext/ralloc/src/RegionManager.cpp | 303 +++ ext/ralloc/src/RegionManager.hpp | 281 ++ ext/ralloc/src/SizeClass.cpp | 51 + ext/ralloc/src/SizeClass.hpp | 365 +++ ext/ralloc/src/TCache.cpp | 56 + ext/ralloc/src/TCache.hpp | 85 + ext/ralloc/src/pfence_util.h | 90 + ext/ralloc/src/pm_config.hpp | 115 + ext/ralloc/src/pptr.hpp | 242 ++ ext/ralloc/src/ralloc.cpp | 219 ++ ext/ralloc/src/ralloc.hpp | 97 + ext/ralloc/test/Makefile | 79 + ext/ralloc/test/benchmark/AllocatorMacro.hpp | 261 ++ ext/ralloc/test/benchmark/HazardPointers.hpp | 156 ++ .../test/benchmark/MichaelScottQueue.hpp | 158 ++ ext/ralloc/test/benchmark/cpuinfo.h | 202 ++ ext/ralloc/test/benchmark/fred.h | 66 + ext/ralloc/test/benchmark/larson.cpp | 577 +++++ ext/ralloc/test/benchmark/optional.hpp | 1070 ++++++++ ext/ralloc/test/benchmark/prod-con.cpp | 189 ++ ext/ralloc/test/benchmark/sh6bench.cpp | 358 +++ ext/ralloc/test/benchmark/threadtest.cpp | 203 ++ ext/ralloc/test/benchmark/timer.h | 372 +++ ext/ralloc/test/larson-single.sh | 37 + ext/ralloc/test/old/active-false-single.sh | 31 + ext/ralloc/test/old/arrayqueue_test.cpp | 122 + ext/ralloc/test/old/arraystack_test.cpp | 122 + ext/ralloc/test/old/base_meta_test.cpp | 35 + ext/ralloc/test/old/cache-scratch.cpp | 227 ++ ext/ralloc/test/old/cache-thrash.cpp | 216 ++ ext/ralloc/test/old/msqueue_test.cpp | 117 + ext/ralloc/test/old/passive-false-single.sh | 32 + ext/ralloc/test/old/pptr_test.cpp | 130 + ext/ralloc/test/old/region_manager_test.cpp | 19 + ext/ralloc/test/old/run_act_false.sh | 30 + ext/ralloc/test/old/run_pas_false.sh | 30 + ext/ralloc/test/old/trivial_test.cpp | 50 + ext/ralloc/test/prod-con-single.sh | 37 + ext/ralloc/test/ralloc_test.cpp | 112 + ext/ralloc/test/run_all.sh | 13 + ext/ralloc/test/run_larson.sh | 28 + ext/ralloc/test/run_prod-con.sh | 27 + ext/ralloc/test/run_resur.sh | 33 + ext/ralloc/test/run_shbench.sh | 29 + ext/ralloc/test/run_threadtest.sh | 27 + ext/ralloc/test/shbench-single.sh | 43 + ext/ralloc/test/threadtest-single.sh | 37 + ext/threadcached/.gitignore | 43 + ext/threadcached/.gitmodules | 6 + ext/threadcached/Makefile | 101 + ext/threadcached/NOTES/COPYING | 30 + ext/threadcached/NOTES/LICENSE | 30 + ext/threadcached/NOTES/LICENSE.bipbuffer | 24 + ext/threadcached/NOTES/LICENSE.itoa_ljust | 39 + ext/threadcached/README.md | 20 + ext/threadcached/include/assoc.h | 11 + ext/threadcached/include/bipbuffer.h | 86 + ext/threadcached/include/config.h | 135 + ext/threadcached/include/constants.h | 104 + ext/threadcached/include/crawler.h | 42 + ext/threadcached/include/defines.h | 266 ++ ext/threadcached/include/items.h | 74 + ext/threadcached/include/itoa_ljust.h | 28 + ext/threadcached/include/memcached.h | 569 ++++ ext/threadcached/include/murmur3_hash.h | 19 + ext/threadcached/include/pku_memcached.h | 120 + ext/threadcached/include/slab_automove.h | 19 + ext/threadcached/include/util.h | 40 + ext/threadcached/src/assoc.cc | 308 +++ ext/threadcached/src/bipbuffer.cc | 183 ++ ext/threadcached/src/crawler.cc | 463 ++++ ext/threadcached/src/globals.cc | 32 + ext/threadcached/src/items.cc | 1151 ++++++++ ext/threadcached/src/itoa_ljust.cc | 149 ++ ext/threadcached/src/memcached.cc | 1017 ++++++++ ext/threadcached/src/murmur3_hash.cc | 124 + ext/threadcached/src/pku_memcached.cc | 440 ++++ ext/threadcached/src/thread.cc | 236 ++ ext/threadcached/src/util.cc | 248 ++ ext/threadcached/test/basic_test.cc | 12 + ext/threadcached/test/end.cc | 15 + ext/threadcached/test/get.cc | 30 + ext/threadcached/test/insert.cc | 69 + ext/threadcached/test/server.cc | 9 + ext/threadcached/threadcached.diff | 567 ++++ ext/ycsb-tcd/LICENSE | 202 ++ ext/ycsb-tcd/Makefile | 55 + ext/ycsb-tcd/README.md | 34 + ext/ycsb-tcd/cache_test/Makefile | 15 + ext/ycsb-tcd/cache_test/cache_test.cc | 71 + ext/ycsb-tcd/cache_test/cache_test.h | 3 + ext/ycsb-tcd/core/.gitignore | 3 + ext/ycsb-tcd/core/Makefile | 12 + ext/ycsb-tcd/core/client.h | 143 + ext/ycsb-tcd/core/const_generator.h | 28 + ext/ycsb-tcd/core/core_workload.cc | 200 ++ ext/ycsb-tcd/core/core_workload.h | 215 ++ ext/ycsb-tcd/core/counter_generator.h | 31 + ext/ycsb-tcd/core/db.h | 99 + ext/ycsb-tcd/core/discrete_generator.h | 66 + ext/ycsb-tcd/core/generator.h | 27 + ext/ycsb-tcd/core/properties.h | 70 + .../core/scrambled_zipfian_generator.h | 56 + ext/ycsb-tcd/core/skewed_latest_generator.h | 43 + ext/ycsb-tcd/core/timer.h | 40 + ext/ycsb-tcd/core/uniform_generator.h | 47 + ext/ycsb-tcd/core/utils.h | 79 + ext/ycsb-tcd/core/zipfian_generator.h | 122 + ext/ycsb-tcd/db/Makefile | 16 + ext/ycsb-tcd/db/basic_db.h | 100 + ext/ycsb-tcd/db/db_factory.cc | 23 + ext/ycsb-tcd/db/db_factory.h | 25 + ext/ycsb-tcd/db/hashtable_db.cc | 130 + ext/ycsb-tcd/db/hashtable_db.h | 51 + ext/ycsb-tcd/db/mcd_db.cc | 93 + ext/ycsb-tcd/db/tcd_db.cc | 83 + ext/ycsb-tcd/db/tcd_db.h | 51 + ext/ycsb-tcd/lib/lock_stl_hashtable.h | 74 + ext/ycsb-tcd/lib/mem_alloc.h | 27 + ext/ycsb-tcd/lib/stl_hashtable.h | 105 + ext/ycsb-tcd/lib/string.h | 92 + ext/ycsb-tcd/lib/string_hashtable.h | 34 + ext/ycsb-tcd/lib/tbb_rand_hashtable.h | 101 + ext/ycsb-tcd/lib/tbb_scan_hashtable.h | 101 + ext/ycsb-tcd/parse_result.py | 69 + ext/ycsb-tcd/workloads/workloada.spec | 23 + ext/ycsb-tcd/workloads/workloadb.spec | 22 + ext/ycsb-tcd/workloads/workloadc.spec | 23 + ext/ycsb-tcd/workloads/workloadd.spec | 26 + ext/ycsb-tcd/workloads/workloade.spec | 31 + ext/ycsb-tcd/workloads/workloadf.spec | 21 + ext/ycsb-tcd/ycsbc.cc | 290 +++ script/EpochLengthSensitivity.sh | 35 + script/dataset-txt-to-binary.py | 27 + script/explore_hashtable.sh | 144 + script/explore_memcached.sh | 95 + script/pronto_snapshot.sh | 23 + script/run_graph.sh | 81 + script/run_memcached.sh | 43 + script/run_size.sh | 266 ++ script/run_thread.sh | 249 ++ script/setup-datasets.sh | 46 + src/CustomTypes.cpp | 92 + src/CustomTypes.hpp | 48 + src/HeapQueue.hpp | 18 + src/ParallelLaunch.cpp | 241 ++ src/ParallelLaunch.hpp | 18 + src/RGraph.hpp | 39 + src/RMap.hpp | 55 + src/RQueue.hpp | 36 + src/RSet.hpp | 25 + src/Recorder.cpp | 167 ++ src/Recorder.hpp | 190 ++ src/Rideable.hpp | 32 + src/TestConfig.cpp | 398 +++ src/TestConfig.hpp | 152 ++ src/main.cpp | 172 ++ src/persist/EpochSys.cpp | 513 ++++ src/persist/EpochSys.hpp | 668 +++++ src/persist/PString.hpp | 176 ++ src/persist/PerThreadContainers.hpp | 170 ++ src/persist/README.md | 40 + src/persist/Recoverable.hpp | 12 + src/persist/ToBeFreedContainers.hpp | 136 + src/persist/ToBePersistedContainers.hpp | 459 ++++ src/persist/TransactionTrackers.hpp | 215 ++ src/persist/api/pblk_naked.hpp | 236 ++ src/persist/api/persist_struct_api.hpp | 6 + src/persist/persist_config.hpp | 2 + src/persist/persist_utils.hpp | 396 +++ src/rideables/DLGraph.hpp | 406 +++ src/rideables/DaliUnorderedMap.hpp | 618 +++++ src/rideables/FriedmanQueue.hpp | 157 ++ src/rideables/HOHHashTable.hpp | 210 ++ src/rideables/HashTable.hpp | 324 +++ src/rideables/LinkedList.hpp | 16 + src/rideables/LockfreeHashTable.hpp | 258 ++ src/rideables/MODHashTable.hpp | 66 + src/rideables/MODQueue.hpp | 64 + src/rideables/MSQueue.hpp | 108 + src/rideables/MneHashTable.hpp | 390 +++ src/rideables/MneQueue.hpp | 154 ++ src/rideables/MontageGraph.hpp | 559 ++++ src/rideables/MontageHashTable.hpp | 290 +++ src/rideables/MontageLfHashTable.hpp | 315 +++ src/rideables/MontageMSQueue.hpp | 162 ++ src/rideables/MontageNatarajanTree.hpp | 559 ++++ src/rideables/MontageQueue.hpp | 139 + src/rideables/NVMGraph.hpp | 362 +++ src/rideables/NVMSOFTHashTable.hpp | 363 +++ src/rideables/NatarajanTree.hpp | 468 ++++ src/rideables/PLockfreeHashTable.hpp | 332 +++ src/rideables/PriorityQueue.hpp | 134 + src/rideables/ProntoHashTable.hpp | 250 ++ src/rideables/ProntoQueue.hpp | 159 ++ src/rideables/Queue.hpp | 137 + src/rideables/README.md | 50 + src/rideables/SOFTHashTable.hpp | 369 +++ src/rideables/TGraph.hpp | 332 +++ src/rideables/Toy.hpp | 44 + src/rideables/UnbalancedTree.hpp | 331 +++ src/rideables/murmur3_hash.cpp | 125 + src/rideables/murmur3_hash.h | 39 + src/tests/ChurnTest.hpp | 191 ++ src/tests/EpochSysVerifyTest.hpp | 152 ++ src/tests/GraphRecoveryTest.hpp | 166 ++ src/tests/GraphTest.hpp | 119 + src/tests/HeapChurnTest.hpp | 143 + src/tests/KVTest.hpp | 108 + src/tests/MapChurnTest.hpp | 147 ++ src/tests/MapTest.hpp | 305 +++ src/tests/MapVerify.hpp | 12 + src/tests/ProntoQueueTest.hpp | 202 ++ src/tests/QueueChurnTest.hpp | 208 ++ src/tests/QueueTest.hpp | 231 ++ src/tests/RecoverVerifyTest.hpp | 144 + src/tests/SetChurnTest.hpp | 81 + src/tests/SetVerify.hpp | 12 + src/tests/TGraphConstructionTest.hpp | 119 + src/tests/ToyTest.hpp | 223 ++ src/tests/YCSBTest.hpp | 152 ++ src/utils/BaseTracker.hpp | 105 + src/utils/ConcurrentPrimitives.hpp | 379 +++ src/utils/HarnessUtils.cpp | 119 + src/utils/HarnessUtils.hpp | 46 + src/utils/PersistFunc.hpp | 81 + src/utils/Persistent.hpp | 64 + src/utils/RCUTracker.hpp | 188 ++ src/utils/optional.hpp | 1070 ++++++++ test.sh | 77 + 873 files changed, 149191 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 data/mt_graph_plotting.R create mode 100644 data/mt_map_plotting.R create mode 100644 data/mt_queue_plotting.R create mode 100644 data/rec_orkut_plotting.R create mode 100644 data/sz_map_plotting.R create mode 100644 data/sz_queue_plotting.R create mode 100644 data/threadcached_plotting.R create mode 100644 ext/README.md create mode 100755 ext/libitm/libitm.so create mode 100644 ext/mnemosyne-gcc/Doxyfile create mode 100644 ext/mnemosyne-gcc/README.md create mode 100644 ext/mnemosyne-gcc/doxypage create mode 100644 ext/mnemosyne-gcc/mne.diff create mode 100644 ext/mnemosyne-gcc/usermode/.gitignore create mode 100644 ext/mnemosyne-gcc/usermode/COPYING create mode 100644 ext/mnemosyne-gcc/usermode/Makefile create mode 100644 ext/mnemosyne-gcc/usermode/SConstruct create mode 100644 ext/mnemosyne-gcc/usermode/bench/SConscript create mode 100644 ext/mnemosyne-gcc/usermode/bench/doxypage create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/AUTHORS create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/LICENSE create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/README.md create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/SConscript create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/VERSIONS create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/common/Defines.common.mk create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/common/Defines.common.otm.mk create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/common/Makefile.common create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/common/Makefile.seq create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/common/Makefile.stm create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/common/Makefile.stm.otm create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/LEGALNOTICE.rbtree create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/LICENSE.rbtree create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/Makefile create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/avltree.c create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/avltree.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/bitmap.c create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/bitmap.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/hash.c create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/hash.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/hashtable.c create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/hashtable.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/heap.c create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/heap.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/list.c create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/list.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/map.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/memory.c create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/memory.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/mt19937ar.c create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/mt19937ar.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/pair.c create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/pair.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/ptm/tm.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/queue.c create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/queue.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/random.c create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/random.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/rbtree.c create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/rbtree.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/set.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/thread.c create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/thread.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/timer.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/tm_common.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/types.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/utility.h create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/vector.c create mode 100644 ext/mnemosyne-gcc/usermode/bench/stamp-kozy/lib/vector.h create mode 100644 ext/mnemosyne-gcc/usermode/examples/SConscript create mode 100644 ext/mnemosyne-gcc/usermode/examples/simple/.gitignore create mode 100644 ext/mnemosyne-gcc/usermode/examples/simple/SConscript create mode 100644 ext/mnemosyne-gcc/usermode/examples/simple/main.c create mode 100644 ext/mnemosyne-gcc/usermode/examples/simple/pvar.c create mode 100644 ext/mnemosyne-gcc/usermode/examples/simple/pvar.h create mode 100644 ext/mnemosyne-gcc/usermode/init_vacation.sh create mode 100644 ext/mnemosyne-gcc/usermode/library/__init__.py create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/AUTHORS create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/COPYING create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/README create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/aligned_atomic_load_store.h create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/all_acquire_release_volatile.h create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/ao_t_is_int.h create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/atomic_ops.h create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/generalize-small.h create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/generalize.h create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/ia64.h create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/ordered_except_wr.h create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/powerpc.h create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/read_ordered.h create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/sparc.h create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/standard_ao_double_t.h create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/test_and_set_t_is_ao_t.h create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/test_and_set_t_is_char.h create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/x86.h create mode 100644 ext/mnemosyne-gcc/usermode/library/atomic_ops/x86_64.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/SConscript create mode 100644 ext/mnemosyne-gcc/usermode/library/common/chhash.c create mode 100644 ext/mnemosyne-gcc/usermode/library/common/chhash.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/config_generic.c create mode 100644 ext/mnemosyne-gcc/usermode/library/common/config_generic.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/cuckoo_hash/CHash.c create mode 100644 ext/mnemosyne-gcc/usermode/library/common/cuckoo_hash/CHash.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/cuckoo_hash/CHash_inline.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/cuckoo_hash/Common.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/cuckoo_hash/Common_inline.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/cuckoo_hash/PointerHash.c create mode 100644 ext/mnemosyne-gcc/usermode/library/common/cuckoo_hash/PointerHash.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/cuckoo_hash/PointerHashInline.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/cuckoo_hash/PointerHash_inline.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/cuckoo_hash/PointerHash_struct.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/cuckoo_hash/PointerSetHash.c create mode 100644 ext/mnemosyne-gcc/usermode/library/common/cuckoo_hash/PointerSetHash.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/cuckoo_hash/PointerSetHashInline.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/cuckoo_hash/PointerSetHash_inline.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/cuckoo_hash/PointerSetHash_struct.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/cuckoo_hash/PortableStdint.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/debug.c create mode 100644 ext/mnemosyne-gcc/usermode/library/common/debug.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/hrtime.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/list.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/mtypes.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/plist.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/pm_instr.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/ptx.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/red_black_tree.c create mode 100644 ext/mnemosyne-gcc/usermode/library/common/red_black_tree.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/result.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/spinlock.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/stack.c create mode 100644 ext/mnemosyne-gcc/usermode/library/common/stack.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/stats_generic.c create mode 100644 ext/mnemosyne-gcc/usermode/library/common/stats_generic.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/ut_barrier.h create mode 100644 ext/mnemosyne-gcc/usermode/library/common/util.h create mode 100644 ext/mnemosyne-gcc/usermode/library/configuration/__init__.py create mode 100644 ext/mnemosyne-gcc/usermode/library/configuration/default/mcore.py create mode 100644 ext/mnemosyne-gcc/usermode/library/configuration/default/mnemosyne.py create mode 100644 ext/mnemosyne-gcc/usermode/library/configuration/default/mtm.py create mode 100644 ext/mnemosyne-gcc/usermode/library/configuration/default/pmalloc.py create mode 100644 ext/mnemosyne-gcc/usermode/library/configuration/default/test.py create mode 100644 ext/mnemosyne-gcc/usermode/library/configuration/helper.py create mode 100644 ext/mnemosyne-gcc/usermode/library/configuration/mcore.py create mode 100644 ext/mnemosyne-gcc/usermode/library/configuration/mnemosyne.py create mode 100644 ext/mnemosyne-gcc/usermode/library/configuration/mtm.py create mode 100644 ext/mnemosyne-gcc/usermode/library/configuration/pmalloc.py create mode 100644 ext/mnemosyne-gcc/usermode/library/configuration/test.py create mode 100644 ext/mnemosyne-gcc/usermode/library/libconfig++.so.8.0.0 create mode 100644 ext/mnemosyne-gcc/usermode/library/libconfig.so.8 create mode 100644 ext/mnemosyne-gcc/usermode/library/libimf.so create mode 100644 ext/mnemosyne-gcc/usermode/library/libintlc.so.5 create mode 100644 ext/mnemosyne-gcc/usermode/library/libmemcached.so.6 create mode 100644 ext/mnemosyne-gcc/usermode/library/libmemcached.so.6.0.0 create mode 100644 ext/mnemosyne-gcc/usermode/library/libsvml.so create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/SConscript create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/config.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/files.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/hal/pcm_i.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/init.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/log.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/log/log_i.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/log/logtrunc.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/log/phlog_base.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/log/phlog_tornbit.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/log/staticlogs.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/mcore_i.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/mnemosyne.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/module.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/pcm.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/pregionlayout.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/reincarnation_callback.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/segment.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/include/thrdesc.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/src/config.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/src/files.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/src/hal/pcm.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/src/init.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/src/log/logtrunc.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/src/log/mgr.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/src/log/phlog_base.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/src/log/phlog_tornbit.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/src/module.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/src/reincarnation_callback.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mcore/src/segment.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mnemosyne_vars.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/SConscript create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/atomic.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/cm.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/config.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/gc.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/init.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/itm.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/local.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/locks.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/common/barrier.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/common/beginend.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/common/mask.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/common/memcpy.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/common/memset.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/common/rwset.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/dtable.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/mode.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/pwb-common/#beginend-bits.h# create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/pwb-common/barrier-bits.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/pwb-common/barrier.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/pwb-common/beginend-bits.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/pwb-common/locks.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/pwb-common/pwb.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/pwb-common/pwb_i.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/pwb-common/tmlog.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/pwb-common/tmlog_base.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/pwb-common/tmlog_tornbit.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/pwbetl/barrier.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/pwbetl/beginend.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/pwbetl/memcpy.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/pwbetl/memset.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/pwbetl/pwb_i.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mode/pwbetl/pwbetl.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mtm.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/mtm_i.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/stats.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/sysdeps/linux/rwlock.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/sysdeps/x86/target.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/tm_def.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/transactions.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/txlock.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/include/useraction.h create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/config.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/gc.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/gcc-abi.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/init.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/local.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/mode/common/common.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/mode/mode.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/mode/pwb-common/pwb.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/mode/pwb-common/tmlog_base.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/mode/pwb-common/tmlog_tornbit.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/mode/pwbetl/barrier.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/mode/pwbetl/beginend.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/mode/pwbetl/memcpy.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/mode/pwbetl/memset.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/mode/pwbetl/pwbetl.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/mtm.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/stats.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/sysdeps/linux/rwlock.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/sysdeps/x86/arch.S create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/sysdeps/x86/sjlj.S create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/txlock.c create mode 100644 ext/mnemosyne-gcc/usermode/library/mtm/src/useraction.c create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/SConscript create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/include/arch-specific.h create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/include/block.h create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/include/config.h create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/include/genalloc.h create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/include/heapstats.h create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/include/hoardheap.h create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/include/pdlmalloc.h create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/include/persistentheap.h create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/include/persistentsuperblock.h create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/include/pmalloc.h create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/include/processheap.h create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/include/superblock.h create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/include/threadheap.h create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/include/timer.h create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/include/txmutex.h create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/include/vhalloc.h create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/include/vistaheap.h create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/#pdlmalloc.c# create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/AUTHORS create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/COPYING create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/ChangeLog create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/README create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/arch-specific.cpp create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/gen_sizeclass.py create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/hoardheap.cpp create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/malloc-test.c create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/mallocwrap.cpp create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/mytest.cpp create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/pdlmalloc.c create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/persistentheap.cpp create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/processheap.cpp create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/superblock.cpp create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/threadheap.cpp create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/vhalloc.c create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/vistaheap.c create mode 100644 ext/mnemosyne-gcc/usermode/library/pmalloc/src/wrapper.cpp create mode 100644 ext/mnemosyne-gcc/usermode/mnemosyne.ini create mode 100644 ext/mnemosyne-gcc/usermode/run.cnf create mode 100644 ext/mnemosyne-gcc/usermode/run.sh create mode 100644 ext/mnemosyne-gcc/usermode/run_vacation.sh create mode 100644 ext/mnemosyne-gcc/usermode/site_scons/unit_test.py create mode 100644 ext/mnemosyne-gcc/usermode/test/SConscript create mode 100644 ext/mnemosyne-gcc/usermode/test/common/memrandom.h create mode 100644 ext/mnemosyne-gcc/usermode/test/common/unittest.h create mode 100644 ext/mnemosyne-gcc/usermode/test/malloc/SConscript create mode 100644 ext/mnemosyne-gcc/usermode/test/malloc/large-malloc_free.test.cxx create mode 100644 ext/mnemosyne-gcc/usermode/test/malloc/main.cxx create mode 100644 ext/mnemosyne-gcc/usermode/test/malloc/simple-malloc_free.test.cxx create mode 100644 ext/mnemosyne-gcc/usermode/test/mtm/SConscript create mode 100644 ext/mnemosyne-gcc/usermode/test/mtm/nonvolatile_write_set.fixtures.cxx create mode 100644 ext/mnemosyne-gcc/usermode/test/mtm/nonvolatile_write_set.fixtures.hxx create mode 100644 ext/mnemosyne-gcc/usermode/test/mtm/nonvolatile_write_set.helpers.cxx create mode 100644 ext/mnemosyne-gcc/usermode/test/mtm/nonvolatile_write_set.helpers.hxx create mode 100644 ext/mnemosyne-gcc/usermode/test/mtm/nonvolatile_write_set.tests.cxx create mode 100644 ext/mnemosyne-gcc/usermode/test/pmap/SConscript create mode 100644 ext/mnemosyne-gcc/usermode/test/pmap/main.cxx create mode 100644 ext/mnemosyne-gcc/usermode/test/pmap/write_read.test.cxx create mode 100644 ext/mnemosyne-gcc/usermode/test/rawlog/SConscript create mode 100644 ext/mnemosyne-gcc/usermode/test/rawlog/main.cxx create mode 100644 ext/mnemosyne-gcc/usermode/test/rawlog/random_read_write_log.test.cxx create mode 100644 ext/mnemosyne-gcc/usermode/test/rawlog/rawlog_tornbit.helper.cxx create mode 100644 ext/mnemosyne-gcc/usermode/test/rawlog/rawlog_tornbit.helper.h create mode 100644 ext/mnemosyne-gcc/usermode/test/rawlog/sequence.helper.h create mode 100644 ext/mnemosyne-gcc/usermode/test/tmlog/SConscript create mode 100644 ext/mnemosyne-gcc/usermode/test/tmlog/main.cxx create mode 100644 ext/mnemosyne-gcc/usermode/tool/SConscript create mode 100644 ext/mnemosyne-gcc/usermode/tool/bandwidth-pcm/SConscript create mode 100644 ext/mnemosyne-gcc/usermode/tool/bandwidth-pcm/main.c create mode 100644 ext/mnemosyne-gcc/usermode/tool/bandwidth-ram/COPYING create mode 100644 ext/mnemosyne-gcc/usermode/tool/bandwidth-ram/Makefile create mode 100644 ext/mnemosyne-gcc/usermode/tool/bandwidth-ram/README create mode 100644 ext/mnemosyne-gcc/usermode/tool/bandwidth-ram/main.c create mode 100644 ext/mnemosyne-gcc/usermode/tool/bandwidth-ram/routines32.s create mode 100644 ext/mnemosyne-gcc/usermode/tool/bandwidth-ram/routines64.s create mode 100644 ext/mnemosyne-gcc/usermode/tool/linker/linker_script_persistent_segment_m32 create mode 100644 ext/mnemosyne-gcc/usermode/tool/linker/linker_script_persistent_segment_m64 create mode 100644 ext/mnemosyne-gcc/usermode/tool/linker/shdr.c create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/.travis.yml create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/LICENSE create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/default.nix create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/:w create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/algorithm.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/array.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/array_transient.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/box.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/concurrent_map.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/concurrent_vector.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/config.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/arrays/no_capacity.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/arrays/node.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/arrays/with_capacity.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/combine_standard_layout.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/hamts/bits.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/hamts/champ.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/hamts/champ_iterator.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/hamts/node.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/iterator_facade.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/list/list.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/rbts/bits.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/rbts/node.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/rbts/operations.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/rbts/perf.data create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/rbts/perf.data.old create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/rbts/position.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/rbts/rbtree.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/rbts/rbtree_iterator.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/rbts/rrbtree.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/rbts/rrbtree_iterator.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/rbts/visitor.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/ref_count_base.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/type_traits.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/detail/util.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/experimental/detail/dvektor_impl.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/experimental/dvektor.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/flex_vector.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/flex_vector_transient.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/heap/cpp_heap.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/heap/debug_size_heap.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/heap/free_list_heap.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/heap/free_list_node.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/heap/gc_heap.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/heap/heap_policy.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/heap/identity_heap.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/heap/malloc_heap.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/heap/nvm_malloc_heap.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/heap/pmalloc_heap.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/heap/split_heap.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/heap/tags.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/heap/thread_local_free_list_heap.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/heap/unsafe_free_list_heap.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/heap/with_data.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/map.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/map_transient.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/memory_policy.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/nvm_utils.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/queue.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/refcount/enable_intrusive_ptr.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/refcount/no_refcount_policy.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/refcount/refcount_policy.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/refcount/unsafe_refcount_policy.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/set.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/set_transient.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/transience/gc_transience_policy.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/transience/no_transience_policy.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/unordered_map.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/vector.hpp create mode 100644 ext/mod-single-repo/Immutable-Datastructure-c++/immer/vector_transient.hpp create mode 100644 ext/mod-single-repo/LICENSE create mode 100644 ext/mod-single-repo/mod.diff create mode 100644 ext/mod-single-repo/nvm_malloc/.gitignore create mode 100644 ext/mod-single-repo/nvm_malloc/LICENSE create mode 100644 ext/mod-single-repo/nvm_malloc/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/README.md create mode 100644 ext/mod-single-repo/nvm_malloc/benchmark/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/benchmark/run_benchmarks.py create mode 100644 ext/mod-single-repo/nvm_malloc/benchmark/src/bench_alloc_free.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/benchmark/src/bench_alloc_free_alloc.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/benchmark/src/bench_fastalloc.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/benchmark/src/bench_linkedlist.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/benchmark/src/bench_recovery.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/benchmark/src/common.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/benchmark/src/common.h create mode 100755 ext/mod-single-repo/nvm_malloc/compile.sh create mode 100644 ext/mod-single-repo/nvm_malloc/src/arena.c create mode 100644 ext/mod-single-repo/nvm_malloc/src/arena.h create mode 100644 ext/mod-single-repo/nvm_malloc/src/chunk.c create mode 100644 ext/mod-single-repo/nvm_malloc/src/chunk.h create mode 100644 ext/mod-single-repo/nvm_malloc/src/nvm_malloc.c create mode 100644 ext/mod-single-repo/nvm_malloc/src/nvm_malloc.h create mode 100644 ext/mod-single-repo/nvm_malloc/src/object_table.c create mode 100644 ext/mod-single-repo/nvm_malloc/src/object_table.h create mode 100644 ext/mod-single-repo/nvm_malloc/src/types.h create mode 100644 ext/mod-single-repo/nvm_malloc/src/util.c create mode 100644 ext/mod-single-repo/nvm_malloc/src/util.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/AUTHORS create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/CHANGELOG create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/README create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/VERSION create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/lib/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/lib/__.SYMDEF SORTED create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/lib/makedll.bat create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/perf/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/perf/avl/libavl/avl.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/perf/avl/libavl/avl.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/perf/avl/libavl/avl_bench.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/perf/avl/libavl/result create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/perf/avl/solaris/avl.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/perf/avl/solaris/avl.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/perf/avl/solaris/avl_bench.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/perf/avl/solaris/avl_impl.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/perf/avl/solaris/result create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/perf/avl/ulib/result create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/perf/hashmap/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/perf/hashmap/hash_perf.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/perf/mapreduce/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/perf/mapreduce/mr_bench.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/rules.mk create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/bitmap.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/bitmap.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/crypt_aes.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/crypt_aes.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/crypt_md5.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/crypt_md5.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/crypt_rc4.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/crypt_rc4.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/crypt_sha1.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/crypt_sha1.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/crypt_sha256.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/crypt_sha256.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/hash_chain_prot.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/hash_func.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/hash_func.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/hash_open_prot.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/heap_prot.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/list.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/math_bit.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/math_bn.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/math_bn.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/math_factorial.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/math_gcd.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/math_gcd.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/math_lcm.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/math_lcm.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/math_rand_prot.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/search_line.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/search_line.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/sort_heap_prot.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/sort_list.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/sort_list.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/sort_median_prot.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/str_util.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/str_util.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/tree.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/tree.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/tree_util.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/tree_util.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/ulib_ver.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/ulib_ver.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/util_algo.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/util_hexdump.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/util_hexdump.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/util_log.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/base/util_timer.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/bloom_filter/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/bloom_filter/bfilter.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/bloom_filter/bfilter.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/c++/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/c++/hash_chain.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/c++/hash_open.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/c++/util_class.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/comb/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/comb/math_comb.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/comb/math_comb.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/console/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/console/util_argv.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/console/util_argv.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/console/util_console.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/console/util_console.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/rng/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/rng/math_rng_gamma.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/rng/math_rng_gamma.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/rng/math_rng_normal.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/rng/math_rng_normal.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/rng/math_rng_zipf.c create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext1/rng/math_rng_zipf.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/mapreduce/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/mapreduce/mr_dataset.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/mapreduce/mr_dataset.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/mapreduce/mr_engine.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/mapreduce/mr_interm.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/osdep/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/osdep/os_atomic_intel64.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/osdep/os_rdtsc.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/osdep/os_spinlock.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/reentrant/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/reentrant/hash_chain_r.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/reentrant/hash_multi_r.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/reentrant/os_regionlock.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/reentrant/os_typelock.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/thread/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/thread/os_thread.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/src/ext2/thread/os_thread.h create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/Makefile create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/aes.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/atomic.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/avl_bench.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/bfilter.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/bfilter_bench.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/bit.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/bitmap.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/bn.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/comb.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/console.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/factorial.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/fpr.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/gamma_rng.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/gcd.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hash_chain.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hash_chain_bench.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hash_chain_prot.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hash_chain_prot_bench.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hash_chain_r.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hash_chain_r1.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hash_chain_r_bench.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hash_chain_r_workload_shared.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hash_chain_workload_indep.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hash_func.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hash_func_perf.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hash_multi_r_workload_shared.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hash_multihash_r.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hash_multihash_r_bench.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hash_open.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hash_open_prot_bench.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/heapsort.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hweight.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hweight_mult.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hweight_perf.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/hweight_perf_mult.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/int_hash_perf.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/lcm.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/list.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/listsort.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/log.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/md5.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/median.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/normal_rng.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/rand.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/rand_inv.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/rc4.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/rdtsc.cpp create mode 100755 ext/mod-single-repo/nvm_malloc/ulib-svn/test/run_all_test.sh create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/search_line.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/search_line.data create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/set_bench.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/sha1.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/sha256.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/spinlock.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/splay_bench.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/splay_np_bench.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/str_util.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/thread.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/tree.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/version.cpp create mode 100644 ext/mod-single-repo/nvm_malloc/ulib-svn/test/zipf_rng.cpp create mode 100644 ext/pronto-v1.1/pronto.diff create mode 100644 ext/pronto-v1.1/src/.gitignore create mode 100644 ext/pronto-v1.1/src/Makefile create mode 100644 ext/pronto-v1.1/src/ckpt_alloc.cpp create mode 100644 ext/pronto-v1.1/src/ckpt_alloc.hpp create mode 100644 ext/pronto-v1.1/src/context.cpp create mode 100644 ext/pronto-v1.1/src/cpu_info.cpp create mode 100644 ext/pronto-v1.1/src/nv_catalog.cpp create mode 100644 ext/pronto-v1.1/src/nv_catalog.hpp create mode 100644 ext/pronto-v1.1/src/nv_factory.cpp create mode 100644 ext/pronto-v1.1/src/nv_factory.hpp create mode 100644 ext/pronto-v1.1/src/nv_log.cpp create mode 100644 ext/pronto-v1.1/src/nv_log.hpp create mode 100644 ext/pronto-v1.1/src/nv_object.cpp create mode 100644 ext/pronto-v1.1/src/nv_object.hpp create mode 100644 ext/pronto-v1.1/src/nvm_manager.cpp create mode 100644 ext/pronto-v1.1/src/nvm_manager.hpp create mode 100644 ext/pronto-v1.1/src/persister.cpp create mode 100644 ext/pronto-v1.1/src/persister.hpp create mode 100644 ext/pronto-v1.1/src/recovery_context.hpp create mode 100644 ext/pronto-v1.1/src/savitar.hpp create mode 100644 ext/pronto-v1.1/src/snapshot.cpp create mode 100644 ext/pronto-v1.1/src/snapshot.hpp create mode 100644 ext/pronto-v1.1/src/stl_alloc.hpp create mode 100644 ext/pronto-v1.1/src/thread.cpp create mode 100644 ext/pronto-v1.1/src/thread.hpp create mode 100644 ext/ralloc/LICENSE create mode 100644 ext/ralloc/Makefile create mode 100644 ext/ralloc/README.md create mode 100644 ext/ralloc/SConscript create mode 100644 ext/ralloc/TODO create mode 100644 ext/ralloc/data/genfigs.R create mode 100644 ext/ralloc/data/mm-uncached/genfigs.R create mode 100644 ext/ralloc/data/uncached+dax/genfigs.R create mode 100644 ext/ralloc/ralloc.diff create mode 120000 ext/ralloc/src/AllocatorMacro.hpp create mode 100644 ext/ralloc/src/BaseMeta.cpp create mode 100644 ext/ralloc/src/BaseMeta.hpp create mode 100644 ext/ralloc/src/README.md create mode 100644 ext/ralloc/src/RegionManager.cpp create mode 100644 ext/ralloc/src/RegionManager.hpp create mode 100644 ext/ralloc/src/SizeClass.cpp create mode 100644 ext/ralloc/src/SizeClass.hpp create mode 100644 ext/ralloc/src/TCache.cpp create mode 100644 ext/ralloc/src/TCache.hpp create mode 100644 ext/ralloc/src/pfence_util.h create mode 100644 ext/ralloc/src/pm_config.hpp create mode 100644 ext/ralloc/src/pptr.hpp create mode 100644 ext/ralloc/src/ralloc.cpp create mode 100644 ext/ralloc/src/ralloc.hpp create mode 100644 ext/ralloc/test/Makefile create mode 100644 ext/ralloc/test/benchmark/AllocatorMacro.hpp create mode 100644 ext/ralloc/test/benchmark/HazardPointers.hpp create mode 100644 ext/ralloc/test/benchmark/MichaelScottQueue.hpp create mode 100644 ext/ralloc/test/benchmark/cpuinfo.h create mode 100644 ext/ralloc/test/benchmark/fred.h create mode 100644 ext/ralloc/test/benchmark/larson.cpp create mode 100644 ext/ralloc/test/benchmark/optional.hpp create mode 100644 ext/ralloc/test/benchmark/prod-con.cpp create mode 100644 ext/ralloc/test/benchmark/sh6bench.cpp create mode 100644 ext/ralloc/test/benchmark/threadtest.cpp create mode 100644 ext/ralloc/test/benchmark/timer.h create mode 100755 ext/ralloc/test/larson-single.sh create mode 100755 ext/ralloc/test/old/active-false-single.sh create mode 100644 ext/ralloc/test/old/arrayqueue_test.cpp create mode 100644 ext/ralloc/test/old/arraystack_test.cpp create mode 100644 ext/ralloc/test/old/base_meta_test.cpp create mode 100644 ext/ralloc/test/old/cache-scratch.cpp create mode 100644 ext/ralloc/test/old/cache-thrash.cpp create mode 100644 ext/ralloc/test/old/msqueue_test.cpp create mode 100755 ext/ralloc/test/old/passive-false-single.sh create mode 100644 ext/ralloc/test/old/pptr_test.cpp create mode 100644 ext/ralloc/test/old/region_manager_test.cpp create mode 100755 ext/ralloc/test/old/run_act_false.sh create mode 100755 ext/ralloc/test/old/run_pas_false.sh create mode 100644 ext/ralloc/test/old/trivial_test.cpp create mode 100755 ext/ralloc/test/prod-con-single.sh create mode 100644 ext/ralloc/test/ralloc_test.cpp create mode 100755 ext/ralloc/test/run_all.sh create mode 100755 ext/ralloc/test/run_larson.sh create mode 100755 ext/ralloc/test/run_prod-con.sh create mode 100755 ext/ralloc/test/run_resur.sh create mode 100755 ext/ralloc/test/run_shbench.sh create mode 100755 ext/ralloc/test/run_threadtest.sh create mode 100755 ext/ralloc/test/shbench-single.sh create mode 100755 ext/ralloc/test/threadtest-single.sh create mode 100644 ext/threadcached/.gitignore create mode 100644 ext/threadcached/.gitmodules create mode 100644 ext/threadcached/Makefile create mode 100644 ext/threadcached/NOTES/COPYING create mode 100644 ext/threadcached/NOTES/LICENSE create mode 100644 ext/threadcached/NOTES/LICENSE.bipbuffer create mode 100644 ext/threadcached/NOTES/LICENSE.itoa_ljust create mode 100644 ext/threadcached/README.md create mode 100644 ext/threadcached/include/assoc.h create mode 100644 ext/threadcached/include/bipbuffer.h create mode 100644 ext/threadcached/include/config.h create mode 100644 ext/threadcached/include/constants.h create mode 100644 ext/threadcached/include/crawler.h create mode 100644 ext/threadcached/include/defines.h create mode 100644 ext/threadcached/include/items.h create mode 100644 ext/threadcached/include/itoa_ljust.h create mode 100644 ext/threadcached/include/memcached.h create mode 100644 ext/threadcached/include/murmur3_hash.h create mode 100644 ext/threadcached/include/pku_memcached.h create mode 100644 ext/threadcached/include/slab_automove.h create mode 100644 ext/threadcached/include/util.h create mode 100644 ext/threadcached/src/assoc.cc create mode 100644 ext/threadcached/src/bipbuffer.cc create mode 100644 ext/threadcached/src/crawler.cc create mode 100644 ext/threadcached/src/globals.cc create mode 100644 ext/threadcached/src/items.cc create mode 100644 ext/threadcached/src/itoa_ljust.cc create mode 100644 ext/threadcached/src/memcached.cc create mode 100644 ext/threadcached/src/murmur3_hash.cc create mode 100644 ext/threadcached/src/pku_memcached.cc create mode 100644 ext/threadcached/src/thread.cc create mode 100644 ext/threadcached/src/util.cc create mode 100644 ext/threadcached/test/basic_test.cc create mode 100644 ext/threadcached/test/end.cc create mode 100644 ext/threadcached/test/get.cc create mode 100644 ext/threadcached/test/insert.cc create mode 100644 ext/threadcached/test/server.cc create mode 100644 ext/threadcached/threadcached.diff create mode 100644 ext/ycsb-tcd/LICENSE create mode 100644 ext/ycsb-tcd/Makefile create mode 100644 ext/ycsb-tcd/README.md create mode 100644 ext/ycsb-tcd/cache_test/Makefile create mode 100644 ext/ycsb-tcd/cache_test/cache_test.cc create mode 100644 ext/ycsb-tcd/cache_test/cache_test.h create mode 100644 ext/ycsb-tcd/core/.gitignore create mode 100644 ext/ycsb-tcd/core/Makefile create mode 100644 ext/ycsb-tcd/core/client.h create mode 100644 ext/ycsb-tcd/core/const_generator.h create mode 100644 ext/ycsb-tcd/core/core_workload.cc create mode 100644 ext/ycsb-tcd/core/core_workload.h create mode 100644 ext/ycsb-tcd/core/counter_generator.h create mode 100644 ext/ycsb-tcd/core/db.h create mode 100644 ext/ycsb-tcd/core/discrete_generator.h create mode 100644 ext/ycsb-tcd/core/generator.h create mode 100644 ext/ycsb-tcd/core/properties.h create mode 100644 ext/ycsb-tcd/core/scrambled_zipfian_generator.h create mode 100644 ext/ycsb-tcd/core/skewed_latest_generator.h create mode 100644 ext/ycsb-tcd/core/timer.h create mode 100644 ext/ycsb-tcd/core/uniform_generator.h create mode 100644 ext/ycsb-tcd/core/utils.h create mode 100644 ext/ycsb-tcd/core/zipfian_generator.h create mode 100644 ext/ycsb-tcd/db/Makefile create mode 100644 ext/ycsb-tcd/db/basic_db.h create mode 100644 ext/ycsb-tcd/db/db_factory.cc create mode 100644 ext/ycsb-tcd/db/db_factory.h create mode 100644 ext/ycsb-tcd/db/hashtable_db.cc create mode 100644 ext/ycsb-tcd/db/hashtable_db.h create mode 100644 ext/ycsb-tcd/db/mcd_db.cc create mode 100644 ext/ycsb-tcd/db/tcd_db.cc create mode 100644 ext/ycsb-tcd/db/tcd_db.h create mode 100644 ext/ycsb-tcd/lib/lock_stl_hashtable.h create mode 100644 ext/ycsb-tcd/lib/mem_alloc.h create mode 100644 ext/ycsb-tcd/lib/stl_hashtable.h create mode 100644 ext/ycsb-tcd/lib/string.h create mode 100644 ext/ycsb-tcd/lib/string_hashtable.h create mode 100644 ext/ycsb-tcd/lib/tbb_rand_hashtable.h create mode 100644 ext/ycsb-tcd/lib/tbb_scan_hashtable.h create mode 100755 ext/ycsb-tcd/parse_result.py create mode 100644 ext/ycsb-tcd/workloads/workloada.spec create mode 100644 ext/ycsb-tcd/workloads/workloadb.spec create mode 100644 ext/ycsb-tcd/workloads/workloadc.spec create mode 100644 ext/ycsb-tcd/workloads/workloadd.spec create mode 100644 ext/ycsb-tcd/workloads/workloade.spec create mode 100644 ext/ycsb-tcd/workloads/workloadf.spec create mode 100644 ext/ycsb-tcd/ycsbc.cc create mode 100755 script/EpochLengthSensitivity.sh create mode 100644 script/dataset-txt-to-binary.py create mode 100755 script/explore_hashtable.sh create mode 100755 script/explore_memcached.sh create mode 100755 script/pronto_snapshot.sh create mode 100755 script/run_graph.sh create mode 100755 script/run_memcached.sh create mode 100755 script/run_size.sh create mode 100755 script/run_thread.sh create mode 100755 script/setup-datasets.sh create mode 100644 src/CustomTypes.cpp create mode 100644 src/CustomTypes.hpp create mode 100644 src/HeapQueue.hpp create mode 100644 src/ParallelLaunch.cpp create mode 100644 src/ParallelLaunch.hpp create mode 100644 src/RGraph.hpp create mode 100644 src/RMap.hpp create mode 100644 src/RQueue.hpp create mode 100644 src/RSet.hpp create mode 100644 src/Recorder.cpp create mode 100644 src/Recorder.hpp create mode 100644 src/Rideable.hpp create mode 100644 src/TestConfig.cpp create mode 100644 src/TestConfig.hpp create mode 100644 src/main.cpp create mode 100644 src/persist/EpochSys.cpp create mode 100644 src/persist/EpochSys.hpp create mode 100644 src/persist/PString.hpp create mode 100644 src/persist/PerThreadContainers.hpp create mode 100644 src/persist/README.md create mode 100644 src/persist/Recoverable.hpp create mode 100644 src/persist/ToBeFreedContainers.hpp create mode 100644 src/persist/ToBePersistedContainers.hpp create mode 100644 src/persist/TransactionTrackers.hpp create mode 100644 src/persist/api/pblk_naked.hpp create mode 100644 src/persist/api/persist_struct_api.hpp create mode 100644 src/persist/persist_config.hpp create mode 100644 src/persist/persist_utils.hpp create mode 100644 src/rideables/DLGraph.hpp create mode 100644 src/rideables/DaliUnorderedMap.hpp create mode 100644 src/rideables/FriedmanQueue.hpp create mode 100644 src/rideables/HOHHashTable.hpp create mode 100644 src/rideables/HashTable.hpp create mode 100644 src/rideables/LinkedList.hpp create mode 100644 src/rideables/LockfreeHashTable.hpp create mode 100644 src/rideables/MODHashTable.hpp create mode 100644 src/rideables/MODQueue.hpp create mode 100644 src/rideables/MSQueue.hpp create mode 100644 src/rideables/MneHashTable.hpp create mode 100644 src/rideables/MneQueue.hpp create mode 100644 src/rideables/MontageGraph.hpp create mode 100644 src/rideables/MontageHashTable.hpp create mode 100644 src/rideables/MontageLfHashTable.hpp create mode 100644 src/rideables/MontageMSQueue.hpp create mode 100644 src/rideables/MontageNatarajanTree.hpp create mode 100644 src/rideables/MontageQueue.hpp create mode 100644 src/rideables/NVMGraph.hpp create mode 100644 src/rideables/NVMSOFTHashTable.hpp create mode 100644 src/rideables/NatarajanTree.hpp create mode 100644 src/rideables/PLockfreeHashTable.hpp create mode 100644 src/rideables/PriorityQueue.hpp create mode 100644 src/rideables/ProntoHashTable.hpp create mode 100644 src/rideables/ProntoQueue.hpp create mode 100644 src/rideables/Queue.hpp create mode 100644 src/rideables/README.md create mode 100644 src/rideables/SOFTHashTable.hpp create mode 100644 src/rideables/TGraph.hpp create mode 100644 src/rideables/Toy.hpp create mode 100644 src/rideables/UnbalancedTree.hpp create mode 100644 src/rideables/murmur3_hash.cpp create mode 100644 src/rideables/murmur3_hash.h create mode 100644 src/tests/ChurnTest.hpp create mode 100644 src/tests/EpochSysVerifyTest.hpp create mode 100644 src/tests/GraphRecoveryTest.hpp create mode 100644 src/tests/GraphTest.hpp create mode 100644 src/tests/HeapChurnTest.hpp create mode 100644 src/tests/KVTest.hpp create mode 100644 src/tests/MapChurnTest.hpp create mode 100644 src/tests/MapTest.hpp create mode 100644 src/tests/MapVerify.hpp create mode 100644 src/tests/ProntoQueueTest.hpp create mode 100644 src/tests/QueueChurnTest.hpp create mode 100644 src/tests/QueueTest.hpp create mode 100644 src/tests/RecoverVerifyTest.hpp create mode 100644 src/tests/SetChurnTest.hpp create mode 100644 src/tests/SetVerify.hpp create mode 100644 src/tests/TGraphConstructionTest.hpp create mode 100644 src/tests/ToyTest.hpp create mode 100644 src/tests/YCSBTest.hpp create mode 100644 src/utils/BaseTracker.hpp create mode 100644 src/utils/ConcurrentPrimitives.hpp create mode 100644 src/utils/HarnessUtils.cpp create mode 100644 src/utils/HarnessUtils.hpp create mode 100644 src/utils/PersistFunc.hpp create mode 100644 src/utils/Persistent.hpp create mode 100644 src/utils/RCUTracker.hpp create mode 100644 src/utils/optional.hpp create mode 100755 test.sh diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..d95d7e9d --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +ext/pronto-v1.1/* linguist-vendored diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..160d023a --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +*.test +*.a +*.o +*.out +bin +obj +*.swp +*.csv +*.pdf \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..e69de29b diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..b76f20bd --- /dev/null +++ b/LICENSE @@ -0,0 +1,27 @@ +The ext folder in this repository contains code files from other work, some of +which come with different licenses. Please refer to their directory for those +license and copyright information. Below is the license for code files, unless +explicitly providing different copyright notice, in all other folders, i.e., in +data, script, and src. + +MIT License + +Copyright (C) 2020 University of Rochester + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..96ee9764 --- /dev/null +++ b/Makefile @@ -0,0 +1,551 @@ +# +# Copyright (c) 2014-2015, Hewlett-Packard Development Company, LP. +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2 of the License, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# HP designates this particular file as subject to the "Classpath" exception +# as provided by HP in the LICENSE.txt file that accompanied this code. +# +# The "Classpath" exception is restated below: +# +# Certain source files distributed by Hewlett-Packard Company and/or its +# affiliates(“HP”) are subject to the following clarification and special +# exception to the GPL, but only where HP has expressly included in the +# particular source file's header the words "HP designates this particular file +# as subject to the "Classpath" exception as provided by HP in the LICENSE file +# that accompanied this code." +# +# Linking this library statically or dynamically with other modules is making +# a combined work based on this library. Thus, the terms and conditions of the +# GNU General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this library give you +# permission to link this library with independent modules to produce an +# executable, regardless of the license terms of these independent modules, +# and to copy and distribute the resulting executable under terms of your +# choice, provided that you also meet, for each linked independent module, +# the terms and conditions of the license of that module. An independent module +# is a module which is not derived from or based on this library. If you modify +# this library, you may extend this exception to your version of the library, +# but you are not obligated to do so. If you do not wish to do so, delete this +# exception statement from your version. +# + + + +# ========= Make To End All Make ============== +# +# A makefile so you don't need to touch a +# makefile again. Or at least avoid relearning +# the makefile language. +# =============================================== + + +# =============================================== +# User configured variables +# =============================================== + +# ------------------------- +# Paths configuration +# ------------------------- +NVM_MALLOC_DIR=./ext/mod-single-repo/nvm_malloc/ +IMMER_DIR=./ext/mod-single-repo/Immutable-Datastructure-c++/ +PRONTO_PATH = ./ext/pronto-v1.1 +MNEMOSYNE_PATH = ./ext/mnemosyne-gcc +LIBITM_PATH = ./ext/libitm +# list of directories which contain headers (include directories) +IDIRS:=./src ./src/utils ./src/rideables ./src/tests ./src/persist ./src/persist/api +IDIRS+=./ext/ralloc/src +IDIRS+=$(IMMER_DIR) $(NVM_MALLOC_DIR)/src/ + +# directory to put build artifacts (e.g. .o, .d files) +ODIR:=./obj +# list of directories which contain linked in libraries +LDIRS:=./ext/ralloc +LDIRS+=$(NVM_MALLOC_DIR) +# libraries to link against (are expected to be in the above directories, +# or they are system default) +# LIBS :=-l:libjemalloc.so.2 -lstm -lparharness -lpthread -lhwloc -lm -lrt +LIBS :=-l:libjemalloc.so.2 -lpthread -lhwloc -lralloc -lgomp +LIBS+=-lnvmmalloc +# directories that should be built first using recursive make. +# You should avoid this in general, but it's useful for building +# external libraries which we depend on +RECURSEDIRS := ext/ralloc $(PRONTO_PATH)/src $(NVM_MALLOC_DIR) $(MNEMOSYNE_PATH)/usermode +# root directories of sources. Will be recursively +# searched for .c and .cpp files. All of them will +# be built +SRCDIRS :=./src +# output directory for binary executables +BINDIR :=./bin +# C compiler +CC:=gcc +# C++ compiler +CXX:=g++ +# linker +LD:= $(CXX) + + +# we input LIBS and output ARCHIVES +# the name of the outputed .a archive file of all non executable source +# name defaults to the name of the Makefile's parent directory +STATICARCHIVE:= +# the name of the outputed .so shared library +# file of all non executable source +# name defaults to the name of the Makefile's parent directory +SHAREDARCHIVE:= + +# the directory to output the .a and .so files +# path defaults to BINDIR +ARCHIVEDIR:=./lib + + +# A list of source files with a "main" method. +# -generated executables have the same name +# as their source file (without the .c/.cpp suffix) +# -since all executables go into the same folder, +# they must each have unique file names (even if the +# source files are in different folders) +# -since we do pattern matching between this list and the +# source files, the file path specified must be the same +# type (absolute or relative) +EXECUTABLES:= ./src/main.cpp + +# A list of source files contained in the +# source directory to exclude from the build +# -since we do pattern matching between this list and the +# source files, the file path specified must be the same +# type (absolute or relative) +IGNORES:= + +ifeq ($(K_SZ),) +K_SZ := 32 +endif +ifeq ($(V_SZ),) +V_SZ := 1024 +endif +# ------------------------- +# Flags configuration +# ------------------------- + +# Default warning flags, only used in CFLAGS, +# and CXXFLAGS +WARNING_FLAGS:=-ftrapv -Wreturn-type -W -Wall \ +-Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-parameter + +# Default build flags. +# CFLAGS:=-pthread -g -gdwarf-2 -fpic $(WARNING_FLAGS) +CFLAGS:=-fopnemp -pthread -g -gdwarf-2 -fpic $(WARNING_FLAGS) -D_REENTRANT -fno-strict-aliasing -march=native -DTESTS_KEY_SIZE=$(K_SZ) -DTESTS_VAL_SIZE=$(V_SZ) + +# CXXFLAGS:= -pthread -std=c++11 -g -fpic $(WARNING_FLAGS) #-std=c++1y +CXXFLAGS:= -fopenmp -pthread -g -fpic $(WARNING_FLAGS) -D_REENTRANT -fno-strict-aliasing -march=native -std=c++17 -mclwb -DTESTS_KEY_SIZE=$(K_SZ) -DTESTS_VAL_SIZE=$(V_SZ) +# linker flags +# LDFLAGS := + +# ------------------------- +# Build configurations +# ------------------------- + +# A "build" is a separate make target and generates +# its own compilation artifacts. A build sets +# the $(BUILD) variable when built, so you can +# add build specific logic (see below where we +# define these build configurations). +# To run a build, e.g. release, you would invoke: +# make release +BUILDS :=release debug ngc release32 debug32 mnemosyne pronto-full pronto-sync graph-rec +DEFAULT_BUILD :=release + +# ------------------------------- +# Build and build var definitions +# ------------------------------- +ifeq ($(BUILD),mnemosyne) +MNEMOSYNE_LIBS=$(MNEMOSYNE_PATH)/usermode/build/library +MNEMOSYNE_INCLUDES=$(MNEMOSYNE_PATH)/usermode/library +IDIRS+=$(MNEMOSYNE_INCLUDES)/mtm/include $(MNEMOSYNE_INCLUDES)/pmalloc/include \ + $(MNEMOSYNE_INCLUDES)/mcore/include +LDIRS+=$(MNEMOSYNE_LIBS)/mtm $(MNEMOSYNE_LIBS)/pmalloc $(MNEMOSYNE_LIBS)/mcore #$(LIBITM_PATH) +LIBS+=-lmtm -lpmalloc -lmcore -lelf -lconfig -litm +CFLAGS += -fgnu-tm -march=native -DMNEMOSYNE -O2 -DNDEBUG -fno-strict-aliasing -msse2 -mfpmath=sse -fno-schedule-insns -fno-schedule-insns2 -fno-tree-ch +CXXFLAGS += -fgnu-tm -march=native -DMNEMOSYNE -O2 -std=c++1y -DNDEBUG -fno-strict-aliasing -msse2 -mfpmath=sse -fno-schedule-insns -fno-schedule-insns2 -fno-tree-ch +LD += -fgnu-tm -T $(MNEMOSYNE_PATH)/usermode/tool/linker/linker_script_persistent_segment_m64 +# we can add additional release customization here +# e.g. link against different libraries, +# define enviroment vars, etc. +endif + +ifeq ($(BUILD),pronto-full) +IDIRS+=$(PRONTO_PATH)/src +LDIRS+=$(PRONTO_PATH)/src +LIBS+=-lsavitar -lpmem -luuid -lstdc++fs -lstdc++ +CFLAGS+=-DPRONTO -fno-stack-protector -U__STRICT_ANSI__ +CXXFLAGS+=-DPRONTO -fno-stack-protector -U__STRICT_ANSI__ +# we can add additional release customization here +# e.g. link against different libraries, +# define enviroment vars, etc. +endif + +ifeq ($(BUILD),pronto-sync) +IDIRS+=$(PRONTO_PATH)/src +LDIRS+=$(PRONTO_PATH)/src +LIBS+=-lsavitar_sync -lpmem -luuid -lstdc++fs -lstdc++ +CFLAGS+=-DPRONTO -fno-stack-protector -U__STRICT_ANSI__ -DPRONTO_SYNC +CXXFLAGS+=-DPRONTO -fno-stack-protector -U__STRICT_ANSI__ -DPRONTO_SYNC +# we can add additional release customization here +# e.g. link against different libraries, +# define enviroment vars, etc. +endif + +LDFLAGS := $(WARNING_FLAGS) $(foreach d, $(LDIRS), -Xlinker -rpath -Xlinker $(d)) + +ifeq ($(BUILD),graph-rec) +# -ftree-vectorize crashes Mnemosyne +CFLAGS+=-DGRAPH_RECOVERY -ftree-vectorize -O3 -DNDEBUG +CXXFLAGS+=-DGRAPH_RECOVERY -ftree-vectorize -O3 -DNDEBUG +# we can add additional release customization here +# e.g. link against different libraries, +# define enviroment vars, etc. +endif + +ifeq ($(BUILD),release) +CXXFLAGS += -O3 -DNDEBUG +CFLAGS += -O3 -DNDEBUG +# we can add additional release customization here +# e.g. link against different libraries, +# define enviroment vars, etc. +endif + +ifeq ($(BUILD),debug) +CXXFLAGS += -O0 +CFLAGS += -O0 +# we can add additional debug customization here +# e.g. link against different libraries, +# define enviroment vars, etc. +endif + +ifeq ($(BUILD),ngc) +CXXFLAGS += -O3 -DNGC +CFLAGS += -O3 -DNGC +endif + +ifeq ($(BUILD),release32) +CXXFLAGS += -O3 -m32 +CFLAGS += -O3 -m32 +LDFLAGS += -m32 +# we can add additional release customization here +# e.g. link against different libraries, +# define enviroment vars, etc. +endif + +ifeq ($(BUILD),debug32) +CXXFLAGS += -O0 -m32 +CFLAGS += -O0 -m32 +LDFLAGS += -m32 +# we can add additional release customization here +# e.g. link against different libraries, +# define enviroment vars, etc. +endif + +# Annoying warning flags. +# These are added when environment variable ANNOYING=true +# e.g. make release ANNOYING=true +ANNOYING_FLAGS:= -Wall -W -Wextra -Wundef -Wshadow \ +-Wunreachable-code -Wredundant-decls -Wunused-macros \ +-Wcast-qual -Wcast-align -Wwrite-strings -Wmissing-field-initializers \ +-Wendif-labels -Winit-self -Wlogical-op -Wmissing-declarations \ +-Wpacked -Wstack-protector -Wformat=2 -Wswitch-default -Wswitch-enum \ +-Wunused -Wstrict-overflow=5 -Wpointer-arith -Wnormalized=nfc \ +-Wlong-long -Wconversion -Wmissing-format-attribute -Wpadded \ +-Winline -Wvariadic-macros -Wvla -Wdisabled-optimization \ +-Woverlength-strings -Waggregate-return -Wmissing-prototypes \ +-Wstrict-prototypes -Wold-style-definition -Wbad-function-cast \ +-Wc++-compat -Wjump-misses-init -Wnested-externs \ +-Wdeclaration-after-statement -ftrapv + +ifeq ($(ANNOYING),true) +CXXFLAGS += $(ANNOYING_FLAGS) +CFLAGS += $(ANNOYING_FLAGS) +endif + + +# ------------------------------- +# Outputted artifacts +# ------------------------------- + +# what targets get built by default +ARTIFACTS := .info .bin .static +# .bin : compiles all executables +# .lib : compiles archive files (.a , .so) +# .static: compiles static archive (.a) +# .shared: compiles shared library (.so) +# .info : prints information about compilation variables + + +# ============================================= +# End of user configured variables +# ============================================= + + + + +# ============================================= +# Automatic stuff below. Hopefully you don't +# need to access below here. If you do, +# be careful. +# ============================================= + +# TODOs +# bring in line with http://aegis.sourceforge.net/auug97.pdf +# find executable source? +# comment for non joe users +# fix clean for builds +# faster evaluation? autocache? + +# ------------------------- +# Utility Functions +# ------------------------- + +# because make doesn't have a newline character +define \n + +endef + +# because make lacks equals +eq =$(and $(findstring $(1),$(2)),$(findstring $(2),$(1))) + +# ------------------------- +# Generate static variables +# ------------------------- + +_HOSTNAME:=$(shell hostname) +MKFILE_PATH :=$(abspath $(lastword $(MAKEFILE_LIST))) +DIR_PATH :=$(patsubst %/,%,$(dir $(MKFILE_PATH))) +CURRENT_DIR :=$(notdir $(patsubst %/,%,$(dir $(MKFILE_PATH)))) + +_DEPDIRS:=$(IDIRS) +_IDIRS:=$(foreach d, $(IDIRS), -I $d) +_LDIRS:=$(foreach d, $(LDIRS), -L $d) +_C_COMP_ARGS:= $(CFLAGS) $(_IDIRS) +_CXX_COMP_ARGS:= $(CXXFLAGS) $(_IDIRS) +_LINK_ARGS:= $(LIBS) $(_LDIRS) $(LDFLAGS) + + +_IGNORES_FULL_PATHS:=$(foreach x, $(IGNORES), $(patsubst ./%,%,$(x))) +_EXECUTABLE_FULL_PATHS:=$(foreach x, $(EXECUTABLES), $(patsubst ./%,%,$(x))) + +_DEPS :=$(MKFILE_PATH) +_SRCS_C :=$(foreach d, $(SRCDIRS), $(shell find $d/ -iname '*.c' -type f | sed 's/ /\\ /g')) +_SRCS_CPP :=$(foreach d, $(SRCDIRS), $(shell find $d/ -iname '*.cpp' -type f | sed 's/ /\\ /g')) +_SRCS := $(foreach x, $(_SRCS_C) $(_SRCS_CPP), $(patsubst ./%,%,$(x))) +_SRCS_FULL_PATHS :=$(filter-out $(_EXECUTABLE_FULL_PATHS) $(_IGNORES_FULL_PATHS), $(foreach x, $(_SRCS), $(x))) + +VPATH+=:$(IDIRS) + +# ------------------------- +# Build configuration rules +# ------------------------- + + +ifneq ($(BUILD),) +_BUILD_THIS:=$(BUILD) +else +_BUILD_THIS:=$(DEFAULT_BUILD) +endif + +ifeq ($(strip $(ARCHIVEDIR)),) + ARCHIVEDIR:=$(BINDIR) +endif + +_BUILD_DIR:=$(patsubst ./%,%,$(patsubst %/,%,$(strip $(ODIR)))) +_BUILD:=$(patsubst ./%,%,$(patsubst %/,%,$(strip $(_BUILD_THIS)))) +_ODIR:=$(_BUILD_DIR)/$(_BUILD) +_BINDIR:=$(patsubst ./%,%,$(patsubst %/,%,$(strip $(BINDIR))))/$(_BUILD) +_ARCHIVEDIR:=$(patsubst ./%,%,$(patsubst %/,%,$(strip $(ARCHIVEDIR))))/$(_BUILD) + +ifeq ($(strip $(STATICARCHIVE)),) + _STATICARCHIVE:=$(_ARCHIVEDIR)/lib$(CURRENT_DIR).a +else + _STATICARCHIVE:=$(_ARCHIVEDIR)/$(STATICARCHIVE) +endif + +ifeq ($(strip $(SHAREDARCHIVE)),) + _SHAREDARCHIVE:=$(_ARCHIVEDIR)/lib$(CURRENT_DIR).so +else + _SHAREDARCHIVE:=$(_ARCHIVEDIR)/$(SHAREDARCHIVE) +endif + + +morph=$(_ODIR)/$(basename $(strip $(1))) +unmorph=$(patsubst $(_ODIR)/%, %, $(basename $(strip $(1)))) +_OBJECTS_MOVED :=$(foreach x, $(_SRCS_FULL_PATHS), $(call morph,$(x)).o) +_EXECUTABLE_OBJECTS_MOVED :=$(foreach x, $(_EXECUTABLE_FULL_PATHS), $(call morph,$(x)).o) +_BINS_MOVED :=$(foreach x,$(_EXECUTABLE_FULL_PATHS),$(_BINDIR)/$(notdir $(basename $(x)))) +_BUILD_SUBDIRS :=$(foreach x, $(_OBJECTS_MOVED) $(_EXECUTABLE_OBJECTS_MOVED), $(dir $(x))) +find_morphed_executable=$(filter $(_ODIR)/$(notdir $(basename $1)).o %/$(notdir $(basename $1)).o, $(_EXECUTABLE_OBJECTS_MOVED)) + + +# we use some serious voodoo here. +# $(-*-command-variables-*-) gives us the command line arguments. It's undocumented. +# http://stackoverflow.com/questions/23919199/detecting-unused-makefile-command-line-arguments +default: + for rec in $(RECURSEDIRS); do $(MAKE) -C $$rec; done + $(MAKE) .artifacts -f $(MKFILE_PATH) BUILD=$(DEFAULT_BUILD) $(-*-command-variables-*-) + +$(BUILDS): + for rec in $(RECURSEDIRS); do $(MAKE) -C $$rec; done + $(MAKE) .artifacts -f $(MKFILE_PATH) BUILD=$@ $(-*-command-variables-*-) + +.PHONY: .artifacts +.artifacts: $(ARTIFACTS) + cp $(_BINS_MOVED) $(dir $(_BINDIR)) 2>/dev/null || : + cp $(_STATICARCHIVE) $(dir $(_ARCHIVEDIR)) 2>/dev/null || : + cp $(_SHAREDARCHIVE) $(dir $(_ARCHIVEDIR)) 2>/dev/null || : + +# ------------------------- +# Print variables +# ------------------------- +.info: + $(info ${\n}) + $(info Makefile - $(strip ${MKFILE_PATH})) + $(info Include Dirs - ${IDIRS}) + $(info Lib Dirs - ${LDIRS}) + $(info Executable Source Files - ${_EXECUTABLE_FULL_PATHS}) + $(info Nonexecutable Source Files - ${_SRCS_FULL_PATHS}) + $(info Targets - ${_BINS_MOVED}) + $(info Nonexecutable Objects - ${_OBJECTS_MOVED}) + $(info Executable Objects - ${_EXECUTABLE_OBJECTS_MOVED}) + $(info Static Archive File - ${_STATICARCHIVE}) + $(info Shared Object File - ${_SHAREDARCHIVE}) + $(info Path - ${DIR_PATH}) + $(info Host - ${_HOSTNAME}) + $(info ${\n}) + +# ======================== +# Actual Build Rules +# ======================== +# Building can only happen at the second +# level of recursion once we've set up the build +# We elide the actual rules to make -pq faster +ifneq (0,${MAKELEVEL}) + + +# ------------------------ +# Makefile pragmas +# ------------------------ + +# for sorcery. just look it up in the manual. +.SECONDEXPANSION: +# for getting rid of implicit rules, because they make debugging hard +.SUFFIXES: + + +# ------------------------ +# Create directories +# ------------------------ +create_dirs:=$(foreach d, $(_ODIR) $(_BINDIR) $(_ARCHIVEDIR) $(_BUILD_SUBDIRS),$(shell test -d $(d) || mkdir -p $(d))) +create_build_dir:=$(shell test -d $(_BUILD_DIR) || mkdir -p $(_BUILD_DIR))) + +# ------------------------ +# Build rules for target +# ------------------------ + +.bin: $(_BINS_MOVED) + +$(_BINS_MOVED): $$(call find_morphed_executable,$$@) $(_OBJECTS_MOVED) $(_DEPS) + $(if $(findstring .atl,$@), \ + $(ALD) -o $@ $(_OBJECTS_MOVED) $(call find_morphed_executable,$@) -latlas $(_LINK_ARGS) , \ + $(LD) -o $@ $(_OBJECTS_MOVED) $(call find_morphed_executable,$@) $(_LINK_ARGS) ) + +# --------------------- +# Library build rules +# --------------------- + +# builds a libraries of all +# source (minus executables) +.lib: .static .shared +.static: $(_STATICARCHIVE) +.shared: $(_SHAREDARCHIVE) + +$(_STATICARCHIVE): $(_OBJECTS_MOVED) $(_DEPS) + $(if $(_OBJECTS_MOVED), ar rcs $(_STATICARCHIVE) $(_OBJECTS_MOVED) , ) + touch $(_STATICARCHIVE) + +$(_SHAREDARCHIVE): $(_OBJECTS_MOVED) $(_DEPS) + $(if $(_OBJECTS_MOVED), gcc -shared -o $(_SHAREDARCHIVE) $(_OBJECTS_MOVED) , ) + +# ------------------------------ +# Dependency handling +# ------------------------------ + +-include $(_OBJECTS_MOVED:.o=.d) +-include $(_EXECUTABLE_OBJECTS_MOVED:.o=.d) + + +%.d: $$(call unmorph, $$@).c $(_DEPS) + $(CC) -MM $(call unmorph, $@).c $(_C_COMP_ARGS) | sed -e "s?$(notdir $*).o:?$*.d:?" > $@ + +%.d: $$(call unmorph, $$@).cpp $(_DEPS) + $(CXX) -MM $(call unmorph, $@).cpp $(_CXX_COMP_ARGS) | sed -e "s?$(notdir $*).o:?$*.d:?" > $@ + +# ------------------------- +# atlas specific handling +# ------------------------- + +# Compile c code +%.atl.o: $$(call unmorph, $$@).c $(_DEPS) %.d + $(ACC) -c $(call unmorph, $@).c -o $@ $(_C_COMP_ARGS) + +# Compile cpp code +%.atl.o: $$(call unmorph, $$@).cpp $(_DEPS) %.d + $(ACXX) -c $(call unmorph, $@).cpp -o $@ $(_CXX_COMP_ARGS) + +# ------------------------------ +# Default build rules for c/c++ +# ------------------------------ + +# Compile c code +%.o: $$(call unmorph, $$@).c $(_DEPS) %.d + $(CC) -c $(call unmorph, $@).c -o $@ $(_C_COMP_ARGS) + +# Compile cpp code +%.o: $$(call unmorph, $$@).cpp $(_DEPS) %.d + $(CXX) -c $(call unmorph, $@).cpp -o $@ $(_CXX_COMP_ARGS) + +# ======================== +# End of Actual Build Rules +# ======================== +endif + + +# --------------------- +# Auxiliary build rules +# --------------------- + +clean: + rm Makefile~ 2> /dev/null || : + rm -r $(_BUILD_DIR) *.o *.d 2> /dev/null || : + $(foreach d, $(SRCDIRS), $(shell rm $d/*.c~ $d/*.cpp~ $d/*.h~ $d/*.hpp~ 2> /dev/null || :) ) + $(foreach d, $(SRCDIRS), $(info rm ${d}/*.c~ ${d}/*.cpp~ ${d}/*.h~ ${d}/*.hpp~ 2> /dev/null || :) ) + $(foreach d, $(BUILDS) . , $(info rm $(dir $(_ARCHIVEDIR))$d/$(notdir $(_STATICARCHIVE)) $(dir $(_ARCHIVEDIR))$d/$(notdir $(_SHAREDARCHIVE)) 2> /dev/null || : ) ) + $(foreach d, $(BUILDS) . , $(shell rm $(dir $(_ARCHIVEDIR))$d/$(notdir $(_STATICARCHIVE)) $(dir $(_ARCHIVEDIR))$d/$(notdir $(_SHAREDARCHIVE)) 2> /dev/null || : ) ) + $(foreach d, $(BUILDS) . , $(foreach b, $(notdir $(_BINS_MOVED)), $(info rm $(dir $(_BINDIR))$d/$b 2> /dev/null || : )) ) + $(foreach d, $(BUILDS) . , $(foreach b, $(notdir $(_BINS_MOVED)), $(shell rm $(dir $(_BINDIR))$d/$b 2> /dev/null || : )) ) + + +clean_memory: + rm -f -r /dev/shm/* || : + +print_%: ; @echo $*=$($*) + + + + diff --git a/README.md b/README.md new file mode 100644 index 00000000..fa118b09 --- /dev/null +++ b/README.md @@ -0,0 +1,235 @@ +# Montage: A General System for Buffered Durably Linearizable Data Structures + +Montage is a system for building fast buffered persistent data +structures, developed at the University of Rochester by H. Wen, W. +Cai, M. Du, L. Jenkins, B. Valpey, and M. L. Scott. The work has been +published in ArXiv ([link](https://arxiv.org/abs/2009.701)). You can +also find its short version in DISC' 20 as a brief announcement (link +to appear). + +The testing harness is based on J. Izraelevitz's +[parHarness](https://github.com/izrajoe/parHarness). + +- [Montage: A General System for Buffered Durably Linearizable Data Structures](#montage-a-general-system-for-buffered-durably-linearizable-data-structures) + - [1. Required Libraries](#1-required-libraries) + - [2. Commands](#2-commands) + - [2.1. Run Specific Queue or Map Test](#21-run-specific-queue-or-map-test) + - [2.2. Run Specific Graph Test](#22-run-specific-graph-test) + - [2.3. Use Montage in Your Code](#23-use-montage-in-your-code) + - [2.4. Different Mount Point](#24-different-mount-point) + - [3. Static and Dynamic Environment Variables](#3-static-and-dynamic-environment-variables) + - [3.1. Static Variables](#31-static-variables) + - [3.2. Dynamic Variables](#32-dynamic-variables) + - [3.3. Obsolete Variables](#33-obsolete-variables) + +## 1. Required Libraries + +Most of required libraries are provided in `./ext`, which includes +[Mnemosyne](https://github.com/snalli/mnemosyne-gcc/tree/master), +[libitm.so](https://pkgs.org/download/libitm), +[Pronto](https://zenodo.org/record/3605351#.X3YlJmhKj-g), +[MOD](https://zenodo.org/record/35636#.X3YlXmhKj-g) (which contains +nvm_malloc and immutable data structures), +[Ralloc](https://github.com/urcs-sync/ralloc), and +[threadcached](https://github.com/ChrisKjellqvist/MemcachedProtectedLibrary/tree/nohodor). +Most of them are customized for the experiment. +[nvm_malloc](https://github.com/IMCG/nvm-malloc) is vanilla. + +Other than those in `./ext`, this repository also depends on libhwloc, +libjemalloc, libuuid, and libpthread. + +Before running Pronto, ensure that huge pages are turned on, or an +error such as `ckpt_alloc.cpp:44: GlobalAlloc::GlobalAlloc(const +char*, const char*): Assertion newBlock(®ion, BaseAddress, +MinPoolSize) failed` would occur. You may use the following command +to turn on: + +```bash +sudo sysctl -w vm.nr_hugepages=32768 +``` + +## 2. Commands + +First, make sure persistent memory is mounted in DAX mode at +`/mnt/pmem`. Montage, MOD, and other native data structures in this +harness will create heap files prefixed by the user name. Pronto and +Mnemosyne handle heap files by their own and don't have the user name +prefix. Please refer to Section [2.3](#23-different-mount-point) if +NVM is mounted in a different path. + +To test scalability (with different thread counts) of queues and maps: + +```bash +./script/run_test.sh +``` + +To test queues and maps with different value sizes: + +```bash +./script/run_size.sh +``` + +To test memcached on YCSB: + +```bash +./script/run_memcached.sh +``` + +To test graph scalability and recovery, set up dataset and run +workloads using the following commands: + +```bash +./script/setup-datasets.sh +./script/run_graph.sh +``` + +To plot, run the following commands: +```bash +cd data +## data generated by run_test.sh +Rscript mt_queue_plotting.R # plot queues_thread.pdf from queues_thread.csv +Rscript mt_map_plotting.R # plot hashtables_*_thread.pdf from maps_*_thread.csv + +## data generated by run_size.sh +Rscript sz_queue_plotting.R # plot queues_size.pdf from queues_size.csv +Rscript sz_map_plotting.R # plot hashtables_*_size.pdf from maps_*_size.csv + +## data generated by run_memcached.sh +Rscript threadcached_plotting.R # plot threadcached_ycsba.pdf from ycsbc_a.csv + +## data generated by run_graph.sh +Rscript mt_graph_plotting.R # plot graph_*_thread.pdf from graph_thread.csv +Rscript rec_orkut_plotting.R # plot graph_recovery.pdf from graph_recovery.csv +``` + +### 2.1. Run Specific Queue or Map Test + +**Please read this subsection if you want to manually test specific +queues or maps on some workloads.** + +To build harness for testing all the queues or maps *except* those with +Pronto and Mnemosyne: + +```bash +make +``` + +To build with Pronto full version (with background threads) and Pronto +sync version (worker threads do their own logging), respectively: + +```bash +make pronto-full +make pronto-sync +``` + +To compile with Mnemosyne: + +```bash +make mnemosyne +``` + +Static variables such as `K_SZ` and `V_SZ` can be set while building, +to adjust key and value size of workloads. See Section +[3](#3-static-and-dynamic-environment-variables) for more details. + +After building, run the following with proper arguments: + +```bash +./bin/main -r -m -t -i [-v] +``` + +Running `./bin/main` without an argument will +print help info listing available options. + +### 2.2. Run Specific Graph Test + +If you want to manually run graph tests, do as follows: + +To building for testing multithreading performance: + +```bash +make +``` + +To test recovery, run the following command to build harness with +default thread pinning on the harness disabled, so that it won't +interfere with OpenMP threads spawned during recovery: + +```bash +make graph-rec +``` + +After building, run the following with proper arguments: + +```bash +./bin/main -r -m -t -i [-v] +``` + +Running +`./bin/main` without an argument will print help info listing +available options. The performance test is `GraphTest:1m:i33r33l33:c1` +and `GraphTest:1m:i25r25l25:c25`, while the recovery test is +`GraphRecoveryTest:Orkut:verify` and `TGraphConstructionTest:Orkut`. + +### 2.3. Use Montage in Your Code + +(In preparation) + +### 2.4. Different Mount Point + +If NVM is mounted in a different path, please either create a symbolic +link at `/mnt/pmem` (recommended) or search for `/mnt/pmem` in this +repository and replace them appeared in the following files: + +```bash +ext/mnemosyne-gcc/username/mnemosyne.ini # Mnemosyne +ext/mnemosyne-gcc/usermode/library/mcore/include/config.h # Mnemosyne +ext/pronto-v1.1/src/savitar.hpp # Pronto +ext/ralloc/src/pm_config.hpp # Ralloc + +script/EpochLengthSensitivity.sh # script for testing epoch lengths +script/explore_hashtable.sh # script for exploring Montage config on hash table +script/explore_memcached.sh # script for exploring Montage config on threadcached +script/run_graph.sh # script for running graph benchmarks +script/run_memcached.sh # script for running ycsb on memcached +script/run_size.sh # script for running Montage harness with different sizes +script/run_thread.sh # script for running Montage harness with different threads + +src/rideables/MODHashTable.hpp # MOD nvm_malloc init path +src/rideables/MODQueue.hpp # MOD nvm_malloc init path +``` + +## 3. Static and Dynamic Environment Variables + +### 3.1. Static Variables + +`K_SZ`: Static variable to control key size (Byte) for maps. By +default it's 32. It needs to be set before compilation to take effect, +e.g., `K_SZ=40 make`. Don't pass values less than 10! + +`V_SZ`: Static variable to control value size (Byte) for maps and +queues. By default it's 24. It needs to be set before compilation to +take effect, e.g., `V_SZ=2048 make`. + +### 3.2. Dynamic Variables + +`prefill`: The number of elements to be prefilled into the tested data +structure. This variable will overwrite the `prefill` argument passed +to Test constructors. + +`range`: This decides the range of keys in map tests. This variable +will also overwirte the `range` argument passed to Test constructors. + +There are also options mentioned in `./src/persist/README.md` for +configuring Montage parameter, e.g., epoch length, persisting +strategy, and buffering container. + +### 3.3. Obsolete Variables + +There're some obsolete variables no longer useable and are not +mentioned above. + +To name a few: `KeySize` and `ValueSize`. Inconsistency between them +and `K_SZ` and `V_SZ` will trigger assertion. +Please don't use any not mentioned above, unless you know what exactly +you are doing. diff --git a/data/mt_graph_plotting.R b/data/mt_graph_plotting.R new file mode 100644 index 00000000..449c3f2d --- /dev/null +++ b/data/mt_graph_plotting.R @@ -0,0 +1,134 @@ +# Copyright 2015 University of Rochester +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +library(plyr) +library(ggplot2) + +scientific_10 <- function(x) { + parse(text=gsub("1e\\+", "10^", scales::scientific_format()(x))) +} +tests<-c("thread") +for (t in tests){ +read.csv(paste("./graph_",t,".csv",sep=""))->montagedata + +montagedata$ds<-as.factor(gsub("TGraph","DRAM (T)",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NVMGraph","Montage (T)",montagedata$ds)) +montagedata$ds<-as.factor(gsub("MontageGraph","Montage",montagedata$ds)) +unfair<-subset(montagedata,test=="GraphTest:1m:i33r33l33:c1") +fair<-subset(montagedata,test=="GraphTest:1m:i25r25l25:c25") + +ddply(.data=unfair,.(ds,thread),mutate,ops= mean(ops))->unfair + +ddply(.data=fair,.(ds,thread),mutate,ops= mean(ops))->fair + +unfairdata = rbind(unfair[,c("ds","thread","ops")]) +unfairdata$ds <- factor(unfairdata$ds, levels=c("DRAM (T)", "NVM (T)", "Montage (T)", "Montage", "SOFT", "Dalí", "MOD", "Pronto-Full", "Pronto-Sync", "Mnemosyne")) + +fairdata = rbind(fair[,c("ds","thread","ops")]) +fairdata$ds <- factor(fairdata$ds, levels=c("DRAM (T)", "NVM (T)", "Montage (T)", "Montage", "SOFT", "Dalí", "MOD", "Pronto-Full", "Pronto-Sync", "Mnemosyne")) + +# Set up colors and shapes (invariant for all plots) +color_key = c("#12E1EA","#1245EA", + "#FF69B4","#C11B14", + "#660099","#1BC40F","#5947ff", + "#FF8C00", "#F86945", + "#191970") +names(color_key) <- levels(unfairdata$ds) + +shape_key = c(2,1,0,18,20,17,15,16,62,4) +names(shape_key) <- levels(unfairdata$ds) + +line_key = c(2,2,2,1,1,1,1,1,4,1) +names(line_key) <- levels(unfairdata$ds) + +# legend_pos=c(0.5,0.92) +# y_range_up = 2000 + +# Benchmark-specific plot formatting +legend_pos=c(0.665,0.3) +# y_range_up=300 +y_name="Throughput (ops/s)" +y_range_down = 100000 + +# Generate the plots +linchart<-ggplot(data=unfairdata, + aes(x=thread,y=ops,color=ds, shape=ds, linetype=ds))+ + geom_line()+xlab("Threads")+ylab(y_name)+geom_point(size=4)+ + scale_shape_manual(values=shape_key[names(shape_key) %in% unfairdata$ds])+ + scale_linetype_manual(values=line_key[names(line_key) %in% unfairdata$ds])+ + theme_bw()+ guides(shape=guide_legend(title=NULL))+ + guides(color=guide_legend(title=NULL))+ + guides(linetype=guide_legend(title=NULL))+ + scale_color_manual(values=color_key[names(color_key) %in% unfairdata$ds])+ + scale_x_continuous(breaks=c(1,10,20,30,40,50,60,70,80,90), + minor_breaks=c(2,4,8,16,32,64))+ + scale_y_continuous(trans='log2',label=scientific_10,breaks=c(10000,100000,1000000,1000000,10000000,100000000), + minor_breaks=c(20000,30000,40000,50000,60000,70000,80000,90000,200000,300000,400000,500000,600000,700000,800000,900000,2000000,3000000,4000000,5000000,6000000,7000000,8000000,9000000,20000000,30000000,40000000,50000000,60000000,70000000,80000000,90000000,200000000,300000000,400000000,500000000,600000000,700000000,800000000,900000000,2000000000))+ + coord_cartesian(xlim = c(-1, 65))+ + theme(plot.margin = unit(c(.2,0,-1.5,0), "cm"))+ + theme(legend.position=legend_pos, + legend.background = element_blank(), + legend.key = element_rect(colour = NA, fill = "transparent"))+ + theme(text = element_text(size = 18))+ + theme(axis.title.y = element_text(margin = margin(t = 0, r = 5, b = 0, l = 2)))+ + theme(axis.title.x = element_text(hjust =-0.185,vjust = 12.7,margin = margin(t = 15, r = 0, b = 10, l = 0))) + +# Save all four plots to separate PDFs +ggsave(filename = paste("./graph_unfair_",t,".pdf",sep=""),linchart,width=5.3, height = 4, units = "in", dpi=300, title = paste("graph_unfair_",t,".pdf",sep="")) + +names(color_key) <- levels(fairdata$ds) + +shape_key = c(2,1,0,18,20,17,15,16,62,4) +names(shape_key) <- levels(fairdata$ds) + +line_key = c(2,2,2,1,1,1,1,1,4,1) +names(line_key) <- levels(fairdata$ds) + +# legend_pos=c(0.5,0.92) +# y_range_up = 2000 + +# Benchmark-specific plot formatting +legend_pos=c(0.665,0.3) +# y_range_up=300 +y_name="Throughput (ops/s)" +y_range_down = 100000 + +# Generate the plots +linchart<-ggplot(data=fairdata, + aes(x=thread,y=ops,color=ds, shape=ds, linetype=ds))+ + geom_line()+xlab("Threads")+ylab(y_name)+geom_point(size=4)+ + scale_shape_manual(values=shape_key[names(shape_key) %in% fairdata$ds])+ + scale_linetype_manual(values=line_key[names(line_key) %in% fairdata$ds])+ + theme_bw()+ guides(shape=guide_legend(title=NULL))+ + guides(color=guide_legend(title=NULL))+ + guides(linetype=guide_legend(title=NULL))+ + scale_color_manual(values=color_key[names(color_key) %in% fairdata$ds])+ + scale_x_continuous(breaks=c(1,10,20,30,40,50,60,70,80,90), + minor_breaks=c(2,4,8,16,32,64))+ + scale_y_continuous(trans='log2',label=scientific_10,breaks=c(10000,100000,1000000,1000000,10000000,100000000), + minor_breaks=c(20000,30000,40000,50000,60000,70000,80000,90000,200000,300000,400000,500000,600000,700000,800000,900000,2000000,3000000,4000000,5000000,6000000,7000000,8000000,9000000,20000000,30000000,40000000,50000000,60000000,70000000,80000000,90000000,200000000,300000000,400000000,500000000,600000000,700000000,800000000,900000000,2000000000))+ + coord_cartesian(xlim = c(-1, 65))+ + theme(plot.margin = unit(c(.2,0,-1.5,0), "cm"))+ + theme(legend.position=legend_pos, + legend.background = element_blank(), + legend.key = element_rect(colour = NA, fill = "transparent"))+ + theme(text = element_text(size = 18))+ + theme(axis.title.y = element_text(margin = margin(t = 0, r = 5, b = 0, l = 2)))+ + theme(axis.title.x = element_text(hjust =-0.185,vjust = 12.7,margin = margin(t = 15, r = 0, b = 10, l = 0))) + +# Save all four plots to separate PDFs +ggsave(filename = paste("./graph_fair_",t,".pdf",sep=""),linchart,width=5.3, height = 4, units = "in", dpi=300, title = paste("graph_fair_",t,".pdf",sep="")) +} +# width=15.95 diff --git a/data/mt_map_plotting.R b/data/mt_map_plotting.R new file mode 100644 index 00000000..a2b8e6f6 --- /dev/null +++ b/data/mt_map_plotting.R @@ -0,0 +1,101 @@ +# Copyright 2015 University of Rochester +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +library(plyr) +library(ggplot2) + +scientific_10 <- function(x) { + parse(text=gsub("1e\\+", "10^", scales::scientific_format()(x))) +} +tests<-c("g0i50r50_thread","g50i25r25_thread","g90i5r5_thread") +for (t in tests){ +read.csv(paste("./maps_",t,".csv",sep=""))->montagedata + +montagedata$ds<-as.factor(gsub("NoPersistTransientHashTable","DRAM (T)",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistTransientHashTable","NVM (T)",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistMontageHashTable","Montage (T)",montagedata$ds)) +montagedata$ds<-as.factor(gsub("MontageHashTable","Montage",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistDali","Dalí",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistSOFT","SOFT",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistMODHashTable","MOD",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistMneHashTable","Mnemosyne",montagedata$ds)) +montagedata$ds<-as.factor(gsub("SyncNoPersistProntoHashTable","Pronto-Sync",montagedata$ds)) +montagedata$ds<-as.factor(gsub("FullNoPersistProntoHashTable","Pronto-Full",montagedata$ds)) +d1<-subset(montagedata,ds=="DRAM (T)") +d2<-subset(montagedata,ds=="NVM (T)") +d3<-subset(montagedata,ds=="Montage (T)") +d4<-subset(montagedata,ds=="Montage") +d5<-subset(montagedata,ds=="Dalí") +d6<-subset(montagedata,ds=="SOFT") +d7<-subset(montagedata,ds=="MOD") +d8<-subset(montagedata,ds=="Mnemosyne") +d9<-subset(montagedata,ds=="Pronto-Sync") +d10<-subset(montagedata,ds=="Pronto-Full") +lkdata = rbind(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10) + +ddply(.data=lkdata,.(ds,thread),mutate,ops= mean(ops))->lkdata +lindata = rbind(lkdata[,c("ds","thread","ops")]) +lindata$ds <- factor(lindata$ds, levels=c("DRAM (T)", "NVM (T)", "Montage (T)", "Montage", "SOFT", "Dalí", "MOD", "Pronto-Full", "Pronto-Sync", "Mnemosyne")) + +# Set up colors and shapes (invariant for all plots) +color_key = c("#12E1EA","#1245EA", + "#FF69B4","#C11B14", + "#660099","#1BC40F","#5947ff", + "#FF8C00", "#F86945", + "#191970") +names(color_key) <- levels(lindata$ds) + +shape_key = c(2,1,0,18,20,17,15,16,62,4) +names(shape_key) <- levels(lindata$ds) + +line_key = c(2,2,2,1,1,1,1,1,4,1) +names(line_key) <- levels(lindata$ds) + +# legend_pos=c(0.5,0.92) +# y_range_up = 2000 + +# Benchmark-specific plot formatting +legend_pos=c(0.581,0.13) +# y_range_up=300 +y_name="Throughput (ops/s)" +y_range_down = 10000 + +# Generate the plots +linchart<-ggplot(data=lindata, + aes(x=thread,y=ops,color=ds, shape=ds, linetype=ds))+ + geom_line()+xlab("Threads")+ylab(y_name)+geom_point(size=4)+ + scale_shape_manual(values=shape_key[names(shape_key) %in% lindata$ds])+ + scale_linetype_manual(values=line_key[names(line_key) %in% lindata$ds])+ + theme_bw()+ guides(shape=guide_legend(title=NULL,ncol=4))+ + guides(color=guide_legend(title=NULL,ncol=4))+ + guides(linetype=guide_legend(title=NULL,ncol=4))+ + scale_color_manual(values=color_key[names(color_key) %in% lindata$ds])+ + scale_x_continuous(breaks=c(1,10,20,30,40,50,60,70,80,90), + minor_breaks=c(4,8,12,16,24,32,36,48,62,72))+ + scale_y_continuous(trans='log2',label=scientific_10,breaks=c(10000,100000,1000000,1000000,10000000,100000000), + minor_breaks=c(20000,30000,40000,50000,60000,70000,80000,90000,200000,300000,400000,500000,600000,700000,800000,900000,2000000,3000000,4000000,5000000,6000000,7000000,8000000,9000000,20000000,30000000,40000000,50000000,60000000,70000000,80000000,90000000,200000000,300000000,400000000,500000000,600000000,700000000,800000000,900000000,2000000000))+ + coord_cartesian(xlim = c(1, 90), ylim = c(y_range_down,100000000))+ + theme(plot.margin = unit(c(.2,0,-1.5,0), "cm"))+ + theme(legend.position=legend_pos, + legend.background = element_blank(), + legend.key = element_rect(colour = NA, fill = "transparent"))+ + theme(text = element_text(size = 18))+ + theme(axis.title.y = element_text(margin = margin(t = 0, r = 5, b = 0, l = 2)))+ + theme(axis.title.x = element_text(hjust =-0.105,vjust = 12.7,margin = margin(t = 15, r = 0, b = 10, l = 0))) + +# Save all four plots to separate PDFs +ggsave(filename = paste("./hashtables_",t,".pdf",sep=""),linchart,width=8, height = 4, units = "in", dpi=300, title = paste("hashtables_",t,".pdf",sep="")) +} +# width=15.95 diff --git a/data/mt_queue_plotting.R b/data/mt_queue_plotting.R new file mode 100644 index 00000000..ded1ae17 --- /dev/null +++ b/data/mt_queue_plotting.R @@ -0,0 +1,102 @@ +# Copyright 2015 University of Rochester +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +library(plyr) +library(ggplot2) + +scientific_10 <- function(x) { + parse(text=gsub("1e\\+", "10^", scales::scientific_format()(x))) +} +tests<-c("thread") +for (t in tests){ +read.csv(paste("./queues_",t,".csv",sep=""))->montagedata + +montagedata$ds<-as.factor(gsub("NoPersistTransientQueue","DRAM (T)",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistTransientQueue","NVM (T)",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistMontageQueue","Montage (T)",montagedata$ds)) +montagedata$ds<-as.factor(gsub("MontageQueue","Montage",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistMODQueue","MOD",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistMneQueue","Mnemosyne",montagedata$ds)) +montagedata$ds<-as.factor(gsub("SyncNoPersistProntoQueue","Pronto-Sync",montagedata$ds)) +montagedata$ds<-as.factor(gsub("FullNoPersistProntoQueue","Pronto-Full",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistFriedmanQueue","Friedman",montagedata$ds)) +montagedata$ds<-as.factor(gsub("MontageMSQueue","Montage MSQ",montagedata$ds)) +d1<-subset(montagedata,ds=="DRAM (T)") +d2<-subset(montagedata,ds=="NVM (T)") +d3<-subset(montagedata,ds=="Montage (T)") +d4<-subset(montagedata,ds=="Montage") +d5<-subset(montagedata,ds=="MOD") +d6<-subset(montagedata,ds=="Mnemosyne") +d7<-subset(montagedata,ds=="Pronto-Sync") +d8<-subset(montagedata,ds=="Pronto-Full") +d9<-subset(montagedata,ds=="Friedman") +d10<-subset(montagedata,ds=="Montage MSQ") +lkdata = rbind(d1,d2,d3,d4,d5,d6,d7,d8,d9) + +ddply(.data=lkdata,.(ds,thread),mutate,ops= mean(ops))->lkdata_ +lindata = rbind(lkdata_[,c("ds","thread","ops")]) +lindata$ds <- factor(lindata$ds, levels=c("DRAM (T)", "NVM (T)", "Montage (T)", "Montage","Montage MSQ","Friedman", "MOD", "Pronto-Full", "Pronto-Sync", "Mnemosyne")) + +# Set up colors and shapes (invariant for all plots) +color_key = c("#12E1EA","#1245EA", + "#FF69B4","#C11B14", + "#DC143C","#809900", + "#5947ff", + "#FF8C00","#F86945", + "#191970") +names(color_key) <- levels(lindata$ds) + +shape_key = c(2,1,0,18,25,20,15,16,62,4) +names(shape_key) <- levels(lindata$ds) + +line_key = c(2,2,2,1,1,1,1,1,4,1) +names(line_key) <- levels(lindata$ds) + +# legend_pos=c(0.5,0.92) +# y_range_down = 0 +# y_range_up = 2000 + +# Benchmark-specific plot formatting +legend_pos=c(0.554,0.25) +# y_range_up=300 +y_name="Throughput (ops/s)" + + +# Generate the plots +linchart<-ggplot(data=lindata, + aes(x=thread,y=ops,color=ds, shape=ds, linetype=ds))+ + geom_line()+xlab("Threads")+ylab(y_name)+geom_point(size=4)+ + scale_shape_manual(values=shape_key[names(shape_key) %in% lindata$ds])+ + scale_linetype_manual(values=line_key[names(line_key) %in% lindata$ds])+ + theme_bw()+ guides(shape=guide_legend(title=NULL,ncol=4))+ + guides(color=guide_legend(title=NULL,ncol=4))+ + guides(linetype=guide_legend(title=NULL,ncol=4))+ + scale_color_manual(values=color_key[names(color_key) %in% lindata$ds])+ + scale_x_continuous(breaks=c(1,10,20,30,40,50,60,70,80,90), + minor_breaks=c(4,8,12,16,24,32,36,48,62,72))+ + scale_y_continuous(trans='log2',label=scientific_10,breaks=c(1000,10000,100000,1000000,1000000,10000000), + minor_breaks=c(3000,4000,5000,6000,7000,8000,9000,20000,30000,40000,50000,60000,70000,80000,90000,200000,300000,400000,500000,600000,700000,800000,900000,2000000,3000000,4000000,5000000,6000000,7000000,8000000,9000000,20000000,30000000,40000000,50000000,60000000,70000000,80000000,90000000,200000000,300000000,400000000,500000000,600000000,700000000,800000000,900000000,2000000000))+ + coord_cartesian(xlim = c(1, 90), ylim = c(4000,10000000))+ + theme(plot.margin = unit(c(.2,0,-1.5,0), "cm"))+ + theme(legend.position=legend_pos, + legend.background = element_blank(), + legend.key = element_rect(colour = NA, fill = "transparent"))+ + theme(text = element_text(size = 18))+ + theme(axis.title.y = element_text(margin = margin(t = 0, r = 5, b = 0, l = 2)))+ + theme(axis.title.x = element_text(hjust =-0.105,vjust = 12.7,margin = margin(t = 15, r = 0, b = 10, l = 0))) + +# Save all four plots to separate PDFs +ggsave(filename = paste("./queues_",t,".pdf",sep=""),linchart,width=8, height = 4, units = "in", dpi=300, title = paste("queues_",t,".pdf",sep="")) +} diff --git a/data/rec_orkut_plotting.R b/data/rec_orkut_plotting.R new file mode 100644 index 00000000..f0bb94a9 --- /dev/null +++ b/data/rec_orkut_plotting.R @@ -0,0 +1,85 @@ +# Copyright 2015 University of Rochester +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +library(plyr) +library(ggplot2) + +scientific_10 <- function(x) { + parse(text=gsub("1e\\+", "10^", scales::scientific_format()(x))) +} +tests<-c("recovery") +for (t in tests){ +read.csv(paste("./graph_",t,".csv",sep=""))->montagedata + +montagedata$ds<-as.factor(gsub("TGraphRecovery","DRAM (T)",montagedata$ds)) + +montagedata$ds<-as.factor(gsub("MontageCreation","Montage (T)",montagedata$ds)) +montagedata$ds<-as.factor(gsub("MontageRecovery","Montage",montagedata$ds)) + +ddply(.data=montagedata,.(ds,thread),mutate,latency= mean(latency)/1000)->lkdata + +lindata = rbind(lkdata[,c("ds","thread","latency")]) +lindata$ds <- factor(lindata$ds, levels=c("DRAM (T)", "NVM (T)", "Montage (T)", "Montage", "SOFT", "Dalí", "MOD", "Pronto-Full", "Pronto-Sync", "Mnemosyne")) + +# Set up colors and shapes (invariant for all plots) +color_key = c("#12E1EA","#1245EA", + "#FF69B4","#C11B14", + "#660099","#1BC40F","#5947ff", + "#FF8C00", "#F86945", + "#191970") +names(color_key) <- levels(lindata$ds) + +shape_key = c(2,1,0,18,20,17,15,16,62,4) +names(shape_key) <- levels(lindata$ds) + +line_key = c(2,2,2,1,1,1,1,1,4,1) +names(line_key) <- levels(lindata$ds) + +# legend_pos=c(0.5,0.92) +# y_range_up = 2000 + +# Benchmark-specific plot formatting +legend_pos=c(0.637,0.78) +# y_range_up=300 +y_name="Latency (s)" +y_range_down = 100 + +# Generate the plots +linchart<-ggplot(data=lindata, + aes(x=thread,y=latency,color=ds, shape=ds, linetype=ds))+ + geom_line()+xlab("Threads")+ylab(y_name)+geom_point(size=4)+ + scale_shape_manual(values=shape_key[names(shape_key) %in% lindata$ds])+ + scale_linetype_manual(values=line_key[names(line_key) %in% lindata$ds])+ + theme_bw()+ guides(shape=guide_legend(title=NULL))+ + guides(color=guide_legend(title=NULL))+ + guides(linetype=guide_legend(title=NULL))+ + scale_color_manual(values=color_key[names(color_key) %in% lindata$ds])+ + scale_x_continuous(breaks=c(1,10,20,30,40,50,60,70,80,90), + minor_breaks=c(2,4,8,16,32,64))+ + scale_y_continuous(trans='log2',label=scientific_10,breaks=c(10,100,1000,1000,10000,100000), + minor_breaks=c(20,30,40,50,60,70,80,90,200,300,400,500,600,700,800,900,2000,3000,4000,5000,6000,7000,8000,9000))+ + coord_cartesian(xlim = c(-1, 65))+ + theme(plot.margin = unit(c(.2,0,-1.5,0), "cm"))+ + theme(legend.position=legend_pos, + legend.background = element_blank(), + legend.key = element_rect(colour = NA, fill = "transparent"))+ + theme(text = element_text(size = 18))+ + theme(axis.title.y = element_text(margin = margin(t = 0, r = 5, b = 0, l = 2)))+ + theme(axis.title.x = element_text(hjust =-0.185,vjust = 12.7,margin = margin(t = 15, r = 0, b = 10, l = 0))) + +# Save all four plots to separate PDFs +ggsave(filename = paste("./graph_",t,".pdf",sep=""),linchart,width=5.3, height = 4, units = "in", dpi=300, title = paste("graph_",t,".pdf",sep="")) +} +# width=15.95 diff --git a/data/sz_map_plotting.R b/data/sz_map_plotting.R new file mode 100644 index 00000000..b867d98e --- /dev/null +++ b/data/sz_map_plotting.R @@ -0,0 +1,100 @@ +# Copyright 2015 University of Rochester +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +library(plyr) +library(ggplot2) + +scientific_10 <- function(x) { + parse(text=gsub("1e\\+", "10^", scales::scientific_format()(x))) +} +tests<-c("g0i50r50_size","g50i25r25_size","g90i5r5_size") +for (t in tests){ +read.csv(paste("./maps_",t,".csv",sep=""))->montagedata + +montagedata$ds<-as.factor(gsub("NoPersistTransientHashTable","DRAM (T)",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistTransientHashTable","NVM (T)",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistMontageHashTable","Montage (T)",montagedata$ds)) +montagedata$ds<-as.factor(gsub("MontageHashTable","Montage",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistDali","Dalí",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistSOFT","SOFT",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistMODHashTable","MOD",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistMneHashTable","Mnemosyne",montagedata$ds)) +montagedata$ds<-as.factor(gsub("SyncNoPersistProntoHashTable","Pronto-Sync",montagedata$ds)) +montagedata$ds<-as.factor(gsub("FullNoPersistProntoHashTable","Pronto-Full",montagedata$ds)) +d1<-subset(montagedata,ds=="DRAM (T)") +d2<-subset(montagedata,ds=="NVM (T)") +d3<-subset(montagedata,ds=="Montage (T)") +d4<-subset(montagedata,ds=="Montage") +d5<-subset(montagedata,ds=="Dalí") +d6<-subset(montagedata,ds=="SOFT") +d7<-subset(montagedata,ds=="MOD") +d8<-subset(montagedata,ds=="Mnemosyne") +d9<-subset(montagedata,ds=="Pronto-Sync") +d10<-subset(montagedata,ds=="Pronto-Full") +lkdata = rbind(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10) + +ddply(.data=lkdata,.(ds,size),mutate,ops= mean(ops))->lkdata +lindata = rbind(lkdata[,c("ds","size","ops")]) +lindata$ds <- factor(lindata$ds, levels=c("DRAM (T)", "NVM (T)", "Montage (T)", "Montage", "SOFT", "Dalí", "MOD", "Pronto-Full", "Pronto-Sync", "Mnemosyne")) + +# Set up colors and shapes (invariant for all plots) +color_key = c("#12E1EA","#1245EA", + "#FF69B4","#C11B14", + "#660099","#1BC40F","#5947ff", + "#FF8C00", "#F86945", + "#191970") +names(color_key) <- levels(lindata$ds) + +shape_key = c(2,1,0,18,20,17,15,16,62,4) +names(shape_key) <- levels(lindata$ds) + +line_key = c(2,2,2,1,1,1,1,1,4,1) +names(line_key) <- levels(lindata$ds) + +# legend_pos=c(0.5,0.92) +# y_range_up = 2000 + +# Benchmark-specific plot formatting +legend_pos=c(0.237,0.2) +# y_range_up=300 +y_name="Throughput (ops/s)" +y_range_down = 15000 + +# Generate the plots +linchart<-ggplot(data=lindata, + aes(x=size,y=ops,color=ds, shape=ds, linetype=ds))+ + geom_line()+xlab("Size (B)")+ylab(y_name)+geom_point(size=4)+ + scale_shape_manual(values=shape_key[names(shape_key) %in% lindata$ds])+ + scale_linetype_manual(values=line_key[names(line_key) %in% lindata$ds])+ + theme_bw()+ guides(shape=guide_legend(title=NULL,ncol=2))+ + guides(color=guide_legend(title=NULL,ncol=2))+ + guides(linetype=guide_legend(title=NULL,ncol=2))+ + scale_color_manual(values=color_key[names(color_key) %in% lindata$ds])+ + scale_x_continuous(trans='log2',breaks=c(16,64,256,1024,4096),labels=c("16","64","256","1K","4K"))+ + scale_y_continuous(trans='log2',label=scientific_10,breaks=c(10000,100000,1000000,1000000,10000000), + minor_breaks=c(2000,3000,4000,5000,6000,7000,8000,9000,20000,30000,40000,50000,60000,70000,80000,90000,200000,300000,400000,500000,600000,700000,800000,900000,2000000,3000000,4000000,5000000,6000000,7000000,8000000,9000000,20000000,30000000,40000000,50000000,60000000,70000000,80000000,90000000,200000000,300000000,400000000,500000000,600000000,700000000,800000000,900000000,2000000000))+ + coord_cartesian(xlim = c(16,4096), ylim = c(3000,2000000))+ + theme(plot.margin = unit(c(.2,0,-1.5,0), "cm"))+ + theme(legend.position=legend_pos, + legend.background = element_blank(), + legend.key = element_rect(colour = NA, fill = "transparent"))+ + theme(text = element_text(size = 18))+ + theme(axis.title.y = element_text(margin = margin(t = 0, r = 5, b = 0, l = 2)))+ + theme(axis.title.x = element_text(hjust =-0.105,vjust = 12.7,margin = margin(t = 15, r = 0, b = 10, l = 0))) + +# Save all four plots to separate PDFs +ggsave(filename = paste("./hashtables_",t,".pdf",sep=""),linchart,width=8, height = 4, units = "in", dpi=300, title = paste("hashtables_",t,".pdf",sep="")) +} +# width=15.95 diff --git a/data/sz_queue_plotting.R b/data/sz_queue_plotting.R new file mode 100644 index 00000000..4f22492d --- /dev/null +++ b/data/sz_queue_plotting.R @@ -0,0 +1,100 @@ +# Copyright 2015 University of Rochester +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +library(plyr) +library(ggplot2) + +scientific_10 <- function(x) { + parse(text=gsub("1e\\+", "10^", scales::scientific_format()(x))) +} +tests<-c("size") +for (t in tests){ +read.csv(paste("./queues_",t,".csv",sep=""))->montagedata + +montagedata$ds<-as.factor(gsub("NoPersistTransientQueue","DRAM (T)",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistTransientQueue","NVM (T)",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistMontageQueue","Montage (T)",montagedata$ds)) +montagedata$ds<-as.factor(gsub("MontageQueue","Montage",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistMODQueue","MOD",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistMneQueue","Mnemosyne",montagedata$ds)) +montagedata$ds<-as.factor(gsub("SyncNoPersistProntoQueue","Pronto-Sync",montagedata$ds)) +montagedata$ds<-as.factor(gsub("FullNoPersistProntoQueue","Pronto-Full",montagedata$ds)) +montagedata$ds<-as.factor(gsub("NoPersistFriedmanQueue","Friedman",montagedata$ds)) +montagedata$ds<-as.factor(gsub("MontageMSQueue","Montage MSQ",montagedata$ds)) +d1<-subset(montagedata,ds=="DRAM (T)") +d2<-subset(montagedata,ds=="NVM (T)") +d3<-subset(montagedata,ds=="Montage (T)") +d4<-subset(montagedata,ds=="Montage") +d5<-subset(montagedata,ds=="MOD") +d6<-subset(montagedata,ds=="Mnemosyne") +d7<-subset(montagedata,ds=="Pronto-Sync") +d8<-subset(montagedata,ds=="Pronto-Full") +d9<-subset(montagedata,ds=="Friedman") +lkdata = rbind(d1,d2,d3,d4,d5,d6,d7,d8,d9) + +ddply(.data=lkdata,.(ds,size),mutate,ops= mean(ops))->lkdata_ +lindata = rbind(lkdata_[,c("ds","size","ops")]) +lindata$ds <- factor(lindata$ds, levels=c("DRAM (T)", "NVM (T)", "Montage (T)", "Montage","Montage MSQ","Friedman", "MOD", "Pronto-Full", "Pronto-Sync", "Mnemosyne")) + +# Set up colors and shapes (invariant for all plots) +color_key = c("#12E1EA","#1245EA", + "#FF69B4","#C11B14", + "#DC143C","#809900", + "#5947ff", + "#FF8C00","#F86945", + "#191970") +names(color_key) <- levels(lindata$ds) + +shape_key = c(2,1,0,18,25,20,15,16,62,4) +names(shape_key) <- levels(lindata$ds) + +line_key = c(2,2,2,1,1,1,1,1,4,1) +names(line_key) <- levels(lindata$ds) + +# legend_pos=c(0.5,0.92) +# y_range_down = 0 +# y_range_up = 2000 + +# Benchmark-specific plot formatting +legend_pos=c(0.237,0.17) +# y_range_up=300 +y_name="Throughput (ops/s)" + + +# Generate the plots +linchart<-ggplot(data=lindata, + aes(x=size,y=ops,color=ds, shape=ds, linetype=ds))+ + geom_line()+xlab("Size (B)")+ylab(y_name)+geom_point(size=4)+ + scale_shape_manual(values=shape_key[names(shape_key) %in% lindata$ds])+ + scale_linetype_manual(values=line_key[names(line_key) %in% lindata$ds])+ + theme_bw()+ guides(shape=guide_legend(title=NULL,ncol=2))+ + guides(color=guide_legend(title=NULL,ncol=2))+ + guides(linetype=guide_legend(title=NULL,ncol=2))+ + scale_color_manual(values=color_key[names(color_key) %in% lindata$ds])+ + scale_x_continuous(trans='log2',breaks=c(16,64,256,1024,4096),labels=c("16","64","256","1K","4K"))+ + scale_y_continuous(trans='log2',label=scientific_10,breaks=c(1000,10000,100000,1000000,1000000,10000000), + minor_breaks=c(2000,3000,4000,5000,6000,7000,8000,9000,20000,30000,40000,50000,60000,70000,80000,90000,200000,300000,400000,500000,600000,700000,800000,900000,2000000,3000000,4000000,5000000,6000000,7000000,8000000,9000000,20000000,30000000,40000000,50000000,60000000,70000000,80000000,90000000,200000000,300000000,400000000,500000000,600000000,700000000,800000000,900000000,2000000000))+ + coord_cartesian(xlim = c(16, 4096), ylim = c(1000,20000000))+ + theme(plot.margin = unit(c(.2,0,-1.5,0), "cm"))+ + theme(legend.position=legend_pos, + legend.background = element_blank(), + legend.key = element_rect(colour = NA, fill = "transparent"))+ + theme(text = element_text(size = 18))+ + theme(axis.title.y = element_text(margin = margin(t = 0, r = 5, b = 0, l = 2)))+ + theme(axis.title.x = element_text(hjust =-0.105,vjust = 12.7,margin = margin(t = 15, r = 0, b = 10, l = 0))) + +# Save all four plots to separate PDFs +ggsave(filename = paste("./queues_",t,".pdf",sep=""),linchart,width=8, height = 4, units = "in", dpi=300, title = paste("queues_",t,".pdf",sep="")) +} diff --git a/data/threadcached_plotting.R b/data/threadcached_plotting.R new file mode 100644 index 00000000..f49987b7 --- /dev/null +++ b/data/threadcached_plotting.R @@ -0,0 +1,59 @@ +library(plyr) +library(ggplot2) + +scientific_10 <- function(x) { + parse(text=gsub("1e\\+", "10^", scales::scientific_format()(x))) +} +# for memcached +tests<-c("") +for (t in tests){ +lindata<-do.call(rbind,lapply(paste("./ycsbc_a",t,".csv",sep=""),read.csv,header=TRUE,row.names=NULL)) + +ddply(.data=lindata,.(option,thread),mutate,mops= mean(kops)/1000)->lindata +lindata$option<-as.factor(gsub("dram","DRAM (T)",lindata$option)) +lindata$option<-as.factor(gsub("nvm","Montage (T)",lindata$option)) +lindata$option<-as.factor(gsub("montage","Montage",lindata$option)) +lindata$option <- factor(lindata$option, levels=c("DRAM (T)", "Montage (T)", "Montage")) + +color_key = c("#12E1EA","#FF69B4", + "#C11B14", "#FF69B4", "#FF8C00", "#F86945") +names(color_key) <- levels(lindata$option) + +shape_key = c(2,1,18,0,3,62) +names(shape_key) <- levels(lindata$option) + +line_key = c(4,2,1,5,5,4) +names(line_key) <- levels(lindata$option) + +##################################### +#### Begin charts for Throughput #### +##################################### + +legend_pos=c(0.769,0.77) +y_range_up=2.2 +y_name="Throughput (Mops/s)" + +# Generate the plots +linchart<-ggplot(data=lindata, + aes(x=thread,y=mops,color=option, shape=option, linetype=option))+ + geom_line()+xlab("Threads")+ylab(y_name)+geom_point(size=4)+ + scale_shape_manual(values=shape_key[names(shape_key) %in% lindata$option])+ + scale_linetype_manual(values=line_key[names(line_key) %in% lindata$option])+ + theme_bw()+ guides(shape=guide_legend(title=NULL))+ + guides(color=guide_legend(title=NULL))+ + guides(linetype=guide_legend(title=NULL))+ + scale_color_manual(values=color_key[names(color_key) %in% lindata$option])+ + scale_x_continuous(breaks=c(1,10,20,30,40,50,60,70,80,90), + minor_breaks=c(4,8,12,16,24,32,36,40,48,62,72))+ + coord_cartesian(xlim = c(0,90), ylim = c(0, y_range_up))+ + theme(plot.margin = unit(c(.2,0,-1.5,0), "cm"))+ + theme(legend.position=legend_pos, + legend.background = element_blank(), + legend.key = element_rect(colour = NA, fill = "transparent"))+ + theme(text = element_text(size = 18))+ + theme(axis.title.y = element_text(margin = margin(t = 0, r = 5, b = 0, l = 2)))+ + theme(axis.title.x = element_text(hjust =-0.1,vjust = 12.7,margin = margin(t = 15, r = 0, b = 10, l = 0))) + +# Save all four plots to separate PDFs +ggsave(filename = paste("./threadcached_ycsba",t,".pdf",sep=""),linchart,width=8, height = 4, units = "in", dpi=300, title = paste("threadcached_ycsba",t,".pdf",sep="")) +} diff --git a/ext/README.md b/ext/README.md new file mode 100644 index 00000000..661ff1c5 --- /dev/null +++ b/ext/README.md @@ -0,0 +1,138 @@ +# External Libraries + +- [External Libraries](#external-libraries) + - [1. libitm](#1-libitm) + - [2. mnemosyne-gcc](#2-mnemosyne-gcc) + - [3. mod-single-repo](#3-mod-single-repo) + - [4. pronto-v1.1](#4-pronto-v11) + - [5. ralloc](#5-ralloc) + - [6. threadcached and ycsb-tcd](#6-threadcached-and-ycsb-tcd) + +This directory contains code from other works, which may have their +own license and authorship different from what Montage has. Please +refer to their folder for those information. + +To integrate their core functionality to our harness for comparison, +we extract minimum files/subfolders from their original distribution +and make some necessary modification. Their origin and modification (if +any) are listed as follows: + +## 1. [libitm](https://pkgs.org/download/libitm) + +No modification has been made. A dynamic library (.so) tested on +Fedora 30 is included in the directory. + +## 2. [mnemosyne-gcc](https://github.com/snalli/mnemosyne-gcc/tree/master) + +Mnemosyne is a persistent transactional memory system developed by H. +Volos, A. J. Tack, and M. M. Swift. Its corresponding +[paper](https://doi.org/10.1145/1961296.1950379) was published on +ASPLOS' 2011. + +We clone the code from its *master* branch and made changes including: + +1. Comment out locks used for synchronizing statistic information + collection in critical path. +2. Change persistent heap file path to `/mnt/pmem/psegments`. +3. Use `clwb` instead of `clflush`, `mfence` instead of `sfence`, and + DAX `mmap` (i.e., passing `MAP_SHARED_VALIDATE | MAP_SYNC` as + flag). +4. Refactor code to make the size of heap file more extendable and + extend it to 32 GiB. +5. Add `Makefile` to `./ext/mnemosyne-gcc/usermode`. +6. Remove benchmarks of vacation and memcached as they are not used in + our harness. + +Please refer to `mne.diff` in `./ext/mnemosyne-gcc` for all nontrivial +difference between our version and the vanilla Mnemosyne. The diff +file assumes that original mnemosyne is located in the same level of +the entire repository and is gotten by command +`diff -r ../mnemosyne-gcc ./ext/mnemosyne-gcc >> ./ext/mnemosyne-gcc/mne.diff`. + +## 3. [mod-single-repo](https://zenodo.org/record/3563186#.X3YlXmhKj-g) + +MOD is a system that persists immutable data structures by S. Haria, +M. D. Hill, and M. M. Swift. Its corresponding +[paper](https://doi.org/10.1145/3373376.3378472) was published on +ASPLOS' 2020. + +We use only `immer/queue.hpp` and write our own concurrent hash table +in `immer/unordered_map.hpp` based on `immer/detail/list/list.hpp`. +These two headers utilize `nvm_malloc`. As a result, we keep only +`Immutable-Datastructure-c++` and `nvm_malloc` and other directories +are omitted. + +Additional, we replace `clflushopt` by `clwb`. Please refer to +`mod.diff` in `./ext/mod-single-repo` for all nontrivial difference +between our version and the vanilla MOD. + +## 4. [pronto-v1.1](https://zenodo.org/record/3605351#.X3YlJmhKj-g) + +Pronto is a system that persists arbitrary data structures by logging +high-level operations with semantical information. Authored by A. +Memaripour, J. Izraelevitz, and S. Swanson, its corresponding +[paper](https://doi.org/10.1145/3373376.3378456) was published on +ASPLOS' 2020. + +In the harness, we implement our own hash table and queue with Pronto +for experiments; they are named `ProntoQueue` and `ProntoHashTable`, +located at `./src/rideables`. + +We made several changes to the Pronto system including: + +1. Disable buggy free list coalescing in their allocator. +2. Fix typos in Makefile (mainly %s/-o3/-O3). +3. Change max thread number to 80 and adapt affinity rule to our + machine (see below). +4. Change persistent heap file path to `/mnt/pmem`. +5. Use DAX `mmap` (i.e., passing `MAP_SHARED_VALIDATE | MAP_SYNC` as + flag) for snapshot. + +Please refer to `pronto.diff` in `./ext/pronto-v1.1` for all +nontrivial difference between our version and the vanilla Pronto. + +Note: We assume two-socket machine to be used for experiments. Each +socket has 20 cores and 40 hyperthreads. The core is indexed such as +{0,2,4...38} are 20 hyperthreads on individual cores of the first +socket, {40,42,44...,78} are 20 sister threads of the previous 20 +hyperthreads. Cores indexed by odd numbers are those on the second +socket. Refer to `./ext/pronto-v1.1/src/thread.cpp:75` for the pinning +map. + +## 5. [ralloc](https://github.com/urcs-sync/ralloc) + +Ralloc is a lock-free persistent allocator that has competitive +performance to even transient allocators. It is developed by W. Cai, +H. Wen, H. A. Beadle, and M. L. Scott. Its corresponding +[paper](https://doi.org/10.1145/3332466.3374502) was published on +ISMM' 2020. + +We adjust its recovery routine so it instead returns a set of +iterators and the heap is recovered on the way applications iterating +through it. Please refer to `ralloc.diff` in `./ext/ralloc` for all +nontrivial difference between our version and the vanilla Ralloc. + +## 6. [threadcached](https://github.com/ChrisKjellqvist/MemcachedProtectedLibrary/tree/nohodor) and ycsb-tcd + +Threadcached is a variant of Memcached which links directly to a +multithreaded client application, dispensing with the usual +socket-based communication. Since we only focus on performance of +persistence, its `nohodor` branch is used. Authored by C. Kjellqvist, +M. Hedayati, and M. L. Scott, its corresponding +[paper](https://doi.org/10.1145/3404397.3404443) was published on +ICPP' 2020. + +The main changes are: + +1. Replace allocator calls with generic ones so we can easily control + which allocator to use. +2. Persist with Montage + +ycsb-tcd is a variant of C version YCSB, customized by C. Kjellqvist. +Instead of communicating through socket, it directly calls into the +threadcached library. This code wasn't published by Kjellqvist himself +yet, so please contact him for approval if you need to redistribute. + +Please refer to `threadcached.diff` in `./ext/threadcached` for all +nontrivial difference between our version and the vanilla +Threadcached. diff --git a/ext/libitm/libitm.so b/ext/libitm/libitm.so new file mode 100755 index 0000000000000000000000000000000000000000..e1b75168232d05816a7a8026ddb24c21ae9eefd0 GIT binary patch literal 133496 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