Skip to content

Commit 329dba8

Browse files
committedJul 26, 2012
Add dumb C11 (seq_cst) version of cdeque
1 parent d6b1681 commit 329dba8

File tree

4 files changed

+64
-41
lines changed

4 files changed

+64
-41
lines changed
 

‎libworkstream_df/Makefile

+7-3
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ WSTREAM_LDFLAGS= $(LDFLAGS) -lpthread
55
# WSTREAM_CFLAGS+= -I$(PAPI_DIR)/include
66
# WSTREAM_LDFLAGS+= -L$(PAPI_DIR)/lib -lpapi
77

8-
TEST_PROGS= test-cdeque test-cdeque-c11
8+
TEST_PROGS= test-cdeque test-cdeque-c11 test-cdeque-dumbc11
99
TEST_PROGS+= test-cdeque-nollscopt test-cdeque-nolwcas test-cdeque-nofences
10-
TEST_PROGS+= test-cdeque-cas test-cdeque-cas-nollscopt
11-
TEST_PROGS+= test-cdeque-cas-nolwcas test-cdeque-cas-nofences
10+
TEST_PROGS+= test-cdeque-cas test-cdeque-cas-c11 test-cdeque-cas-dumbc11
11+
TEST_PROGS+= test-cdeque-cas-nollscopt test-cdeque-cas-nolwcas test-cdeque-cas-nofences
1212
TEST_LDFLAGS= -lm -lrt
1313

1414
all: libwstream_df.so
@@ -21,6 +21,8 @@ test-cdeque: test-cdeque.c wstream_df.h cdeque.h cbuffer.h papi-defs.h
2121
$(CC) $(WSTREAM_CFLAGS) $< -o $@ $(WSTREAM_LDFLAGS) $(TEST_LDFLAGS)
2222
test-cdeque-c11: test-cdeque.c wstream_df.h cdeque.h cbuffer.h papi-defs.h
2323
$(CC) $(WSTREAM_CFLAGS) -DUSE_STDATOMIC=1 $< -o $@ $(WSTREAM_LDFLAGS) $(TEST_LDFLAGS)
24+
test-cdeque-dumbc11: test-cdeque.c wstream_df.h cdeque.h cbuffer.h papi-defs.h
25+
$(CC) $(WSTREAM_CFLAGS) -DUSE_STDATOMIC=1 -DUSE_SEQ_CST_STDATOMIC=1 $< -o $@ $(WSTREAM_LDFLAGS) $(TEST_LDFLAGS)
2426
test-cdeque-nollscopt: test-cdeque.c wstream_df.h cdeque.h cbuffer.h papi-defs.h
2527
$(CC) $(WSTREAM_CFLAGS) -DNO_LLSC_OPTIMIZATION=1 $< -o $@ $(WSTREAM_LDFLAGS) $(TEST_LDFLAGS)
2628
test-cdeque-nolwcas: test-cdeque.c wstream_df.h cdeque.h cbuffer.h papi-defs.h
@@ -32,6 +34,8 @@ test-cdeque-cas: test-cdeque-cas.c wstream_df.h cdeque.h cbuffer.h papi-defs.h
3234
$(CC) $(WSTREAM_CFLAGS) $< -o $@ $(WSTREAM_LDFLAGS) $(TEST_LDFLAGS)
3335
test-cdeque-cas-c11: test-cdeque-cas.c wstream_df.h cdeque.h cbuffer.h papi-defs.h
3436
$(CC) $(WSTREAM_CFLAGS) -DUSE_STDATOMIC=1 $< -o $@ $(WSTREAM_LDFLAGS) $(TEST_LDFLAGS)
37+
test-cdeque-cas-dumbc11: test-cdeque-cas.c wstream_df.h cdeque.h cbuffer.h papi-defs.h
38+
$(CC) $(WSTREAM_CFLAGS) -DUSE_STDATOMIC=1 -DUSE_SEQ_CST_STDATOMIC=1 $< -o $@ $(WSTREAM_LDFLAGS) $(TEST_LDFLAGS)
3539
test-cdeque-cas-nollscopt: test-cdeque-cas.c wstream_df.h cdeque.h cbuffer.h papi-defs.h
3640
$(CC) $(WSTREAM_CFLAGS) -DNO_LLSC_OPTIMIZATION=1 -DNO_LIGHTWEIGHT_CAS=1 $< -o $@ $(WSTREAM_LDFLAGS) $(TEST_LDFLAGS)
3741
test-cdeque-cas-nolwcas: test-cdeque-cas.c wstream_df.h cdeque.h cbuffer.h papi-defs.h

