@@ -838,6 +838,117 @@ struct TesterMaskUnaryBool
838838 }
839839};
840840
841+ // =============================================================================
842+ // test for binary vector functions that also need a mask template parameter
843+ // =============================================================================
844+
845+ template <typename T, size_t SIMD_WIDTH, template <typename , size_t > class FCT ,
846+ class CMP = CmpEqual>
847+ struct TesterBinaryWithMask
848+ {
849+ static void test (size_t repeats, const std::string &pattern)
850+ {
851+ std::string name = FCT<T, SIMD_WIDTH>::name ();
852+ if (name.find (pattern) == std::string::npos) { return ; }
853+ std::string args = " v,v" ;
854+ printInfo (name, args);
855+ #if !ONLY_TIME_MEASUREMENT
856+ size_t errors = 0 , trials = 0 ;
857+ for (size_t i = 0 ; i < repeats; i++, trials++) {
858+ SerialVec<T, SIMD_WIDTH> cond;
859+ SerialVec<T, SIMD_WIDTH> a;
860+ FCT<T, SIMD_WIDTH>::randomizeInput (cond);
861+ FCT<T, SIMD_WIDTH>::randomizeInput (a);
862+ SerialVec<T, SIMD_WIDTH> cs =
863+ FCT<T, SIMD_WIDTH>::template apply<SerialVec, SerialMask>(cond, a);
864+ SerialVec<T, SIMD_WIDTH> cp = SerialVec<T, SIMD_WIDTH>::fromVec (
865+ FCT<T, SIMD_WIDTH>::template apply<Vec, Mask>(cond.getVec (),
866+ a.getVec ()));
867+ if (!CMP::cmpVec (cs, cp)) {
868+ errors++;
869+ if (errors <= PRINT_ERRORS) {
870+ printError (name, args);
871+ PRINT_VEC (T, cond);
872+ PRINT_VEC (T, a);
873+ PRINT_VEC (T, cs);
874+ PRINT_VEC (T, cp);
875+ }
876+ EXIT;
877+ }
878+ }
879+ printErrorStats (errors, trials);
880+ #endif
881+
882+ Vec<T, SIMD_WIDTH> input1, input2;
883+ struct timespec start = getTimeSpecMonotonic ();
884+ for (size_t i = 0 ; i < repeats / SIMD_TIME_MEASUREMENT_UNROLL; i++) {
885+ for (size_t j = 0 ; j < SIMD_TIME_MEASUREMENT_UNROLL; j++) {
886+ doNotOptimize (input1);
887+ doNotOptimize (input2);
888+ Vec<T, SIMD_WIDTH> result =
889+ FCT<T, SIMD_WIDTH>::template apply<Vec, Mask>(input1, input2);
890+ doNotOptimize (result);
891+ }
892+ }
893+ struct timespec end = getTimeSpecMonotonic ();
894+ long int time = timeSpecDiffNsec (end, start);
895+ printTimeStats (time, repeats);
896+ }
897+ };
898+
899+ // =============================================================================
900+ // test for unary mask functions that return a vector
901+ // =============================================================================
902+
903+ template <typename T, size_t SIMD_WIDTH, template <typename , size_t > class FCT ,
904+ class CMP = CmpEqual>
905+ struct TesterUnaryMaskToVec
906+ {
907+ static void test (size_t repeats, const std::string &pattern)
908+ {
909+ std::string name = FCT<T, SIMD_WIDTH>::name ();
910+ if (name.find (pattern) == std::string::npos) { return ; }
911+ std::string args = " m" ;
912+ printInfo (name, args);
913+ #if !ONLY_TIME_MEASUREMENT
914+ size_t errors = 0 , trials = 0 ;
915+ for (size_t i = 0 ; i < repeats; i++, trials++) {
916+ SerialMask<T, SIMD_WIDTH> k;
917+ FCT<T, SIMD_WIDTH>::randomizeInput (k);
918+ SerialVec<T, SIMD_WIDTH> cs =
919+ FCT<T, SIMD_WIDTH>::template apply<SerialVec, SerialMask>(k);
920+ SerialVec<T, SIMD_WIDTH> cp = SerialVec<T, SIMD_WIDTH>::fromVec (
921+ FCT<T, SIMD_WIDTH>::template apply<Vec, Mask>(k.getMask ()));
922+ if (!CMP::cmpVec (cs, cp, true )) {
923+ errors++;
924+ if (errors <= PRINT_ERRORS) {
925+ printError (name, args);
926+ PRINT_SERIAL_MASK (T, SIMD_WIDTH, k);
927+ PRINT_VEC (T, cs);
928+ PRINT_VEC (T, cp);
929+ }
930+ EXIT;
931+ }
932+ }
933+ printErrorStats (errors, trials);
934+ #endif
935+
936+ Mask<T, SIMD_WIDTH> inputMask;
937+ struct timespec start = getTimeSpecMonotonic ();
938+ for (size_t i = 0 ; i < repeats / SIMD_TIME_MEASUREMENT_UNROLL; i++) {
939+ for (size_t j = 0 ; j < SIMD_TIME_MEASUREMENT_UNROLL; j++) {
940+ doNotOptimize (inputMask);
941+ Vec<T, SIMD_WIDTH> result =
942+ FCT<T, SIMD_WIDTH>::template apply<Vec, Mask>(inputMask);
943+ doNotOptimize (result);
944+ }
945+ }
946+ struct timespec end = getTimeSpecMonotonic ();
947+ long int time = timeSpecDiffNsec (end, start);
948+ printTimeStats (time, repeats);
949+ }
950+ };
951+
841952// =============================================================================
842953// test for unary mask functions
843954// =============================================================================
0 commit comments