From 8b94d135429a9f3253cc7f25a1453b412065c4a0 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Sun, 18 May 2025 08:48:13 +0200 Subject: Refactor solver dispatch and checkdata --- src/solvers/h48/gendata_h48.h | 86 ++++++++++++------------------------------- 1 file changed, 24 insertions(+), 62 deletions(-) (limited to 'src/solvers/h48/gendata_h48.h') diff --git a/src/solvers/h48/gendata_h48.h b/src/solvers/h48/gendata_h48.h index c1a9ced..644ddc2 100644 --- a/src/solvers/h48/gendata_h48.h +++ b/src/solvers/h48/gendata_h48.h @@ -1,3 +1,5 @@ +STATIC long long gendata_h48_dispatch( + const char *, unsigned long long, unsigned char *); STATIC uint64_t gendata_h48short(gendata_h48short_arg_t [static 1]); STATIC int64_t gendata_h48(gendata_h48_arg_t [static 1]); STATIC void gendata_h48h0k4(gendata_h48_arg_t [static 1]); @@ -12,9 +14,6 @@ STATIC_INLINE bool gendata_h48k2_dfs_stop( cube_t, int8_t, h48k2_dfs_arg_t [static 1]); STATIC void gendata_h48k2_dfs(h48k2_dfs_arg_t [static 1]); STATIC tableinfo_t makeinfo_h48k2(gendata_h48_arg_t [static 1]); -STATIC void *getdistribution_h48_runthread(void *); -STATIC void getdistribution_h48(const unsigned char *, - uint64_t [static INFO_DISTRIBUTION_LEN], uint8_t, uint8_t); STATIC const uint32_t *get_cocsepdata_constptr(const unsigned char *); STATIC const unsigned char *get_h48data_constptr(const unsigned char *); @@ -28,6 +27,27 @@ STATIC_INLINE void set_h48_pval_atomic( size_t gendata_h48_derive(uint8_t, const unsigned char *, unsigned char *); +STATIC long long +gendata_h48_dispatch( + const char *solver, + unsigned long long data_size, + unsigned char *data +) +{ + long long err; + gendata_h48_arg_t arg; + + err = parse_h48_hk(solver, &arg.h, &arg.k); + if (err != NISSY_OK) + return err; + + arg.buf_size = data_size; + arg.buf = data; + arg.maxdepth = 20; + + return gendata_h48(&arg); +} + STATIC uint64_t gendata_h48short(gendata_h48short_arg_t arg[static 1]) { @@ -649,64 +669,6 @@ makeinfo_h48k2(gendata_h48_arg_t arg[static 1]) return info; } -STATIC void * -getdistribution_h48_runthread(void *arg) -{ - getdistribution_h48_data_t *data = (getdistribution_h48_data_t *)arg; - const unsigned char *table; - uint8_t j, k, m; - int64_t i; - - memset(data->distr, 0, INFO_DISTRIBUTION_LEN * sizeof(uint64_t)); - - k = data->k; - table = data->table; - m = H48_MASK(0, k); - for (i = data->min; i < data->max; i++) - for (j = 0; j < H48_DIV(k); j++) - data->distr[(table[i] & (m << (j*k))) >> (j*k)]++; - - return NULL; -} - -STATIC void -getdistribution_h48( - const unsigned char *table, - uint64_t distr[static INFO_DISTRIBUTION_LEN], - uint8_t h, - uint8_t k -) { - getdistribution_h48_data_t targ[THREADS]; - pthread_t thread[THREADS]; - uint64_t local_distr[THREADS][INFO_DISTRIBUTION_LEN]; - int64_t i, j, nbytes, sz; - - nbytes = H48_COORDMAX(h) / H48_DIV(k); - sz = nbytes / THREADS; - for (i = 0; i < THREADS; i++) { - targ[i] = (getdistribution_h48_data_t) { - .min = i * sz, - .max = i == THREADS - 1 ? nbytes : (i+1) * sz, - .k = k, - .distr = local_distr[i], - .table = table, - }; - pthread_create(&thread[i], NULL, - getdistribution_h48_runthread, &targ[i]); - } - - for (i = 0; i < THREADS; i++) - pthread_join(thread[i], NULL); - - memset(distr, 0, INFO_DISTRIBUTION_LEN * sizeof(uint64_t)); - for (i = 0; i < THREADS; i++) - for (j = 0; j < INFO_DISTRIBUTION_LEN; j++) - distr[j] += local_distr[i][j]; - - for (i = nbytes * H48_DIV(k); i < H48_COORDMAX(h); i++) - distr[get_h48_pval(table, i, k)]++; -} - STATIC const uint32_t * get_cocsepdata_constptr(const unsigned char *data) { @@ -821,7 +783,7 @@ gendata_h48_derive(uint8_t h, const unsigned char *fulltable, unsigned char *buf h48derive, j, arg.k, MIN(val_full, val_derive)); } - getdistribution_h48(h48derive, arg.info.distribution, h, arg.k); + getdistribution(h48derive, arg.info.distribution, &arg.info); bufsize = arg.buf_size - COCSEP_FULLSIZE - INFOSIZE; if (writetableinfo(&arg.info, bufsize, (unsigned char *)arg.h48buf) -- cgit v1.3