Skip to content

Commit

Permalink
Refactor tests
Browse files Browse the repository at this point in the history
  • Loading branch information
aprokop committed Dec 27, 2023
1 parent 45123fe commit d221f4f
Show file tree
Hide file tree
Showing 3 changed files with 169 additions and 141 deletions.
1 change: 1 addition & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ target_link_libraries(ArborX_Test_CompileOnly.exe PRIVATE ArborX)

add_executable(ArborX_Test_DetailsUtils.exe
tstDetailsUtils.cpp
tstDetailsKokkosExtStdAlgorithms.cpp
tstDetailsKokkosExtViewHelpers.cpp
utf_main.cpp
)
Expand Down
168 changes: 168 additions & 0 deletions test/tstDetailsKokkosExtStdAlgorithms.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
/****************************************************************************
* Copyright (c) 2017-2022 by the ArborX authors *
* All rights reserved. *
* *
* This file is part of the ArborX library. ArborX is *
* distributed under a BSD 3-clause license. For the licensing terms see *
* the LICENSE file in the top-level directory. *
* *
* SPDX-License-Identifier: BSD-3-Clause *
****************************************************************************/

#include "ArborX_EnableDeviceTypes.hpp" // ARBORX_DEVICE_TYPES
#include "ArborX_EnableViewComparison.hpp"
#include <ArborX_DetailsKokkosExtStdAlgorithms.hpp>
#include <ArborX_Exception.hpp>

#include <Kokkos_Core.hpp>

#include <boost/test/unit_test.hpp>

#include <algorithm>
#include <numeric>
#include <vector>

#define BOOST_TEST_MODULE KokkosExtStdAlgorithms

namespace tt = boost::test_tools;

BOOST_AUTO_TEST_CASE_TEMPLATE(iota, DeviceType, ARBORX_DEVICE_TYPES)
{
using ExecutionSpace = typename DeviceType::execution_space;
namespace KokkosExt = ArborX::Details::KokkosExt;

ExecutionSpace space{};
int const n = 10;
double const val = 3.;

Kokkos::View<double *, DeviceType> v("v", n);
KokkosExt::iota(space, v, val);
std::vector<double> v_ref(n);
std::iota(v_ref.begin(), v_ref.end(), val);
auto v_host = Kokkos::create_mirror_view(v);
Kokkos::deep_copy(v_host, v);
BOOST_TEST(v_ref == v_host, tt::per_element());

Kokkos::View<int[3], DeviceType> w("w");
KokkosExt::iota(space, w);
std::vector<int> w_ref = {0, 1, 2};
auto w_host = Kokkos::create_mirror_view(w);
Kokkos::deep_copy(w_host, w);
BOOST_TEST(w_ref == w_host, tt::per_element());
}

BOOST_AUTO_TEST_CASE_TEMPLATE(exclusive_scan, DeviceType, ARBORX_DEVICE_TYPES)
{
namespace KokkosExt = ArborX::Details::KokkosExt;
using ExecutionSpace = typename DeviceType::execution_space;

ExecutionSpace space{};

int const n = 10;
Kokkos::View<int *, DeviceType> x("x", n);
std::vector<int> x_ref(n, 1);
x_ref.back() = 0;
auto x_host = Kokkos::create_mirror_view(x);
for (int i = 0; i < n; ++i)
x_host(i) = x_ref[i];
Kokkos::deep_copy(x, x_host);

Kokkos::View<int *, DeviceType> y("y", n);
KokkosExt::exclusive_scan(space, x, y);

std::vector<int> y_ref(n);
std::iota(y_ref.begin(), y_ref.end(), 0);
auto y_host = Kokkos::create_mirror_view(y);
Kokkos::deep_copy(y_host, y);
Kokkos::deep_copy(x_host, x);
BOOST_TEST(y_host == y_ref, tt::per_element());
BOOST_TEST(x_host == x_ref, tt::per_element());
// in-place
KokkosExt::exclusive_scan(space, x, x);
Kokkos::deep_copy(x_host, x);
BOOST_TEST(x_host == y_ref, tt::per_element());
int const m = 11;
BOOST_TEST(n != m);
Kokkos::View<int *, DeviceType> z("z", m);
BOOST_CHECK_THROW(KokkosExt::exclusive_scan(space, x, z),
ArborX::SearchException);
Kokkos::View<double[3], DeviceType> v("v");
auto v_host = Kokkos::create_mirror_view(v);
v_host(0) = 1.;
v_host(1) = 1.;
v_host(2) = 0.;
Kokkos::deep_copy(v, v_host);
KokkosExt::exclusive_scan(space, v, v);
Kokkos::deep_copy(v_host, v);
std::vector<double> v_ref = {0., 1., 2.};
BOOST_TEST(v_host == v_ref, tt::per_element());
Kokkos::View<double *, DeviceType> w("w", 4);
BOOST_CHECK_THROW(KokkosExt::exclusive_scan(space, v, w),
ArborX::SearchException);
v_host(0) = 1.;
v_host(1) = 0.;
v_host(2) = 0.;
Kokkos::deep_copy(v, v_host);
Kokkos::resize(w, 3);
KokkosExt::exclusive_scan(space, v, w);
auto w_host = Kokkos::create_mirror_view(w);
Kokkos::deep_copy(w_host, w);
std::vector<double> w_ref = {0., 1., 1.};
BOOST_TEST(w_host == w_ref, tt::per_element());
}

