vendored externals: update archspec (#30683)
- Better support for 164fx - Better support for Apple M1(pro)
This commit is contained in:
parent
1185eb9199
commit
c775c322ec
2
lib/spack/external/__init__.py
vendored
2
lib/spack/external/__init__.py
vendored
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
* Homepage: https://pypi.python.org/pypi/archspec
|
* Homepage: https://pypi.python.org/pypi/archspec
|
||||||
* Usage: Labeling, comparison and detection of microarchitectures
|
* Usage: Labeling, comparison and detection of microarchitectures
|
||||||
* Version: 0.1.2 (commit 85757b6666422fca86aa882a769bf78b0f992f54)
|
* Version: 0.1.2 (commit 147942bd96219cf39e7001aef3644b43af76bdf6)
|
||||||
|
|
||||||
argparse
|
argparse
|
||||||
--------
|
--------
|
||||||
|
75
lib/spack/external/archspec/cpu/detect.py
vendored
75
lib/spack/external/archspec/cpu/detect.py
vendored
@ -61,7 +61,7 @@ def proc_cpuinfo():
|
|||||||
``/proc/cpuinfo``
|
``/proc/cpuinfo``
|
||||||
"""
|
"""
|
||||||
info = {}
|
info = {}
|
||||||
with open("/proc/cpuinfo") as file:
|
with open("/proc/cpuinfo") as file: # pylint: disable=unspecified-encoding
|
||||||
for line in file:
|
for line in file:
|
||||||
key, separator, value = line.partition(":")
|
key, separator, value = line.partition(":")
|
||||||
|
|
||||||
@ -80,26 +80,46 @@ def proc_cpuinfo():
|
|||||||
|
|
||||||
|
|
||||||
def _check_output(args, env):
|
def _check_output(args, env):
|
||||||
output = subprocess.Popen(args, stdout=subprocess.PIPE, env=env).communicate()[0]
|
output = subprocess.Popen( # pylint: disable=consider-using-with
|
||||||
|
args, stdout=subprocess.PIPE, env=env
|
||||||
|
).communicate()[0]
|
||||||
return six.text_type(output.decode("utf-8"))
|
return six.text_type(output.decode("utf-8"))
|
||||||
|
|
||||||
|
|
||||||
|
def _machine():
|
||||||
|
""" "Return the machine architecture we are on"""
|
||||||
|
operating_system = platform.system()
|
||||||
|
|
||||||
|
# If we are not on Darwin, trust what Python tells us
|
||||||
|
if operating_system != "Darwin":
|
||||||
|
return platform.machine()
|
||||||
|
|
||||||
|
# On Darwin it might happen that we are on M1, but using an interpreter
|
||||||
|
# built for x86_64. In that case "platform.machine() == 'x86_64'", so we
|
||||||
|
# need to fix that.
|
||||||
|
#
|
||||||
|
# See: https://bugs.python.org/issue42704
|
||||||
|
output = _check_output(
|
||||||
|
["sysctl", "-n", "machdep.cpu.brand_string"], env=_ensure_bin_usrbin_in_path()
|
||||||
|
).strip()
|
||||||
|
|
||||||
|
if "Apple" in output:
|
||||||
|
# Note that a native Python interpreter on Apple M1 would return
|
||||||
|
# "arm64" instead of "aarch64". Here we normalize to the latter.
|
||||||
|
return "aarch64"
|
||||||
|
|
||||||
|
return "x86_64"
|
||||||
|
|
||||||
|
|
||||||
@info_dict(operating_system="Darwin")
|
@info_dict(operating_system="Darwin")
|
||||||
def sysctl_info_dict():
|
def sysctl_info_dict():
|
||||||
"""Returns a raw info dictionary parsing the output of sysctl."""
|
"""Returns a raw info dictionary parsing the output of sysctl."""
|
||||||
# Make sure that /sbin and /usr/sbin are in PATH as sysctl is
|
child_environment = _ensure_bin_usrbin_in_path()
|
||||||
# usually found there
|
|
||||||
child_environment = dict(os.environ.items())
|
|
||||||
search_paths = child_environment.get("PATH", "").split(os.pathsep)
|
|
||||||
for additional_path in ("/sbin", "/usr/sbin"):
|
|
||||||
if additional_path not in search_paths:
|
|
||||||
search_paths.append(additional_path)
|
|
||||||
child_environment["PATH"] = os.pathsep.join(search_paths)
|
|
||||||
|
|
||||||
def sysctl(*args):
|
def sysctl(*args):
|
||||||
return _check_output(["sysctl"] + list(args), env=child_environment).strip()
|
return _check_output(["sysctl"] + list(args), env=child_environment).strip()
|
||||||
|
|
||||||
if platform.machine() == "x86_64":
|
if _machine() == "x86_64":
|
||||||
flags = (
|
flags = (
|
||||||
sysctl("-n", "machdep.cpu.features").lower()
|
sysctl("-n", "machdep.cpu.features").lower()
|
||||||
+ " "
|
+ " "
|
||||||
@ -125,6 +145,18 @@ def sysctl(*args):
|
|||||||
return info
|
return info
|
||||||
|
|
||||||
|
|
||||||
|
def _ensure_bin_usrbin_in_path():
|
||||||
|
# Make sure that /sbin and /usr/sbin are in PATH as sysctl is
|
||||||
|
# usually found there
|
||||||
|
child_environment = dict(os.environ.items())
|
||||||
|
search_paths = child_environment.get("PATH", "").split(os.pathsep)
|
||||||
|
for additional_path in ("/sbin", "/usr/sbin"):
|
||||||
|
if additional_path not in search_paths:
|
||||||
|
search_paths.append(additional_path)
|
||||||
|
child_environment["PATH"] = os.pathsep.join(search_paths)
|
||||||
|
return child_environment
|
||||||
|
|
||||||
|
|
||||||
def adjust_raw_flags(info):
|
def adjust_raw_flags(info):
|
||||||
"""Adjust the flags detected on the system to homogenize
|
"""Adjust the flags detected on the system to homogenize
|
||||||
slightly different representations.
|
slightly different representations.
|
||||||
@ -184,12 +216,7 @@ def compatible_microarchitectures(info):
|
|||||||
Args:
|
Args:
|
||||||
info (dict): dictionary containing information on the host cpu
|
info (dict): dictionary containing information on the host cpu
|
||||||
"""
|
"""
|
||||||
architecture_family = platform.machine()
|
architecture_family = _machine()
|
||||||
# On Apple M1 platform.machine() returns "arm64" instead of "aarch64"
|
|
||||||
# so we should normalize the name here
|
|
||||||
if architecture_family == "arm64":
|
|
||||||
architecture_family = "aarch64"
|
|
||||||
|
|
||||||
# If a tester is not registered, be conservative and assume no known
|
# If a tester is not registered, be conservative and assume no known
|
||||||
# target is compatible with the host
|
# target is compatible with the host
|
||||||
tester = COMPATIBILITY_CHECKS.get(architecture_family, lambda x, y: False)
|
tester = COMPATIBILITY_CHECKS.get(architecture_family, lambda x, y: False)
|
||||||
@ -244,12 +271,7 @@ def compatibility_check(architecture_family):
|
|||||||
architecture_family = (architecture_family,)
|
architecture_family = (architecture_family,)
|
||||||
|
|
||||||
def decorator(func):
|
def decorator(func):
|
||||||
# pylint: disable=fixme
|
COMPATIBILITY_CHECKS.update({family: func for family in architecture_family})
|
||||||
# TODO: on removal of Python 2.6 support this can be re-written as
|
|
||||||
# TODO: an update + a dict comprehension
|
|
||||||
for arch_family in architecture_family:
|
|
||||||
COMPATIBILITY_CHECKS[arch_family] = func
|
|
||||||
|
|
||||||
return func
|
return func
|
||||||
|
|
||||||
return decorator
|
return decorator
|
||||||
@ -288,7 +310,7 @@ def compatibility_check_for_x86_64(info, target):
|
|||||||
arch_root = TARGETS[basename]
|
arch_root = TARGETS[basename]
|
||||||
return (
|
return (
|
||||||
(target == arch_root or arch_root in target.ancestors)
|
(target == arch_root or arch_root in target.ancestors)
|
||||||
and (target.vendor == vendor or target.vendor == "generic")
|
and target.vendor in (vendor, "generic")
|
||||||
and target.features.issubset(features)
|
and target.features.issubset(features)
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -303,8 +325,9 @@ def compatibility_check_for_aarch64(info, target):
|
|||||||
arch_root = TARGETS[basename]
|
arch_root = TARGETS[basename]
|
||||||
return (
|
return (
|
||||||
(target == arch_root or arch_root in target.ancestors)
|
(target == arch_root or arch_root in target.ancestors)
|
||||||
and (target.vendor == vendor or target.vendor == "generic")
|
and target.vendor in (vendor, "generic")
|
||||||
and target.features.issubset(features)
|
# On macOS it seems impossible to get all the CPU features with syctl info
|
||||||
|
and (target.features.issubset(features) or platform.system() == "Darwin")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
4
lib/spack/external/archspec/cpu/schema.py
vendored
4
lib/spack/external/archspec/cpu/schema.py
vendored
@ -11,7 +11,7 @@
|
|||||||
try:
|
try:
|
||||||
from collections.abc import MutableMapping # novm
|
from collections.abc import MutableMapping # novm
|
||||||
except ImportError:
|
except ImportError:
|
||||||
from collections import MutableMapping
|
from collections import MutableMapping # pylint: disable=deprecated-class
|
||||||
|
|
||||||
|
|
||||||
class LazyDictionary(MutableMapping):
|
class LazyDictionary(MutableMapping):
|
||||||
@ -56,7 +56,7 @@ def _load_json_file(json_file):
|
|||||||
|
|
||||||
def _factory():
|
def _factory():
|
||||||
filename = os.path.join(json_dir, json_file)
|
filename = os.path.join(json_dir, json_file)
|
||||||
with open(filename, "r") as file:
|
with open(filename, "r") as file: # pylint: disable=unspecified-encoding
|
||||||
return json.load(file)
|
return json.load(file)
|
||||||
|
|
||||||
return _factory
|
return _factory
|
||||||
|
@ -1788,7 +1788,6 @@
|
|||||||
"fp",
|
"fp",
|
||||||
"asimd",
|
"asimd",
|
||||||
"evtstrm",
|
"evtstrm",
|
||||||
"aes",
|
|
||||||
"pmull",
|
"pmull",
|
||||||
"sha1",
|
"sha1",
|
||||||
"sha2",
|
"sha2",
|
||||||
@ -1821,18 +1820,26 @@
|
|||||||
"flags": "-march=armv8.2-a+crc+crypto+fp16"
|
"flags": "-march=armv8.2-a+crc+crypto+fp16"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"versions": "8:",
|
"versions": "8:10.2",
|
||||||
"flags": "-march=armv8.2-a+crc+aes+sha2+fp16+sve -msve-vector-bits=512"
|
"flags": "-march=armv8.2-a+crc+sha2+fp16+sve -msve-vector-bits=512"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"versions": "10.3:",
|
||||||
|
"flags": "-mcpu=a64fx -msve-vector-bits=512"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"clang": [
|
"clang": [
|
||||||
{
|
{
|
||||||
"versions": "3.9:4.9",
|
"versions": "3.9:4.9",
|
||||||
"flags": "-march=armv8.2-a+crc+crypto+fp16"
|
"flags": "-march=armv8.2-a+crc+sha2+fp16"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"versions": "5:",
|
"versions": "5:10",
|
||||||
"flags": "-march=armv8.2-a+crc+crypto+fp16+sve"
|
"flags": "-march=armv8.2-a+crc+sha2+fp16+sve"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"versions": "11:",
|
||||||
|
"flags": "-mcpu=a64fx"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"arm": [
|
"arm": [
|
||||||
@ -1954,7 +1961,40 @@
|
|||||||
"m1": {
|
"m1": {
|
||||||
"from": ["aarch64"],
|
"from": ["aarch64"],
|
||||||
"vendor": "Apple",
|
"vendor": "Apple",
|
||||||
"features": [],
|
"features": [
|
||||||
|
"fp",
|
||||||
|
"asimd",
|
||||||
|
"evtstrm",
|
||||||
|
"aes",
|
||||||
|
"pmull",
|
||||||
|
"sha1",
|
||||||
|
"sha2",
|
||||||
|
"crc32",
|
||||||
|
"atomics",
|
||||||
|
"fphp",
|
||||||
|
"asimdhp",
|
||||||
|
"cpuid",
|
||||||
|
"asimdrdm",
|
||||||
|
"jscvt",
|
||||||
|
"fcma",
|
||||||
|
"lrcpc",
|
||||||
|
"dcpop",
|
||||||
|
"sha3",
|
||||||
|
"asimddp",
|
||||||
|
"sha512",
|
||||||
|
"asimdfhm",
|
||||||
|
"dit",
|
||||||
|
"uscat",
|
||||||
|
"ilrcpc",
|
||||||
|
"flagm",
|
||||||
|
"ssbs",
|
||||||
|
"sb",
|
||||||
|
"paca",
|
||||||
|
"pacg",
|
||||||
|
"dcpodp",
|
||||||
|
"flagm2",
|
||||||
|
"frint"
|
||||||
|
],
|
||||||
"compilers": {
|
"compilers": {
|
||||||
"gcc": [
|
"gcc": [
|
||||||
{
|
{
|
||||||
@ -1964,14 +2004,22 @@
|
|||||||
],
|
],
|
||||||
"clang" : [
|
"clang" : [
|
||||||
{
|
{
|
||||||
"versions": "9.0:",
|
"versions": "9.0:12.0",
|
||||||
"flags" : "-march=armv8.4-a"
|
"flags" : "-march=armv8.4-a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"versions": "13.0:",
|
||||||
|
"flags" : "-mcpu=apple-m1"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"apple-clang": [
|
"apple-clang": [
|
||||||
{
|
{
|
||||||
"versions": "11.0:",
|
"versions": "11.0:12.5",
|
||||||
"flags" : "-march=armv8.4-a"
|
"flags" : "-march=armv8.4-a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"versions": "13.0:",
|
||||||
|
"flags" : "-mcpu=apple-m1"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user