summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUbuntu <ubuntu@ip-172-31-17-195.eu-west-3.compute.internal>2022-03-05 17:49:26 +0000
committerUbuntu <ubuntu@ip-172-31-17-195.eu-west-3.compute.internal>2022-03-05 17:49:26 +0000
commita45f0a9d6bacee372161a007f2f1a0b2ffe05f81 (patch)
tree60d665e51772e9d632493a93ff0d55ae1adb64e4
parentdd33ee3926fb8294c5ad810e7f63043888ae7170 (diff)
downloadnumpy-a45f0a9d6bacee372161a007f2f1a0b2ffe05f81.tar.gz
ENH: even faster numpy.where using loop unrolling (better ILP)
-rw-r--r--numpy/core/src/multiarray/item_selection.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/numpy/core/src/multiarray/item_selection.c b/numpy/core/src/multiarray/item_selection.c
index 1074eb2bd..a0fd0a574 100644
--- a/numpy/core/src/multiarray/item_selection.c
+++ b/numpy/core/src/multiarray/item_selection.c
@@ -2649,6 +2649,19 @@ PyArray_Nonzero(PyArrayObject *self)
npy_intp * multi_index_end = multi_index + nonzero_count;
npy_intp j = 0;
+ while (multi_index + 4 < multi_index_end) {
+ *multi_index = j;
+ multi_index += data[0] != 0;
+ *multi_index = j + 1;
+ multi_index += data[stride] != 0;
+ *multi_index = j + 2;
+ multi_index += data[stride * 2] != 0;
+ *multi_index = j + 3;
+ multi_index += data[stride * 3] != 0;
+ data += stride * 4;
+ j += 4;
+ }
+
while (multi_index < multi_index_end) {
*multi_index = j;
multi_index += *data != 0;