BOOST_AUTO_TEST_CASE_TEMPLATE(reduce, DeviceType, ARBORX_DEVICE_TYPES)
{
using ExecutionSpace = typename DeviceType::execution_space;
ExecutionSpace space{};

namespace KokkosExt = ArborX::Details::KokkosExt;

Kokkos::View<int[6], DeviceType> v("v");
Kokkos::deep_copy(v, 5);
BOOST_TEST(KokkosExt::reduce(space, v, 3) == 33);

Kokkos::View<int *, DeviceType> w("w", 5);
KokkosExt::iota(space, w, 2);
BOOST_TEST(KokkosExt::reduce(space, w, 4) == 24);
}

BOOST_AUTO_TEST_CASE_TEMPLATE(adjacent_difference, DeviceType,
ARBORX_DEVICE_TYPES)
{
using ExecutionSpace = typename DeviceType::execution_space;
ExecutionSpace space{};

using ArborX::Details::KokkosExt::adjacent_difference;

Kokkos::View<int[5], DeviceType> v("v");
auto v_host = Kokkos::create_mirror_view(v);
v_host(0) = 2;
v_host(1) = 4;
v_host(2) = 6;
v_host(3) = 8;
v_host(4) = 10;
Kokkos::deep_copy(v, v_host);
// In-place operation is not allowed
BOOST_CHECK_THROW(adjacent_difference(space, v, v), ArborX::SearchException);
auto w = Kokkos::create_mirror(DeviceType(), v);
BOOST_CHECK_NO_THROW(adjacent_difference(space, v, w));
auto w_host = Kokkos::create_mirror_view(w);
Kokkos::deep_copy(w_host, w);
std::vector<int> w_ref(5, 2);
BOOST_TEST(w_host == w_ref, tt::per_element());

Kokkos::View<float *, DeviceType> x("x", 10);
Kokkos::deep_copy(x, 3.14);
BOOST_CHECK_THROW(adjacent_difference(space, x, x), ArborX::SearchException);
Kokkos::View<float[10], DeviceType> y("y");
BOOST_CHECK_NO_THROW(adjacent_difference(space, x, y));
std::vector<float> y_ref(10);
y_ref[0] = 3.14;
auto y_host = Kokkos::create_mirror_view(y);
Kokkos::deep_copy(y_host, y);
BOOST_TEST(y_host == y_ref, tt::per_element());

Kokkos::resize(x, 5);
BOOST_CHECK_THROW(adjacent_difference(space, y, x), ArborX::SearchException);
}
141 changes: 0 additions & 141 deletions test/tstDetailsUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,91 +29,6 @@

namespace tt = boost::test_tools;

BOOST_AUTO_TEST_CASE_TEMPLATE(iota, DeviceType, ARBORX_DEVICE_TYPES)
{
using ExecutionSpace = typename DeviceType::execution_space;
namespace KokkosExt = ArborX::Details::KokkosExt;

ExecutionSpace space{};
int const n = 10;
double const val = 3.;

Kokkos::View<double *, DeviceType> v("v", n);
KokkosExt::iota(space, v, val);
std::vector<double> v_ref(n);
std::iota(v_ref.begin(), v_ref.end(), val);
auto v_host = Kokkos::create_mirror_view(v);
Kokkos::deep_copy(v_host, v);
BOOST_TEST(v_ref == v_host, tt::per_element());

Kokkos::View<int[3], DeviceType> w("w");
KokkosExt::iota(space, w);
std::vector<int> w_ref = {0, 1, 2};
auto w_host = Kokkos::create_mirror_view(w);
Kokkos::deep_copy(w_host, w);
BOOST_TEST(w_ref == w_host, tt::per_element());
}

