diff --git a/Makefile b/Makefile index 7b2c456ba..5850a8eea 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,50 @@ all: $(EXECUTABLES) parse: main.cpp common_defs.h linux-perf-events.h $(CXX) $(CXXFLAGS) -o parse main.cpp +testflatten: parse parsenocheesy parsenodep2 parsenodep4 parsenodep6 parsenodep8 parsenodep10 parsenodep12 parsenodep14 parsenodep16 + for filename in jsonexamples/twitter.json jsonexamples/gsoc-2018.json jsonexamples/citm_catalog.json jsonexamples/canada.json ; do \ + echo $$filename ; \ + set -x; \ + ./parse $$filename ; \ + ./parsenocheesy $$filename ; \ + ./parsenocheesy $$filename ; \ + ./parsenodep2 $$filename ; \ + ./parsenodep4 $$filename ; \ + ./parsenodep6 $$filename ; \ + ./parsenodep8 $$filename ; \ + ./parsenodep10 $$filename ; \ + ./parsenodep12 $$filename ; \ + ./parsenodep14 $$filename ; \ + ./parsenodep16 $$filename ; \ + set +x; \ + done + +parsenocheesy: main.cpp common_defs.h linux-perf-events.h + $(CXX) $(CXXFLAGS) -o parsenocheesy main.cpp -DSUPPRESS_CHEESY_FLATTEN + +parsenodep2: main.cpp common_defs.h linux-perf-events.h + $(CXX) $(CXXFLAGS) -o parsenodep2 main.cpp -DNO_PDEP_PLEASE -DNO_PDEP_WIDTH=2 + +parsenodep4: main.cpp common_defs.h linux-perf-events.h + $(CXX) $(CXXFLAGS) -o parsenodep4 main.cpp -DNO_PDEP_PLEASE -DNO_PDEP_WIDTH=4 + +parsenodep6: main.cpp common_defs.h linux-perf-events.h + $(CXX) $(CXXFLAGS) -o parsenodep6 main.cpp -DNO_PDEP_PLEASE -DNO_PDEP_WIDTH=6 + +parsenodep8: main.cpp common_defs.h linux-perf-events.h + $(CXX) $(CXXFLAGS) -o parsenodep8 main.cpp -DNO_PDEP_PLEASE -DNO_PDEP_WIDTH=8 + +parsenodep10: main.cpp common_defs.h linux-perf-events.h + $(CXX) $(CXXFLAGS) -o parsenodep10 main.cpp -DNO_PDEP_PLEASE -DNO_PDEP_WIDTH=10 + +parsenodep12: main.cpp common_defs.h linux-perf-events.h + $(CXX) $(CXXFLAGS) -o parsenodep12 main.cpp -DNO_PDEP_PLEASE -DNO_PDEP_WIDTH=12 + +parsenodep14: main.cpp common_defs.h linux-perf-events.h + $(CXX) $(CXXFLAGS) -o parsenodep14 main.cpp -DNO_PDEP_PLEASE -DNO_PDEP_WIDTH=14 + +parsenodep16: main.cpp common_defs.h linux-perf-events.h + $(CXX) $(CXXFLAGS) -o parsenodep16 main.cpp -DNO_PDEP_PLEASE -DNO_PDEP_WIDTH=16 clean: rm -f $(EXECUTABLES) diff --git a/main.cpp b/main.cpp index 86ecc8f6a..a1f9417b5 100644 --- a/main.cpp +++ b/main.cpp @@ -296,6 +296,20 @@ never_inline bool flatten_indexes(size_t len, ParsedJson & pj) { while (s) { base_ptr[base++] = (u32)idx + __builtin_ctzll(s); s &= s - 1ULL; } +#elif defined(NO_PDEP_PLEASE) +#ifndef NO_PDEP_WIDTH +#define NO_PDEP_WIDTH 6 +#endif + u32 cnt = __builtin_popcountll(s); + u32 next_base = base + cnt; + while (s) { + for(size_t i = 0; i < NO_PDEP_WIDTH; i++) { + base_ptr[base+i] = (u32)idx + __builtin_ctzll(s); + s = s & (s - 1); + } + base += NO_PDEP_WIDTH; + } + base = next_base; #else u32 cnt = __builtin_popcountll(s); u32 next_base = base + cnt;