Skip to content

Commit 1419d3e

Browse files
committed
pcm-daemon: add 'memory mode hit approximation' metric
1 parent abafc63 commit 1419d3e

File tree

3 files changed

+95
-18
lines changed

3 files changed

+95
-18
lines changed

src/client/main.cpp

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -241,35 +241,75 @@ int main(int argc, char *argv[])
241241
std::cout << "\n\n";
242242

243243
// Display memory counters
244-
printTitle("Mem Read p/Sock.");
244+
245+
printTitle("PMM Metrics Avail.");
246+
std::cout << std::setprecision(coutPrecision) << counters.memory.pmmMetricsAvailable << " ";
247+
std::cout << "\n";
248+
249+
printTitle("DRAM Read p/Sock.");
245250
for(PCMDaemon::uint32 i = 0; i < counters.system.numOfOnlineSockets; ++i)
246251
{
247252
std::cout << std::setprecision(coutPrecision) << counters.memory.sockets[i].read << " ";
248253
}
249254
std::cout << "\n";
250255

251-
printTitle("Mem Write p/Sock.");
256+
printTitle("DRAM Write p/Sock.");
252257
for(PCMDaemon::uint32 i = 0; i < counters.system.numOfOnlineSockets; ++i)
253258
{
254259
std::cout << std::setprecision(coutPrecision) << counters.memory.sockets[i].write << " ";
255260
}
256261
std::cout << "\n";
257262

263+
if (counters.memory.pmmMetricsAvailable)
264+
{
265+
printTitle("PMM Read p/Sock.");
266+
for(PCMDaemon::uint32 i = 0; i < counters.system.numOfOnlineSockets; ++i)
267+
{
268+
std::cout << std::setprecision(coutPrecision) << counters.memory.sockets[i].pmmRead << " ";
269+
}
270+
std::cout << "\n";
271+
272+
printTitle("PMM Write p/Sock.");
273+
for(PCMDaemon::uint32 i = 0; i < counters.system.numOfOnlineSockets; ++i)
274+
{
275+
std::cout << std::setprecision(coutPrecision) << counters.memory.sockets[i].pmmWrite << " ";
276+
}
277+
std::cout << "\n";
278+
279+
printTitle("PMM Memory Mode hit rate p/Sock. ");
280+
for(PCMDaemon::uint32 i = 0; i < counters.system.numOfOnlineSockets; ++i)
281+
{
282+
std::cout << std::setprecision(coutPrecision) << counters.memory.sockets[i].pmmMemoryModeHitRate << " ";
283+
}
284+
std::cout << "\n";
285+
}
286+
258287
printTitle("Mem Total p/Sock.");
259288
for(PCMDaemon::uint32 i = 0; i < counters.system.numOfOnlineSockets; ++i)
260289
{
261290
std::cout << std::setprecision(coutPrecision) << counters.memory.sockets[i].total << " ";
262291
}
263292
std::cout << "\n";
264293

265-
printTitle("Mem Read Sys.");
266-
std::cout << std::setprecision(coutPrecision) << counters.memory.system.total << " ";
294+
printTitle("DRAM Read Sys.");
295+
std::cout << std::setprecision(coutPrecision) << counters.memory.system.read << " ";
267296
std::cout << "\n";
268297

269-
printTitle("Mem Write Sys.");
298+
printTitle("DRAM Write Sys.");
270299
std::cout << std::setprecision(coutPrecision) << counters.memory.system.write << " ";
271300
std::cout << "\n";
272301

302+
if (counters.memory.pmmMetricsAvailable)
303+
{
304+
printTitle("PMM Read Sys.");
305+
std::cout << std::setprecision(coutPrecision) << counters.memory.system.pmmRead << " ";
306+
std::cout << "\n";
307+
308+
printTitle("PMM Write Sys.");
309+
std::cout << std::setprecision(coutPrecision) << counters.memory.system.pmmWrite << " ";
310+
std::cout << "\n";
311+
}
312+
273313
printTitle("Mem Total Sys.");
274314
std::cout << std::setprecision(coutPrecision) << counters.memory.system.total << " ";
275315
std::cout << "\n";

src/daemon/common.h

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// SPDX-License-Identifier: BSD-3-Clause
2-
// Copyright (c) 2009-2018, Intel Corporation
2+
// Copyright (c) 2009-2018,2022 Intel Corporation
33
// written by Steven Briscoe
44

