forked from GridTools/gt4py
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdefinitions.py
187 lines (156 loc) · 7.64 KB
/
definitions.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# GT4Py - GridTools Framework
#
# Copyright (c) 2014-2023, ETH Zurich
# All rights reserved.
#
# This file is part of the GT4Py project and the GridTools framework.
# GT4Py is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or any later
# version. See the LICENSE.txt file at the top-level directory of this
# distribution for a copy of the license or check <https://www.gnu.org/licenses/>.
#
# SPDX-License-Identifier: GPL-3.0-or-later
"""Contains definition of test-exclusion matrices, see ADR 15."""
import enum
import importlib
import pytest
from gt4py.next import allocators as next_allocators
# Skip definitions
XFAIL = pytest.xfail
SKIP = pytest.skip
# Program processors
class _PythonObjectIdMixin:
# Only useful for classes inheriting from (str, enum.Enum)
def __str__(self) -> str:
assert isinstance(self.value, str)
return self.value
def load(self) -> object:
*mods, obj = self.value.split(".")
globs = {"_m": importlib.import_module(".".join(mods))}
obj = eval(f"_m.{obj}", globs)
return obj
__invert__ = load
def short_id(self, num_components: int = 2) -> str:
return ".".join(self.value.split(".")[-num_components:])
class _PythonObjectIdMixinForAllocator(_PythonObjectIdMixin):
def short_id(self, num_components: int = 1) -> str:
return "None-" + super().short_id(num_components)
class ProgramBackendId(_PythonObjectIdMixin, str, enum.Enum):
GTFN_CPU = "gt4py.next.program_processors.runners.gtfn.run_gtfn"
GTFN_CPU_IMPERATIVE = "gt4py.next.program_processors.runners.gtfn.run_gtfn_imperative"
GTFN_CPU_WITH_TEMPORARIES = (
"gt4py.next.program_processors.runners.gtfn.run_gtfn_with_temporaries"
)
GTFN_GPU = "gt4py.next.program_processors.runners.gtfn.run_gtfn_gpu"
ROUNDTRIP = "gt4py.next.program_processors.runners.roundtrip.backend"
DOUBLE_ROUNDTRIP = "gt4py.next.program_processors.runners.double_roundtrip.backend"
cpu_allocator = next_allocators.StandardCPUFieldBufferAllocator()
gpu_allocator = next_allocators.StandardGPUFieldBufferAllocator()
class AllocatorId(_PythonObjectIdMixinForAllocator, str, enum.Enum):
CPU_ALLOCATOR = "next_tests.definitions.cpu_allocator"
GPU_ALLOCATOR = "next_tests.definitions.gpu_allocator"
class OptionalProgramBackendId(_PythonObjectIdMixin, str, enum.Enum):
DACE_CPU = "gt4py.next.program_processors.runners.dace_iterator.run_dace_cpu"
DACE_GPU = "gt4py.next.program_processors.runners.dace_iterator.run_dace_gpu"
class ProgramExecutorId(_PythonObjectIdMixin, str, enum.Enum):
GTFN_CPU_EXECUTOR = f"{ProgramBackendId.GTFN_CPU}.executor"
GTFN_CPU_IMPERATIVE_EXECUTOR = f"{ProgramBackendId.GTFN_CPU_IMPERATIVE}.executor"
GTFN_CPU_WITH_TEMPORARIES = f"{ProgramBackendId.GTFN_CPU_WITH_TEMPORARIES}.executor"
ROUNDTRIP = f"{ProgramBackendId.ROUNDTRIP}.executor"
DOUBLE_ROUNDTRIP = f"{ProgramBackendId.DOUBLE_ROUNDTRIP}.executor"
class OptionalProgramExecutorId(_PythonObjectIdMixin, str, enum.Enum):
DACE_CPU_EXECUTOR = f"{OptionalProgramBackendId.DACE_CPU}.executor"
class ProgramFormatterId(_PythonObjectIdMixin, str, enum.Enum):
GTFN_CPP_FORMATTER = "gt4py.next.program_processors.formatters.gtfn.format_cpp"
ITIR_PRETTY_PRINTER = (
"gt4py.next.program_processors.formatters.pretty_print.format_itir_and_check"
)
ITIR_TYPE_CHECKER = "gt4py.next.program_processors.formatters.type_check.check_type_inference"
LISP_FORMATTER = "gt4py.next.program_processors.formatters.lisp.format_lisp"
# Test markers
REQUIRES_ATLAS = "requires_atlas"
USES_APPLIED_SHIFTS = "uses_applied_shifts"
USES_CONSTANT_FIELDS = "uses_constant_fields"
USES_DYNAMIC_OFFSETS = "uses_dynamic_offsets"
USES_FLOORDIV = "uses_floordiv"
USES_IF_STMTS = "uses_if_stmts"
USES_INDEX_FIELDS = "uses_index_fields"
USES_LIFT_EXPRESSIONS = "uses_lift_expressions"
USES_NEGATIVE_MODULO = "uses_negative_modulo"
USES_ORIGIN = "uses_origin"
USES_REDUCTION_OVER_LIFT_EXPRESSIONS = "uses_reduction_over_lift_expressions"
USES_SCAN = "uses_scan"
USES_SCAN_IN_FIELD_OPERATOR = "uses_scan_in_field_operator"
USES_SCAN_WITHOUT_FIELD_ARGS = "uses_scan_without_field_args"
USES_SPARSE_FIELDS = "uses_sparse_fields"
USES_SPARSE_FIELDS_AS_OUTPUT = "uses_sparse_fields_as_output"
USES_REDUCTION_WITH_ONLY_SPARSE_FIELDS = "uses_reduction_with_only_sparse_fields"
USES_STRIDED_NEIGHBOR_OFFSET = "uses_strided_neighbor_offset"
USES_TUPLE_ARGS = "uses_tuple_args"
USES_TUPLE_RETURNS = "uses_tuple_returns"
USES_ZERO_DIMENSIONAL_FIELDS = "uses_zero_dimensional_fields"
USES_CARTESIAN_SHIFT = "uses_cartesian_shift"
USES_UNSTRUCTURED_SHIFT = "uses_unstructured_shift"
CHECKS_SPECIFIC_ERROR = "checks_specific_error"
# Skip messages (available format keys: 'marker', 'backend')
UNSUPPORTED_MESSAGE = "'{marker}' tests not supported by '{backend}' backend"
BINDINGS_UNSUPPORTED_MESSAGE = "'{marker}' not supported by '{backend}' bindings"
REDUCTION_WITH_ONLY_SPARSE_FIELDS_MESSAGE = (
"We cannot unroll a reduction on a sparse field only (not clear if it is legal ITIR)"
)
# Common list of feature markers to skip
COMMON_SKIP_TEST_LIST = [
(REQUIRES_ATLAS, XFAIL, BINDINGS_UNSUPPORTED_MESSAGE),
(USES_APPLIED_SHIFTS, XFAIL, UNSUPPORTED_MESSAGE),
(USES_IF_STMTS, XFAIL, UNSUPPORTED_MESSAGE),
(USES_NEGATIVE_MODULO, XFAIL, UNSUPPORTED_MESSAGE),
(USES_REDUCTION_WITH_ONLY_SPARSE_FIELDS, XFAIL, REDUCTION_WITH_ONLY_SPARSE_FIELDS_MESSAGE),
(USES_SCAN_IN_FIELD_OPERATOR, XFAIL, UNSUPPORTED_MESSAGE),
(USES_SPARSE_FIELDS_AS_OUTPUT, XFAIL, UNSUPPORTED_MESSAGE),
]
DACE_SKIP_TEST_LIST = COMMON_SKIP_TEST_LIST + [
(USES_CONSTANT_FIELDS, XFAIL, UNSUPPORTED_MESSAGE),
(USES_INDEX_FIELDS, XFAIL, UNSUPPORTED_MESSAGE),
(USES_LIFT_EXPRESSIONS, XFAIL, UNSUPPORTED_MESSAGE),
(USES_ORIGIN, XFAIL, UNSUPPORTED_MESSAGE),
(USES_TUPLE_ARGS, XFAIL, UNSUPPORTED_MESSAGE),
(USES_TUPLE_RETURNS, XFAIL, UNSUPPORTED_MESSAGE),
(USES_ZERO_DIMENSIONAL_FIELDS, XFAIL, UNSUPPORTED_MESSAGE),
]
EMBEDDED_SKIP_LIST = [
(USES_DYNAMIC_OFFSETS, XFAIL, UNSUPPORTED_MESSAGE),
(CHECKS_SPECIFIC_ERROR, XFAIL, UNSUPPORTED_MESSAGE),
]
GTFN_SKIP_TEST_LIST = COMMON_SKIP_TEST_LIST + [
# floordiv not yet supported, see https://github.com/GridTools/gt4py/issues/1136
(USES_FLOORDIV, XFAIL, BINDINGS_UNSUPPORTED_MESSAGE),
(USES_STRIDED_NEIGHBOR_OFFSET, XFAIL, BINDINGS_UNSUPPORTED_MESSAGE),
]
#: Skip matrix, contains for each backend processor a list of tuples with following fields:
#: (<test_marker>, <skip_definition, <skip_message>)
BACKEND_SKIP_TEST_MATRIX = {
AllocatorId.CPU_ALLOCATOR: EMBEDDED_SKIP_LIST,
AllocatorId.GPU_ALLOCATOR: EMBEDDED_SKIP_LIST
+ [
# we can't extract the type of the output field
(USES_SCAN_WITHOUT_FIELD_ARGS, XFAIL, UNSUPPORTED_MESSAGE)
],
OptionalProgramBackendId.DACE_CPU: DACE_SKIP_TEST_LIST,
OptionalProgramBackendId.DACE_GPU: DACE_SKIP_TEST_LIST
+ [
# awaiting dace fix, see https://github.com/spcl/dace/pull/1442
(USES_FLOORDIV, XFAIL, BINDINGS_UNSUPPORTED_MESSAGE),
],
ProgramBackendId.GTFN_CPU: GTFN_SKIP_TEST_LIST,
ProgramBackendId.GTFN_CPU_IMPERATIVE: GTFN_SKIP_TEST_LIST,
ProgramBackendId.GTFN_GPU: GTFN_SKIP_TEST_LIST,
ProgramBackendId.GTFN_CPU_WITH_TEMPORARIES: GTFN_SKIP_TEST_LIST
+ [
(USES_DYNAMIC_OFFSETS, XFAIL, UNSUPPORTED_MESSAGE),
],
ProgramFormatterId.GTFN_CPP_FORMATTER: [
(USES_REDUCTION_WITH_ONLY_SPARSE_FIELDS, XFAIL, REDUCTION_WITH_ONLY_SPARSE_FIELDS_MESSAGE),
],
ProgramBackendId.ROUNDTRIP: [(USES_SPARSE_FIELDS_AS_OUTPUT, XFAIL, UNSUPPORTED_MESSAGE)],
}