Skip to content

Commit e0a666e

Browse files
author
Vahid Tavanashad
committed
address comments
1 parent 495a300 commit e0a666e

File tree

1 file changed

+28
-5
lines changed

1 file changed

+28
-5
lines changed

mkl_umath/src/mkl_umath_loops.c.src

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -316,12 +316,13 @@ mkl_umath_@TYPE@_exp(char **args, const npy_intp *dimensions, const npy_intp *st
316316
can_vectorize
317317
,
318318
const @type@ in1 = *(@type@ *)ip1;
319-
ignore_fpstatus |= ((in1 == -NPY_INFINITY@A@) ? 1 : 0);
319+
const int invalid_cases = npy_isnan(in1) || in1 == NPY_INFINITY || in1 == -NPY_INFINITY;
320+
ignore_fpstatus |= (invalid_cases ? 1 : 0);
320321
*(@type@ *)op1 = @scalarf@(in1);
321-
)
322+
)
322323
}
323324
if(ignore_fpstatus) {
324-
feclearexcept(FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW | FE_INVALID);
325+
feclearexcept(FE_OVERFLOW | FE_UNDERFLOW | FE_INVALID);
325326
}
326327
}
327328

@@ -341,8 +342,10 @@ mkl_umath_@TYPE@_exp2(char **args, const npy_intp *dimensions, const npy_intp *s
341342
const int contig = IS_UNARY_CONT(@type@, @type@);
342343
const int disjoint_or_same = DISJOINT_OR_SAME(args[0], args[1], dimensions[0], sizeof(@type@));
343344
const int can_vectorize = contig && disjoint_or_same;
345+
int ignore_fpstatus = 0;
344346

345347
if(can_vectorize && dimensions[0] > VML_TRANSCEDENTAL_THRESHOLD) {
348+
ignore_fpstatus = 1;
346349
CHUNKED_VML_CALL2(v@c@Exp2, dimensions[0], @type@, args[0], args[1]);
347350
/* v@c@Exp2(dimensions[0], (@type@*) args[0], (@type@*) args[1]); */
348351
} else {
@@ -352,9 +355,14 @@ mkl_umath_@TYPE@_exp2(char **args, const npy_intp *dimensions, const npy_intp *s
352355
can_vectorize
353356
,
354357
const @type@ in1 = *(@type@ *)ip1;
358+
const int invalid_cases = npy_isnan(in1) || in1 == NPY_INFINITY || in1 == -NPY_INFINITY;
359+
ignore_fpstatus |= (invalid_cases ? 1 : 0);
355360
*(@type@ *)op1 = @scalarf@(in1);
356361
)
357362
}
363+
if(ignore_fpstatus) {
364+
feclearexcept(FE_OVERFLOW | FE_UNDERFLOW | FE_INVALID);
365+
}
358366
}
359367

360368
/**end repeat**/
@@ -471,9 +479,11 @@ mkl_umath_@TYPE@_log2(char **args, const npy_intp *dimensions, const npy_intp *s
471479
const int contig = IS_UNARY_CONT(@type@, @type@);
472480
const int disjoint_or_same = DISJOINT_OR_SAME(args[0], args[1], dimensions[0], sizeof(@type@));
473481
const int can_vectorize = contig && disjoint_or_same;
482+
int ignore_fpstatus = 0;
474483

475484
if (can_vectorize && dimensions[0] > VML_TRANSCEDENTAL_THRESHOLD)
476485
{
486+
ignore_fpstatus = 1;
477487
CHUNKED_VML_CALL2(v@c@Log2, dimensions[0], @type@, args[0], args[1]);
478488
/* v@c@Log2(dimensions[0], (@type@*) args[0], (@type@*) args[1]); */
479489
} else {
@@ -483,9 +493,14 @@ mkl_umath_@TYPE@_log2(char **args, const npy_intp *dimensions, const npy_intp *s
483493
can_vectorize
484494
,
485495
const @type@ in1 = *(@type@ *)ip1;
496+
const int invalid_cases = in1 < 0 || in1 == 0 || npy_isnan(in1) || in1 == -NPY_INFINITY;
497+
ignore_fpstatus |= (invalid_cases ? 1 : 0);
486498
*(@type@ *)op1 = @scalarf@(in1);
487499
)
488500
}
501+
if(ignore_fpstatus) {
502+
feclearexcept(FE_DIVBYZERO | FE_INVALID);
503+
}
489504
}
490505

491506
/**end repeat**/
@@ -2007,7 +2022,7 @@ mkl_umath_@TYPE@_nextafter(char **args, const npy_intp *dimensions, const npy_in
20072022
CHUNKED_VML_CALL3(v@s@NextAfter, dimensions[0], @type@, args[0], args[1], args[2]);
20082023
/* v@s@NextAfter(dimensions[0], (@type@*) args[0], (@type@*) args[1], (@type@*) args[2]); */
20092024
} else
2010-
#endif
2025+
#endif
20112026
{
20122027
BINARY_LOOP {
20132028
const @type@ in1 = *(@type@ *)ip1;
@@ -2097,8 +2112,10 @@ mkl_umath_@TYPE@_remainder(char **args, const npy_intp *dimensions, const npy_in
20972112
const int disjoint_or_same1 = DISJOINT_OR_SAME(args[0], args[2], dimensions[0], sizeof(@type@));
20982113
const int disjoint_or_same2 = DISJOINT_OR_SAME(args[1], args[2], dimensions[0], sizeof(@type@));
20992114
const int can_vectorize = contig && disjoint_or_same1 && disjoint_or_same2;
2115+
int ignore_fpstatus = 0;
21002116

21012117
if(can_vectorize && dimensions[0] > VML_TRANSCEDENTAL_THRESHOLD) {
2118+
ignore_fpstatus = 1;
21022119
CHUNKED_VML_CALL3(v@s@Remainder, dimensions[0], @type@, args[0], args[1], args[2]);
21032120
/* v@s@Remainder(dimensions[0], (@type@*) args[0], (@type@*) args[1], (@type@*) args[2]); */
21042121
} else
@@ -2107,9 +2124,16 @@ mkl_umath_@TYPE@_remainder(char **args, const npy_intp *dimensions, const npy_in
21072124
BINARY_LOOP {
21082125
const @type@ in1 = *(@type@ *)ip1;
21092126
const @type@ in2 = *(@type@ *)ip2;
2127+
int invalid_cases = !npy_isnan(in1) && in2 == 0;
2128+
invalid_cases |= (in1 == NPY_INFINITY || in1 == -NPY_INFINITY) && !npy_isnan(in2);
2129+
invalid_cases |= (in1 != NPY_INFINITY && in1 != -NPY_INFINITY) && (in2 == NPY_INFINITY || in2 == -NPY_INFINITY);
2130+
ignore_fpstatus |= (invalid_cases ? 1 : 0);
21102131
divmod@c@(in1, in2, (@type@ *)op1);
21112132
}
21122133
}
2134+
if(ignore_fpstatus) {
2135+
feclearexcept(FE_UNDERFLOW | FE_INVALID);
2136+
}
21132137
}
21142138

21152139
void
@@ -2671,7 +2695,6 @@ mkl_umath_@TYPE@_absolute(char **args, const npy_intp *dimensions, const npy_int
26712695
*((@ftype@ *)op1) = hypot@c@(in1r, in1i);
26722696
}
26732697
}
2674-
26752698
if(ignore_fpstatus) {
26762699
feclearexcept(FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW | FE_INVALID);
26772700
}

0 commit comments

Comments
 (0)