/
_simd.c
95 lines (88 loc) · 4.29 KB
/
_simd.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "_simd.h"
#include "numpy/npy_math.h"
static PyObject *
get_floatstatus(PyObject* NPY_UNUSED(self), PyObject *NPY_UNUSED(args))
{
return PyLong_FromLong(npy_get_floatstatus());
}
static PyObject *
clear_floatstatus(PyObject* NPY_UNUSED(self), PyObject *NPY_UNUSED(args))
{
npy_clear_floatstatus();
Py_RETURN_NONE;
}
static PyMethodDef _simd_methods[] = {
{"get_floatstatus", get_floatstatus, METH_NOARGS, NULL},
{"clear_floatstatus", clear_floatstatus, METH_NOARGS, NULL},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC PyInit__simd(void)
{
static struct PyModuleDef defs = {
.m_base = PyModuleDef_HEAD_INIT,
.m_name = "numpy.core._simd",
.m_size = -1,
.m_methods = _simd_methods
};
if (npy_cpu_init() < 0) {
return NULL;
}
PyObject *m = PyModule_Create(&defs);
if (m == NULL) {
return NULL;
}
PyObject *targets = PyDict_New();
if (targets == NULL) {
goto err;
}
if (PyModule_AddObject(m, "targets", targets) < 0) {
Py_DECREF(targets);
goto err;
}
// add keys for non-supported optimizations with None value
#define ATTACH_MODULE(TESTED_FEATURES, TARGET_NAME, MAKE_MSVC_HAPPY) \
{ \
PyObject *simd_mod; \
if (!TESTED_FEATURES) { \
Py_INCREF(Py_None); \
simd_mod = Py_None; \
} else { \
simd_mod = NPY_CAT(simd_create_module_, TARGET_NAME)(); \
if (simd_mod == NULL) { \
goto err; \
} \
} \
const char *target_name = NPY_TOSTRING(TARGET_NAME); \
if (PyDict_SetItemString(targets, target_name, simd_mod) < 0) { \
Py_DECREF(simd_mod); \
goto err; \
} \
Py_INCREF(simd_mod); \
if (PyModule_AddObject(m, target_name, simd_mod) < 0) { \
Py_DECREF(simd_mod); \
goto err; \
} \
}
#define ATTACH_BASELINE_MODULE(MAKE_MSVC_HAPPY) \
{ \
PyObject *simd_mod = simd_create_module(); \
if (simd_mod == NULL) { \
goto err; \
} \
if (PyDict_SetItemString(targets, "baseline", simd_mod) < 0) { \
Py_DECREF(simd_mod); \
goto err; \
} \
Py_INCREF(simd_mod); \
if (PyModule_AddObject(m, "baseline", simd_mod) < 0) { \
Py_DECREF(simd_mod); \
goto err; \
} \
}
NPY__CPU_DISPATCH_CALL(NPY_CPU_HAVE, ATTACH_MODULE, MAKE_MSVC_HAPPY)
NPY__CPU_DISPATCH_BASELINE_CALL(ATTACH_BASELINE_MODULE, MAKE_MSVC_HAPPY)
return m;
err:
Py_DECREF(m);
return NULL;
}