‎libworkstream_df/atomic-defs-c11.h

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#ifndef ATOMIC_C11_DEFS
2+
#define ATOMIC_C11_DEFS
3+
4+
#if !USE_SEQ_CST_STDATOMIC
5+
#define relaxed memory_order_relaxed
6+
#define acquire memory_order_acquire
7+
#define release memory_order_release
8+
#define consume memory_order_consume
9+
#define rel_acq memory_order_rel_acq
10+
#define seq_cst memory_order_seq_cst
11+
#define thread_fence(memord) atomic_thread_fence (memord);
12+
#else
13+
#define relaxed memory_order_seq_cst
14+
#define acquire memory_order_seq_cst
15+
#define release memory_order_seq_cst
16+
#define consume memory_order_seq_cst
17+
#define rel_acq memory_order_seq_cst
18+
#define seq_cst memory_order_seq_cst
19+
#define thread_fence(memord)
20+
#endif
21+
22+
#endif

‎libworkstream_df/cbuffer-c11.h

+7-6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#include <stdio.h>
77
#include <stdlib.h>
88

9+
#include "atomic-defs-c11.h"
10+
911
/* #define _DEBUG_THIS_ */
1012

1113
#ifdef _DEBUG_THIS_
@@ -45,8 +47,7 @@ cbuffer_alloc (size_t log_size)
4547
cbuffer->log_size = log_size;
4648
cbuffer->size = (1 << log_size);
4749
cbuffer->modulo_mask = cbuffer->size - 1;
48-
if (posix_memalign (&p, 64,
49-
sizeof *cbuffer->array * cbuffer->size))
50+
if (posix_memalign (&p, 64, sizeof *cbuffer->array * cbuffer->size))
5051
wstream_df_fatal ("Out of memory ...");
5152
cbuffer->array = p;
5253

@@ -84,7 +85,7 @@ cbuffer_copy_relaxed (wstream_df_atomic_type *p,
8485
{
8586
size_t i;
8687
for (i = 0; i < n; ++i)
87-
atomic_store_explicit (p + i, q + i, memory_order_relaxed);
88+
atomic_store_explicit (p + i, q + i, relaxed);
8889
}
8990

9091
static inline cbuffer_p
@@ -124,8 +125,8 @@ cbuffer_grow (cbuffer_p old_cbuffer, size_t bottom, size_t top,
124125
old_bot_pos);
125126
}
126127

127-
atomic_store_explicit (pnew, new_cbuffer, memory_order_release);
128-
atomic_thread_fence (memory_order_release);
128+
atomic_store_explicit (pnew, new_cbuffer, release);
129+
thread_fence (release);
129130

130131
/* XXX(nhatle): Race condition with steal() on freed buffer? */
131132
cbuffer_free (old_cbuffer);
@@ -138,7 +139,7 @@ print_cbuffer (cbuffer_p cbuffer)
138139
{
139140
size_t i;
140141
for (i = 0; i < cbuffer->size; i++)
141-
printf ("%p,", cbuffer_get (cbuffer, i, memory_order_relaxed));
142+
printf ("%p,", cbuffer_get (cbuffer, i, relaxed));
142143
printf ("\n");
143144
}
144145

‎libworkstream_df/cdeque-c11.h

+28-32
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <stdlib.h>
1515
#include <stdio.h>
1616

17+
#include "atomic-defs-c11.h"
1718
#include "wstream_df.h"
1819
#include "cbuffer-c11.h"
1920

@@ -49,7 +50,7 @@ cdeque_alloc (size_t log_size)
4950
static inline void
5051
cdeque_free (cdeque_p cdeque)
5152
{
52-
cbuffer_free (atomic_load_explicit (&cdeque->cbuffer, memory_order_relaxed));
53+
cbuffer_free (atomic_load_explicit (&cdeque->cbuffer, relaxed));
5354
free (cdeque);
5455
}
5556

@@ -60,19 +61,18 @@ cdeque_push_bottom (cdeque_p cdeque, wstream_df_type elem)
6061
{
6162
_PAPI_P0B;
6263

63-
size_t bottom = atomic_load_explicit (&cdeque->bottom, memory_order_relaxed);
64-
size_t top = atomic_load_explicit (&cdeque->top, memory_order_acquire);
64+
size_t bottom = atomic_load_explicit (&cdeque->bottom, relaxed);
65+
size_t top = atomic_load_explicit (&cdeque->top, acquire);
6566

66-
cbuffer_p buffer = atomic_load_explicit (&cdeque->cbuffer,
67-
memory_order_relaxed);
67+
cbuffer_p buffer = atomic_load_explicit (&cdeque->cbuffer, relaxed);
6868

6969
XLOG ("cdeque_push_bottom with elem: %d\n", elem);
7070
if (bottom >= top + buffer->size)
7171
buffer = cbuffer_grow (buffer, bottom, top, &cdeque->cbuffer);
7272

73-
cbuffer_set (buffer, bottom, elem, memory_order_relaxed);
74-
atomic_thread_fence (memory_order_release);
75-
atomic_store_explicit (&cdeque->bottom, bottom + 1, memory_order_relaxed);
73+
cbuffer_set (buffer, bottom, elem, relaxed);
74+
thread_fence (release);
75+
atomic_store_explicit (&cdeque->bottom, bottom + 1, relaxed);
7676

7777
_PAPI_P0E;
7878
}
@@ -86,22 +86,22 @@ cdeque_take (cdeque_p cdeque)
8686
cbuffer_p buffer;
8787
wstream_df_type task;
8888

