8000 Merge pull request #16782 from seiko2plus/implement_npyv_pymod · numpy/numpy@8829b80 · GitHub
[go: up one dir, main page]

Skip to content

Commit 8829b80

Browse files
authored
Merge pull request #16782 from seiko2plus/implement_npyv_pymod
ENH, TST: Bring the NumPy C SIMD vectorization interface "NPYV" to Python
2 parents 43683b3 + ac4ffe1 commit 8829b80

17 files changed

+2549
-6
lines changed

.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ doc/release/*.rst merge=union
77
# Highlight our custom templating language as C, since it's hopefully better
88
# than nothing. This also affects repo statistics.
99
*.c.src linguist-language=C
10+
*.inc.src linguist-language=C
1011
*.h.src linguist-language=C
1112

1213
# Mark some files as vendored

numpy/core/setup.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,7 @@ def generate_api(ext, build_dir):
626626
config.add_include_dirs(join('src', 'multiarray'))
627627
config.add_include_dirs(join('src', 'umath'))
628628
config.add_include_dirs(join('src', 'npysort'))
629+
config.add_include_dirs(join('src', '_simd'))
629630

630631
config.add_define_macros([("NPY_INTERNAL_BUILD", "1")]) # this macro indicates that Numpy build is in process
631632
config.add_define_macros([("HAVE_NPY_CONFIG_H", "1")])
@@ -974,6 +975,28 @@ def generate_umath_c(ext, build_dir):
974975
config.add_extension('_operand_flag_tests',
975976
sources=[join('src', 'umath', '_operand_flag_tests.c.src')])
976977

978+
#######################################################################
979+
# SIMD module #
980+
#######################################################################
981+
982+
config.add_extension('_simd', sources=[
983+
join('src', 'common', 'npy_cpu_features.c.src'),
984+
join('src', '_simd', '_simd.c'),
985+
join('src', '_simd', '_simd_inc.h.src'),
986+
join('src', '_simd', '_simd_data.inc.src'),
987+
join('src', '_simd', '_simd.dispatch.c.src'),
988+
], depends=[
989+
join('src', 'common', 'npy_cpu_dispatch.h'),
990+
join('src', 'common', 'simd', 'simd.h'),
991+
join('src', '_simd', '_simd.h'),
992+
join('src', '_simd', '_simd_inc.h.src'),
993+
join('src', '_simd', '_simd_data.inc.src'),
994+
join('src', '_simd', '_simd_arg.inc'),
995+
join('src', '_simd', '_simd_convert.inc'),
996+
join('src', '_simd', '_simd_easyintrin.inc'),
997+
join('src', '_simd', '_simd_vector.inc'),
998+
])
999+
9771000
config.add_subpackage('tests')
9781001
config.add_data_dir('tests/data')
9791002
config.add_data_dir('tests/examples')

numpy/core/src/_simd/_simd.c

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#include "_simd.h"
2+
3+
PyMODINIT_FUNC PyInit__simd(void)
4+
{
5+
static struct PyModuleDef defs = {
6+
.m_base = PyModuleDef_HEAD_INIT,
7+
.m_name = "numpy.core._simd",
8+
.m_size = -1
9+
};
10+
if (npy_cpu_init() < 0) {
11+
return NULL;
12+
}
13+
PyObject *m = PyModule_Create(&defs);
14+
if (m == NULL) {
15+
return NULL;
16+
}
17+
PyObject *targets = PyDict_New();
18+
if (targets == NULL) {
19+
goto err;
20+
}
21+
if (PyModule_AddObject(m, "targets", targets) < 0) {
22+
Py_DECREF(targets);
23+
goto err;
24+
}
25+
// add keys for non-supported optimizations with None value
26+
#define ATTACH_MODULE(TESTED_FEATURES, TARGET_NAME, MAKE_MSVC_HAPPY) \
27+
{ \
28+
PyObject *simd_mod; \
29+
if (!TESTED_FEATURES) { \
30+
Py_INCREF(Py_None); \
31+
simd_mod = Py_None; \
32+
} else { \
33+
simd_mod = NPY_CAT(simd_create_module_, TARGET_NAME)(); \
34+
if (simd_mod == NULL) { \
35+
goto err; \
36+
} \
37+
} \
38+
const char *target_name = NPY_TOSTRING(TARGET_NAME); \
39+
if (PyDict_SetItemString(targets, target_name, simd_mod) < 0) { \
40+
Py_DECREF(simd_mod); \
41+
goto err; \
42+
} \
43+
Py_INCREF(simd_mod); \
44+
if (PyModule_AddObject(m, target_name, simd_mod) < 0) { \
45+
Py_DECREF(simd_mod); \
46+
goto err; \
47+
} \
48+
}
49+
50+
#define ATTACH_BASELINE_MODULE(MAKE_MSVC_HAPPY) \
51+
{ \
52+
PyObject *simd_mod = simd_create_module(); \
53+
if (simd_mod == NULL) { \
54+
goto err; \
55+
} \
56+
if (PyDict_SetItemString(targets, "baseline", simd_mod) < 0) { \
57+
Py_DECREF(simd_mod); \
58+
goto err; \
59+
} \
60+
Py_INCREF(simd_mod); \
61+
if (PyModule_AddObject(m, "baseline", simd_mod) < 0) { \
62+
Py_DECREF(simd_mod); \
63+
goto err; \
64+
} \
65+
}
66+
67+
NPY__CPU_DISPATCH_CALL(NPY_CPU_HAVE, ATTACH_MODULE, MAKE_MSVC_HAPPY)
68+
NPY__CPU_DISPATCH_BASELINE_CALL(ATTACH_BASELINE_MODULE, MAKE_MSVC_HAPPY)
69+
return m;
70+
err:
71+
Py_DECREF(m);
72+
return NULL;
73+
}

0 commit comments

Comments
 (0)
0