Skip to content
Merged
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
30 changes: 20 additions & 10 deletions python/cuda_parallel/tests/test_segmented_reduce.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,38 @@

import cupy as cp
import numpy as np
import pytest

import cuda.parallel.experimental.algorithms as algorithms
from cuda.parallel.experimental.struct import gpu_struct


def test_segmented_reduce(input_array):
"Test for all supported input types"
@pytest.fixture(params=["i4", "u4", "i8", "u8"])
def offset_dtype(request):
return np.dtype(request.param)


def test_segmented_reduce(input_array, offset_dtype):
"Test for all supported input types and for some offset types"

def binary_op(a, b):
return a + b

assert input_array.ndim == 1
sz = input_array.size
rng = np.random.default_rng()
n_segments = 2**4
h_offsets = np.zeros(n_segments + 1, dtype="int64")
h_offsets[1:] = rng.multinomial(sz, [1 / 16] * 16)
rng = cp.random

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FWIW CuPy also has the new random interface (no need to change).

n_segments = 16
h_offsets = cp.zeros(n_segments + 1, dtype="int64")
h_offsets[1:] = rng.multinomial(sz, [1 / n_segments] * n_segments)

offsets = cp.asarray(h_offsets)
offsets = cp.cumsum(cp.asarray(h_offsets, dtype=offset_dtype), dtype=offset_dtype)

start_offsets = offsets[:-1]
end_offsets = offsets[:-1]
end_offsets = offsets[1:]
Comment thread
oleksandr-pavlyk marked this conversation as resolved.
Resolved

assert offsets.dtype == np.dtype(offset_dtype)
assert cp.all(start_offsets <= end_offsets)
assert end_offsets[-1] == sz

d_in = cp.asarray(input_array)
d_out = cp.empty(n_segments, dtype=d_in.dtype)
Expand Down Expand Up @@ -67,11 +77,11 @@ class Pixel:
def max_g_value(x, y):
return x if x.g > y.g else y

def ceil_up(n, m):
def align_up(n, m):
return ((n + m - 1) // m) * m

segment_size = 64
n_pixels = ceil_up(4000, 64)
n_pixels = align_up(4000, 64)
offsets = cp.arange(n_pixels + segment_size - 1, step=segment_size, dtype=np.int64)
start_offsets = offsets[:-1]
end_offsets = offsets[1:]
Expand Down