55
#ifndef COMMON_H_
@@ -119,31 +119,41 @@ namespace PCMDaemon {
119119
uint64 socketId = 0;
120120
PCMMemoryChannelCounter channels[MEMORY_MAX_IMC_CHANNELS];
121121
uint32 numOfChannels;
122-
float read;
123-
float write;
124-
float total;
122+
float read; // DRAM read traffic in MBytes/sec
123+
float write; // DRAM write traffic in MBytes/sec
124+
float pmmRead; // PMM read traffic in MBytes/sec
125+
float pmmWrite; // PMM write traffic in MBytes/sec
126+
float total; // total traffic in MBytes/sec
127+
float pmmMemoryModeHitRate; // PMM memory mode hit rate estimation. Metric value range is [0..1]
125128
double dramEnergy;
126129

127130
public:
128131
PCMMemorySocketCounter() :
129132
numOfChannels(0),
130133
read(-1.0),
131134
write(-1.0),
135+
pmmRead(-1.0),
136+
pmmWrite(-1.0),
132137
total(-1.0),
138+
pmmMemoryModeHitRate(-1.0),
133139
dramEnergy(0.0) {}
134140
} ALIGN(ALIGNMENT);
135141

136142
typedef struct PCMMemorySocketCounter PCMMemorySocketCounter;
137143

138144
struct PCMMemorySystemCounter {
139-
float read;
140-
float write;
141-
float total;
145+
float read; // DRAM read traffic in MBytes/sec
146+
float write; // DRAM write traffic in MBytes/sec
147+
float pmmRead; // PMM read traffic in MBytes/sec
148+
float pmmWrite; // PMM write traffic in MBytes/sec
149+
float total; // total traffic in MBytes/sec
142150

143151
public:
144152
PCMMemorySystemCounter() :
145153
read(-1.0),
146154
write(-1.0),
155+
pmmRead(-1.0),
156+
pmmWrite(-1.0),
147157
total(-1.0) {}
148158
} ALIGN(ALIGNMENT);
149159

