Skip to content

Commit

Permalink
[XDP] Changes to stop on specified Byte count and other enhancements …
Browse files Browse the repository at this point in the history
…for ADF profile API (#8471)
  • Loading branch information
vipangul authored Oct 1, 2024
1 parent 9619a17 commit 1510f83
Show file tree
Hide file tree
Showing 11 changed files with 404 additions and 201 deletions.
44 changes: 36 additions & 8 deletions src/runtime_src/xdp/profile/database/static_info/aie_constructs.h
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,17 @@ namespace xdp {
aie_cfg_tile(uint32_t c, uint32_t r, module_type t) : column(c), row(r), type(t) {}
};

struct GraphPortPair {
std::string srcGraphName;
std::string srcGraphPort;
std::string destGraphName;
std::string destGraphPort;

GraphPortPair() = default;
GraphPortPair(std::string g1, std::string p1, std::string g2, std::string p2):
srcGraphName(g1), srcGraphPort(p1), destGraphName(g2), destGraphPort(p2) {}
};

struct LatencyConfig
{
public:
Expand All @@ -350,30 +361,47 @@ namespace xdp {
uint32_t tranx_no;
bool isSource;
uint8_t portId;
GraphPortPair graphPortPair;

LatencyConfig() = default;
LatencyConfig(tile_type& s, tile_type& d, std::string m, uint32_t t, bool i) :
src(s), dest(d), metricSet(m), tranx_no(t), isSource(i) {}
LatencyConfig(tile_type& s, tile_type& d, std::string m, uint32_t t, bool i,
std::string g1, std::string p1, std::string g2, std::string p2) :
src(s), dest(d), metricSet(m), tranx_no(t), isSource(i),
graphPortPair(g1, p1, g2, p2) {}
void updatePortId(uint8_t& id) { portId=id; }
};

struct LatencyCache
{
std::string srcDestKey;
GraphPortPair graphPortPair;

LatencyCache() = default;
LatencyCache(std::string key, std::string g1, std::string p1, std::string g2, std::string p2):
srcDestKey(key), graphPortPair(g1, p1, g2, p2) {}
};

struct AIEProfileFinalConfig
{
using tile_vec = std::vector<std::map<tile_type, std::string>>;
using tile_channel = std::map<tile_type, uint8_t>;
using tile_bytes = std::map<tile_type, uint32_t>;
using tile_latencyMap = std::map<tile_type, LatencyConfig>;

std::vector<std::map<tile_type, std::string>> configMetrics;
std::map<tile_type, uint8_t> configChannel0;
std::map<tile_type, uint8_t> configChannel1;
tile_vec configMetrics;
tile_channel configChannel0;
tile_channel configChannel1;
uint8_t tileRowOffset;
std::map<tile_type, uint32_t> bytesTransferConfigMap;
tile_bytes bytesTransferConfigMap;
tile_latencyMap latencyConfigMap;

AIEProfileFinalConfig() {}
AIEProfileFinalConfig(const tile_vec& otherTileVec, const tile_channel& cc0,
const tile_channel& cc1, uint8_t offset, const tile_bytes& byteMap):
const tile_channel& cc1, uint8_t offset,
const tile_bytes& byteMap, const tile_latencyMap& latencyMap):
configMetrics(otherTileVec), configChannel0(cc0),
configChannel1(cc1), tileRowOffset(offset),
bytesTransferConfigMap(byteMap) {}
bytesTransferConfigMap(byteMap), latencyConfigMap(latencyMap) {}
};

} // end namespace xdp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@
#include <boost/property_tree/ptree.hpp>

#include "aie_control_config_filetype.h"
#include "xdp/profile/database/static_info/aie_util.h"
#include "core/common/message.h"
#include "xdp/profile/database/static_info/aie_util.h"
#include "xdp/profile/plugin/aie_profile/aie_profile_defs.h"

