summaryrefslogtreecommitdiffstats
path: root/src/vppinfra/test_cuckoo_bihash.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vppinfra/test_cuckoo_bihash.c')
-rw-r--r--src/vppinfra/test_cuckoo_bihash.c451
1 files changed, 0 insertions, 451 deletions
diff --git a/src/vppinfra/test_cuckoo_bihash.c b/src/vppinfra/test_cuckoo_bihash.c
deleted file mode 100644
index e992e26fa7d..00000000000
--- a/src/vppinfra/test_cuckoo_bihash.c
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * Copyright (c) 2017 Cisco and/or its affiliates.
- * 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.
- */
-
-__thread int thread_id = 0;
-
-#include <vppinfra/time.h>
-#include <vppinfra/cache.h>
-#include <vppinfra/error.h>
-#include <vppinfra/heap.h>
-#include <vppinfra/format.h>
-#include <vppinfra/pool.h>
-#include <vppinfra/error.h>
-#include <vppinfra/hash.h>
-#include <vppinfra/cache.h>
-
-#define os_get_cpu_number() (thread_id)
-
-#include <vppinfra/cuckoo_8_8.h>
-#include <vppinfra/cuckoo_template.h>
-#include <vppinfra/cuckoo_template.c>
-
-#include <vppinfra/bihash_8_8.h>
-#include <vppinfra/bihash_template.h>
-#include <vppinfra/bihash_template.c>
-
-#include <pthread.h>
-
-#define MAX_THREADS 255
-
-typedef struct
-{
- void *tm;
- int thread_idx;
- u64 nlookups;
-} thread_data_t;
-
-typedef struct
-{
- u64 deadline;
- u64 seed;
- u32 nbuckets;
- u32 nitems;
- u32 runtime;
- int verbose;
- int non_random_keys;
- int nthreads;
- int search_iter;
- uword *key_hash;
- u64 *keys;
- CVT (clib_cuckoo) ch;
- BVT (clib_bihash) bh;
- clib_time_t clib_time;
- u64 *key_add_del_sequence;
- u8 *key_op_sequence;
- u64 *key_search_sequence[MAX_THREADS];
- unformat_input_t *input;
- u64 nadds;
- u64 ndels;
- pthread_t bwriter_thread;
- pthread_t breader_threads[MAX_THREADS];
- pthread_t cwriter_thread;
- pthread_t creader_threads[MAX_THREADS];
- thread_data_t wthread_data;
- thread_data_t rthread_data[MAX_THREADS];
-} test_main_t;
-
-test_main_t test_main;
-
-uword
-vl (void *v)
-{
- return vec_len (v);
-}
-
-#define w_thread(x, guts) \
- void *x##writer_thread (void *v) \
- { \
- test_main_t *tm = v; \
- uword counter = 0; \
- u64 nadds = 0; \
- u64 ndels = 0; \
- u64 deadline = tm->deadline; \
- do \
- { \
- for (counter = 0; counter < vec_len (tm->key_add_del_sequence); \
- ++counter) \
- { \
- u64 idx = tm->key_add_del_sequence[counter]; \
- u8 op = tm->key_op_sequence[counter]; \
- if (op) \
- { \
- ++nadds; \
- } \
- else \
- { \
- ++ndels; \
- } \
- guts; \
- if (clib_cpu_time_now () > deadline) \
- { \
- break; \
- } \
- } \
- } \
- while (clib_cpu_time_now () < deadline); \
- tm->nadds = nadds; \
- tm->ndels = ndels; \
- return NULL; \
- }
-
-/* *INDENT-OFF* */
-w_thread (b, {
- BVT (clib_bihash_kv) kv;
- kv.key = tm->keys[idx];
- kv.value = *hash_get (tm->key_hash, kv.key);
- BV (clib_bihash_add_del) (&tm->bh, &kv, op);
-});
-/* *INDENT-ON* */
-
-/* *INDENT-OFF* */
-w_thread (c, {
- CVT (clib_cuckoo_kv) kv;
- kv.key = tm->keys[idx];
- kv.value = *hash_get (tm->key_hash, kv.key);
- CV (clib_cuckoo_add_del) (&tm->ch, &kv, op, 0);
-});
-/* *INDENT-ON* */
-
-#define r_thread(x, guts) \
- void *x##reader_thread (void *v) \
- { \
- thread_data_t *data = v; \
- thread_id = data->thread_idx; \
- test_main_t *tm = data->tm; \
- uword thread_idx = data->thread_idx; \
- u64 *idx; \
- uword nlookups = 0; \
- u64 deadline = tm->deadline; \
- do \
- { \
- vec_foreach (idx, tm->key_search_sequence[thread_idx]) \
- { \
- guts; \
- ++nlookups; \
- if (clib_cpu_time_now () > deadline) \
- { \
- break; \
- } \
- } \
- } \
- while (clib_cpu_time_now () < deadline); \
- data->nlookups = nlookups; \
- return NULL; \
- }
-
-/* *INDENT-OFF* */
-r_thread (c, {
- CVT (clib_cuckoo_kv) kv;
- kv.key = tm->keys[*idx];
- kv.value = *hash_get (tm->key_hash, kv.key);
- CV (clib_cuckoo_search) (&tm->ch, &kv, &kv);
-});
-/* *INDENT-ON* */
-
-/* *INDENT-OFF* */
-r_thread (b, {
- BVT (clib_bihash_kv) kv;
- kv.key = tm->keys[*idx];
- kv.value = *hash_get (tm->key_hash, kv.key);
- BV (clib_bihash_search) (&tm->bh, &kv, &kv);
-});
-/* *INDENT-ON* */
-
-#define run_threads(x) \
- do \
- { \
- \
- before = clib_time_now (&tm->clib_time); \
- tm->deadline = clib_cpu_time_now () + \
- tm->runtime * tm->clib_time.clocks_per_second; \
- fformat (stdout, #x "-> Start threads..., runtime is %llu second(s)\n", \
- (long long unsigned)tm->runtime); \
- \
- /* \
- fformat (stdout, #x "-> Writer thread only...\n"); \
- if (0 != \
- pthread_create (&tm->x##writer_thread, NULL, x##writer_thread, tm)) \
- { \
- perror ("pthread_create()"); \
- abort (); \
- } \
- \
- if (0 != pthread_join (tm->x##writer_thread, NULL)) \
- { \
- perror ("pthread_join()"); \
- abort (); \
- } \
- \
- delta = clib_time_now (&tm->clib_time) - before; \
- fformat (stdout, #x "-> %wu adds, %wu dels in %.6f seconds\n", \
- tm->nadds, tm->ndels, delta); \
- tm->nadds = 0; \
- tm->ndels = 0; \
- */ \
- \
- fformat (stdout, #x "-> Writer + %d readers\n", tm->nthreads); \
- before = clib_time_now (&tm->clib_time); \
- tm->deadline = clib_cpu_time_now () + \
- tm->runtime * tm->clib_time.clocks_per_second; \
- if (0 != \
- pthread_create (&tm->x##writer_thread, NULL, x##writer_thread, tm)) \
- { \
- perror ("pthread_create()"); \
- abort (); \
- } \
- \
- for (i = 0; i < tm->nthreads; i++) \
- { \
- tm->rthread_data[i].nlookups = 0; \
- if (0 != pthread_create (&tm->x##reader_threads[i], NULL, \
- x##reader_thread, &tm->rthread_data[i])) \
- { \
- perror ("pthread_create()"); \
- abort (); \
- } \
- } \
- \
- if (0 != pthread_join (tm->x##writer_thread, NULL)) \
- { \
- perror ("pthread_join()"); \
- abort (); \
- } \
- \
- for (i = 0; i < tm->nthreads; i++) \
- { \
- if (0 != pthread_join (tm->x##reader_threads[i], NULL)) \
- { \
- perror ("pthread_join()"); \
- abort (); \
- } \
- } \
- \
- delta = clib_time_now (&tm->clib_time) - before; \
- \
- total_searches = 0; \
- for (i = 0; i < tm->nthreads; ++i) \
- { \
- u64 nlookups = tm->rthread_data[i].nlookups; \
- fformat (stdout, #x "-> Thread #%d: %u searches\n", i, nlookups); \
- total_searches += nlookups; \
- } \
- \
- if (delta > 0) \
- { \
- ops = (tm->nadds + tm->ndels) / (f64)delta; \
- fformat (stdout, #x "-> %.f add/dels per second\n", ops); \
- sps = ((f64)total_searches) / delta; \
- fformat (stdout, #x "-> %.f searches per second\n", sps); \
- } \
- \
- fformat (stdout, \
- #x "-> %wu adds, %wu dels, %lld searches in %.6f seconds\n", \
- tm->nadds, tm->ndels, total_searches, delta); \
- } \
- while (0);
-
-static void
-cb (CVT (clib_cuckoo) * h, void *ctx)
-{
- fformat (stdout, "Garbage callback called...\n");
-}
-
-static clib_error_t *
-test_cuckoo_bihash (test_main_t * tm)
-{
- int i;
- uword *p;
- uword total_searches;
- f64 before, delta;
- f64 ops = 0, sps = 0;
- f64 bops = 0, bsps = 0;
- f64 cops = 0, csps = 0;
- CVT (clib_cuckoo) * ch;
- BVT (clib_bihash) * bh;
-
- ch = &tm->ch;
- bh = &tm->bh;
-
- CV (clib_cuckoo_init) (ch, "test", 1, cb, NULL);
- BV (clib_bihash_init) (bh, (char *) "test", tm->nbuckets, 256 << 20);
-
- fformat (stdout, "Pick %lld unique %s keys...\n", tm->nitems,
- tm->non_random_keys ? "non-random" : "random");
-
- for (i = 0; i < tm->nitems; i++)
- {
- u64 rndkey;
-
- if (tm->non_random_keys == 0)
- {
-
- again:
- rndkey = random_u64 (&tm->seed);
-
- p = hash_get (tm->key_hash, rndkey);
- if (p)
- goto again;
- }
- else
- rndkey = (u64) (i + 1) << 16;
-
- hash_set (tm->key_hash, rndkey, i + 1);
- vec_add1 (tm->keys, rndkey);
-
- int j;
- for (j = 0; j < tm->nthreads; ++j)
- {
- u64 *x = tm->key_search_sequence[j];
- vec_add1 (x, random_u64 (&tm->seed) % tm->nitems);
- tm->key_search_sequence[j] = x;
- }
- vec_add1 (tm->key_add_del_sequence,
- random_u64 (&tm->seed) % tm->nitems);
- vec_add1 (tm->key_op_sequence, (rndkey % 10 < 8) ? 1 : 0);
- }
-
- int thread_counter = 0;
- tm->wthread_data.tm = tm;
- tm->wthread_data.thread_idx = thread_counter;
- for (i = 0; i < tm->nthreads; ++i)
- {
- tm->rthread_data[i].tm = tm;
- tm->rthread_data[i].thread_idx = thread_counter;
- tm->rthread_data[i].nlookups = 0;
- ++thread_counter;
- }
-
- int iter;
- for (iter = 0; iter < tm->search_iter; ++iter)
- {
- fformat (stdout, "Bihash test #%d\n", iter);
- run_threads (b);
- bops = ops;
- bsps = sps;
- fformat (stdout, "%U", BV (format_bihash), bh, 0);
- fformat (stdout, "Cuckoo test #%d\n", iter);
- run_threads (c);
- cops = ops;
- csps = sps;
- fformat (stdout, "%U", CV (format_cuckoo), ch, 0);
- fformat (stdout,
- "Bihash add/del speed is %.2f%% of cuckoo add/del speed\n",
- bops / cops * 100);
- fformat (stdout,
- "Bihash search speed is %.2f%% of cuckoo search speed\n",
- bsps / csps * 100);
- }
- return 0;
-}
-
-clib_error_t *
-test_cuckoo_bihash_main (test_main_t * tm)
-{
- unformat_input_t *i = tm->input;
- clib_error_t *error;
-
- while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (i, "seed %u", &tm->seed))
- ;
- else if (unformat (i, "nbuckets %d", &tm->nbuckets))
- ;
- else if (unformat (i, "non-random-keys"))
- tm->non_random_keys = 1;
- else if (unformat (i, "nitems %d", &tm->nitems))
- ;
- else if (unformat (i, "search_iter %d", &tm->search_iter))
- ;
- else if (unformat (i, "verbose %d", &tm->verbose))
- ;
- else if (unformat (i, "runtime %d", &tm->runtime))
- ;
- else if (unformat (i, "nthreads %d", &tm->nthreads))
- ;
- else if (unformat (i, "verbose"))
- tm->verbose = 1;
- else
- return clib_error_return (0, "unknown input '%U'",
- format_unformat_error, i);
- }
-
- error = test_cuckoo_bihash (tm);
-
- return error;
-}
-
-#ifdef CLIB_UNIX
-int
-main (int argc, char *argv[])
-{
- unformat_input_t i;
- clib_error_t *error;
- test_main_t *tm = &test_main;
- clib_memset (&test_main, 0, sizeof (test_main));
-
- clib_mem_init (0, 3ULL << 30);
-
- tm->input = &i;
- tm->seed = 0xdeaddabe;
-
- tm->nbuckets = 2;
- tm->nitems = 5;
- tm->verbose = 1;
- tm->nthreads = 1;
- clib_time_init (&tm->clib_time);
- tm->runtime = 1;
- tm->search_iter = 1;
- tm->key_hash = hash_create (0, sizeof (uword));
-
- unformat_init_command_line (&i, argv);
- error = test_cuckoo_bihash_main (tm);
- unformat_free (&i);
-
- if (error)
- {
- clib_error_report (error);
- return 1;
- }
- return 0;
-}
-#endif /* CLIB_UNIX */
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */