pfor/tests/parallelizable.cpp

81 lines
2.3 KiB
C++

#include <catch.hpp>
#include <pfor/pfor.h>
#include <pfor/traits.h>
template<std::size_t v>
constexpr auto _ = pfor::ctv<v>;
TEST_CASE("Parallelizable") {
using T = std::array<int, 1024>;
T a_;
pfor::Operand<T, class IDT> a{a_};
pfor::Index i;
auto rangeXX = pfor::Range{0,0};
auto range01 = pfor::RangeCT<0, 1>{0};
auto range11 = pfor::RangeCT<1, 1>{0};
auto range02 = pfor::RangeCT<0, 2>{0};
auto range12 = pfor::RangeCT<1, 2>{0};
SECTION("Linear") {
SECTION("Basic") {
auto e = a[_<2>*i+_<1>] = a[_<2>*i];
REQUIRE(pfor::parallelTest(rangeXX, e));
REQUIRE(pfor::parallelTest(range01, e));
REQUIRE(pfor::parallelTest(range11, e));
REQUIRE(pfor::parallelTest(range02, e));
REQUIRE(pfor::parallelTest(range12, e));
}
SECTION("Requiring step") {
auto e = a[i+_<1>] = a[i];
REQUIRE_FALSE(pfor::parallelTest(rangeXX, e));
REQUIRE_FALSE(pfor::parallelTest(range01, e));
REQUIRE_FALSE(pfor::parallelTest(range11, e));
REQUIRE(pfor::parallelTest(range02, e));
REQUIRE(pfor::parallelTest(range12, e));
}
SECTION("Requiring begin and step") {
auto e = a[_<2>*i] = a[_<3>*i+_<1>];
REQUIRE_FALSE(pfor::parallelTest(rangeXX, e));
REQUIRE_FALSE(pfor::parallelTest(range01, e));
REQUIRE_FALSE(pfor::parallelTest(range11, e));
REQUIRE(pfor::parallelTest(range02, e));
REQUIRE_FALSE(pfor::parallelTest(range12, e));
}
}
SECTION("Non linear") {
SECTION("No properties") {
auto e = a[i*i] = a[i*i]+1;
REQUIRE_FALSE(pfor::parallelTest(rangeXX, e));
REQUIRE_FALSE(pfor::parallelTest(range01, e));
REQUIRE_FALSE(pfor::parallelTest(range11, e));
REQUIRE_FALSE(pfor::parallelTest(range02, e));
REQUIRE_FALSE(pfor::parallelTest(range12, e));
}
SECTION("Injective") {
auto e = a[injective(i*i)] = a[injective(i*i)]+1;
REQUIRE(pfor::parallelTest(rangeXX, e));
REQUIRE(pfor::parallelTest(range01, e));
REQUIRE(pfor::parallelTest(range11, e));
REQUIRE(pfor::parallelTest(range02, e));
REQUIRE(pfor::parallelTest(range12, e));
}
SECTION("Strict inc inferred injective") {
auto e = a[strictinc(i*i)] = a[strictinc(i*i)]+1;
REQUIRE(pfor::parallelTest(rangeXX, e));
REQUIRE(pfor::parallelTest(range01, e));
REQUIRE(pfor::parallelTest(range11, e));
REQUIRE(pfor::parallelTest(range02, e));
REQUIRE(pfor::parallelTest(range12, e));
}
}
}