mirror of
https://github.com/paboyle/Grid.git
synced 2026-08-31 23:09:36 +01:00
More perf diagnostics
This commit is contained in:
@@ -404,7 +404,8 @@ public:
|
|||||||
// same sequence of sizes). Time is wall time inside SendToRecvFrom, so it
|
// same sequence of sizes). Time is wall time inside SendToRecvFrom, so it
|
||||||
// includes waiting for the partner -- a bucket whose GB/s is far below the
|
// includes waiting for the partner -- a bucket whose GB/s is far below the
|
||||||
// probe's for the same size is wait, not wire.
|
// probe's for the same size is wait, not wire.
|
||||||
std::cout << GridLogMessage << "BlockCyclicSumma ring histogram (boss): size-bucket msgs GB secs GB/s %time" << std::endl;
|
std::cout << GridLogMessage << "BlockCyclicSumma ring histogram (boss): size-bucket msgs GB xfer-secs GB/s %time"
|
||||||
|
<< (SUMMA.handshake>0 ? " handshake-secs (partner wait, excluded from xfer)" : "") << std::endl;
|
||||||
std::streamsize oldprec = std::cout.precision();
|
std::streamsize oldprec = std::cout.precision();
|
||||||
for(int b=0;b<SUMMA.NHIST;b++){
|
for(int b=0;b<SUMMA.NHIST;b++){
|
||||||
if ( !SUMMA.histN[b] ) continue;
|
if ( !SUMMA.histN[b] ) continue;
|
||||||
@@ -416,7 +417,9 @@ public:
|
|||||||
<< std::setw(10) << std::setprecision(3) << g
|
<< std::setw(10) << std::setprecision(3) << g
|
||||||
<< std::setw(9) << std::setprecision(3) << sec
|
<< std::setw(9) << std::setprecision(3) << sec
|
||||||
<< std::setw(9) << std::setprecision(3) << (sec>0 ? g/sec : 0.0)
|
<< std::setw(9) << std::setprecision(3) << (sec>0 ? g/sec : 0.0)
|
||||||
<< std::setw(8) << std::setprecision(3) << (ring>0 ? 100.0*sec/ring : 0.0) << std::endl;
|
<< std::setw(8) << std::setprecision(3) << (ring>0 ? 100.0*sec/ring : 0.0);
|
||||||
|
if ( SUMMA.handshake>0 ) std::cout << std::setw(12) << std::setprecision(3) << SUMMA.histHsUs[b]/1.0e6;
|
||||||
|
std::cout << std::endl;
|
||||||
}
|
}
|
||||||
std::cout.precision(oldprec);
|
std::cout.precision(oldprec);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -148,9 +148,14 @@ public:
|
|||||||
// GB/s can be attributed (many small latency-bound messages vs slow large
|
// GB/s can be attributed (many small latency-bound messages vs slow large
|
||||||
// ones vs partner-wait). The 8 MB probe runs at 11-20 GB/s; SUMMA averaged 2.
|
// ones vs partner-wait). The 8 MB probe runs at 11-20 GB/s; SUMMA averaged 2.
|
||||||
static const int NHIST=48;
|
static const int NHIST=48;
|
||||||
uint64_t histN[NHIST]={0}, histBytes[NHIST]={0}; double histUs[NHIST]={0};
|
uint64_t histN[NHIST]={0}, histBytes[NHIST]={0}; double histUs[NHIST]={0}, histHsUs[NHIST]={0};
|
||||||
void HistAdd(uint64_t bytes, double us){ int b=0; while((bytes>>b)>1) b++; histN[b]++; histBytes[b]+=bytes; histUs[b]+=us; }
|
// SUMMA_HANDSHAKE=1: a 4-byte SendToRecvFrom with the same partner
|
||||||
void ResetTelemetry(void){ tAlloc=tPack=tRingA=tRingB=tGemm=0; bytesRing=nRingMsg=nMultiply=nGemm=0; for(int b=0;b<NHIST;b++){histN[b]=histBytes[b]=0; histUs[b]=0;} }
|
// immediately before each ring message, timed separately (histHsUs).
|
||||||
|
// Handshake time = partner-arrival skew; the remainder = transfer. Splits
|
||||||
|
// the [2,4) MB bucket's 12 ms/msg (2026-08-27) into wait vs wire.
|
||||||
|
int handshake = -1; int hsTx=0, hsRx=0;
|
||||||
|
void HistAdd(uint64_t bytes, double us, double hs=0.0){ int b=0; while((bytes>>b)>1) b++; histN[b]++; histBytes[b]+=bytes; histUs[b]+=us; histHsUs[b]+=hs; }
|
||||||
|
void ResetTelemetry(void){ tAlloc=tPack=tRingA=tRingB=tGemm=0; bytesRing=nRingMsg=nMultiply=nGemm=0; for(int b=0;b<NHIST;b++){histN[b]=histBytes[b]=0; histUs[b]=histHsUs[b]=0;} }
|
||||||
|
|
||||||
static int Overlap(int64_t a0,int64_t a1,int64_t b0,int64_t b1)
|
static int Overlap(int64_t a0,int64_t a1,int64_t b0,int64_t b1)
|
||||||
{ return (a0 < b1) && (b0 < a1); }
|
{ return (a0 < b1) && (b0 < a1); }
|
||||||
@@ -214,6 +219,7 @@ public:
|
|||||||
const uint64_t slotB1 = (uint64_t)nb*nloc_j; // one panel
|
const uint64_t slotB1 = (uint64_t)nb*nloc_j; // one panel
|
||||||
const uint64_t slotB = (uint64_t)S*slotB1;
|
const uint64_t slotB = (uint64_t)S*slotB1;
|
||||||
nMultiply++;
|
nMultiply++;
|
||||||
|
if ( handshake < 0 ) handshake = getenv("SUMMA_HANDSHAKE") ? atoi(getenv("SUMMA_HANDSHAKE")) : 0;
|
||||||
tAlloc -= usecond();
|
tAlloc -= usecond();
|
||||||
if ( Abuf.size() < std::max<uint64_t>(slotA*Pc,1) ) Abuf.resize( std::max<uint64_t>(slotA*Pc,1) );
|
if ( Abuf.size() < std::max<uint64_t>(slotA*Pc,1) ) Abuf.resize( std::max<uint64_t>(slotA*Pc,1) );
|
||||||
if ( Bbuf.size() < std::max<uint64_t>(slotB*Pr,1) ) Bbuf.resize( std::max<uint64_t>(slotB*Pr,1) );
|
if ( Bbuf.size() < std::max<uint64_t>(slotB*Pr,1) ) Bbuf.resize( std::max<uint64_t>(slotB*Pr,1) );
|
||||||
@@ -280,11 +286,12 @@ public:
|
|||||||
for(int t=1;t<Pc;t++){
|
for(int t=1;t<Pc;t++){
|
||||||
int cs = (pcol - t + 1 + Pc*Pc) % Pc;
|
int cs = (pcol - t + 1 + Pc*Pc) % Pc;
|
||||||
int cr = (pcol - t + Pc*Pc) % Pc;
|
int cr = (pcol - t + Pc*Pc) % Pc;
|
||||||
double tm = usecond();
|
double ths = 0.0, tm = usecond();
|
||||||
|
if ( handshake ) { grid->SendToRecvFrom((void *)&hsTx, dest, (void *)&hsRx, src, sizeof(int)); ths = usecond()-tm; tm = usecond(); }
|
||||||
grid->SendToRecvFrom((void *)(&Abuf[0]+slotA*cs), dest,
|
grid->SendToRecvFrom((void *)(&Abuf[0]+slotA*cs), dest,
|
||||||
(void *)(&Abuf[0]+slotA*cr), src,
|
(void *)(&Abuf[0]+slotA*cr), src,
|
||||||
slotA*sizeof(ComplexD));
|
slotA*sizeof(ComplexD));
|
||||||
HistAdd(slotA*sizeof(ComplexD), usecond()-tm);
|
HistAdd(slotA*sizeof(ComplexD), usecond()-tm, ths);
|
||||||
bytesRing += slotA*sizeof(ComplexD); nRingMsg++;
|
bytesRing += slotA*sizeof(ComplexD); nRingMsg++;
|
||||||
}
|
}
|
||||||
tRingA += usecond();
|
tRingA += usecond();
|
||||||
@@ -300,11 +307,12 @@ public:
|
|||||||
for(int t=1;t<Pr;t++){
|
for(int t=1;t<Pr;t++){
|
||||||
int rs = (prow - t + 1 + Pr*Pr) % Pr;
|
int rs = (prow - t + 1 + Pr*Pr) % Pr;
|
||||||
int rr = (prow - t + Pr*Pr) % Pr;
|
int rr = (prow - t + Pr*Pr) % Pr;
|
||||||
double tm = usecond();
|
double ths = 0.0, tm = usecond();
|
||||||
|
if ( handshake ) { grid->SendToRecvFrom((void *)&hsTx, dest, (void *)&hsRx, src, sizeof(int)); ths = usecond()-tm; tm = usecond(); }
|
||||||
grid->SendToRecvFrom((void *)(&Bbuf[0]+slotB*rs), dest,
|
grid->SendToRecvFrom((void *)(&Bbuf[0]+slotB*rs), dest,
|
||||||
(void *)(&Bbuf[0]+slotB*rr), src,
|
(void *)(&Bbuf[0]+slotB*rr), src,
|
||||||
slotB*sizeof(ComplexD));
|
slotB*sizeof(ComplexD));
|
||||||
HistAdd(slotB*sizeof(ComplexD), usecond()-tm);
|
HistAdd(slotB*sizeof(ComplexD), usecond()-tm, ths);
|
||||||
bytesRing += slotB*sizeof(ComplexD); nRingMsg++;
|
bytesRing += slotB*sizeof(ComplexD); nRingMsg++;
|
||||||
}
|
}
|
||||||
tRingB += usecond();
|
tRingB += usecond();
|
||||||
|
|||||||
Reference in New Issue
Block a user