Skip to content

Commit cbe1469

Browse files
committed
Adding partitioned threading benchmark
1 parent 4cfd78a commit cbe1469

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import csv
2+
import time
3+
import argparse
4+
5+
import threading
6+
7+
from sleep.core import bsleep, sleep_with_gil
8+
9+
free_sleep = bsleep
10+
lock_sleep = sleep_with_gil
11+
12+
parser = argparse.ArgumentParser()
13+
parser.add_argument("-workers", type=int, default=1)
14+
parser.add_argument("-n", type=int, default=3)
15+
parser.add_argument("-t", type=int, default=10)
16+
parser.add_argument("-accesses", type=int, default=10)
17+
parser.add_argument("-frac", type=float, default=0)
18+
parser.add_argument('-sweep', type=int, default=0)
19+
parser.add_argument('-barrier', type=int, default=0)
20+
args = parser.parse_args()
21+
22+
23+
def task(barrier, n, t, accesses, frac, free_time, lock_time):
24+
for k in range(accesses):
25+
free_sleep(free_time)
26+
lock_sleep(lock_time)
27+
28+
def thread_task(barrier, n, t, accesses, frac):
29+
30+
kernel_time = t / accesses
31+
free_time = kernel_time * (1 - frac)
32+
lock_time = kernel_time * frac
33+
for i in range(n):
34+
task(barrier, n, t, accesses, frac, free_time, lock_time)
35+
if args.barrier:
36+
barrier.wait()
37+
38+
def drange(start, stop):
39+
while start < stop:
40+
yield start
41+
start <<= 1
42+
43+
def main(workers, n, task_time, accesses, frac):
44+
barrier = threading.Barrier(workers)
45+
threads = []
46+
47+
for i in range(workers):
48+
per = (n//workers + (i < n % workers))
49+
t = threading.Thread(target=thread_task, args=(barrier, per,
50+
task_time, accesses, frac))
51+
threads.append(t)
52+
53+
start_t = time.perf_counter()
54+
55+
for t in threads:
56+
t.start()
57+
58+
for t in threads:
59+
t.join()
60+
61+
end_t = time.perf_counter()
62+
63+
elapsed_t = end_t - start_t
64+
print(', '.join([str(workers), str(n), str(task_time), str(
65+
accesses), str(frac), str(elapsed_t)]), flush=True)
66+
67+
if __name__ == "__main__":
68+
print(', '.join([str('workers'), str('n'), str('task_time'), str(
69+
'accesses'), str('frac'), str('total_time')]), flush=True)
70+
for task_time in [1000, 5000, 10000, 50000, 100000]:
71+
for accesses in [1, 10]:
72+
for nworkers in drange(1, args.workers):
73+
for frac in [0]:
74+
main(nworkers, args.n, task_time, accesses, frac)
75+
76+
77+
78+

0 commit comments

Comments
 (0)