Skip to content
Snippets Groups Projects
Commit c1c40069 authored by Frederik Hennig's avatar Frederik Hennig
Browse files

Enable vectorization in some tests

parent 3962799b
1 merge request!172Draft: Changes for compatibility with pystencils 2.0
Pipeline #70368 failed with stages
in 32 minutes and 7 seconds
...@@ -13,7 +13,13 @@ if PYSTENCILS_VERSION_MAJOR == 2: ...@@ -13,7 +13,13 @@ if PYSTENCILS_VERSION_MAJOR == 2:
return DEFAULTS.spatial_counters[coord] return DEFAULTS.spatial_counters[coord]
def get_supported_instruction_sets(): def get_supported_instruction_sets():
return [] from pystencils import Target
vector_targets = Target.available_vector_cpu_targets()
isas = []
for target in vector_targets:
tokens = target.name.split("_")
isas.append(tokens[-1].lower())
return isas
else: else:
from pystencils.backends.simd_instruction_sets import ( from pystencils.backends.simd_instruction_sets import (
......
...@@ -10,6 +10,8 @@ import warnings ...@@ -10,6 +10,8 @@ import warnings
import numpy as np import numpy as np
import pytest import pytest
from pystencils import Target
from lbmpy._compat import get_supported_instruction_sets from lbmpy._compat import get_supported_instruction_sets
from lbmpy.boundaries.boundaryconditions import NoSlip from lbmpy.boundaries.boundaryconditions import NoSlip
from lbmpy.geometry import get_pipe_velocity_field from lbmpy.geometry import get_pipe_velocity_field
......
import numpy as np import numpy as np
import pytest import pytest
from dataclasses import replace
import pystencils as ps import pystencils as ps
from lbmpy._compat import get_supported_instruction_sets from lbmpy._compat import get_supported_instruction_sets, IS_PYSTENCILS_2
from lbmpy.scenarios import create_lid_driven_cavity from lbmpy.scenarios import create_lid_driven_cavity
from lbmpy.creationfunctions import LBMConfig, LBMOptimisation from lbmpy.creationfunctions import LBMConfig, LBMOptimisation
...@@ -11,7 +12,7 @@ if vector_isas is None: ...@@ -11,7 +12,7 @@ if vector_isas is None:
vector_isas = [] vector_isas = []
@pytest.mark.skipif(not vector_isas, reason='cannot detect CPU instruction set') @pytest.mark.skipif(not vector_isas, reason="cannot detect CPU instruction set")
def test_lbm_vectorization_short(): def test_lbm_vectorization_short():
print("Computing reference solutions") print("Computing reference solutions")
size1 = (64, 32) size1 = (64, 32)
...@@ -21,30 +22,45 @@ def test_lbm_vectorization_short(): ...@@ -21,30 +22,45 @@ def test_lbm_vectorization_short():
ldc1_ref.run(10) ldc1_ref.run(10)
lbm_config = LBMConfig(relaxation_rate=relaxation_rate) lbm_config = LBMConfig(relaxation_rate=relaxation_rate)
config = ps.CreateKernelConfig(cpu_vectorize_info={'instruction_set': get_supported_instruction_sets()[-1], config = ps.CreateKernelConfig(
'assume_aligned': True, cpu_vectorize_info={
'nontemporal': True, "instruction_set": get_supported_instruction_sets()[-1],
'assume_inner_stride_one': True, "assume_aligned": True,
'assume_sufficient_line_padding': False, "nontemporal": True,
}) "assume_inner_stride_one": True,
ldc1 = create_lid_driven_cavity(size1, lbm_config=lbm_config, config=config, "assume_sufficient_line_padding": False,
fixed_loop_sizes=False) }
)
ldc1 = create_lid_driven_cavity(
size1, lbm_config=lbm_config, config=config, fixed_loop_sizes=False
)
ldc1.run(10) ldc1.run(10)
@pytest.mark.skipif(not vector_isas, reason='cannot detect CPU instruction set') @pytest.mark.skipif(not vector_isas, reason="cannot detect CPU instruction set")
@pytest.mark.parametrize('instruction_set', vector_isas) @pytest.mark.xfail(reason="Loop splitting is not available yet")
@pytest.mark.parametrize('aligned_and_padding', [[False, False], [True, False], [True, True]]) @pytest.mark.parametrize("instruction_set", vector_isas)
@pytest.mark.parametrize('nontemporal', [False, True]) @pytest.mark.parametrize(
@pytest.mark.parametrize('double_precision', [False, True]) "aligned_and_padding", [[False, False], [True, False], [True, True]]
@pytest.mark.parametrize('fixed_loop_sizes', [False, True]) )
@pytest.mark.parametrize("nontemporal", [False, True])
@pytest.mark.parametrize("double_precision", [False, True])
@pytest.mark.parametrize("fixed_loop_sizes", [False, True])
@pytest.mark.longrun @pytest.mark.longrun
def test_lbm_vectorization(instruction_set, aligned_and_padding, nontemporal, double_precision, fixed_loop_sizes): def test_lbm_vectorization(
vectorization_options = {'instruction_set': instruction_set, instruction_set,
'assume_aligned': aligned_and_padding[0], aligned_and_padding,
'nontemporal': nontemporal, nontemporal,
'assume_inner_stride_one': True, double_precision,
'assume_sufficient_line_padding': aligned_and_padding[1]} fixed_loop_sizes,
):
vectorization_options = {
"instruction_set": instruction_set,
"assume_aligned": aligned_and_padding[0],
"nontemporal": nontemporal,
"assume_inner_stride_one": True,
"assume_sufficient_line_padding": aligned_and_padding[1],
}
time_steps = 100 time_steps = 100
size1 = (64, 32) size1 = (64, 32)
size2 = (666, 34) size2 = (666, 34)
...@@ -57,20 +73,40 @@ def test_lbm_vectorization(instruction_set, aligned_and_padding, nontemporal, do ...@@ -57,20 +73,40 @@ def test_lbm_vectorization(instruction_set, aligned_and_padding, nontemporal, do
ldc2_ref.run(time_steps) ldc2_ref.run(time_steps)
lbm_config = LBMConfig(relaxation_rate=relaxation_rate) lbm_config = LBMConfig(relaxation_rate=relaxation_rate)
config = ps.CreateKernelConfig(data_type="float64" if double_precision else "float32", config = ps.CreateKernelConfig(
default_number_float="float64" if double_precision else "float32", data_type="float64" if double_precision else "float32",
cpu_vectorize_info=vectorization_options) cpu_vectorize_info=vectorization_options,
)
if not IS_PYSTENCILS_2:
config = replace(
config,
default_number_float="float64" if double_precision else "float32",
)
lbm_opt_split = LBMOptimisation(cse_global=True, split=True) lbm_opt_split = LBMOptimisation(cse_global=True, split=True)
lbm_opt = LBMOptimisation(cse_global=True, split=False) lbm_opt = LBMOptimisation(cse_global=True, split=False)
print(f"Vectorization test, double precision {double_precision}, vectorization {vectorization_options}, " print(
f"fixed loop sizes {fixed_loop_sizes}") f"Vectorization test, double precision {double_precision}, vectorization {vectorization_options}, "
ldc1 = create_lid_driven_cavity(size1, fixed_loop_sizes=fixed_loop_sizes, f"fixed loop sizes {fixed_loop_sizes}"
lbm_config=lbm_config, lbm_optimisation=lbm_opt, config=config) )
ldc1 = create_lid_driven_cavity(
size1,
fixed_loop_sizes=fixed_loop_sizes,
lbm_config=lbm_config,
lbm_optimisation=lbm_opt,
config=config,
)
ldc1.run(time_steps) ldc1.run(time_steps)
np.testing.assert_almost_equal(ldc1_ref.velocity[:, :], ldc1.velocity[:, :]) np.testing.assert_almost_equal(ldc1_ref.velocity[:, :], ldc1.velocity[:, :])
ldc2 = create_lid_driven_cavity(size2, fixed_loop_sizes=fixed_loop_sizes, ldc2 = create_lid_driven_cavity(
lbm_config=lbm_config, lbm_optimisation=lbm_opt_split, config=config) size2,
fixed_loop_sizes=fixed_loop_sizes,
lbm_config=lbm_config,
lbm_optimisation=lbm_opt_split,
config=config,
)
ldc2.run(time_steps) ldc2.run(time_steps)
np.testing.assert_almost_equal(ldc2_ref.velocity[:, :], ldc2.velocity[:, :]) np.testing.assert_almost_equal(ldc2_ref.velocity[:, :], ldc2.velocity[:, :])
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment