You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.5 KiB
80 lines
2.5 KiB
#pragma once
|
|
|
|
#include <iostream>
|
|
|
|
#include "json/single_include/nlohmann/json.hpp"
|
|
|
|
#include "statuscode-tostring.hpp"
|
|
#include "barrier.hpp"
|
|
|
|
struct TaskData {
|
|
// thread placement / engine selection
|
|
uint8_t numa_node;
|
|
// region size and source+destination for move
|
|
size_t size;
|
|
uint8_t nnode_src;
|
|
uint8_t nnode_dst;
|
|
// repetition
|
|
uint32_t rep_count;
|
|
bool batch_submit;
|
|
uint32_t batch_size;
|
|
// thread output
|
|
dml::status_code status;
|
|
// average run duration in microseconds
|
|
std::vector<double> combined_duration;
|
|
std::vector<double> submit_duration;
|
|
std::vector<double> complete_duration;
|
|
// completed iterations
|
|
uint32_t rep_completed;
|
|
// set by execution
|
|
barrier* barrier_;
|
|
};
|
|
|
|
inline void to_json(nlohmann::json& j, const TaskData& a) {
|
|
j["task"]["size"] = a.size;
|
|
j["task"]["iterations"] = a.rep_count;
|
|
j["task"]["batching"]["batch_submit"] = a.batch_submit;
|
|
j["task"]["batching"]["batch_size"] = a.batch_size;
|
|
j["affinity"]["node"] = a.numa_node;
|
|
j["affinity"]["nnode_src"] = a.nnode_src;
|
|
j["affinity"]["nnode_dst"] = a.nnode_dst;
|
|
j["report"]["time"]["unit"] = "microseconds";
|
|
j["report"]["time"]["completion_avg"] = a.complete_duration;
|
|
j["report"]["time"]["submission_avg"] = a.submit_duration;
|
|
j["report"]["time"]["combined_avg"] = a.combined_duration;
|
|
j["report"]["iterations_completed"] = a.rep_completed;
|
|
j["report"]["status"] = StatusCodeToString(a.status);
|
|
}
|
|
|
|
inline void from_json(const nlohmann::json& j, TaskData& a) {
|
|
j["task"]["size"].get_to(a.size);
|
|
j["task"]["iterations"].get_to(a.rep_count);
|
|
j["task"]["batching"]["batch_submit"].get_to(a.batch_submit);
|
|
j["task"]["batching"]["batch_size"].get_to(a.batch_size);
|
|
j["affinity"]["node"].get_to(a.numa_node);
|
|
j["affinity"]["nnode_src"].get_to(a.nnode_src);
|
|
j["affinity"]["nnode_dst"].get_to(a.nnode_dst);
|
|
}
|
|
|
|
inline void WriteResultLog(const std::vector<TaskData>& args, const std::string& path, std::ostream& os) {
|
|
nlohmann::json json;
|
|
|
|
json["count"] = args.size();
|
|
json["path"] = path;
|
|
json["list"] = args;
|
|
|
|
os << std::setw(4) << json;
|
|
}
|
|
|
|
inline void ReadWorkDescription(std::vector<TaskData>& args, std::string& path, std::istream& is) {
|
|
nlohmann::json json;
|
|
is >> json;
|
|
|
|
const uint32_t count = json.at("count");
|
|
args.resize(count);
|
|
path = json.at("path");
|
|
|
|
for (uint32_t i = 0; i < count; i++) {
|
|
args[i] = json["list"][i].template get<TaskData>();
|
|
}
|
|
}
|