Research Article
Inastemp: A Novel Intrinsics-as-Template Library for Portable SIMD-Vectorization
Code 13
Inastemp testing the Boolean vector to avoid computing all branches.
| (1) InaVecBestType<double> aKernel(const InaVecBestType<double> v1, const InaVecBestType<double> v2) | | (2) // Same as: | | (3) // return InaVecBestType<double>::IfElse(v1 < v2, (v1 − v2).exp(), (v2 − v1).exp()); | | (4) // Both (v1−v2).exp() and (v2−v1).exp() are computed | | (5) return InaVecBestType<double>::If(v1 < v2) | | (6) .Then((v1−v2).exp()) | | (7) .Else((v2−v1).exp()); | | (8) | | (9) | | (10) InaVecBestType<double> aKernelWithTest(const InaVecBestType<double> v1, const … | | InaVecBestType<double> v2) | | (11) const InaVecBestType<double>::MaskType v1lowerv2 = (v1 < v2); | | (12) // Similar to v1lowerv2 == InaVecBestType<double>::MaskType(true) | | (13) if( v1lowerv2.isAllTrue() ) | | (14) return (v1−v2).exp(); | | (15) | | (16) return InaVecBestType<double>::If(v1lowerv2) | | (17) .Then((v1−v2).exp()) | | (18) .Else((v2−v1).exp()); | | (19) |
|