namespace xdp::aie {
namespace pt = boost::property_tree;
Expand Down Expand Up @@ -260,8 +261,8 @@ AIEControlConfigFiletype::getInterfaceTiles(const std::string& graphName,
{
// Catch metric sets that don't follow above naming convention
if ((metricStr != "packets") &&
(metricStr != "interface_tile_latency") &&
(metricStr != "start_to_bytes_transferred"))
(metricStr != METRIC_LATENCY) &&
(metricStr != METRIC_BYTE_COUNT))
continue;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,8 @@ constexpr uint32_t GROUP_SHIM_S2MM1_STALL_MASK = 0x00082000;
constexpr uint32_t GROUP_SHIM_MM2S0_STALL_MASK = 0x00500000;
constexpr uint32_t GROUP_SHIM_MM2S1_STALL_MASK = 0x00A00000;

// ADF API related constants
inline const std::string METRIC_BYTE_COUNT = "start_to_bytes_transferred";
inline const std::string METRIC_LATENCY = "interface_tile_latency";

#endif
Original file line number Diff line number Diff line change
Expand Up @@ -724,7 +724,7 @@ namespace xdp {

// Grab channel numbers (if specified; memory tiles only)
if (graphMetrics[i].size() > 3) {
if (graphMetrics[i][2]=="start_to_bytes_transferred") {
if (graphMetrics[i][2]==METRIC_BYTE_COUNT) {
uint32_t bytes = processUserSpecifiedBytes(graphMetrics[i][3]);
for (auto& e : tiles)
setUserSpecifiedBytes(e, bytes);
Expand Down Expand Up @@ -789,7 +789,7 @@ namespace xdp {

// Grab channel numbers (if specified; memory tiles only)
if (graphMetrics[i].size() > 3) {
if (graphMetrics[i][2]=="start_to_bytes_transferred") {
if (graphMetrics[i][2]==METRIC_BYTE_COUNT) {
uint32_t bytes = processUserSpecifiedBytes(graphMetrics[i][3]);
for (auto& e : tiles)
setUserSpecifiedBytes(e, bytes);
Expand Down Expand Up @@ -840,7 +840,7 @@ namespace xdp {
uint8_t channelId1 = 1;
uint32_t bytes = defaultTransferBytes;
if (metrics[i].size() > 2) {
if (metrics[i][1] == "start_to_bytes_transferred") {
if (metrics[i][1] == METRIC_BYTE_COUNT) {
bytes = processUserSpecifiedBytes(metrics[i][2]);
}
else {
Expand Down Expand Up @@ -868,7 +868,7 @@ namespace xdp {
configMetrics[moduleIdx][t] = metrics[i][1];
configChannel0[t] = channelId0;
configChannel1[t] = channelId1;
if (metrics[i][1] == "start_to_bytes_transferred")
if (metrics[i][1] == METRIC_BYTE_COUNT)
setUserSpecifiedBytes(t, bytes);
}
} // Pass 1
Expand Down Expand Up @@ -908,7 +908,7 @@ namespace xdp {
uint32_t bytes = defaultTransferBytes;
if (metrics[i].size() > 3) {
// Process <tile1>:<tile2>:start_to_bytes_transferred:<bytes>
if (metrics[i][2] == "start_to_bytes_transferred") {
if (metrics[i][2] == METRIC_BYTE_COUNT) {
bytes = processUserSpecifiedBytes(metrics[i][3]);
}
else {
Expand Down Expand Up @@ -936,7 +936,7 @@ namespace xdp {
configMetrics[moduleIdx][t] = metrics[i][2];
configChannel0[t] = channelId0;
configChannel1[t] = channelId1;
if (metrics[i][2] == "start_to_bytes_transferred")
if (metrics[i][2] == METRIC_BYTE_COUNT)
setUserSpecifiedBytes(t, bytes);
}
} // Pass 2
Expand Down Expand Up @@ -995,7 +995,7 @@ namespace xdp {
configMetrics[moduleIdx][t] = metrics[i][1];
configChannel0[t] = channelId0;
configChannel1[t] = channelId1;
if (metrics[i][1] == "start_to_bytes_transferred")
if (metrics[i][1] == METRIC_BYTE_COUNT)
setUserSpecifiedBytes(t, bytes);
}
}
Expand Down Expand Up @@ -1038,7 +1038,7 @@ namespace xdp {
{
static const AIEProfileFinalConfig config(configMetrics, configChannel0,
configChannel1, metadataReader->getAIETileRowOffset(),
bytesTransferConfigMap);
bytesTransferConfigMap, latencyConfigMap);
return config;
}

Expand All @@ -1047,7 +1047,7 @@ namespace xdp {
{
auto allValidGraphs = metadataReader->getValidGraphs();
auto allValidPorts = metadataReader->getValidPorts();
std::string metricName = "interface_tile_latency";
std::string metricName = METRIC_LATENCY;
int moduleIdx = static_cast<int>(module);

// STEP 1 : Parse per-graph or per-kernel settings
Expand All @@ -1064,13 +1064,14 @@ namespace xdp {

if (tileMetrics[i].size() < 4 || tileMetrics[i].size()>5)
continue;

auto tileSrc = metadataReader->getInterfaceTiles(tileMetrics[i][0],
tileMetrics[i][1],
metricName);
auto tileDest = metadataReader->getInterfaceTiles(tileMetrics[i][2],
tileMetrics[i][3],
metricName);

std::string g1 = tileMetrics[i][0];
std::string p1 = tileMetrics[i][1];
std::string g2 = tileMetrics[i][2];
std::string p2 = tileMetrics[i][3];

auto tileSrc = metadataReader->getInterfaceTiles(g1, p1, metricName);
auto tileDest = metadataReader->getInterfaceTiles(g2, p2, metricName);

if(tileSrc.empty() || tileDest.empty() || (tileSrc[0]==tileDest[0])) {
continue;
Expand All @@ -1081,11 +1082,10 @@ namespace xdp {
}

// Update the latencyConfigMap to store the complete config.
latencyConfigMap[tileSrc[0]] = LatencyConfig(tileSrc[0], tileDest[0], metricName, std::stoul(tranx_no), true);
latencyConfigMap[tileDest[0]] = LatencyConfig(tileSrc[0], tileDest[0], metricName, std::stoul(tranx_no), false);
latencyConfigMap[tileSrc[0]] = LatencyConfig(tileSrc[0], tileDest[0], metricName, std::stoul(tranx_no), true, g1, p1, g2, p2);
latencyConfigMap[tileDest[0]] = LatencyConfig(tileSrc[0], tileDest[0], metricName, std::stoul(tranx_no), false, g1, p1, g2, p2);

// Also update the common configMetrics
// TODO: Make sure this config doesn't collide with other interface tile config
configMetrics[moduleIdx][tileSrc[0]] = metricName;
configMetrics[moduleIdx][tileDest[0]] = metricName;

Expand Down Expand Up @@ -1163,15 +1163,15 @@ namespace xdp {
uint32_t AieProfileMetadata::getUserSpecifiedThreshold(const tile_type& tile,
const std::string& metricSet)
{
if (metricSet == "start_to_bytes_transferred") {
if (metricSet == METRIC_BYTE_COUNT) {
if (bytesTransferConfigMap.find(tile) == bytesTransferConfigMap.end()) {
return 0;
}
else{
return bytesTransferConfigMap.at(tile);
}
}
else if(metricSet == "interface_tile_latency") {
else if(metricSet == METRIC_LATENCY) {
if (latencyConfigMap.find(tile) == latencyConfigMap.end()) {
return 0;
}
Expand Down Expand Up @@ -1204,26 +1204,50 @@ namespace xdp {
return true;
}

std::string AieProfileMetadata::srcDestPairKey(uint8_t col, uint8_t row) const
bool AieProfileMetadata::getDestTile(const tile_type& pairTyle, tile_type& destTile) const
{
if (!isValidLatencyTile(pairTyle))
return false;

destTile = latencyConfigMap.at(pairTyle).dest;
return true;
}

std::string AieProfileMetadata::getSrcDestPairKey(uint8_t col, uint8_t row)
{
static std::map<std::string, std::string> keysCache;
std::string key = "";

std::string cacheKey = "fetch_" + aie::uint8ToStr(col) + "," + aie::uint8ToStr(row);
if(keysCache.find(cacheKey) != keysCache.end())
return keysCache.at(cacheKey);
return keysCache.at(cacheKey).srcDestKey;

for(const auto &config : latencyConfigMap) {
if(config.first.col == col && config.first.row == row) {
key = "src_" + aie::uint8ToStr(config.second.src.col) + "," + aie::uint8ToStr(config.second.src.row)+
"dest_" + aie::uint8ToStr(config.second.dest.col) + "," + aie::uint8ToStr(config.second.dest.row);
keysCache[cacheKey] = key;
keysCache[cacheKey] = LatencyCache(key,
config.second.graphPortPair.srcGraphName,
config.second.graphPortPair.srcGraphPort,
config.second.graphPortPair.destGraphName,
config.second.graphPortPair.destGraphPort);
return key;
}
}
return key;
}

GraphPortPair AieProfileMetadata::getSrcDestGraphPair(const std::string& srcDestKey) const
{
for (const auto &keys : keysCache) {
if (keys.second.srcDestKey == srcDestKey)
return keys.second.graphPortPair;
}

// Code flow should never come here
std::string errMsg = "Key not found: " + srcDestKey;
throw std::runtime_error(errMsg);
}

bool AieProfileMetadata::isValidLatencyTile(const tile_type& tile) const
{
return latencyConfigMap.find(tile) != latencyConfigMap.end();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include "xdp/profile/database/static_info/aie_constructs.h"
#include "xdp/profile/database/static_info/aie_util.h"
#include "xdp/profile/database/static_info/filetypes/base_filetype_impl.h"
#include "xdp/profile/plugin/aie_profile/aie_profile_defs.h"

namespace xdp {

Expand Down Expand Up @@ -62,7 +63,7 @@ class AieProfileMetadata {
"input_throughputs", "output_throughputs",
"s2mm_throughputs", "mm2s_throughputs",
"input_stalls", "output_stalls",
"s2mm_stalls", "mm2s_stalls", "packets", "start_to_bytes_transferred"}
"s2mm_stalls", "mm2s_stalls", "packets", METRIC_BYTE_COUNT}
},
{
module_type::mem_tile, {
Expand Down Expand Up @@ -99,14 +100,17 @@ class AieProfileMetadata {

// Config data structures required for new profile API metrics
const std::unordered_map<std::string, uint16_t> adfApiMetricSetMap = {
{"start_to_bytes_transferred", static_cast<uint16_t>(3600)},
{"interface_tile_latency", static_cast<uint16_t>(3601)}
{METRIC_BYTE_COUNT, static_cast<uint16_t>(3600)},
{METRIC_LATENCY, static_cast<uint16_t>(3601)}
};


std::map<tile_type, LatencyConfig> latencyConfigMap;
std::vector<std::pair<tile_type, std::string>> configMetricLatencyVec; // configuration order vector
std::map<tile_type, uint32_t> bytesTransferConfigMap;
std::map<std::string, LatencyCache> keysCache;
uint32_t defaultTransferBytes = 1;

const aie::BaseFiletypeImpl* metadataReader = nullptr;

public:
Expand Down Expand Up @@ -155,6 +159,11 @@ class AieProfileMetadata {
return metadataReader->getPartitionOverlayStartCols();
}
bool aieMetadataEmpty() { return metadataReader==nullptr; }
std::vector<tile_type> getInterfaceTiles(const std::string graph, const std::string port, const std::string metric) {
if (aieMetadataEmpty())
return {};
return metadataReader->getInterfaceTiles(graph, port, metric);
}

void getConfigMetricsForintfTilesLatencyConfig(xdp::module_type module,
const std::vector<std::string>& intfTilesLatencyConfigs);
Expand All @@ -172,7 +181,9 @@ class AieProfileMetadata {
uint64_t createPayload(uint8_t col1, uint8_t row1, uint8_t portID1,
uint8_t col2, uint8_t row2, uint8_t portID2);
bool getSourceTile(const tile_type& pairTyle, tile_type& sourceTile) const;
std::string srcDestPairKey(uint8_t col, uint8_t row) const;
bool getDestTile(const tile_type& pairTyle, tile_type& destTile) const;
std::string getSrcDestPairKey(uint8_t col, uint8_t row);
GraphPortPair getSrcDestGraphPair(const std::string& srcDestKey) const;

std::vector<tile_type>
getTiles(const std::string& graph_name, module_type type, const std::string& kernel_name) const;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,8 @@ auto time = std::time(nullptr);
auto& data = p.second;
if (data.thread.joinable())
data.thread.join();
if (data.implementation)
data.implementation->freeResources();
}

handleToAIEData.clear();
Expand Down
Loading

0 comments on commit 1510f83

Please sign in to comment.