Skip to content

Commit

Permalink
added SscReader::GetDeferredDeltaCommon
Browse files Browse the repository at this point in the history
  • Loading branch information
JasonRuonanWang committed Jan 5, 2021
1 parent f6d6640 commit 95d8b5b
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 80 deletions.
3 changes: 3 additions & 0 deletions source/adios2/engine/ssc/SscReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@ class SscReader : public Engine
template <class T>
void GetDeferredCommon(Variable<T> &variable, T *data);

template <class T>
void GetDeferredDeltaCommon(Variable<T> &variable);

void CalculatePosition(ssc::BlockVecVec &mapVec,
ssc::RankPosMap &allOverlapRanks);

Expand Down
142 changes: 62 additions & 80 deletions source/adios2/engine/ssc/SscReader.tcc
Original file line number Diff line number Diff line change
Expand Up @@ -23,39 +23,58 @@ namespace core
namespace engine
{

template <>
void SscReader::GetDeferredCommon(Variable<std::string> &variable,
std::string *data)
template <class T>
void SscReader::GetDeferredDeltaCommon(Variable<T> &variable)
{
TAU_SCOPED_TIMER_FUNC();
variable.SetData(data);

if (m_CurrentStep == 0 || m_WriterDefinitionsLocked == false ||
m_ReaderSelectionsLocked == false)
Dims vStart = variable.m_Start;
Dims vCount = variable.m_Count;
Dims vShape = variable.m_Shape;

if (!helper::IsRowMajor(m_IO.m_HostLanguage))
{
m_LocalReadPattern.emplace_back();
auto &b = m_LocalReadPattern.back();
b.name = variable.m_Name;
b.count = variable.m_Count;
b.start = variable.m_Start;
b.shape = variable.m_Shape;
b.type = DataType::String;
std::reverse(vStart.begin(), vStart.end());
std::reverse(vCount.begin(), vCount.end());
std::reverse(vShape.begin(), vShape.end());
}

m_LocalReadPatternJson["Variables"].emplace_back();
auto &jref = m_LocalReadPatternJson["Variables"].back();
jref["Name"] = b.name;
jref["Type"] = b.type;
jref["ShapeID"] = variable.m_ShapeID;
jref["Start"] = b.start;
jref["Count"] = b.count;
jref["Shape"] = b.shape;
jref["BufferStart"] = 0;
jref["BufferCount"] = 0;
m_LocalReadPattern.emplace_back();
auto &b = m_LocalReadPattern.back();
b.name = variable.m_Name;
b.count = vCount;
b.start = vStart;
b.shape = vShape;
b.type = helper::GetDataType<T>();

for (const auto &d : b.count)
{
if (d == 0)
{
throw(std::runtime_error(
"SetSelection count dimensions cannot be 0"));
}
}

ssc::JsonToBlockVecVec(m_GlobalWritePatternJson, m_GlobalWritePattern);
m_AllReceivingWriterRanks =
ssc::CalculateOverlap(m_GlobalWritePattern, m_LocalReadPattern);
CalculatePosition(m_GlobalWritePattern, m_AllReceivingWriterRanks);
m_LocalReadPatternJson["Variables"].emplace_back();
auto &jref = m_LocalReadPatternJson["Variables"].back();
jref["Name"] = variable.m_Name;
jref["Type"] = helper::GetDataType<T>();
jref["ShapeID"] = variable.m_ShapeID;
jref["Start"] = vStart;
jref["Count"] = vCount;
jref["Shape"] = vShape;
jref["BufferStart"] = 0;
jref["BufferCount"] = 0;

ssc::JsonToBlockVecVec(m_GlobalWritePatternJson, m_GlobalWritePattern);
size_t oldSize = m_AllReceivingWriterRanks.size();
m_AllReceivingWriterRanks =
ssc::CalculateOverlap(m_GlobalWritePattern, m_LocalReadPattern);
CalculatePosition(m_GlobalWritePattern, m_AllReceivingWriterRanks);
size_t newSize = m_AllReceivingWriterRanks.size();
if (oldSize != newSize)
{
size_t totalDataSize = 0;
for (auto i : m_AllReceivingWriterRanks)
{
Expand All @@ -69,8 +88,23 @@ void SscReader::GetDeferredCommon(Variable<std::string> &variable,
static_cast<int>(i.second.second), MPI_CHAR, i.first, 0,
static_cast<int>(i.second.second), MPI_CHAR, m_MpiWin);
MPI_Win_unlock(i.first, m_MpiWin);
m_ReceivedRanks.insert(i.first);
}
}
}

template <>
void SscReader::GetDeferredCommon(Variable<std::string> &variable,
std::string *data)
{
TAU_SCOPED_TIMER_FUNC();
variable.SetData(data);

if (m_CurrentStep == 0 || m_WriterDefinitionsLocked == false ||
m_ReaderSelectionsLocked == false)
{
GetDeferredDeltaCommon(variable);
}
for (const auto &i : m_AllReceivingWriterRanks)
{
const auto &v = m_GlobalWritePattern[i.first];
Expand All @@ -88,7 +122,6 @@ template <class T>
void SscReader::GetDeferredCommon(Variable<T> &variable, T *data)
{
TAU_SCOPED_TIMER_FUNC();

variable.SetData(data);

Dims vStart = variable.m_Start;
Expand All @@ -105,58 +138,7 @@ void SscReader::GetDeferredCommon(Variable<T> &variable, T *data)
if (m_CurrentStep == 0 || m_WriterDefinitionsLocked == false ||
m_ReaderSelectionsLocked == false)
{
m_LocalReadPattern.emplace_back();
auto &b = m_LocalReadPattern.back();
b.name = variable.m_Name;
b.count = vCount;
b.start = vStart;
b.shape = vShape;
b.type = helper::GetDataType<T>();

for (const auto &d : b.count)
{
if (d == 0)
{
throw(std::runtime_error(
"SetSelection count dimensions cannot be 0"));
}
}

m_LocalReadPatternJson["Variables"].emplace_back();
auto &jref = m_LocalReadPatternJson["Variables"].back();
jref["Name"] = variable.m_Name;
jref["Type"] = helper::GetDataType<T>();
jref["ShapeID"] = variable.m_ShapeID;
jref["Start"] = vStart;
jref["Count"] = vCount;
jref["Shape"] = vShape;
jref["BufferStart"] = 0;
jref["BufferCount"] = 0;

ssc::JsonToBlockVecVec(m_GlobalWritePatternJson, m_GlobalWritePattern);
size_t oldSize = m_AllReceivingWriterRanks.size();
m_AllReceivingWriterRanks =
ssc::CalculateOverlap(m_GlobalWritePattern, m_LocalReadPattern);
CalculatePosition(m_GlobalWritePattern, m_AllReceivingWriterRanks);
size_t newSize = m_AllReceivingWriterRanks.size();
if (oldSize != newSize)
{
size_t totalDataSize = 0;
for (auto i : m_AllReceivingWriterRanks)
{
totalDataSize += i.second.second;
}
m_Buffer.resize(totalDataSize);
for (const auto &i : m_AllReceivingWriterRanks)
{
MPI_Win_lock(MPI_LOCK_SHARED, i.first, 0, m_MpiWin);
MPI_Get(m_Buffer.data() + i.second.first,
static_cast<int>(i.second.second), MPI_CHAR, i.first, 0,
static_cast<int>(i.second.second), MPI_CHAR, m_MpiWin);
MPI_Win_unlock(i.first, m_MpiWin);
m_ReceivedRanks.insert(i.first);
}
}
GetDeferredDeltaCommon(variable);
}

for (const auto &i : m_AllReceivingWriterRanks)
Expand Down

0 comments on commit 95d8b5b

Please sign in to comment.