89-
bottom = atomic_load_explicit (&cdeque->bottom, memory_order_relaxed) - 1;
90-
buffer = atomic_load_explicit (&cdeque->cbuffer, memory_order_relaxed);
89+
bottom = atomic_load_explicit (&cdeque->bottom, relaxed) - 1;
90+
buffer = atomic_load_explicit (&cdeque->cbuffer, relaxed);
9191

92-
atomic_store_explicit (&cdeque->bottom, bottom, memory_order_relaxed);
93-
atomic_thread_fence (memory_order_seq_cst);
92+
atomic_store_explicit (&cdeque->bottom, bottom, relaxed);
93+
thread_fence (seq_cst);
9494

95-
top = atomic_load_explicit (&cdeque->top, memory_order_relaxed);
95+
top = atomic_load_explicit (&cdeque->top, relaxed);
9696

9797
if (bottom == (size_t) -1 || bottom < top)
9898
{
99-
atomic_store_explicit (&cdeque->bottom, bottom + 1, memory_order_relaxed);
99+
atomic_store_explicit (&cdeque->bottom, bottom + 1, relaxed);
100100
_PAPI_P1E;
101101
return NULL;
102102
}
103103

104-
task = cbuffer_get (buffer, bottom, memory_order_relaxed);
104+
task = cbuffer_get (buffer, bottom, relaxed);
105105

106106
if (bottom > top)
107107
{
@@ -111,10 +111,9 @@ cdeque_take (cdeque_p cdeque)
111111

112112
/* One compare and swap when the deque has one single element. */
113113
if (!atomic_compare_exchange_strong_explicit (&cdeque->top, &top, top + 1,
114-
memory_order_seq_cst,
115-
memory_order_relaxed))
114+
seq_cst, relaxed))
116115
task = NULL;
117-
atomic_store_explicit (&cdeque->bottom, bottom + 1, memory_order_relaxed);
116+
atomic_store_explicit (&cdeque->bottom, bottom + 1, relaxed);
118117

119118
_PAPI_P1E;
120119
return task;
@@ -129,9 +128,9 @@ cdeque_steal (cdeque_p remote_cdeque)
129128
wstream_df_type elem;
130129
cbuffer_p buffer;
131130

132-
top = atomic_load_explicit (&remote_cdeque->top, memory_order_acquire);
133-
atomic_thread_fence (memory_order_seq_cst);
134-
bottom = atomic_load_explicit (&remote_cdeque->bottom, memory_order_acquire);
131+
top = atomic_load_explicit (&remote_cdeque->top, acquire);
132+
thread_fence (seq_cst);
133+
bottom = atomic_load_explicit (&remote_cdeque->bottom, acquire);
135134

136135
XLOG ("cdeque_steal with bottom %d, top %d\n", bottom, top);
137136

@@ -141,13 +140,11 @@ cdeque_steal (cdeque_p remote_cdeque)
141140
return NULL;
142141
}
143142

144-
buffer = atomic_load_explicit (&remote_cdeque->cbuffer, memory_order_relaxed);
145-
elem = cbuffer_get (buffer, top, memory_order_relaxed);
143+
buffer = atomic_load_explicit (&remote_cdeque->cbuffer, relaxed);
144+
elem = cbuffer_get (buffer, top, relaxed);
146145

147-
if (!atomic_compare_exchange_strong_explicit (&remote_cdeque->top,
148-
&top, top + 1,
149-
memory_order_seq_cst,
150-
memory_order_relaxed))
146+
if (!atomic_compare_exchange_strong_explicit (&remote_cdeque->top, &top,
147+
top + 1, seq_cst, relaxed))
151148
elem = NULL;
152149

153150
_PAPI_P2E;
@@ -159,12 +156,11 @@ static inline void
159156
print_cdeque (cdeque_p cdeque)
160157
{
161158
size_t i;
162-
size_t bottom = atomic_load_explicit (&cdeque->bottom, memory_order_relaxed);
163-
size_t top = atomic_load_explicit (&cdeque->top, memory_order_acquire);
164-
cbuffer_p buffer = atomic_load_explicit (&cdeque->cbuffer,
165-
memory_order_relaxed);
159+
size_t bottom = atomic_load_explicit (&cdeque->bottom, relaxed);
160+
size_t top = atomic_load_explicit (&cdeque->top, acquire);
161+
cbuffer_p buffer = atomic_load_explicit (&cdeque->cbuffer, relaxed);
166162
for (i = top; i < bottom; i++)
167-
printf ("%p,", cbuffer_get (buffer, i, memory_order_relaxed));
163+
printf ("%p,", cbuffer_get (buffer, i, relaxed));
168164
printf ("\n");
169165
}
170166

0 commit comments

Comments
 (0)
Please sign in to comment.