81 lines
2.3 KiB
C++
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));
|
|
}
|
|
}
|
|
}
|