#include #include #include template constexpr auto _ = pfor::ctv; TEST_CASE("Parallelizable") { using T = std::array; T a_; pfor::Operand 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)); } } }