Skip to content

Commit

Permalink
A few optimization for doBigIntBinOpvv and doBigIntBinOpvs, still nee…
Browse files Browse the repository at this point in the history
…d sv and bool returns
  • Loading branch information
Pierce Hayes committed Feb 21, 2023
1 parent e049183 commit 42adc22
Show file tree
Hide file tree
Showing 4 changed files with 367 additions and 106 deletions.
22 changes: 18 additions & 4 deletions benchmarks/bigint_conversion.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,15 @@ def time_bigint_conversion(N_per_locale, trials, seed, max_bits):
(2 * a.size * a.itemsize) / 2**30 / avg_conversion
)
)
assert ak.all(a == u_arrays[0])
assert ak.all(b == u_arrays[1])
if max_bits == -1 or max_bits > 128:
assert ak.all(a == u_arrays[0])
assert ak.all(b == u_arrays[1])
elif max_bits <= 64:
assert ak.all(b % (2**max_bits - 1) == u_arrays[0])
else:
max_bits -= 64
assert ak.all(a & (2**max_bits - 1) == u_arrays[0])
assert ak.all(b == u_arrays[1])


def check_correctness(seed, max_bits):
Expand All @@ -54,8 +61,15 @@ def check_correctness(seed, max_bits):
b = ak.randint(0, N, N, dtype=ak.uint64, seed=seed)
u_arrays = ak.bigint_from_uint_arrays([a, b], max_bits=max_bits).bigint_to_uint_arrays()

assert ak.all(a == u_arrays[0])
assert ak.all(b == u_arrays[1])
if max_bits == -1 or max_bits > 128:
assert ak.all(a == u_arrays[0])
assert ak.all(b == u_arrays[1])
elif max_bits <= 64:
assert ak.all(b % (2**max_bits - 1) == u_arrays[0])
else:
max_bits -= 64
assert ak.all(a & (2**max_bits - 1) == u_arrays[0])
assert ak.all(b == u_arrays[1])


def create_parser():
Expand Down
2 changes: 1 addition & 1 deletion benchmarks/bigint_stream.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def time_ak_stream(N_per_locale, trials, alpha, max_bits, random, seed):
if random or seed is not None:
a1 = ak.randint(0, 2**32, N, dtype=ak.uint64, seed=seed)
a2 = ak.randint(0, 2**32, N, dtype=ak.uint64, seed=seed)
a = ak.bigint_from_uint_arrays([a1, a2])
a = ak.bigint_from_uint_arrays([a1, a2], max_bits=max_bits)
b1 = ak.randint(0, 2**32, N, dtype=ak.uint64, seed=seed)
b2 = ak.randint(0, 2**32, N, dtype=ak.uint64, seed=seed)
b = ak.bigint_from_uint_arrays([b1, b2], max_bits=max_bits)
Expand Down
9 changes: 5 additions & 4 deletions src/BigIntMsg.chpl
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,11 @@ module BigIntMsg {

if max_bits != -1 {
// modBy should always be non-zero since we start at 1 and left shift
var modBy = 1:bigint;
modBy <<= max_bits;
forall bA in bigIntArray with (var local_modBy = modBy) {
bA.mod(bA, local_modBy);
var max_size = 1:bigint;
max_size <<= max_bits;
max_size -= 1;
forall bA in bigIntArray with (var local_max_size = max_size) {
bA &= local_max_size;
}
}

Expand Down
Loading

0 comments on commit 42adc22

Please sign in to comment.