@@ -152,11 +162,14 @@ namespace PCMDaemon {
152162
struct PCMMemory {
153163
PCMMemorySocketCounter sockets[MAX_SOCKETS];
154164
PCMMemorySystemCounter system;
155-
bool dramEnergyMetricsAvailable;
165+
bool dramEnergyMetricsAvailable; // true if DRAM energy metrics are available
166+
bool pmmMetricsAvailable; // true if PMM metrics are available
156167

157168
public:
158169
PCMMemory() :
159-
dramEnergyMetricsAvailable(false) {}
170+
dramEnergyMetricsAvailable(false),
171+
pmmMetricsAvailable(false)
172+
{}
160173
} ALIGN(ALIGNMENT);
161174

162175
typedef struct PCMMemory PCMMemory;

src/daemon/daemon.cpp

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// SPDX-License-Identifier: BSD-3-Clause
2-
// Copyright (c) 2009-2018, Intel Corporation
2+
// Copyright (c) 2009-2018,2022 Intel Corporation
33
// written by Steven Briscoe
44

55
#include <cstdlib>
@@ -540,6 +540,7 @@ namespace PCMDaemon {
540540

541541
PCMMemory& memory = sharedPCMState_->pcm.memory;
542542
memory.dramEnergyMetricsAvailable = pcmInstance_->dramEnergyMetricsAvailable();
543+
memory.pmmMetricsAvailable = pcmInstance_->PMMTrafficMetricsAvailable();
543544

544545
const uint32 numSockets = sharedPCMState_->pcm.system.numOfSockets;
545546

@@ -554,11 +555,26 @@ namespace PCMDaemon {
554555
float iMC_Wr_socket_chan[MAX_SOCKETS][MEMORY_MAX_IMC_CHANNELS];
555556
float iMC_Rd_socket[MAX_SOCKETS];
556557
float iMC_Wr_socket[MAX_SOCKETS];
558+
float iMC_PMM_Rd_socket[MAX_SOCKETS];
559+
float iMC_PMM_Wr_socket[MAX_SOCKETS];
557560

558561
for(uint32 skt(0); skt < numSockets; ++skt)
559562
{
560563
iMC_Rd_socket[skt] = 0.0;
561564
iMC_Wr_socket[skt] = 0.0;
565+
iMC_PMM_Rd_socket[skt] = 0.0;
566+
iMC_PMM_Wr_socket[skt] = 0.0;
567+
568+
auto toBW = [&elapsedTime](const uint64 bytes)
569+
{
570+
return (float)(bytes / 1000000.0 / (elapsedTime / 1000.0));
571+
};
572+
573+
if (memory.pmmMetricsAvailable)
574+
{
575+
iMC_PMM_Rd_socket[skt] = toBW(getBytesReadFromPMM(socketStatesBefore_[skt], socketStatesAfter_[skt]));
576+
iMC_PMM_Wr_socket[skt] = toBW(getBytesWrittenToPMM(socketStatesBefore_[skt], socketStatesAfter_[skt]));
577+
}
562578

563579
for(uint32 channel(0); channel < MEMORY_MAX_IMC_CHANNELS; ++channel)
564580
{
@@ -572,8 +588,8 @@ namespace PCMDaemon {
572588
continue;
573589
}
574590

575-
iMC_Rd_socket_chan[skt][channel] = (float) (getMCCounter(channel,MEMORY_READ,serverUncoreCounterStatesBefore_[skt],serverUncoreCounterStatesAfter_[skt]) * 64 / 1000000.0 / (elapsedTime/1000.0));
576-
iMC_Wr_socket_chan[skt][channel] = (float) (getMCCounter(channel,MEMORY_WRITE,serverUncoreCounterStatesBefore_[skt],serverUncoreCounterStatesAfter_[skt]) * 64 / 1000000.0 / (elapsedTime/1000.0));
591+
iMC_Rd_socket_chan[skt][channel] = (float)(toBW(getMCCounter(channel, MEMORY_READ, serverUncoreCounterStatesBefore_[skt],serverUncoreCounterStatesAfter_[skt]) * 64));
592+
iMC_Wr_socket_chan[skt][channel] = (float)(toBW(getMCCounter(channel, MEMORY_WRITE, serverUncoreCounterStatesBefore_[skt],serverUncoreCounterStatesAfter_[skt]) * 64));
577593

578594
iMC_Rd_socket[skt] += iMC_Rd_socket_chan[skt][channel];
579595
iMC_Wr_socket[skt] += iMC_Wr_socket_chan[skt][channel];
@@ -582,6 +598,8 @@ namespace PCMDaemon {
582598

583599
float systemRead(0.0);
584600
float systemWrite(0.0);
601+
float systemPMMRead(0.0);
602+
float systemPMMWrite(0.0);
585603

586604
uint32 onlineSocketsI(0);
587605
for(uint32 skt (0); skt < numSockets; ++skt)
@@ -610,14 +628,20 @@ namespace PCMDaemon {
610628
memory.sockets[onlineSocketsI].numOfChannels = currentChannelI;
611629
memory.sockets[onlineSocketsI].read = iMC_Rd_socket[skt];
612630
memory.sockets[onlineSocketsI].write = iMC_Wr_socket[skt];
613-
memory.sockets[onlineSocketsI].total= iMC_Rd_socket[skt] + iMC_Wr_socket[skt];
631+
memory.sockets[onlineSocketsI].pmmRead = iMC_PMM_Rd_socket[skt];
632+
memory.sockets[onlineSocketsI].pmmWrite = iMC_PMM_Wr_socket[skt];
633+
memory.sockets[onlineSocketsI].total = iMC_Rd_socket[skt] + iMC_Wr_socket[skt] + iMC_PMM_Rd_socket[skt] + iMC_PMM_Wr_socket[skt];
634+
const auto all = memory.sockets[onlineSocketsI].total;
635+
memory.sockets[onlineSocketsI].pmmMemoryModeHitRate = (all == 0.0) ? -1.0 : ((iMC_Rd_socket[skt] + iMC_Wr_socket[skt]) / all); // simplified approximation
614636
if (memory.dramEnergyMetricsAvailable)
615637
{
616638
memory.sockets[onlineSocketsI].dramEnergy = getDRAMConsumedJoules(socketStatesBefore_[skt], socketStatesAfter_[skt]);
617639
}
618640

619641
systemRead += iMC_Rd_socket[skt];
620642
systemWrite += iMC_Wr_socket[skt];
643+
systemPMMRead += iMC_PMM_Rd_socket[skt];
644+
systemPMMWrite += iMC_PMM_Wr_socket[skt];
621645

622646
++onlineSocketsI;
623647
}

0 commit comments

Comments
 (0)