Files
lammps/lib/kokkos/core/unit_test/TestCTestDevice.cpp
Anne Gunn f524fa758d T2345: Replace instances of NULL with nullptr
Per guidance from Axel, revert lib/kokkos and lib/colvars
to remove nullptr changes.
2020-09-14 12:05:44 -06:00

139 lines
4.6 KiB
C++

#include <gtest/gtest.h>
namespace Kokkos {
namespace Impl {
int get_ctest_gpu(const char *local_rank_str);
} // namespace Impl
} // namespace Kokkos
#ifdef _WIN32
int setenv(const char *name, const char *value, int overwrite) {
int errcode = 0;
if (!overwrite) {
size_t envsize = 0;
errcode = getenv_s(&envsize, NULL, 0, name);
if (errcode || envsize) return errcode;
}
return _putenv_s(name, value);
}
int unsetenv(const char *name) { return _putenv_s(name, ""); }
#endif
// Needed because https://github.com/google/googletest/issues/952 has not been
// resolved
#define EXPECT_THROW_WITH_MESSAGE(stmt, etype, whatstring) \
EXPECT_THROW( \
try { stmt; } catch (const etype &ex) { \
EXPECT_EQ(whatstring, std::string(ex.what())); \
throw; \
}, \
etype)
class ctest_environment : public ::testing::Test {
protected:
void SetUp();
};
void ctest_environment::SetUp() {
setenv("CTEST_KOKKOS_DEVICE_TYPE", "gpus", 1);
setenv("CTEST_RESOURCE_GROUP_COUNT", "10", 1);
unsetenv("CTEST_RESOURCE_GROUP_0");
setenv("CTEST_RESOURCE_GROUP_1", "threads", 1);
setenv("CTEST_RESOURCE_GROUP_2", "threads,cores", 1);
setenv("CTEST_RESOURCE_GROUP_3", "gpus", 1);
unsetenv("CTEST_RESOURCE_GROUP_3_GPUS");
setenv("CTEST_RESOURCE_GROUP_4", "gpus", 1);
setenv("CTEST_RESOURCE_GROUP_4_GPUS", "id:2", 1);
setenv("CTEST_RESOURCE_GROUP_5", "gpus", 1);
setenv("CTEST_RESOURCE_GROUP_5_GPUS", "slots:1,id:2", 1);
setenv("CTEST_RESOURCE_GROUP_6", "gpus", 1);
setenv("CTEST_RESOURCE_GROUP_6_GPUS", "id:2,slots:1", 1);
setenv("CTEST_RESOURCE_GROUP_7", "threads,gpus", 1);
setenv("CTEST_RESOURCE_GROUP_7_GPUS", "id:3,slots:1", 1);
setenv("CTEST_RESOURCE_GROUP_8", "gpus,threads", 1);
setenv("CTEST_RESOURCE_GROUP_8_GPUS", "id:1,slots:1", 1);
setenv("CTEST_RESOURCE_GROUP_9", "cores,gpus,threads", 1);
setenv("CTEST_RESOURCE_GROUP_9_GPUS", "id:4,slots:1", 1);
}
TEST_F(ctest_environment, no_device_type) {
unsetenv("CTEST_KOKKOS_DEVICE_TYPE");
EXPECT_EQ(Kokkos::Impl::get_ctest_gpu("0"), 0);
}
TEST_F(ctest_environment, no_process_count) {
unsetenv("CTEST_RESOURCE_GROUP_COUNT");
EXPECT_EQ(Kokkos::Impl::get_ctest_gpu("0"), 0);
}
TEST_F(ctest_environment, invalid_rank) {
EXPECT_THROW_WITH_MESSAGE(
Kokkos::Impl::get_ctest_gpu("10"), std::runtime_error,
"Error: local rank 10 is outside the bounds of resource groups provided "
"by"
" CTest. Raised by Kokkos::Impl::get_ctest_gpu().\nTraceback "
"functionality"
" not available\n");
}
TEST_F(ctest_environment, no_type_str) {
EXPECT_THROW_WITH_MESSAGE(
Kokkos::Impl::get_ctest_gpu("0"), std::runtime_error,
"Error: CTEST_RESOURCE_GROUP_0 is not specified. Raised by "
"Kokkos::Impl::get_ctest_gpu().\nTraceback functionality not "
"available\n");
}
TEST_F(ctest_environment, missing_type) {
EXPECT_THROW_WITH_MESSAGE(
Kokkos::Impl::get_ctest_gpu("1"), std::runtime_error,
"Error: device type 'gpus' not included in CTEST_RESOURCE_GROUP_1. "
"Raised "
"by Kokkos::Impl::get_ctest_gpu().\nTraceback functionality not available"
"\n");
EXPECT_THROW_WITH_MESSAGE(
Kokkos::Impl::get_ctest_gpu("2"), std::runtime_error,
"Error: device type 'gpus' not included in CTEST_RESOURCE_GROUP_2. "
"Raised "
"by Kokkos::Impl::get_ctest_gpu().\nTraceback functionality not available"
"\n");
}
TEST_F(ctest_environment, no_id_str) {
EXPECT_THROW_WITH_MESSAGE(
Kokkos::Impl::get_ctest_gpu("3"), std::runtime_error,
"Error: CTEST_RESOURCE_GROUP_3_GPUS is not specified. Raised by "
"Kokkos::Impl::get_ctest_gpu().\nTraceback functionality not "
"available\n");
}
TEST_F(ctest_environment, invalid_id_str) {
EXPECT_THROW_WITH_MESSAGE(
Kokkos::Impl::get_ctest_gpu("4"), std::runtime_error,
"Error: invalid value of CTEST_RESOURCE_GROUP_4_GPUS: 'id:2'. Raised by "
"Kokkos::Impl::get_ctest_gpu().\nTraceback functionality not "
"available\n");
EXPECT_THROW_WITH_MESSAGE(
Kokkos::Impl::get_ctest_gpu("5"), std::runtime_error,
"Error: invalid value of CTEST_RESOURCE_GROUP_5_GPUS: 'slots:1,id:2'. "
"Raised by Kokkos::Impl::get_ctest_gpu().\nTraceback functionality not "
"available\n");
}
TEST_F(ctest_environment, good) {
EXPECT_EQ(Kokkos::Impl::get_ctest_gpu("6"), 2);
EXPECT_EQ(Kokkos::Impl::get_ctest_gpu("7"), 3);
EXPECT_EQ(Kokkos::Impl::get_ctest_gpu("8"), 1);
EXPECT_EQ(Kokkos::Impl::get_ctest_gpu("9"), 4);
}