Skip to content

Commit f2c9b6f

Browse files
authored
Merge pull request numpy#26219 from plctlab/enable_rvv
ENH: Enable RVV CPU feature detection
2 parents ab7649f + d1caa61 commit f2c9b6f

File tree

6 files changed

+56
-1
lines changed

6 files changed

+56
-1
lines changed

meson_cpu/main_config.h.in

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,4 +385,8 @@
385385
#ifdef @P@HAVE_NEON
386386
#include <arm_neon.h>
387387
#endif
388+
389+
#ifdef @P@HAVE_RVV
390+
#include <riscv_vector.h>
391+
#endif
388392
#endif // @P@_CPU_DISPATCHER_CONF_H_

meson_cpu/meson.build

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,14 @@ subdir('x86')
7575
subdir('ppc64')
7676
subdir('s390x')
7777
subdir('arm')
78+
subdir('riscv64')
7879

7980
CPU_FEATURES = {}
8081
CPU_FEATURES += ARM_FEATURES
8182
CPU_FEATURES += X86_FEATURES
8283
CPU_FEATURES += PPC64_FEATURES
8384
CPU_FEATURES += S390X_FEATURES
85+
CPU_FEATURES += RV64_FEATURES
8486

8587
# Parse the requested baseline (CPU_CONF_BASELINE) and dispatch features
8688
# (CPU_CONF_DISPATCH).
@@ -93,6 +95,7 @@ min_features = {
9395
's390x': [],
9496
'arm': [],
9597
'aarch64': [ASIMD],
98+
'riscv64': [],
9699
'wasm32': [],
97100
}.get(cpu_family, [])
98101
if host_machine.endian() == 'little' and cpu_family == 'ppc64'
@@ -107,6 +110,7 @@ max_features_dict = {
107110
's390x': S390X_FEATURES,
108111
'arm': ARM_FEATURES,
109112
'aarch64': ARM_FEATURES,
113+
'riscv64': RV64_FEATURES,
110114
'wasm32': {},
111115
}.get(cpu_family, {})
112116
max_features = []

meson_cpu/riscv64/meson.build

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
source_root = meson.project_source_root()
2+
mod_features = import('features')
3+
4+
RVV = mod_features.new(
5+
'RVV', 1, args: ['-march=rv64gcv'],
6+
test_code: files(source_root + '/numpy/distutils/checks/cpu_rvv.c')[0],
7+
)
8+
RV64_FEATURES = {'RVV': RVV}

numpy/_core/src/common/npy_cpu_features.c

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ static struct {
119119
{NPY_CPU_FEATURE_ASIMDHP, "ASIMDHP"},
120120
{NPY_CPU_FEATURE_ASIMDDP, "ASIMDDP"},
121121
{NPY_CPU_FEATURE_ASIMDFHM, "ASIMDFHM"},
122-
{NPY_CPU_FEATURE_SVE, "SVE"}};
122+
{NPY_CPU_FEATURE_SVE, "SVE"},
123+
{NPY_CPU_FEATURE_RVV, "RVV"}};
123124

124125

125126
NPY_VISIBILITY_HIDDEN PyObject *
@@ -813,6 +814,28 @@ npy__cpu_init_features(void)
813814
#endif
814815
}
815816

817+
/************** RISC-V 64 ***************/
818+
819+
#elif defined(__riscv) && __riscv_xlen == 64
820+
821+
#include <sys/auxv.h>
822+
823+
#ifndef HWCAP_RVV
824+
// https://github.com/torvalds/linux/blob/v6.8/arch/riscv/include/uapi/asm/hwcap.h#L24
825+
#define COMPAT_HWCAP_ISA_V (1 << ('V' - 'A'))
826+
#endif
827+
828+
static void
829+
npy__cpu_init_features(void)
830+
{
831+
memset(npy__cpu_have, 0, sizeof(npy__cpu_have[0]) * NPY_CPU_FEATURE_MAX);
832+
833+
unsigned int hwcap = getauxval(AT_HWCAP);
834+
if (hwcap & COMPAT_HWCAP_ISA_V) {
835+
npy__cpu_have[NPY_CPU_FEATURE_RVV] = 1;
836+
}
837+
}
838+
816839
/*********** Unsupported ARCH ***********/
817840
#else
818841
static void

numpy/_core/src/common/npy_cpu_features.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ enum npy_cpu_features
9898
// Vector-Enhancements Facility 2
9999
NPY_CPU_FEATURE_VXE2 = 352,
100100

101+
// RISC-V
102+
NPY_CPU_FEATURE_RVV = 400,
103+
101104
NPY_CPU_FEATURE_MAX
102105
};
103106

numpy/distutils/checks/cpu_rvv.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#ifndef __riscv_vector
2+
#error RVV not supported
3+
#endif
4+
5+
#include <riscv_vector.h>
6+
7+
int main(void)
8+
{
9+
size_t vlmax = __riscv_vsetvlmax_e32m1();
10+
vuint32m1_t a = __riscv_vmv_v_x_u32m1(0, vlmax);
11+
vuint32m1_t b = __riscv_vadd_vv_u32m1(a, a, vlmax);
12+
return __riscv_vmv_x_s_u32m1_u32(b);
13+
}

0 commit comments

Comments
 (0)