Skip to content

Commit c47e5ff

Browse files
committed
ENG, SIMD: Dispatch bool (invert, add, fmax, fmin...)
Following functions are defined by umath generator to enable runtime dispatching without the need to redefine them within dsipatch-able sources: BOOL_invert, BOOL_add, BOOL_bitwise_and BOOL_bitwise_or, BOOL_logical_xor BOOL_bitwise_xor, BOOL_multiply BOOL_maximum, BOOL_minimum, BOOL_fmax, BOOL_fmin
1 parent 0609a34 commit c47e5ff

File tree

2 files changed

+61
-34
lines changed

2 files changed

+61
-34
lines changed

numpy/core/code_generators/generate_umath.py

+43-21
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,8 @@ def english_upper(s):
246246
'P': 'OBJECT',
247247
}
248248

249-
noobj = '?bBhHiIlLqQefdgFDGmM'
249+
no_obj_bool = 'bBhHiIlLqQefdgFDGmM'
250+
noobj = '?' + no_obj_bool
250251
all = '?bBhHiIlLqQefdgFDGOmM'
251252

252253
O = 'O'
@@ -280,6 +281,7 @@ def english_upper(s):
280281
nocmplxP = nocmplx+P
281282
notimes_or_obj = bints + inexact
282283
nodatetime_or_obj = bints + inexact
284+
no_bool_times_obj = ints + inexact
283285

