1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
//
// File: test/core/TestEarlyReturns.cpp
// Purpose: Tests for EarlyReturnAllowed() and EarlyReturnMaxLength() constexpr's
//
//-- ensure asserts are compiled in
#undef NDEBUG
#include <iostream>
#include "VecCore/VecCore"
using namespace vecCore;
template <class Backend>
VECCORE_FORCE_NOINLINE
void TestType(const char *type)
{
using Real_v = typename Backend::Float_v;
std::cout << "Testing type " << type << ", VectorSize=" << VectorSize<Real_v>() << "\n";
constexpr size_t vsize = VectorSize<Real_v>();
Real_v flagReal_v;
// returns false for vsize-1
if (!EarlyReturnMaxLength(flagReal_v, vsize - 1))
assert(true);
else
assert(false);
// returns true for vsize
if (EarlyReturnMaxLength(flagReal_v, vsize))
assert(true);
else
assert(false);
}
int main()
{
#ifdef VECGEOM_NVCC
// always false for CUDA
std::cout << "Testing early returns for CUDA=ON...\n";
assert(!EarlyReturnAllowed());
double flagDouble;
assert(!EarlyReturnMaxLength(, 1);
#else
std::cout << "Testing early returns for CUDA=OFF...\n";
// always true for non-CUDA
assert(EarlyReturnAllowed());
// always returns true for floats or floats
std::cout << "Testing early returns for float...\n";
float flagFloat;
if (EarlyReturnMaxLength(flagFloat, 1))
assert(true);
else
assert(false);
if (EarlyReturnMaxLength(flagFloat, 2))
assert(true);
else
assert(false);
std::cout << "Testing early returns for double...\n";
double flagDouble;
if (EarlyReturnMaxLength(flagDouble, 1))
assert(true);
else
assert(false);
if (EarlyReturnMaxLength(flagDouble, 2))
assert(true);
else
assert(false);
#ifdef VECGEOM_ENABLE_VC
// tests for Float_v
using Float_v = backend::VcVector::Float_v;
Float_v flagFloat_v;
std::cout << "Testing early returns for Float_v of size " << 8 * sizeof(Float_v)
<< " bits..., VectorSize=" << VectorSize<Float_v>() << "\n";
constexpr size_t vsize1 = VectorSize<Float_v>();
if (!EarlyReturnMaxLength(flagFloat_v, vsize1 - 1)
assert(true);
else
assert(false);
if (EarlyReturnMaxLength(flagFloat_v, vsize1)
assert(true);
else
assert(false);
// tests for Double_v
using Double_v = backend::VcVector::Double_v;
Double_v flagDouble_v;
std::cout << "Testing early returns for Double_v of size " << 8 * sizeof(Double_v)
<< " bits..., VectorSize=" << VectorSize<Double_v>() << "\n";
constexpr size_t vsize2 = VectorSize<Double_v>();
if (!EarlyReturnMaxLength(flagDouble_v, vsize2 - 1)
assert(true);
else
assert(false);
if (EarlyReturnMaxLength(flagDouble_v, vsize2)
assert(true);
else
assert(false);
#endif
TestType<backend::Scalar>("Scalar");
#ifdef VECCORE_ENABLE_VC
TestType<backend::VcScalar>("VcScalar");
TestType<backend::VcVector>("VcVector");
TestType<backend::VcSimdArray<8>>("VcSimdArray<8>");
TestType<backend::VcSimdArray<16>>("VcSimdArray<16>");
TestType<backend::VcSimdArray<32>>("VcSimdArray<32>");
#endif
#endif
std::cout << "TestEarlyReturns: passed\n";
return 0;
}
|