Fix in communication techniques bench
* Producers now wait consumer when needed
This commit is contained in:
parent
7e939d50da
commit
91c3ce6ca4
|
@ -6,6 +6,9 @@
|
||||||
#define CACHE_LINE_SIZE 128
|
#define CACHE_LINE_SIZE 128
|
||||||
#define BUF_SIZE CACHE_LINE_SIZE
|
#define BUF_SIZE CACHE_LINE_SIZE
|
||||||
|
|
||||||
|
#define likely(x) __builtin_expect(!!(x), 1)
|
||||||
|
#define unlikely(x) __builtin_expect(!!(x), 0)
|
||||||
|
|
||||||
extern volatile int cont;
|
extern volatile int cont;
|
||||||
|
|
||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
|
|
|
@ -24,9 +24,17 @@ __BEGIN_DECLS
|
||||||
|
|
||||||
extern __thread uintptr_t *shared_space;
|
extern __thread uintptr_t *shared_space;
|
||||||
extern __thread int prod_idx;
|
extern __thread int prod_idx;
|
||||||
|
extern __thread int cons_idx;
|
||||||
|
|
||||||
struct communication_assoc *create_comm_assoc(void);
|
struct communication_assoc *create_comm_assoc(void);
|
||||||
static inline void send(uintptr_t value) {
|
static inline void send(uintptr_t value) {
|
||||||
|
static __thread int local_cons_idx = 0;
|
||||||
|
|
||||||
|
if (likely(((prod_idx + 1) % SHARED_SPACE_SIZE) == local_cons_idx))
|
||||||
|
{
|
||||||
|
while (((prod_idx + 1) % SHARED_SPACE_SIZE) == cons_idx);
|
||||||
|
local_cons_idx = cons_idx;
|
||||||
|
}
|
||||||
shared_space[prod_idx] = value;
|
shared_space[prod_idx] = value;
|
||||||
prod_idx = (prod_idx + 1) % SHARED_SPACE_SIZE;
|
prod_idx = (prod_idx + 1) % SHARED_SPACE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue