Skip to content

Try to force RAM to get cleaned up with buffers #8

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions benchmarks/_benchmark.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ def benchmark(func):

def outer(func):

# inspect the function, if it has an attribute called n_timings
# pass the function to outer
import inspect
import functools

@functools.wraps(func)
def inner(*args):

# Do somewhat of a reset
Expand All @@ -30,7 +36,11 @@ def inner(*args):
time.sleep(0.02)

# Boot the generator.
generator = func(*args)
if "n_timings" in inspect.getfullargspec(func).args:
kwargs = {"n_timings": n_timings}
else:
kwargs = {}
generator = func(*args, **kwargs)

# Seed: the generator does its preparations.
generator.__next__()
Expand Down Expand Up @@ -76,7 +86,6 @@ def inner(*args):
# print([t / 1000_000 for t in times["cpu"]])
print(f"{name.rjust(30)} ({n_timings}x) - {stats_str}")

inner.__name__ == func.__name__
inner.is_benchmark = True
return inner

Expand Down
83 changes: 45 additions & 38 deletions benchmarks/bm_buffer.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def update_resource(resource):


@benchmark(20)
def upload_buffer_full_naive(canvas):
def upload_buffer_full_naive(canvas, n_timings=100_000):
# Emulate updating a pretty big buffer

data1 = np.zeros((N,), np.uint8)
Expand All @@ -33,15 +33,16 @@ def upload_buffer_full_naive(canvas):

yield

while True:
for _ in range(n_timings + 2):
buffer.data[:] = data2
buffer.update_range()
update_resource(buffer)
yield
del buffer


@benchmark(20)
def upload_buffer_full_optimized(canvas):
def upload_buffer_full_optimized(canvas, n_timings=100_000):
# Emulate updating a pretty big buffer, replacing full data if possible

data1 = np.zeros((N,), np.uint8)
Expand All @@ -53,7 +54,7 @@ def upload_buffer_full_optimized(canvas):

yield

while True:
for _ in range(n_timings + 2):
if hasattr(buffer, "set_data"):
buffer.set_data(data2)
buffer.update_full()
Expand All @@ -62,10 +63,11 @@ def upload_buffer_full_optimized(canvas):
buffer.update_range()
update_resource(buffer)
yield
del buffer


@benchmark(20)
def upload_buffer_full_noncont(canvas):
def upload_buffer_full_noncont(canvas, n_timings=100_000):
# Emulate updating a pretty big buffer

data1 = np.zeros((N * 2,), np.uint8)[::2]
Expand All @@ -77,18 +79,19 @@ def upload_buffer_full_noncont(canvas):

yield

while True:
for _ in range(n_timings + 2):
if hasattr(buffer, "set_data"):
buffer.set_data(data1)
else:
buffer.data[:] = data2
buffer.update_range()
update_resource(buffer)
yield
del buffer


@benchmark(20)
def upload_buffer_half(canvas):
def upload_buffer_half(canvas, n_timings=100_000):
# Emulate updating a pretty big buffer

data1 = np.zeros((N), np.uint8)
Expand All @@ -100,19 +103,19 @@ def upload_buffer_half(canvas):

yield

while True:

for _ in range(n_timings + 2):
buffer.data[: N // 2] = data1[: N // 2]
buffer.update_range(0, N // 2)

data1, data2 = data2, data1

update_resource(buffer)
yield
del buffer


@benchmark(20)
def upload_buffer_two_quarters(canvas):
def upload_buffer_two_quarters(canvas, n_timings=100_000):
# Emulate updating a pretty big buffer

data1 = np.zeros((N,), np.uint8)
Expand All @@ -124,7 +127,7 @@ def upload_buffer_two_quarters(canvas):

yield

while True:
for _ in range(n_timings + 2):
buffer.data[: N // 4] = data1[: N // 4]
buffer.update_range(0, N // 4)
buffer.data[-N // 4 :] = data1[-N // 4 :]
Expand All @@ -134,10 +137,11 @@ def upload_buffer_two_quarters(canvas):

update_resource(buffer)
yield
del buffer


@benchmark(20)
def upload_buffer_chunk_stripes(canvas):
def upload_buffer_chunk_stripes(canvas, n_timings=100_000):
# Emulate the worst-case stripe scenario

data1 = np.zeros((N,), np.uint8)
Expand All @@ -151,15 +155,16 @@ def upload_buffer_chunk_stripes(canvas):

yield

while True:
for _ in range(n_timings + 2):
# buffer.data[::n] = data1[::n]
buffer.update_indices(np.arange(0, N, step))

update_resource(buffer)
yield
del buffer


def upload_buffer_random(n_random):
def upload_buffer_random(n_random, n_timings=100_000):

data1 = np.zeros((N,), np.uint8)

Expand All @@ -169,66 +174,68 @@ def upload_buffer_random(n_random):

yield

while True:
for _ in range(n_timings + 2):
ii = np.random.randint(0, N, n_random)
# tex.data[ii] = 1
buffer.update_indices(ii)
update_resource(buffer)
yield
del buffer


@benchmark(20)
def upload_buffer_random8(canvas):
return upload_buffer_random(8)
def upload_buffer_random8(canvas, n_timings=100_000):
return upload_buffer_random(8, n_timings=n_timings)


@benchmark(20)
def upload_buffer_random16(canvas):
return upload_buffer_random(16)
def upload_buffer_random16(canvas, n_timings=100_000):
return upload_buffer_random(16, n_timings=n_timings)


@benchmark(20)
def upload_buffer_random32(canvas):
return upload_buffer_random(32)
def upload_buffer_random32(canvas, n_timings=100_000):
return upload_buffer_random(32, n_timings=n_timings)


@benchmark(20)
def upload_buffer_random64(canvas):
return upload_buffer_random(64)
def upload_buffer_random64(canvas, n_timings=100_000):
return upload_buffer_random(64, n_timings=n_timings)


@benchmark(20)
def upload_buffer_random128(canvas):
return upload_buffer_random(128)
def upload_buffer_random128(canvas, n_timings=100_000):
return upload_buffer_random(128, n_timings=n_timings)


@benchmark(20)
def upload_buffer_random256(canvas):
return upload_buffer_random(256)
def upload_buffer_random256(canvas, n_timings=100_000):
return upload_buffer_random(256, n_timings=n_timings)


@benchmark(20)
def upload_buffer_random512(canvas):
return upload_buffer_random(512)
def upload_buffer_random512(canvas, n_timings=100_000):
return upload_buffer_random(512, n_timings=n_timings)


@benchmark(20)
def upload_v_random1024(canvas):
return upload_buffer_random(1024)
def upload_v_random1024(canvas, n_timings=100_000):
return upload_buffer_random(1024, n_timings=n_timings)


@benchmark(20)
def upload_buffer_random2048(canvas):
return upload_buffer_random(2048)
def upload_buffer_random2048(canvas, n_timings=100_000):
return upload_buffer_random(2048, n_timings=n_timings)


@benchmark(20)
def upload_buffer_random4096(canvas):
return upload_buffer_random(4096)
def upload_buffer_random4096(canvas, n_timings=100_000):
return upload_buffer_random(4096, n_timings=n_timings)


@benchmark(20)
def upload_100_buffers(canvas):
def upload_100_buffers(canvas, n_timings=100_000):
print(n_timings)
# This emulates updating a bunch of uniform buffers

buffers = []
Expand All @@ -244,12 +251,12 @@ def upload_100_buffers(canvas):

yield

while True:

for _ in range(n_timings + 2):
for buffer in buffers:
buffer.update_range()
update_resource(buffer)
yield
del buffer


if __name__ == "__main__":
Expand Down