MPI: RRange unit test works
This commit is contained in:
parent
bd8970ae33
commit
ef5b0ac456
4 changed files with 71 additions and 15 deletions
|
@ -380,6 +380,7 @@ namespace CNORXZ
|
||||||
static_assert(std::is_fundamental<MetaT>::value, "got non-fundamental type");
|
static_assert(std::is_fundamental<MetaT>::value, "got non-fundamental type");
|
||||||
CXZ_ASSERT(r->dim() == 1, "range cast into URange<Int>: source range must have dim = 1, got " << r->dim());
|
CXZ_ASSERT(r->dim() == 1, "range cast into URange<Int>: source range must have dim = 1, got " << r->dim());
|
||||||
Sptr<URange<MetaT>> o = nullptr;
|
Sptr<URange<MetaT>> o = nullptr;
|
||||||
|
// TODO: cast from CRange!!!
|
||||||
o = transform<SizeT>(r); if(o) return o;
|
o = transform<SizeT>(r); if(o) return o;
|
||||||
o = transform<Int>(r); if(o) return o;
|
o = transform<Int>(r); if(o) return o;
|
||||||
o = transform<LInt>(r); if(o) return o;
|
o = transform<LInt>(r); if(o) return o;
|
||||||
|
|
|
@ -72,8 +72,8 @@ namespace CNORXZ
|
||||||
if constexpr(has_static_sub<IndexI>::value){
|
if constexpr(has_static_sub<IndexI>::value){
|
||||||
constexpr SizeT NI = index_dim<IndexI>::value;
|
constexpr SizeT NI = index_dim<IndexI>::value;
|
||||||
iter<0,NI>( [&](auto mu) {
|
iter<0,NI>( [&](auto mu) {
|
||||||
const SizeT jmu = (IB::mPos / ilf[mu].val()*klf[mu].val()) %
|
const SizeT jmu = (IB::mPos / (ilf[mu].val()*klf[mu].val())) %
|
||||||
i[mu]->lmax().val()*k[mu]->lmax().val();
|
(i[mu]->lmax().val() * k[mu]->lmax().val());
|
||||||
r += ( jmu / i[mu]->lmax().val() ) * klf[mu].val();
|
r += ( jmu / i[mu]->lmax().val() ) * klf[mu].val();
|
||||||
l += ( jmu % i[mu]->lmax().val() ) * ilf[mu].val();
|
l += ( jmu % i[mu]->lmax().val() ) * ilf[mu].val();
|
||||||
}, NoF{} );
|
}, NoF{} );
|
||||||
|
@ -81,8 +81,8 @@ namespace CNORXZ
|
||||||
else if constexpr( has_static_sub<IndexK>::value){
|
else if constexpr( has_static_sub<IndexK>::value){
|
||||||
constexpr SizeT NI = index_dim<IndexK>::value;
|
constexpr SizeT NI = index_dim<IndexK>::value;
|
||||||
iter<0,NI>( [&](auto mu) {
|
iter<0,NI>( [&](auto mu) {
|
||||||
const SizeT jmu = (IB::mPos / ilf[mu].val()*klf[mu].val()) %
|
const SizeT jmu = (IB::mPos / (ilf[mu].val()*klf[mu].val())) %
|
||||||
i[mu]->lmax().val()*k[mu]->lmax().val();
|
(i[mu]->lmax().val() * k[mu]->lmax().val());
|
||||||
r += ( jmu / i[mu]->lmax().val() ) * klf[mu].val();
|
r += ( jmu / i[mu]->lmax().val() ) * klf[mu].val();
|
||||||
l += ( jmu % i[mu]->lmax().val() ) * ilf[mu].val();
|
l += ( jmu % i[mu]->lmax().val() ) * ilf[mu].val();
|
||||||
}, NoF{} );
|
}, NoF{} );
|
||||||
|
@ -90,8 +90,8 @@ namespace CNORXZ
|
||||||
else {
|
else {
|
||||||
const SizeT NI = mI->dim();
|
const SizeT NI = mI->dim();
|
||||||
for(SizeT mu = 0; mu != NI; ++mu){
|
for(SizeT mu = 0; mu != NI; ++mu){
|
||||||
const SizeT jmu = (IB::mPos / ilf[mu].val()*klf[mu].val()) %
|
const SizeT jmu = (IB::mPos / (ilf[mu].val()*klf[mu].val())) %
|
||||||
i[mu]->lmax().val()*k[mu]->lmax().val();
|
(i[mu]->lmax().val() * k[mu]->lmax().val());
|
||||||
r += ( jmu / i[mu]->lmax().val() ) * klf[mu].val();
|
r += ( jmu / i[mu]->lmax().val() ) * klf[mu].val();
|
||||||
l += ( jmu % i[mu]->lmax().val() ) * ilf[mu].val();
|
l += ( jmu % i[mu]->lmax().val() ) * ilf[mu].val();
|
||||||
}
|
}
|
||||||
|
@ -203,8 +203,10 @@ namespace CNORXZ
|
||||||
{
|
{
|
||||||
const SizeT r = mK->lex();
|
const SizeT r = mK->lex();
|
||||||
String o;
|
String o;
|
||||||
auto x = mI->stringMeta();
|
if(r == getRankNumber()){
|
||||||
bcast(x, r);
|
o = mI->stringMeta();
|
||||||
|
}
|
||||||
|
bcast(o, r);
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,9 +215,11 @@ namespace CNORXZ
|
||||||
{
|
{
|
||||||
MetaType o;
|
MetaType o;
|
||||||
if constexpr(Typemap<MetaType>::exists){
|
if constexpr(Typemap<MetaType>::exists){
|
||||||
auto x = mI->meta();
|
|
||||||
const SizeT r = mK->lex();
|
const SizeT r = mK->lex();
|
||||||
bcast(x, r);
|
if(r == getRankNumber()){
|
||||||
|
o = mI->meta();
|
||||||
|
}
|
||||||
|
bcast(o, r);
|
||||||
}
|
}
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,4 +4,5 @@ include_directories(${CMAKE_SOURCE_DIR}/src/tests)
|
||||||
add_executable(mpirrutest rrange_unit_test.cc)
|
add_executable(mpirrutest rrange_unit_test.cc)
|
||||||
add_dependencies(mpirrutest cnorxz cnorxzmpi test_lib)
|
add_dependencies(mpirrutest cnorxz cnorxzmpi test_lib)
|
||||||
target_link_libraries(mpirrutest ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${MPI_LIBS} cnorxz cnorxzmpi test_lib)
|
target_link_libraries(mpirrutest ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${MPI_LIBS} cnorxz cnorxzmpi test_lib)
|
||||||
add_test(NAME mpirrutest COMMAND mpirrutest)
|
set(MPI_TEST_COMMAND mpirun -n 4 mpirrutest)
|
||||||
|
add_test(NAME mpirrutest COMMAND ${MPI_TEST_COMMAND})
|
||||||
|
|
|
@ -25,6 +25,29 @@ namespace
|
||||||
using Test::Numbers;
|
using Test::Numbers;
|
||||||
using namespace CNORXZ::mpi;
|
using namespace CNORXZ::mpi;
|
||||||
|
|
||||||
|
class MPIEnv : public ::testing::Environment
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
MPIEnv(int argc, char** argv) : mArgc(argc), mArgv(argv) {}
|
||||||
|
|
||||||
|
virtual ~MPIEnv() override {}
|
||||||
|
|
||||||
|
virtual void SetUp() override
|
||||||
|
{
|
||||||
|
MPI_Init(&mArgc, &mArgv);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void TearDown() override
|
||||||
|
{
|
||||||
|
MPI_Finalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int mArgc;
|
||||||
|
char** mArgv;
|
||||||
|
};
|
||||||
|
|
||||||
class RRange_Test : public ::testing::Test
|
class RRange_Test : public ::testing::Test
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
@ -63,9 +86,38 @@ namespace
|
||||||
TEST_F(RRange_Test, Basics)
|
TEST_F(RRange_Test, Basics)
|
||||||
{
|
{
|
||||||
EXPECT_EQ(mRRange->size(), mGRange->size());
|
EXPECT_EQ(mRRange->size(), mGRange->size());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(RRange_Test, Local)
|
||||||
|
{
|
||||||
typedef UIndex<Int> UI;
|
typedef UIndex<Int> UI;
|
||||||
MIndex<UI,UI,UI,UI> mi(mRRange->sub(1));
|
MIndex<UI,UI,UI,UI> mi(mRRange->sub(1));
|
||||||
|
MIndex<CIndex,CIndex,CIndex,CIndex> ri(mRRange->sub(0));
|
||||||
EXPECT_EQ(mi.lmax().val(), mGRange->size()/mRRange->sub(0)->size());
|
EXPECT_EQ(mi.lmax().val(), mGRange->size()/mRRange->sub(0)->size());
|
||||||
|
EXPECT_EQ(ri.lmax().val(), getNumRanks());
|
||||||
|
const SizeT rank = getRankNumber();
|
||||||
|
ri = rank;
|
||||||
|
iter<0,4>( [&](auto i) {
|
||||||
|
UI xi = *mi.pack()[i];
|
||||||
|
const SizeT max = xi.lmax().val();
|
||||||
|
const Int s = mGRange->sub(i)->size()/2;
|
||||||
|
const SizeT rx = ri.pack()[i]->lex();
|
||||||
|
for(; xi.lex() != max; ++xi){
|
||||||
|
EXPECT_EQ(*xi, static_cast<Int>(xi.lex()) - s + static_cast<Int>(max*rx));
|
||||||
|
}
|
||||||
|
}, NoF {} );
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(RRange_Test, Global)
|
||||||
|
{
|
||||||
|
RIndex<YIndex,YIndex> rgi(mRRange);
|
||||||
|
YIndex gi(mGRange);
|
||||||
|
for(SizeT c = 0; gi.lex() != gi.lmax().val(); ++gi, ++rgi, ++c) {
|
||||||
|
const String s1 = gi.stringMeta();
|
||||||
|
const String s2 = rgi.stringMeta();
|
||||||
|
EXPECT_EQ(rgi.lex(), c);
|
||||||
|
EXPECT_EQ(s1 ,s2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -73,8 +125,6 @@ namespace
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
::testing::InitGoogleTest(&argc, argv);
|
::testing::InitGoogleTest(&argc, argv);
|
||||||
MPI_Init(&argc, &argv);
|
::testing::AddGlobalTestEnvironment( new MPIEnv(argc, argv) );
|
||||||
const int ret = RUN_ALL_TESTS();
|
return RUN_ALL_TESTS();
|
||||||
MPI_Finalize();
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue