Skip to content

Commit e9376e8

Browse files
authored
fix POWER VSX feature detection using platform inference
Update features map and load_flags method for POWER architecture detection.
1 parent 4f671d8 commit e9376e8

1 file changed

Lines changed: 33 additions & 2 deletions

File tree

numpy/_core/tests/test_cpu_features.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -387,11 +387,42 @@ def load_flags(self):
387387
@pytest.mark.skipif(not is_linux or not is_power, reason="Only for Linux and Power")
388388
class Test_POWER_Features(AbstractTest):
389389
features = ["VSX", "VSX2", "VSX3", "VSX4"]
390-
features_map = { "VSX": "ARCH_2_06", "VSX2": "ARCH_2_07", "VSX3": "ARCH_3_00", "VSX4": "ARCH_3_1"}
390+
features_map = {
391+
"VSX": "ARCH_2_06",
392+
"VSX2": "ARCH_2_07",
393+
"VSX3": "ARCH_3_00",
394+
"VSX4": "ARCH_3_1B"
395+
}
391396

392397
def load_flags(self):
393398
self.load_flags_auxv()
394-
self.features_flags.add("ARCH_2_06")
399+
platform = self._get_platform()
400+
401+
if platform:
402+
power_match = re.search(r'power(\d+)', platform, re.IGNORECASE)
403+
if power_match:
404+
power_gen = int(power_match.group(1))
405+
if power_gen >= 7:
406+
self.features_flags.add("ARCH_2_06")
407+
if power_gen >= 8:
408+
self.features_flags.add("ARCH_2_07")
409+
if power_gen >= 9:
410+
self.features_flags.add("ARCH_3_00")
411+
if power_gen >= 10:
412+
self.features_flags.add("ARCH_3_1B")
413+
414+
def _get_platform(self):
415+
"""Get the AT_PLATFORM value from AUXV"""
416+
try:
417+
auxv = subprocess.check_output(['/bin/true'], env={"LD_SHOW_AUXV": "1"})
418+
for line in auxv.split(b'\n'):
419+
if line.startswith(b'AT_PLATFORM'):
420+
parts = line.split(b':', 1)
421+
if len(parts) == 2:
422+
return parts[1].strip().decode().lower()
423+
except Exception:
424+
pass
425+
return None
395426

396427

397428
is_zarch = re.match(r"^(s390x)", machine, re.IGNORECASE)

0 commit comments

Comments
 (0)