BOOST_AUTO_TEST_CASE_TEMPLATE(exclusive_scan, DeviceType, ARBORX_DEVICE_TYPES)
{
namespace KokkosExt = ArborX::Details::KokkosExt;
using ExecutionSpace = typename DeviceType::execution_space;

ExecutionSpace space{};

int const n = 10;
Kokkos::View<int *, DeviceType> x("x", n);
std::vector<int> x_ref(n, 1);
x_ref.back() = 0;
auto x_host = Kokkos::create_mirror_view(x);
for (int i = 0; i < n; ++i)
x_host(i) = x_ref[i];
Kokkos::deep_copy(x, x_host);

Kokkos::View<int *, DeviceType> y("y", n);
KokkosExt::exclusive_scan(space, x, y);

std::vector<int> y_ref(n);
std::iota(y_ref.begin(), y_ref.end(), 0);
auto y_host = Kokkos::create_mirror_view(y);
Kokkos::deep_copy(y_host, y);
Kokkos::deep_copy(x_host, x);
BOOST_TEST(y_host == y_ref, tt::per_element());
BOOST_TEST(x_host == x_ref, tt::per_element());
// in-place
KokkosExt::exclusive_scan(space, x, x);
Kokkos::deep_copy(x_host, x);
BOOST_TEST(x_host == y_ref, tt::per_element());
int const m = 11;
BOOST_TEST(n != m);
Kokkos::View<int *, DeviceType> z("z", m);
BOOST_CHECK_THROW(KokkosExt::exclusive_scan(space, x, z),
ArborX::SearchException);
Kokkos::View<double[3], DeviceType> v("v");
auto v_host = Kokkos::create_mirror_view(v);
v_host(0) = 1.;
v_host(1) = 1.;
v_host(2) = 0.;
Kokkos::deep_copy(v, v_host);
KokkosExt::exclusive_scan(space, v, v);
Kokkos::deep_copy(v_host, v);
std::vector<double> v_ref = {0., 1., 2.};
BOOST_TEST(v_host == v_ref, tt::per_element());
Kokkos::View<double *, DeviceType> w("w", 4);
BOOST_CHECK_THROW(KokkosExt::exclusive_scan(space, v, w),
ArborX::SearchException);
v_host(0) = 1.;
v_host(1) = 0.;
v_host(2) = 0.;
Kokkos::deep_copy(v, v_host);
Kokkos::resize(w, 3);
KokkosExt::exclusive_scan(space, v, w);
auto w_host = Kokkos::create_mirror_view(w);
Kokkos::deep_copy(w_host, w);
std::vector<double> w_ref = {0., 1., 1.};
BOOST_TEST(w_host == w_ref, tt::per_element());
}

BOOST_AUTO_TEST_CASE_TEMPLATE(minmax, DeviceType, ARBORX_DEVICE_TYPES)
{
using ExecutionSpace = typename DeviceType::execution_space;
Expand Down Expand Up @@ -161,62 +76,6 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(minmax, DeviceType, ARBORX_DEVICE_TYPES)
#endif
}

BOOST_AUTO_TEST_CASE_TEMPLATE(reduce, DeviceType, ARBORX_DEVICE_TYPES)
{
using ExecutionSpace = typename DeviceType::execution_space;
ExecutionSpace space{};

namespace KokkosExt = ArborX::Details::KokkosExt;

Kokkos::View<int[6], DeviceType> v("v");
Kokkos::deep_copy(v, 5);
BOOST_TEST(KokkosExt::reduce(space, v, 3) == 33);

Kokkos::View<int *, DeviceType> w("w", 5);
KokkosExt::iota(space, w, 2);
BOOST_TEST(KokkosExt::reduce(space, w, 4) == 24);
}

BOOST_AUTO_TEST_CASE_TEMPLATE(adjacent_difference, DeviceType,
ARBORX_DEVICE_TYPES)
{
using ExecutionSpace = typename DeviceType::execution_space;
ExecutionSpace space{};

using ArborX::Details::KokkosExt::adjacent_difference;

Kokkos::View<int[5], DeviceType> v("v");
auto v_host = Kokkos::create_mirror_view(v);
v_host(0) = 2;
v_host(1) = 4;
v_host(2) = 6;
v_host(3) = 8;
v_host(4) = 10;
Kokkos::deep_copy(v, v_host);
// In-place operation is not allowed
BOOST_CHECK_THROW(adjacent_difference(space, v, v), ArborX::SearchException);
auto w = Kokkos::create_mirror(DeviceType(), v);
BOOST_CHECK_NO_THROW(adjacent_difference(space, v, w));
auto w_host = Kokkos::create_mirror_view(w);
Kokkos::deep_copy(w_host, w);
std::vector<int> w_ref(5, 2);
BOOST_TEST(w_host == w_ref, tt::per_element());

Kokkos::View<float *, DeviceType> x("x", 10);
Kokkos::deep_copy(x, 3.14);
BOOST_CHECK_THROW(adjacent_difference(space, x, x), ArborX::SearchException);
Kokkos::View<float[10], DeviceType> y("y");
BOOST_CHECK_NO_THROW(adjacent_difference(space, x, y));
std::vector<float> y_ref(10);
y_ref[0] = 3.14;
auto y_host = Kokkos::create_mirror_view(y);
Kokkos::deep_copy(y_host, y);
BOOST_TEST(y_host == y_ref, tt::per_element());

Kokkos::resize(x, 5);
BOOST_CHECK_THROW(adjacent_difference(space, y, x), ArborX::SearchException);
}

BOOST_AUTO_TEST_CASE_TEMPLATE(min_and_max, DeviceType, ARBORX_DEVICE_TYPES)
{
using ExecutionSpace = typename DeviceType::execution_space;
Expand Down

0 comments on commit d221f4f

Please sign in to comment.