diff --git a/bench/Makefile b/bench/Makefile index bc671f05..d14ef61b 100644 --- a/bench/Makefile +++ b/bench/Makefile @@ -201,6 +201,15 @@ bench-liblfds0: $(CC) $(CFLAGS) $(CPPFLAGS) -I "$${LIBLFDS}/inc" bench-liblfds.c -o bench-liblfds.exe $${LIBLFDS}/bin/liblfds711.so -lpthread @LD_LIBRARY_PATH="$${LIBLFDS}/bin:$${LD_LIBRARY_PATH}" ./bench-liblfds.exe 60 +# CONCURRENTQUEUE shall point to the directory where the bin/build/inc/obj/src directories are +# The library shall be built. +bench-concurrentqueue: + if test -n "$${CONCURRENTQUEUE}" ; then $(MAKE) bench-concurrentqueue0 ; else echo "Nothing to be done." ; fi + +bench-concurrentqueue0: + $(CXX) $(CFLAGS) $(CPPFLAGS) -I "$${CONCURRENTQUEUE}/" bench-concurrentqueue.cpp -o bench-concurrentqueue.exe -lpthread + @./bench-concurrentqueue.exe 60 + ############################################################################ bench-plain: diff --git a/bench/bench-concurrentqueue.cpp b/bench/bench-concurrentqueue.cpp new file mode 100644 index 00000000..04c25a74 --- /dev/null +++ b/bench/bench-concurrentqueue.cpp @@ -0,0 +1,98 @@ +#define NDEBUG + +#include +#include +#include + +#include "concurrentqueue.h" + +#include "m-mutex.h" +#define MULTI_THREAD_MEASURE +#include "common.h" + + +/********************************************************************************************/ +moodycamel::ConcurrentQueue g_buff; +moodycamel::ConcurrentQueue g_final; + +static void final(void *arg) +{ + size_t *p_n = (size_t*) arg; + size_t n = *p_n; + unsigned long long j, s = 0; + for(unsigned int i = 0; i < n;i++) { + while (!g_final.try_dequeue(j)); + s += j; + } + g_result = s; +} + +static void conso(void *arg) +{ + unsigned int j; + size_t *p_n = (size_t*)arg; + size_t n = *p_n; + unsigned long long s = 0; + for(unsigned int i = 0; i < n;i++) { + while (!g_buff.try_dequeue(j)); + s += j; + } + while (!g_final.try_enqueue(s)); +} + +static void prod(void *arg) +{ + size_t *p_n = (size_t*)arg; + size_t n = *p_n; + size_t r = n; + for(unsigned int i = 0; i < n;i++) { + while (!g_buff.try_enqueue(r)); + r = r * 31421U + 6927U; + } +} + +static void test_buffer(size_t n) +{ + const int cpu_count = get_cpu_count(); + const int prod_count = cpu_count/2; + const int conso_count = cpu_count - prod_count; + if (cpu_count < 2) { + fprintf(stderr, "WARNING: Can not measure Buffer performance.\n"); + return; + } + rand_get(); + // Create thread + m_thread_t idx_p[prod_count]; + m_thread_t idx_c[conso_count]; + m_thread_t idx_final; + for(int i = 0; i < prod_count; i++) { + m_thread_create (idx_p[i], prod, &n); + } + for(int i = 0; i < conso_count; i++) { + m_thread_create (idx_c[i], conso, &n); + } + size_t n2 = conso_count; + m_thread_create(idx_final, final, &n2); + + // Wait for jobs to be done. + for(int i = 0; i < prod_count; i++) { + m_thread_join(idx_p[i]); + } + for(int i = 0; i < conso_count; i++) { + m_thread_join(idx_c[i]); + } + m_thread_join(idx_final); + +} + + +/********************************************************************************************/ + +int main(int argc, const char *argv[]) +{ + int n = (argc > 1) ? atoi(argv[1]) : 0; + if (n == 60) + test_function("Buffer time", 1000000, test_buffer); + exit(0); +} + diff --git a/bench/bench-liblfds.c b/bench/bench-liblfds.c index d0297da4..5b8ccf0b 100644 --- a/bench/bench-liblfds.c +++ b/bench/bench-liblfds.c @@ -80,6 +80,7 @@ static void test_buffer(size_t n) fprintf(stderr, "WARNING: Can not measure Buffer performance.\n"); return; } + rand_get(); // Init const size_t size = m_core_roundpow2(64*cpu_count); struct lfds711_queue_bmm_element g_buff_elements[size]; @@ -122,22 +123,6 @@ static void test_buffer(size_t n) int main(int argc, const char *argv[]) { int n = (argc > 1) ? atoi(argv[1]) : 0; - /* if (n == 10) - test_function("List time",10000000, test_list); - if (n == 20) - test_function("Array time", 100000000, test_array); - if (n == 30) - test_function("Rbtree time", 1000000, test_rbtree); - if (n == 40) - test_function("Dict time", 1000000, test_dict); - if (n == 42) - test_function("DictOA time", 1000000, test_dict_oa); - if (n == 41) - test_function("DictB time", 1000000, test_dict_big); - if (n == 43) - test_function("DictS time", 1000000, test_dict_str); - if (n == 50) - test_function("Sort time", 10000000, test_sort);*/ if (n == 60) test_function("Buffer time", 1000000, test_buffer); exit(0);