Add MRSW snapshots.

This commit is contained in:
Patrick Pelissier committed 2018-02-17 19:19:51 +01:00
1 parent 29d181c113
commit be198a7040
2 files changed
+96 -6

No files matched your search

+92 -3
View File
@@ -32,12 +32,19 @@
// For compatibility with previous version
#define SNAPSHOT_DEF SNAPSHOT_SRSW_DEF
/* Define a snapshot and it function
/* Define a SRSW snapshot and it function
USAGE: SNAPSHOT_SRSW_DEF(name, type[, oplist]) */
#define SNAPSHOT_SRSW_DEF(name, ...) \
SNAPSHOTI_SRSW_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \
((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \
(name, __VA_ARGS__ )))
((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \
(name, __VA_ARGS__ )))
/* Define a MRSW snapshot and it function
USAGE: SNAPSHOT_MRSW_DEF(name, type[, oplist]) */
#define SNAPSHOT_MRSW_DEF(name, ...) \
SNAPSHOTI_MRSW_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \
((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \
(name, __VA_ARGS__ )))
/* Define the oplist of a snapshot.
USAGE: SNAPSHOT_OPLIST(name[, oplist]) */
@@ -400,5 +407,87 @@ static inline void snapshot_mrsw_int_read_end(snapshot_mrsw_int_t s, unsigned in
SNAPSHOTI_MRSW_INT_CONTRACT(s);
}
#define SNAPSHOTI_MRSW_CONTRACT(snap) do { \
assert (snap != NULL); \
assert (snap->data != NULL); \
} while (0)
// Defered evaluation (TBC if it really helps).
#define SNAPSHOTI_MRSW_DEF(arg) SNAPSHOTI_MRSW_DEF2 arg
#define SNAPSHOTI_MRSW_DEF2(name, type, oplist) \
\
/* Create an aligned type to avoid false sharing between threads */ \
typedef struct M_C(name, _aligned_type_s) { \
type x; \
char align[M_ALIGN_FOR_CACHELINE_EXCLUSION > sizeof(type) ? M_ALIGN_FOR_CACHELINE_EXCLUSION - sizeof(type) : 1]; \
} M_C(name, _aligned_type_t); \
\
typedef struct M_C(name, _s) { \
M_C(name, _aligned_type_t) *data; \
snapshot_mrsw_int_t core; \
} M_C(name, _t)[1]; \
\
typedef type M_C(name, _type_t); \
\
static inline void M_C(name, _init)(M_C(name, _t) snap, size_t nReader) \
{ \
assert (snap != NULL); \
assert (nReader > 0 && nReader <= SNAPSHOTI_MRSW_MAX_READER); \
snap->data = M_GET_REALLOC oplist (M_C(name, _aligned_type_t), \
NULL, \
nReader+SNAPSHOTI_MRSW_EXTRA_BUFFER); \
for(size_t i = 0; i < nReader + SNAPSHOTI_MRSW_EXTRA_BUFFER; i++) { \
M_GET_INIT oplist(snap->data[i].x); \
} \
snapshot_mrsw_int_init(snap->core, nReader); \
SNAPSHOTI_MRSW_CONTRACT(snap); \
} \
\
static inline void M_C(name, _clear)(M_C(name, _t) snap) \
{ \
SNAPSHOTI_MRSW_CONTRACT(snap); \
for(int i = 0; i < SNAPSHOTI_SRSW_MAX_BUFFER; i++) { \
M_GET_CLEAR oplist(snap->data[i].x); \
} \
snapshot_mrsw_int_clear(snap->core); \
} \
\
static inline type *M_C(name, _write)(M_C(name, _t) snap) \
{ \
SNAPSHOTI_MRSW_CONTRACT(snap); \
const unsigned int idx = snapshot_mrsw_int_write(snap->core); \
return &snap->data[idx].x; \
} \
\
static inline const type *M_C(name, _read_start)(M_C(name, _t) snap) \
{ \
SNAPSHOTI_MRSW_CONTRACT(snap); \
const unsigned int idx = snapshot_mrsw_int_read_start(snap->core); \
return M_CONST_CAST(type, &snap->data[idx].x); \
} \
\
static inline void M_C(name, _read_end)(M_C(name, _t) snap, const type *old) \
{ \
SNAPSHOTI_MRSW_CONTRACT(snap); \
assert (old != NULL); \
const M_C(name, _aligned_type_t) *oldx; \
oldx = M_CTYPE_FROM_FIELD(M_C(name, _aligned_type_t), old, \
type, x); \
assert (oldx >= snap->data); \
assert (oldx < snap->data + snap->core->n+SNAPSHOTI_MRSW_EXTRA_BUFFER); \
const unsigned int idx = oldx - snap->data; \
snapshot_mrsw_int_read_end(snap->core, idx); \
} \
\
static inline type *M_C(name, _get_write_buffer)(M_C(name, _t) snap) \
{ \
SNAPSHOTI_MRSW_CONTRACT(snap); \
unsigned int idx = snapshot_mrsw_int_get_write_idx(snap->core); \
return &snap->data[idx].x; \
} \
\
//TODO: _set_, _init_set
#endif
+4 -3
View File
@@ -27,9 +27,10 @@
#include "coverage.h"
START_COVERAGE
SNAPSHOT_DEF(snapshot_uint, unsigned int)
SNAPSHOT_DEF(snapshot_mpz, mpz_t,
(INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), CLEAR(mpz_clear)))
SNAPSHOT_SRSW_DEF(snapshot_uint, unsigned int)
SNAPSHOT_SRSW_DEF(snapshot_mpz, mpz_t,
(INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), CLEAR(mpz_clear)))
SNAPSHOT_MRSW_DEF(snapshot_mrsw_double, double)
END_COVERAGE
static void test_uint(void)