Files
SAPFOR/src/Predictor/Lib/RedGroup.cpp
2025-03-12 14:28:04 +03:00

182 lines
4.8 KiB
C++

//////////////////////////////////////////////////////////////////////
//
// RedGroup.cpp: implementation of the RedGroup class.
//
//////////////////////////////////////////////////////////////////////
#include "RedGroup.h"
using namespace std;
extern ofstream prot;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
RedGroup::RedGroup(VM *AvmPtr):
vmPtr(AvmPtr)
{
redVars = vector<RedVar *>(0);
CentralProc = vmPtr->GetCenterLI();
TotalSize = 0;
}
RedGroup::~RedGroup()
{
}
//////////////////////////////////////////////////////////////////////
// Add reduction variable to reduction groupe
//////////////////////////////////////////////////////////////////////
void RedGroup::AddRV(RedVar * ARedVar)
{
redVars.push_back(ARedVar);
TotalSize += ARedVar->GetSize();
}
//////////////////////////////////////////////////////////////////////
// Calculate reduction time
//////////////////////////////////////////////////////////////////////
double RedGroup::StartR(DArray *APattern, long ALoopRank, const vector<long>& AAxisArray)
{
double time = 0;
long i,
redBlSize = 1,
redBlCenterDist = 0;
vector<long> loopAlign(ALoopRank);
int dir;
long LSize = vmPtr->GetLSize();
double TStart = vmPtr->getTStart();
double TByte = vmPtr->getTByte();
bool redBlEmpty = true;
// ???òàê âîîáùå-òî íåëüçÿ, ò.ê. ðåä.ïåðåìåííàÿ ðàçìíîæåíà ïî âñåé âèðò. ìàøèíå,
// à ìàññèâ òîëüêî ïî àáñò. ìàøèíå, à ýòî íå âñåãäà ñîâïàäàåò
// à òàê æå ïðè ñáîðêå èíôîðìàöèè â öåíòð íàäî ó÷èòûâàòü, òî ÷òî
// â íà÷àëå ôóíêöèè Update
// ïðè ðàññûëêå íå âàæíî òàê êàê âñ¸ ðàâíî íà âñå ïðîöåññîðû íàäî ïîñûëàòü
// (åñëè êîíå÷íî íå ïî âñåé âèðò.ìàøèíå ðàçìíîæåí öèêë)
if (APattern->Repl)
return 0;
for (i = 0; i < ALoopRank; i++) {
loopAlign[i] = APattern->GetMapDim(AAxisArray[i], dir);
// prot << "loopAlign[" << i << "] = " << loopAlign[i] << endl;
}
switch (vmPtr->getMType()) {
case mach_ETHERNET :
for (i = 0; i < ALoopRank; i++) {
if (loopAlign[i]) {
redBlSize *= vmPtr->GetSize(loopAlign[i]);
redBlEmpty = false;
}
}
if (!redBlEmpty)
time = (TStart + TByte * TotalSize) * (redBlSize + LSize - 2);
break;
case mach_TRANSPUTER :
for (i = 0; i < ALoopRank; i++) {
if (loopAlign[i]) {
redBlCenterDist += vmPtr->GetSize(loopAlign[i]) / 2;
redBlEmpty = false;
}
}
if (!redBlEmpty)
time = (TStart + TByte * TotalSize) * (vmPtr->GetDistance(0, CentralProc)
+ redBlCenterDist);
break;
case mach_MYRINET :
for (i = 0; i < ALoopRank; i++) {
if (loopAlign[i]) {
redBlSize *= vmPtr->GetSize(loopAlign[i]);
redBlEmpty = false;
// prot << "i = " << i << ", redBlSize = " << redBlSize << endl;
}
}
if (!redBlEmpty) {
time = (TStart + TByte * TotalSize) * (redBlSize + LSize - 2);
}
break;
}
// ? ñëó÷àé êîãäà íà const ïðîöåññîð è BOUNDREPL
return time * vmPtr->getScale();
}
//////////////////////////////////////////////////////////////////////
// Calculate reduction time
//////////////////////////////////////////////////////////////////////
double RedGroup::StartR(AMView *APattern, long ALoopRank, const vector<long>& AAxisArray)
{
double time = 0;
long i, redBlSize = 1, redBlCenterDist = 0;
vector<long> loopAlign(ALoopRank);
// int dir;
long LSize = vmPtr->GetLSize();
double TStart = vmPtr->getTStart();
double TByte = vmPtr->getTByte();
bool redBlEmpty = true;
// ???òàê âîîáùå-òî íåëüçÿ, ò.ê. ðåä.ïåðåìåííàÿ ðàçìíîæåíà ïî âñåé âèðò. ìàøèíå,
// à ìàññèâ òîëüêî ïî àáñò. ìàøèíå, à ýòî íå âñåãäà ñîâïàäàåò
// à òàê æå ïðè ñáîðêå èíôîðìàöèè â öåíòð íàäî ó÷èòûâàòü, òî ÷òî â
// íà÷àëå ôóíêöèè Update
// ïðè ðàññûëêå íå âàæíî òàê êàê âñ¸ ðàâíî íà âñå ïðîöåññîðû íàäî ïîñûëàòü
// (åñëè êîíå÷íî íå ïî âñåé âèðò.ìàøèíå ðàçìíîæåí öèêë)
if (APattern->Repl)
return 0;
for (i = 0; i < ALoopRank; i++)
loopAlign[i] = AAxisArray[i];
// loopAlign[i] = APattern->GetMapDim(AAxisArray[i], dir);
switch (vmPtr->getMType()) {
case mach_ETHERNET :
for (i = 0; i < ALoopRank; i++) {
if (loopAlign[i]) {
redBlSize *= vmPtr->GetSize(loopAlign[i]);
redBlEmpty = false;
}
}
if (!redBlEmpty)
time = (TStart + TByte * TotalSize) * (redBlSize + LSize - 2);
break;
case mach_TRANSPUTER :
for (i = 0; i < ALoopRank; i++) {
if (loopAlign[i]) {
redBlCenterDist += vmPtr->GetSize(loopAlign[i]) / 2;
redBlEmpty = false;
}
}
if (!redBlEmpty)
time = (TStart + TByte * TotalSize) * (vmPtr->GetDistance(0, CentralProc)
+ redBlCenterDist);
break;
}
// ? ñëó÷àé êîãäà íà const ïðîöåññîð è BOUNDREPL
return time;
}