schedbench

上级 25fa822b
...@@ -37,7 +37,7 @@ UPROGS= \ ...@@ -37,7 +37,7 @@ UPROGS= \
wqtest \ wqtest \
rm \ rm \
avar \ avar \
futexbench schedbench
ifeq ($(HAVE_LWIP),y) ifeq ($(HAVE_LWIP),y)
UPROGS += \ UPROGS += \
......
...@@ -4,47 +4,68 @@ ...@@ -4,47 +4,68 @@
#include "pthread.h" #include "pthread.h"
#include "futex.h" #include "futex.h"
#include "errno.h" #include "errno.h"
#include "atomic.hh"
static volatile std::atomic<u64> waiting;
static volatile u64 ftx; static volatile u64 ftx;
static int iters; static int iters;
static int nworkers;
static void* static
worker(void *arg) void* worker(void* x)
{ {
long r; long r;
for (int i = 0; i < iters; i++) { for (int i = 0; i < iters; i++) {
r = futex((u64*)&ftx, FUTEX_WAIT, 0, 0); ++waiting;
r = futex((u64*)&ftx, FUTEX_WAIT, (u64)i, 0);
if (r < 0 && r != -EWOULDBLOCK) if (r < 0 && r != -EWOULDBLOCK)
die("FUTEX_WAIT: %d", r); die("FUTEX_WAIT: %d", r);
ftx = 0;
r = futex((u64*)&ftx, FUTEX_WAKE, 1, 0);
} }
return nullptr; return nullptr;
} }
static
void master(void)
{
long r;
for (int i = 0; i < iters; i++) {
while (waiting.load() < nworkers)
nop_pause();
waiting.store(0);
ftx = i+1;
r = futex((u64*)&ftx, FUTEX_WAKE, nworkers, 0);
assert(r == 0);
}
}
int int
main(int ac, char** av) main(int ac, char** av)
{ {
pthread_t th;
long r; long r;
if (ac < 2) if (ac < 3)
die("usage: %s iters", av[0]); die("usage: %s iters nworkers", av[0]);
iters = atoi(av[1]); iters = atoi(av[1]);
nworkers = atoi(av[2]);
waiting.store(0);
pthread_create(&th, 0, &worker, 0); for (int i = 0; i < nworkers; i++) {
for (int i = 0; i < iters; i++) { pthread_t th;
ftx = 1;
r = futex((u64*)&ftx, FUTEX_WAKE, 1, 0); r = pthread_create(&th, nullptr, worker, nullptr);
assert(r == 0); if (r < 0)
r = futex((u64*)&ftx, FUTEX_WAIT, 1, 0); die("pthread_create");
if (r < 0 && r != -EWOULDBLOCK)
die("FUTEX_WAIT: %d", r);
} }
nsleep(1000*1000);
u64 t0 = rdtsc();
master();
u64 t1 = rdtsc();
printf("%lu\n", (t1-t0)/iters);
for (int i = 0; i < nworkers; i++)
wait(); wait();
printf("done\n");
return 0;
} }
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论