From 59f74b7f06a3245501cf1b10e7419aec0e2bb9b9 Mon Sep 17 00:00:00 2001 From: stijn Date: Wed, 21 May 2025 10:26:14 +0200 Subject: [PATCH 1/3] Fix error 'grid divisor cannot be integer' (issue #264) --- kernel_tuner/util.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/kernel_tuner/util.py b/kernel_tuner/util.py index 072cce433..284bb06b5 100644 --- a/kernel_tuner/util.py +++ b/kernel_tuner/util.py @@ -437,16 +437,18 @@ def compact_number(v): def get_grid_dimensions(current_problem_size, params, grid_div, block_size_names): """Compute grid dims based on problem sizes and listed grid divisors.""" - def get_dimension_divisor(divisor_list, default, params): - if divisor_list is None: - if default in params: - divisor_list = [default] - else: - return 1 - if callable(divisor_list): - return divisor_list(params) + def get_dimension_divisor(divisor, default, params): + if divisor is None: + divisor = params.get(default, 1) + + if isinstance(divisor, int): + return divisor + elif callable(divisor): + return divisor(params) + elif isinstance(divisor, str): + return int(eval(replace_param_occurrences(divisor, params))) else: - return np.prod([int(eval(replace_param_occurrences(s, params))) for s in divisor_list]) + return np.prod([get_dimension_divisor(s, 1, params) for s in divisor]) divisors = [get_dimension_divisor(d, block_size_names[i], params) for i, d in enumerate(grid_div)] return tuple(int(np.ceil(float(current_problem_size[i]) / float(d))) for i, d in enumerate(divisors)) From 0dc80dd756c6945a1c58d4afa9af8cfbd198ed30 Mon Sep 17 00:00:00 2001 From: Ben van Werkhoven Date: Wed, 21 May 2025 15:53:38 +0200 Subject: [PATCH 2/3] simplified code to keep sonarcube happy --- kernel_tuner/util.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/kernel_tuner/util.py b/kernel_tuner/util.py index 284bb06b5..2c56c6861 100644 --- a/kernel_tuner/util.py +++ b/kernel_tuner/util.py @@ -441,14 +441,19 @@ def get_dimension_divisor(divisor, default, params): if divisor is None: divisor = params.get(default, 1) + divisor_num = 1 if isinstance(divisor, int): - return divisor + divisor_num = divisor elif callable(divisor): - return divisor(params) + divisor_num = divisor(params) elif isinstance(divisor, str): - return int(eval(replace_param_occurrences(divisor, params))) + divisor_num = int(eval(replace_param_occurrences(divisor, params))) + elif np.iterable(divisor): + for div in divisor: + divisor_num *= get_dimension_divisor(div, 1, params) else: - return np.prod([get_dimension_divisor(s, 1, params) for s in divisor]) + raise ValueError("Error: unrecognized type in grid divisor list, should be any of int, str, callable, or iterable") + return divisor_num divisors = [get_dimension_divisor(d, block_size_names[i], params) for i, d in enumerate(grid_div)] return tuple(int(np.ceil(float(current_problem_size[i]) / float(d))) for i, d in enumerate(divisors)) From 2437bfc28def26986674e79149e6dcbdfb44c374 Mon Sep 17 00:00:00 2001 From: stijn Date: Mon, 16 Jun 2025 14:39:53 +0200 Subject: [PATCH 3/3] Add test for integer grid divisors in `get_grid_dimensions` --- kernel_tuner/util.py | 9 +++++---- test/test_util_functions.py | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/kernel_tuner/util.py b/kernel_tuner/util.py index 2c56c6861..028cd192f 100644 --- a/kernel_tuner/util.py +++ b/kernel_tuner/util.py @@ -438,11 +438,11 @@ def get_grid_dimensions(current_problem_size, params, grid_div, block_size_names """Compute grid dims based on problem sizes and listed grid divisors.""" def get_dimension_divisor(divisor, default, params): - if divisor is None: - divisor = params.get(default, 1) - divisor_num = 1 - if isinstance(divisor, int): + + if divisor is None: + divisor_num = params.get(default, 1) + elif isinstance(divisor, int): divisor_num = divisor elif callable(divisor): divisor_num = divisor(params) @@ -453,6 +453,7 @@ def get_dimension_divisor(divisor, default, params): divisor_num *= get_dimension_divisor(div, 1, params) else: raise ValueError("Error: unrecognized type in grid divisor list, should be any of int, str, callable, or iterable") + return divisor_num divisors = [get_dimension_divisor(d, block_size_names[i], params) for i, d in enumerate(grid_div)] diff --git a/test/test_util_functions.py b/test/test_util_functions.py index f3431991b..d6870d9da 100644 --- a/test/test_util_functions.py +++ b/test/test_util_functions.py @@ -59,6 +59,22 @@ def test_get_grid_dimensions1(): assert grid[1] == 25 assert grid[2] == 1 + grid = get_grid_dimensions( + problem_size, params, ("41", 37, None), block_size_names + ) + + assert grid[0] == 25 + assert grid[1] == 28 + assert grid[2] == 1 + + grid = get_grid_dimensions( + problem_size, params, (None, [2, "block_y"], None), block_size_names + ) + + assert grid[0] == 1024 + assert grid[1] == 14 + assert grid[2] == 1 + def test_get_grid_dimensions2(): problem_size = (1024, 1024, 1)