Skip to content
Snippets Groups Projects
Commit 7e6be86e authored by Michael Kuron's avatar Michael Kuron :mortar_board:
Browse files

Add ARM SVE CI job

parent 5cf6febc
No related merge requests found
...@@ -151,12 +151,11 @@ ubuntu: ...@@ -151,12 +151,11 @@ ubuntu:
cobertura: coverage.xml cobertura: coverage.xml
junit: report.xml junit: report.xml
arm64: arm64v8:
extends: .multiarch_template extends: .multiarch_template
image: i10git.cs.fau.de:5005/pycodegen/pycodegen/arm64 image: i10git.cs.fau.de:5005/pycodegen/pycodegen/arm64
variables: variables:
PYSTENCILS_SIMD: "neon" PYSTENCILS_SIMD: "neon"
QEMU_CPU: "cortex-a72"
before_script: before_script:
- *multiarch_before_script - *multiarch_before_script
- sed -i s/march=native/march=armv8-a/g ~/.config/pystencils/config.json - sed -i s/march=native/march=armv8-a/g ~/.config/pystencils/config.json
...@@ -170,6 +169,23 @@ ppc64le: ...@@ -170,6 +169,23 @@ ppc64le:
- *multiarch_before_script - *multiarch_before_script
- sed -i s/mcpu=native/mcpu=power8/g ~/.config/pystencils/config.json - sed -i s/mcpu=native/mcpu=power8/g ~/.config/pystencils/config.json
arm64v9:
# Compiler support for SVE is still pretty rough: GCC 10+11 produce incorrect code for fixed-width vectors,
# while Clang 12 produces memory-corrupting heisenbugs unless we enable the address sanitizer.
# In the RNG tests, GCC 10+11 produce an internal compiler error.
# The memory corruption seems to only happen with qemu-user, not with qemu-system.
# Once the compilers and QEMU have improved, this job should be cleaned up to match the others.
extends: .multiarch_template
image: i10git.cs.fau.de:5005/pycodegen/pycodegen/arm64
variables:
PYSTENCILS_SIMD: "sve256,sve512"
ASAN_OPTIONS: detect_leaks=0
LD_PRELOAD: /usr/lib/aarch64-linux-gnu/libasan.so.6
before_script:
- *multiarch_before_script
- sed -i s/march=native/march=armv8-a+sve/g ~/.config/pystencils/config.json
- sed -i s/g\+\+/clang++/g ~/.config/pystencils/config.json
minimal-conda: minimal-conda:
stage: test stage: test
except: except:
......
...@@ -69,6 +69,9 @@ class CachelineSize(ast.Node): ...@@ -69,6 +69,9 @@ class CachelineSize(ast.Node):
def __eq__(self, other): def __eq__(self, other):
return isinstance(other, CachelineSize) return isinstance(other, CachelineSize)
def __hash__(self):
return hash(self.symbol)
def vectorize(kernel_ast: ast.KernelFunction, instruction_set: str = 'best', def vectorize(kernel_ast: ast.KernelFunction, instruction_set: str = 'best',
assume_aligned: bool = False, nontemporal: Union[bool, Container[Union[str, Field]]] = False, assume_aligned: bool = False, nontemporal: Union[bool, Container[Union[str, Field]]] = False,
......
...@@ -117,7 +117,7 @@ def test_cacheline_size(instruction_set): ...@@ -117,7 +117,7 @@ def test_cacheline_size(instruction_set):
# test_vectorization is not parametrized because it is supposed to run without pytest, so we parametrize it here # test_vectorization is not parametrized because it is supposed to run without pytest, so we parametrize it here
from pystencils_tests import test_vectorization from pystencils_tests import test_vectorization
@pytest.mark.parametrize('instruction_set', set(supported_instruction_sets) - set([test_vectorization.instruction_set])) @pytest.mark.parametrize('instruction_set', sorted(set(supported_instruction_sets) - set([test_vectorization.instruction_set])))
@pytest.mark.parametrize('function', [f for f in test_vectorization.__dict__ if f.startswith('test_') and f != 'test_hardware_query']) @pytest.mark.parametrize('function', [f for f in test_vectorization.__dict__ if f.startswith('test_') and f != 'test_hardware_query'])
def test_vectorization_other(instruction_set, function): def test_vectorization_other(instruction_set, function):
test_vectorization.__dict__[function](instruction_set) test_vectorization.__dict__[function](instruction_set)
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