284286
# Find which code corresponds to int64.
285287
int64 = ''
@@ -299,7 +301,9 @@ def english_upper(s):
299301
Ufunc(2, 1, Zero,
300302
docstrings.get('numpy.core.umath.add'),
301303
'PyUFunc_AdditionTypeResolver',
302-
TD(notimes_or_obj, simd=[('avx2', ints)], dispatch=[('loops_arithm_fp', 'fdFD')]),
304+
TD('?', cfunc_alias='logical_or', dispatch=[('loops_logical', '?')]),
305+
TD(no_bool_times_obj, simd=[('avx2', ints)],
306+
dispatch=[('loops_arithm_fp', 'fdFD')]),
303307
[TypeDescription('M', FullTypeDescr, 'Mm', 'M'),
304308
TypeDescription('m', FullTypeDescr, 'mm', 'm'),
305309
TypeDescription('M', FullTypeDescr, 'mM', 'M'),
@@ -310,7 +314,8 @@ def english_upper(s):
310314
Ufunc(2, 1, None, # Zero is only a unit to the right, not the left
311315
docstrings.get('numpy.core.umath.subtract'),
312316
'PyUFunc_SubtractionTypeResolver',
313-
TD(ints + inexact, simd=[('avx2', ints)], dispatch=[('loops_arithm_fp', 'fdFD')]),
317+
TD(no_bool_times_obj, simd=[('avx2', ints)],
318+
dispatch=[('loops_arithm_fp', 'fdFD')]),
314319
[TypeDescription('M', FullTypeDescr, 'Mm', 'M'),
315320
TypeDescription('m', FullTypeDescr, 'mm', 'm'),
316321
TypeDescription('M', FullTypeDescr, 'MM', 'm'),
@@ -321,7 +326,10 @@ def english_upper(s):
321326
Ufunc(2, 1, One,
322327
docstrings.get('numpy.core.umath.multiply'),
323328
'PyUFunc_MultiplicationTypeResolver',
324-
TD(notimes_or_obj, simd=[('avx2', ints)], dispatch=[('loops_arithm_fp', 'fdFD')]),
329+
TD('?', cfunc_alias='logical_and',
330+
dispatch=[('loops_logical', '?')]),
331+
TD(no_bool_times_obj, simd=[('avx2', ints)],
332+
dispatch=[('loops_arithm_fp', 'fdFD')]),
325333
[TypeDescription('m', FullTypeDescr, 'mq', 'm'),
326334
TypeDescription('m', FullTypeDescr, 'qm', 'm'),
327335
TypeDescription('m', FullTypeDescr, 'md', 'm'),
@@ -412,8 +420,8 @@ def english_upper(s):
412420
Ufunc(1, 1, None,
413421
docstrings.get('numpy.core.umath.absolute'),
414422
'PyUFunc_AbsoluteTypeResolver',
415-
TD(bints+flts+timedeltaonly, dispatch=[('loops_unary_fp', 'fd')]),
416-
TD('?', dispatch=[('loops_logical', '?')]),
423+
TD(bints+flts+timedeltaonly, dispatch=[('loops_unary_fp', 'fd'),
424+
('loops_logical', '?')]),
417425
TD(cmplx, simd=[('avx512f', cmplxvec)], out=('f', 'd', 'g')),
418426
TD(O, f='PyNumber_Absolute'),
419427
),
@@ -497,46 +505,51 @@ def english_upper(s):
497505
Ufunc(2, 1, True_,
498506
docstrings.get('numpy.core.umath.logical_and'),
499507
'PyUFunc_SimpleBinaryComparisonTypeResolver',
500-
TD('?', dispatch=[('loops_logical', '?')]),
501-
TD(nodatetime_or_obj, out='?', simd=[('avx2', ints)]),
508+
TD(nodatetime_or_obj, out='?', simd=[('avx2', ints)],
509+
dispatch=[('loops_logical', '?')]),
502510
TD(O, f='npy_ObjectLogicalAnd'),
503511
),
504512
'logical_not':
505513
Ufunc(1, 1, None,
506514
docstrings.get('numpy.core.umath.logical_not'),
507515
None,
508-
TD('?', dispatch=[('loops_logical', '?')]),
509-
TD(nodatetime_or_obj, out='?', simd=[('avx2', ints)]),
516+
TD(nodatetime_or_obj, out='?', simd=[('avx2', ints)],
517+
dispatch=[('loops_logical', '?')]),
510518
TD(O, f='npy_ObjectLogicalNot'),
511519
),
512520
'logical_or':
513521
Ufunc(2, 1, False_,
514522
docstrings.get('numpy.core.umath.logical_or'),
515523
'PyUFunc_SimpleBinaryComparisonTypeResolver',
516-
TD('?', dispatch=[('loops_logical', '?')]),
517-
TD(nodatetime_or_obj, out='?', simd=[('avx2', ints)]),
524+
TD(nodatetime_or_obj, out='?', simd=[('avx2', ints)],
525+
dispatch=[('loops_logical', '?')]),
518526
TD(O, f='npy_ObjectLogicalOr'),
519527
),
520528
'logical_xor':
521529
Ufunc(2, 1, False_,
522530
docstrings.get('numpy.core.umath.logical_xor'),
523531
'PyUFunc_SimpleBinaryComparisonTypeResolver',
524-
TD(nodatetime_or_obj, out='?'),
532+
TD('?', out='?', cfunc_alias='not_equal',
533+
dispatch=[('loops_comparison', '?')]),
534+
TD(no_bool_times_obj, out='?'),
525535
# TODO: using obj.logical_xor() seems pretty much useless:
526536
TD(P, f='logical_xor'),
527537
),
528538
'maximum':
529539
Ufunc(2, 1, ReorderableNone,
530540
docstrings.get('numpy.core.umath.maximum'),
531541
'PyUFunc_SimpleUniformOperationTypeResolver',
532-
TD(noobj, dispatch=[('loops_minmax', ints+'fdg')]),
542+
TD('?', cfunc_alias='logical_or', dispatch=[('loops_logical', '?')]),
543+
TD(no_obj_bool, dispatch=[('loops_minmax', ints+'fdg')]),
533544
TD(O, f='npy_ObjectMax')
534545
),
535546
'minimum':
536547
Ufunc(2, 1, ReorderableNone,
537548
docstrings.get('numpy.core.umath.minimum'),
538549
'PyUFunc_SimpleUniformOperationTypeResolver',
539-
TD(noobj, dispatch=[('loops_minmax', ints+'fdg')]),
550+
TD('?', cfunc_alias='logical_and',
551+
dispatch=[('loops_logical', '?')]),
552+
TD(no_obj_bool, dispatch=[('loops_minmax', ints+'fdg')]),
540553
TD(O, f='npy_ObjectMin')
541554
),
542555
'clip':
@@ -550,14 +563,17 @@ def english_upper(s):
550563
Ufunc(2, 1, ReorderableNone,
551564
docstrings.get('numpy.core.umath.fmax'),
552565
'PyUFunc_SimpleUniformOperationTypeResolver',
553-
TD(noobj, dispatch=[('loops_minmax', 'fdg')]),
566+
TD('?', cfunc_alias='logical_or', dispatch=[('loops_logical', '?')]),
567+
TD(no_obj_bool, dispatch=[('loops_minmax', 'fdg')]),
554568
TD(O, f='npy_ObjectMax')
555569
),
556570
'fmin':
557571
Ufunc(2, 1, ReorderableNone,
558572
docstrings.get('numpy.core.umath.fmin'),
559573
'PyUFunc_SimpleUniformOperationTypeResolver',
560-
TD(noobj, dispatch=[('loops_minmax', 'fdg')]),
574+
TD('?', cfunc_alias='logical_and',
575+
dispatch=[('loops_logical', '?')]),
576+
TD(no_obj_bool, dispatch=[('loops_minmax', 'fdg')]),
561577
TD(O, f='npy_ObjectMin')
562578
),
563579
'logaddexp':
@@ -576,28 +592,34 @@ def english_upper(s):
576592
Ufunc(2, 1, AllOnes,
577593
docstrings.get('numpy.core.umath.bitwise_and'),
578594
None,
579-
TD(bints, simd=[('avx2', ints)]),
595+
TD('?', cfunc_alias='logical_and',
596+
dispatch=[('loops_logical', '?')]),
597+
TD(ints, simd=[('avx2', ints)]),
580598
TD(O, f='PyNumber_And'),
581599
),
582600
'bitwise_or':
583601
Ufunc(2, 1, Zero,
584602
docstrings.get('numpy.core.umath.bitwise_or'),
585603
None,
586-
TD(bints, simd=[('avx2', ints)]),
604+
TD('?', cfunc_alias='logical_or', dispatch=[('loops_logical', '?')]),
605+
TD(ints, simd=[('avx2', ints)]),
587606
TD(O, f='PyNumber_Or'),
588607
),
589608
'bitwise_xor':
590609
Ufunc(2, 1, Zero,
591610
docstrings.get('numpy.core.umath.bitwise_xor'),
592611
None,
593-
TD(bints, simd=[('avx2', ints)]),
612+
TD('?', cfunc_alias='not_equal', dispatch=[('loops_comparison', '?')]),
613+
TD(ints, simd=[('avx2', ints)]),
594614
TD(O, f='PyNumber_Xor'),
595615
),
596616
'invert':
597617
Ufunc(1, 1, None,
598618
docstrings.get('numpy.core.umath.invert'),
599619
None,
600-
TD(bints, simd=[('avx2', ints)]),
620+
TD('?', cfunc_alias='logical_not',
621+
dispatch=[('loops_logical', '?')]),
622+
TD(ints, simd=[('avx2', ints)]),
601623
TD(O, f='PyNumber_Invert'),
602624
),
603625
'left_shift':

numpy/core/src/umath/loops.h.src

+18-13
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,29 @@
1010
#define NPY_NO_EXPORT NPY_VISIBILITY_HIDDEN
1111
#endif
1212

13-
#define BOOL_invert BOOL_logical_not
14-
#define BOOL_add BOOL_logical_or
15-
#define BOOL_bitwise_and BOOL_logical_and
16-
#define BOOL_bitwise_or BOOL_logical_or
17-
#define BOOL_logical_xor BOOL_not_equal
18-
#define BOOL_bitwise_xor BOOL_logical_xor
19-
#define BOOL_multiply BOOL_logical_and
20-
#define BOOL_maximum BOOL_logical_or
21-
#define BOOL_minimum BOOL_logical_and
22-
#define BOOL_fmax BOOL_maximum
23-
#define BOOL_fmin BOOL_minimum
24-
2513
/*
2614
*****************************************************************************
2715
** BOOLEAN LOOPS **
2816
*****************************************************************************
2917
*/
3018

19+
/*
20+
* Following functions are defined by umath generator
21+
* to enable runtime dispatching without the need
22+
* to redefine them within dsipatch-able sources.
23+
*/
24+
// #define BOOL_invert BOOL_logical_not
25+
// #define BOOL_add BOOL_logical_or
26+
// #define BOOL_bitwise_and BOOL_logical_and
27+
// #define BOOL_bitwise_or BOOL_logical_or
28+
// #define BOOL_logical_xor BOOL_not_equal
29+
// #define BOOL_bitwise_xor BOOL_logical_xor
30+
// #define BOOL_multiply BOOL_logical_and
31+
// #define BOOL_maximum BOOL_logical_or
32+
// #define BOOL_minimum BOOL_logical_and
33+
// #define BOOL_fmax BOOL_maximum
34+
// #define BOOL_fmin BOOL_minimum
35+
3136
#ifndef NPY_DISABLE_OPTIMIZATION
3237
#include "loops_comparison.dispatch.h"
3338
#endif
@@ -207,7 +212,7 @@ NPY_NO_EXPORT void
207212

208213
/**end repeat**/
209214

210-
215+
211216
#ifndef NPY_DISABLE_OPTIMIZATION
212217
#include "loops_unary.dispatch.h"
213218
#endif

0 commit comments

Comments
 (0)