rindex: distinguish between lex and pos

This commit is contained in:
Christian Zimmermann 2024-03-24 02:42:45 +01:00
parent d9a546a5cc
commit 5d76ae6e36
4 changed files with 128 additions and 118 deletions

View file

@ -3,6 +3,9 @@
namespace CNORXZ namespace CNORXZ
{ {
namespace mpi
{
/*================+ /*================+
| CROpRoot | | CROpRoot |
+================*/ +================*/
@ -12,7 +15,7 @@ namespace CNORXZ
constexpr decltype(auto) CROpRoot<T,IndexT>::operator()(const PosT& pos) const constexpr decltype(auto) CROpRoot<T,IndexT>::operator()(const PosT& pos) const
{ {
const SizeT L = mIndex->lmax().val(); const SizeT L = mIndex->lmax().val();
const SizeT m = mIndex->myrank() const SizeT m = mIndex->myrank();
const SizeT dst = ( m + pos.val() ) % L; const SizeT dst = ( m + pos.val() ) % L;
const SizeT src = ( m - pos.val() + L ) % L; const SizeT src = ( m - pos.val() + L ) % L;
@ -84,4 +87,5 @@ namespace CNORXZ
} }
} } // namespace mpi
} // namespace CNORXZ

View file

@ -13,6 +13,8 @@
#define __cxz_mpi_rop_types_h__ #define __cxz_mpi_rop_types_h__
namespace CNORXZ namespace CNORXZ
{
namespace mpi
{ {
template <typename T, class IndexT> template <typename T, class IndexT>
class CROpRoot : public COpInterface<CROpRoot<T,IndexT>> class CROpRoot : public COpInterface<CROpRoot<T,IndexT>>
@ -75,6 +77,7 @@ namespace CNORXZ
private: private:
CXpr mCXpr; CXpr mCXpr;
}; };
} } // namespace mpi
} // namespace CNORXZ
#endif #endif

View file

@ -56,9 +56,9 @@ namespace CNORXZ
template <class IndexI, class IndexK> template <class IndexI, class IndexK>
RIndex<IndexI,IndexK>& RIndex<IndexI,IndexK>::operator=(SizeT pos) RIndex<IndexI,IndexK>& RIndex<IndexI,IndexK>::operator=(SizeT pos)
{ {
IB::mPos = pos; // = lex mLex = pos; // = lex
if(pos >= lmax().val()){ if(mLex >= lmax().val()){
IB::mPos = pmax().val(); mLex = lmax().val();
return *this; return *this;
} }
// pos is the lexicographic position of the global range. // pos is the lexicographic position of the global range.
@ -72,7 +72,7 @@ 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 = (mLex / (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();
@ -81,7 +81,7 @@ 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 = (mLex / (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();
@ -90,7 +90,7 @@ 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 = (mLex / (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();
@ -98,6 +98,7 @@ namespace CNORXZ
} }
*mI = l; *mI = l;
*mK = r; *mK = r;
IB::mPos = mK->pos() * mI->pmax().val() + mI->pos();
return *this; return *this;
} }
@ -152,13 +153,13 @@ namespace CNORXZ
template <class IndexI, class IndexK> template <class IndexI, class IndexK>
SizeT RIndex<IndexI,IndexK>::lex() const SizeT RIndex<IndexI,IndexK>::lex() const
{ {
return IB::mPos; return mLex;
} }
template <class IndexI, class IndexK> template <class IndexI, class IndexK>
constexpr decltype(auto) RIndex<IndexI,IndexK>::pmax() const constexpr decltype(auto) RIndex<IndexI,IndexK>::pmax() const
{ {
return UPos(mK->lmax().val() * mI->lmax().val()); return UPos(mK->pmax().val() * mI->pmax().val());
} }
template <class IndexI, class IndexK> template <class IndexI, class IndexK>
@ -302,11 +303,11 @@ namespace CNORXZ
RIndex<IndexI,IndexK>& RIndex<IndexI,IndexK>::operator()() RIndex<IndexI,IndexK>& RIndex<IndexI,IndexK>::operator()()
{ {
if(mI->lex() >= mI->lmax().val()){ if(mI->lex() >= mI->lmax().val()){
IB::mPos = lmax().val(); mLex = lmax().val();
} }
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;
IB::mPos = iter<0,NI> mLex = iter<0,NI>
([&](auto i) { ([&](auto i) {
return mK->pack()[i]->lex() * mK->lexFormat()[i].val() * return mK->pack()[i]->lex() * mK->lexFormat()[i].val() *
mI->lexFormat()[i].val() * mI->pack()[i]->lmax().val() + mI->lexFormat()[i].val() * mI->pack()[i]->lmax().val() +
@ -316,7 +317,7 @@ 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;
IB::mPos = iter<0,NI> mLex = iter<0,NI>
([&](auto i) { ([&](auto i) {
return mK->pack()[i]->lex() * mK->lexFormat()[i].val() * return mK->pack()[i]->lex() * mK->lexFormat()[i].val() *
mI->lexFormat()[i].val() * mI->pack()[i]->lmax().val() + mI->lexFormat()[i].val() * mI->pack()[i]->lmax().val() +
@ -326,14 +327,15 @@ namespace CNORXZ
} }
else { else {
const SizeT NI = mI->dim(); const SizeT NI = mI->dim();
IB::mPos = 0; mLex = 0;
for(SizeT i = 0; i != NI; ++i){ for(SizeT i = 0; i != NI; ++i){
IB::mPos += mK->pack()[i]->lex() * mK->lexFormat()[i].val() * mLex += mK->pack()[i]->lex() * mK->lexFormat()[i].val() *
mI->lexFormat()[i].val() * mI->pack()[i]->lmax().val() + mI->lexFormat()[i].val() * mI->pack()[i]->lmax().val() +
mI->pack()[i]->lex() * mI->lexFormat()[i].val() * mI->pack()[i]->lex() * mI->lexFormat()[i].val() *
mK->lexFormat()[i].val(); mK->lexFormat()[i].val();
} }
} }
IB::mPos = mK->pos() * mI->pmax().val() + mI->pos();
return *this; return *this;
} }

View file

@ -146,6 +146,7 @@ namespace CNORXZ
Sptr<IndexI> local() const; Sptr<IndexI> local() const;
private: private:
SizeT mLex = 0;
Sptr<RangeType> mRange; /**< RRange. */ Sptr<RangeType> mRange; /**< RRange. */
Sptr<IndexI> mI; /**< Index on the local range of the THIS rank. */ Sptr<IndexI> mI; /**< Index on the local range of the THIS rank. */
Sptr<IndexK> mK; /**< Multi-index indicating the current rank. */ Sptr<IndexK> mK; /**< Multi-index indicating the current rank. */