From 51cb49743e6f81456843200c203c0669eb39ac2a Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 19 Apr 2020 00:30:30 -0700 Subject: tests: add framework to mock targets --- lib/spack/spack/platforms/test.py | 6 +- lib/spack/spack/test/concretize.py | 4 +- lib/spack/spack/test/conftest.py | 37 ++ .../microarchitectures/microarchitectures.json | 486 +++++++++++++++++++++ lib/spack/spack/test/spec_semantics.py | 4 +- 5 files changed, 530 insertions(+), 7 deletions(-) create mode 100644 lib/spack/spack/test/data/microarchitectures/microarchitectures.json (limited to 'lib') diff --git a/lib/spack/spack/platforms/test.py b/lib/spack/spack/platforms/test.py index 3480275328..32007394b1 100644 --- a/lib/spack/spack/platforms/test.py +++ b/lib/spack/spack/platforms/test.py @@ -14,9 +14,9 @@ class Test(Platform): if platform.system().lower() == 'darwin': binary_formats = ['macho'] - front_end = 'x86' - back_end = 'x86_64' - default = 'x86_64' + front_end = 'x86_64' + back_end = 'core2' + default = 'core2' front_os = 'redhat6' back_os = 'debian6' diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py index 02305d84b5..b90a948204 100644 --- a/lib/spack/spack/test/concretize.py +++ b/lib/spack/spack/test/concretize.py @@ -230,7 +230,7 @@ class TestConcretize(object): spec.concretize() assert spec['cmake'].architecture == spec.architecture - def test_architecture_deep_inheritance(self): + def test_architecture_deep_inheritance(self, mock_targets): """Make sure that indirect dependencies receive architecture information from the root even when partial architecture information is provided by an intermediate dependency. @@ -243,7 +243,7 @@ class TestConcretize(object): mock_repo.add_package('foopkg', [barpkg], [default_dep]) with spack.repo.swap(mock_repo): - spec = Spec('foopkg %clang@3.3 os=CNL target=footar' + + spec = Spec('foopkg %gcc@4.5.0 os=CNL target=nocona' + ' ^barpkg os=SuSE11 ^bazpkg os=be') spec.concretize() diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py index af77684329..0a9d1e6a7b 100644 --- a/lib/spack/spack/test/conftest.py +++ b/lib/spack/spack/test/conftest.py @@ -8,6 +8,7 @@ import contextlib import errno import inspect import itertools +import json import os import os.path import shutil @@ -17,6 +18,8 @@ import xml.etree.ElementTree import py import pytest +import llnl.util.cpu.microarchitecture +import llnl.util.cpu.schema from llnl.util.filesystem import mkdirp, remove_linked_tree import spack.architecture @@ -448,6 +451,40 @@ def default_config(): yield defaults_config +@pytest.fixture(scope='session') +def mock_uarch_json(tmpdir_factory): + """Mock microarchitectures.json with test architecture descriptions.""" + tmpdir = tmpdir_factory.mktemp('microarchitectures') + + uarch_json = py.path.local(spack.paths.test_path).join( + "data", "microarchitectures", "microarchitectures.json") + uarch_json.copy(tmpdir) + yield str(tmpdir.join("microarchitectures.json")) + + +@pytest.fixture(scope='session') +def mock_uarch_configuration(mock_uarch_json): + """Create mock dictionaries for the llnl.util.cpu.""" + def load_json(): + with open(mock_uarch_json) as f: + return json.load(f) + + targets_json = llnl.util.cpu.schema.LazyDictionary(load_json) + targets = llnl.util.cpu.microarchitecture.LazyDictionary( + llnl.util.cpu.microarchitecture._known_microarchitectures) + + yield targets_json, targets + + +@pytest.fixture(scope='function') +def mock_targets(mock_uarch_configuration, monkeypatch): + """Use this fixture to enable mock uarch targets for testing.""" + targets_json, targets = mock_uarch_configuration + + monkeypatch.setattr(llnl.util.cpu.schema, "targets_json", targets_json) + monkeypatch.setattr(llnl.util.cpu.microarchitecture, "targets", targets) + + @pytest.fixture(scope='session') def configuration_dir(tmpdir_factory, linux_os): """Copies mock configuration files in a temporary directory. Returns the diff --git a/lib/spack/spack/test/data/microarchitectures/microarchitectures.json b/lib/spack/spack/test/data/microarchitectures/microarchitectures.json new file mode 100644 index 0000000000..690d49ffdc --- /dev/null +++ b/lib/spack/spack/test/data/microarchitectures/microarchitectures.json @@ -0,0 +1,486 @@ +{ + "microarchitectures": { + "x86": { + "from": null, + "vendor": "generic", + "features": [] + }, + "i686": { + "from": "x86", + "vendor": "GenuineIntel", + "features": [] + }, + "pentium2": { + "from": "i686", + "vendor": "GenuineIntel", + "features": [ + "mmx" + ] + }, + "pentium3": { + "from": "pentium2", + "vendor": "GenuineIntel", + "features": [ + "mmx", + "sse" + ] + }, + "pentium4": { + "from": "pentium3", + "vendor": "GenuineIntel", + "features": [ + "mmx", + "sse", + "sse2" + ] + }, + "prescott": { + "from": "pentium4", + "vendor": "GenuineIntel", + "features": [ + "mmx", + "sse", + "sse2", + "sse3" + ] + }, + "x86_64": { + "from": null, + "vendor": "generic", + "features": [], + "compilers": { + "gcc": [ + { + "versions": "4.2.0:", + "name": "x86-64", + "flags": "-march={name} -mtune=generic" + }, + { + "versions": ":4.1.2", + "name": "x86-64", + "flags": "-march={name} -mtune={name}" + } + ], + "clang": [ + { + "versions": "0.0.0-apple:", + "name": "x86-64", + "flags": "-march={name}" + }, + { + "versions": ":", + "name": "x86-64", + "flags": "-march={name} -mtune=generic" + } + ], + "intel": { + "versions": ":", + "name": "pentium4", + "flags": "-march={name} -mtune=generic" + } + } + }, + "nocona": { + "from": "x86_64", + "vendor": "GenuineIntel", + "features": [ + "mmx", + "sse", + "sse2", + "sse3" + ], + "compilers": { + "gcc": { + "versions": "4.0.4:", + "flags": "-march={name} -mtune={name}" + }, + "clang": { + "versions": "3.9:", + "flags": "-march={name} -mtune={name}" + }, + "intel": { + "versions": "16.0:", + "name": "pentium4", + "flags": "-march={name} -mtune=generic" + } + } + }, + "core2": { + "from": "nocona", + "vendor": "GenuineIntel", + "features": [ + "mmx", + "sse", + "sse2", + "ssse3" + ], + "compilers": { + "gcc": { + "versions": "4.3.0:", + "flags": "-march={name} -mtune={name}" + }, + "clang": { + "versions": "3.9:", + "flags": "-march={name} -mtune={name}" + }, + "intel": { + "versions": "16.0:", + "flags": "-march={name} -mtune={name}}" + } + } + }, + "nehalem": { + "from": "core2", + "vendor": "GenuineIntel", + "features": [ + "mmx", + "sse", + "sse2", + "ssse3", + "sse4_1", + "sse4_2", + "popcnt" + ], + "compilers": { + "gcc": [ + { + "versions": "4.9:", + "flags": "-march={name} -mtune={name}" + }, + { + "versions": "4.6:4.8.5", + "name": "corei7", + "flags": "-march={name} -mtune={name}" + } + ], + "clang": { + "versions": "3.9:", + "flags": "-march={name} -mtune={name}" + }, + "intel": { + "versions": "16.0:", + "name": "corei7", + "flags": "-march={name} -mtune={name}" + } + } + }, + "westmere": { + "from": "nehalem", + "vendor": "GenuineIntel", + "features": [ + "mmx", + "sse", + "sse2", + "ssse3", + "sse4_1", + "sse4_2", + "popcnt", + "aes", + "pclmulqdq" + ], + "compilers": { + "gcc": { + "versions": "4.9:", + "flags": "-march={name} -mtune={name}" + }, + "clang": { + "versions": "3.9:", + "flags": "-march={name} -mtune={name}" + }, + "intel": { + "versions": "16.0:", + "name": "corei7", + "flags": "-march={name} -mtune={name}" + } + } + }, + "sandybridge": { + "from": "westmere", + "vendor": "GenuineIntel", + "features": [ + "mmx", + "sse", + "sse2", + "ssse3", + "sse4_1", + "sse4_2", + "popcnt", + "aes", + "pclmulqdq", + "avx" + ], + "compilers": { + "gcc": [ + { + "versions": "4.9:", + "flags": "-march={name} -mtune={name}" + }, + { + "versions": "4.6:4.8.5", + "name": "corei7-avx", + "flags": "-march={name} -mtune={name}" + } + ], + "clang": { + "versions": "3.9:", + "flags": "-march={name} -mtune={name}" + }, + "intel": [ + { + "versions": "16.0:17.9.0", + "name": "corei7-avx", + "flags": "-march={name} -mtune={name}" + }, + { + "versions": "18.0:", + "flags": "-march={name} -mtune={name}" + } + ] + } + }, + "ivybridge": { + "from": "sandybridge", + "vendor": "GenuineIntel", + "features": [ + "mmx", + "sse", + "sse2", + "ssse3", + "sse4_1", + "sse4_2", + "popcnt", + "aes", + "pclmulqdq", + "avx", + "rdrand", + "f16c" + ], + "compilers": { + "gcc": [ + { + "versions": "4.9:", + "flags": "-march={name} -mtune={name}" + }, + { + "versions": "4.6:4.8.5", + "name": "core-avx-i", + "flags": "-march={name} -mtune={name}" + } + ], + "clang": { + "versions": "3.9:", + "flags": "-march={name} -mtune={name}" + }, + "intel": [ + { + "versions": "16.0:17.9.0", + "name": "core-avx-i", + "flags": "-march={name} -mtune={name}" + }, + { + "versions": "18.0:", + "flags": "-march={name} -mtune={name}" + } + ] + } + }, + "haswell": { + "from": "ivybridge", + "vendor": "GenuineIntel", + "features": [ + "mmx", + "sse", + "sse2", + "ssse3", + "sse4_1", + "sse4_2", + "popcnt", + "aes", + "pclmulqdq", + "avx", + "rdrand", + "f16c", + "movbe", + "fma", + "avx2", + "bmi1", + "bmi2" + ], + "compilers": { + "gcc": [ + { + "versions": "4.9:", + "flags": "-march={name} -mtune={name}" + }, + { + "versions": "4.8:4.8.5", + "name": "core-avx2", + "flags": "-march={name} -mtune={name}" + } + ], + "clang": { + "versions": "3.9:", + "flags": "-march={name} -mtune={name}" + }, + "intel": [ + { + "versions": "16.0:17.9.0", + "name": "core-avx2", + "flags": "-march={name} -mtune={name}" + }, + { + "versions": "18.0:", + "flags": "-march={name} -mtune={name}" + } + ] + } + }, + "broadwell": { + "from": "haswell", + "vendor": "GenuineIntel", + "features": [ + "mmx", + "sse", + "sse2", + "ssse3", + "sse4_1", + "sse4_2", + "popcnt", + "aes", + "pclmulqdq", + "avx", + "rdrand", + "f16c", + "movbe", + "fma", + "avx2", + "bmi1", + "bmi2", + "rdseed", + "adx" + ], + "compilers": { + "gcc": { + "versions": "4.9:", + "flags": "-march={name} -mtune={name}" + }, + "clang": { + "versions": "3.9:", + "flags": "-march={name} -mtune={name}" + }, + "intel": { + "versions": "18.0:", + "flags": "-march={name} -mtune={name}" + } + } + }, + "skylake": { + "from": "broadwell", + "vendor": "GenuineIntel", + "features": [ + "mmx", + "sse", + "sse2", + "ssse3", + "sse4_1", + "sse4_2", + "popcnt", + "aes", + "pclmulqdq", + "avx", + "rdrand", + "f16c", + "movbe", + "fma", + "avx2", + "bmi1", + "bmi2", + "rdseed", + "adx", + "clflushopt", + "xsavec", + "xsaveopt" + ], + "compilers": { + "gcc": { + "versions": "6.0:", + "flags": "-march={name} -mtune={name}" + }, + "clang": { + "versions": "3.9:", + "flags": "-march={name} -mtune={name}" + }, + "intel": { + "versions": "18.0:", + "flags": "-march={name} -mtune={name}" + } + } + } + }, + "feature_aliases": { + "sse3": { + "reason": "ssse3 is a superset of sse3 and might be the only one listed", + "any_of": [ + "ssse3" + ] + }, + "avx512": { + "reason": "avx512 indicates generic support for any of the avx512 instruction sets", + "any_of": [ + "avx512f", + "avx512vl", + "avx512bw", + "avx512dq", + "avx512cd" + ] + }, + "fma": { + "reason": "FMA has been supported by PowerISA since Power1, but might not be listed in features", + "families": [ + "ppc64le", + "ppc64" + ] + }, + "sse4.1": { + "reason": "permits to refer to sse4_1 also as sse4.1", + "any_of": [ + "sse4_1" + ] + }, + "sse4.2": { + "reason": "permits to refer to sse4_2 also as sse4.2", + "any_of": [ + "sse4_2" + ] + } + }, + "conversions": { + "description": "Conversions that map some platform specific values to canonical values", + "arm_vendors": { + "0x41": "ARM", + "0x42": "Broadcom", + "0x43": "Cavium", + "0x44": "DEC", + "0x46": "Fujitsu", + "0x48": "HiSilicon", + "0x49": "Infineon Technologies AG", + "0x4d": "Motorola", + "0x4e": "Nvidia", + "0x50": "APM", + "0x51": "Qualcomm", + "0x53": "Samsung", + "0x56": "Marvell", + "0x61": "Apple", + "0x66": "Faraday", + "0x68": "HXT", + "0x69": "Intel" + }, + "darwin_flags": { + "sse4.1": "sse4_1", + "sse4.2": "sse4_2", + "avx1.0": "avx", + "clfsopt": "clflushopt", + "xsave": "xsavec xsaveopt" + } + } +} diff --git a/lib/spack/spack/test/spec_semantics.py b/lib/spack/spack/test/spec_semantics.py index 4d221378c7..330a1d7a0a 100644 --- a/lib/spack/spack/test/spec_semantics.py +++ b/lib/spack/spack/test/spec_semantics.py @@ -965,8 +965,8 @@ class TestSpecSematics(object): with pytest.raises(SpecError): spec.prefix - def test_forwarding_of_architecture_attributes(self): - spec = Spec('libelf').concretized() + def test_forwarding_of_architecture_attributes(self, mock_targets): + spec = Spec('libelf target=x86_64').concretized() # Check that we can still access each member through # the architecture attribute -- cgit v1.2.3-60-g2f50