Files
SAPFOR/projects/dvm_svn/tools/pppa/trunk/src/statinter.cpp
2025-03-13 09:28:27 +03:00

705 lines
31 KiB
C++
Raw Blame History

#include "statlist.h"
#include <iostream>
//--- Not relevant ‣ Use to_json ---//
void CStatInter::to_string(std::string &result) {
result += "@interval@ ";
result += patch::to_string(id.nlev) + ' '; //уровень вложенности
result += patch::to_string(id.t) + ' '; //тип интервала
result += patch::to_string(id.expr) + ' '; //значение выражения
result += patch::to_string(id.nline) + ' '; //номер строки начала
result += patch::to_string(id.nline_end) + ' '; //номер строки конца
result += patch::to_string(id.nenter) + ' '; //число вхождений в интервал
result += std::string(id.pname) + ' ';
result += "\n@times@ ";
result += patch::to_string(prod_cpu)+' ';
result += patch::to_string(prod_sys) + ' ';
result += patch::to_string(prod_io) + ' ';
result += patch::to_string(exec_time) + ' ';
result += patch::to_string(sys_time) + ' ';
result += patch::to_string(real_comm) + ' ';
result += patch::to_string(efficiency) + ' ';
result += patch::to_string(lost_time) + ' ';
result += patch::to_string(insuf_user) + ' ';
result += patch::to_string(insuf_sys) + ' ';
result += patch::to_string(comm) + ' ';
result += patch::to_string(real_comm) + ' ';
result += patch::to_string(comm_start) + ' ';
result += patch::to_string(idle) + ' ';
result += patch::to_string(load_imb) + ' ';
result += patch::to_string(synch) + ' ';
result += patch::to_string(time_var) + ' ';
result += patch::to_string(overlap) + ' ';
result += patch::to_string(thr_user_time) + ' ';
result += patch::to_string(thr_sys_time) + ' ';
result += patch::to_string(gpu_time_prod) + ' ';
result += patch::to_string(gpu_time_lost) + ' ';
result += patch::to_string(nproc)+' ';
result += patch::to_string(threadsOfAllProcs)+' ';
result += "@end_times@\n";
for (unsigned int i = 0; i < RED; i++) {
result+= patch::to_string(col_op[i].ncall)+' ';
result += patch::to_string(col_op[i].comm) + ' ';
result += patch::to_string(col_op[i].synch) + ' ';
result += patch::to_string(col_op[i].real_comm) + ' ';
result += patch::to_string(col_op[i].time_var) + ' ';
result += patch::to_string(col_op[i].overlap) + ' ';
}
if (!isjson){
for (unsigned int j = 0; j < nproc; j++) {
for (int i = 0; i <= StatGrpCount; i++) {
result += patch::to_string(op_group[j][i].calls) + ' ';
result += patch::to_string(op_group[j][i].prod) + ' ';
result += patch::to_string(op_group[j][i].lost_time) + ' ';
}
}
result += "\n@proc@\n";
result += patch::to_string(id.proc) + '\n'; //кол-во процессов
for (unsigned int i = 0; i < nproc; i++) {
result += "@proc" + patch::to_string(i) + "@ ";
result += patch::to_string(proc_times[i].prod_cpu) + ' ';
result += patch::to_string(proc_times[i].prod_sys) + ' ';
result += patch::to_string(proc_times[i].prod_io) + ' ';
result += patch::to_string(proc_times[i].exec_time) + ' ';
result += patch::to_string(proc_times[i].sys_time) + ' ';
result += patch::to_string(proc_times[i].real_comm) + ' ';
result += patch::to_string(proc_times[i].lost_time) + ' ';
result += patch::to_string(proc_times[i].insuf_user) + ' ';
result += patch::to_string(proc_times[i].insuf_sys) + ' ';
result += patch::to_string(proc_times[i].comm) + ' ';
result += patch::to_string(proc_times[i].idle) + ' ';
result += patch::to_string(proc_times[i].load_imb) + ' ';
result += patch::to_string(proc_times[i].synch) + ' ';
result += patch::to_string(proc_times[i].time_var) + ' ';
result += patch::to_string(proc_times[i].overlap) + ' ';
result += patch::to_string(proc_times[i].thr_user_time) + ' ';
result += patch::to_string(proc_times[i].thr_sys_time) + ' ';
result += patch::to_string(proc_times[i].gpu_time_prod) + ' ';
result += patch::to_string(proc_times[i].gpu_time_lost) + ' ';
result += "\n@treads@\n";
result += patch::to_string(proc_times[i].num_threads) + ' ';
for (unsigned int j = 0; j < proc_times[i].num_threads;j++) {
result += "@tread" + patch::to_string(j) + "@ ";
result += patch::to_string(proc_times[i].th_times[j].sys_time) + ' ';
result += patch::to_string(proc_times[i].th_times[j].user_time) + ' ';
result += "@end_tread" + patch::to_string(j) + "@ ";
}
result += "\n@end_treads@\n";
result += "@gpu@\n";
result += patch::to_string(proc_times[i].num_gpu) + ' ';
for (unsigned int j = 0; j < proc_times[i].num_gpu; j++) {
result +="@gpu"+ patch::to_string(j) + "_"
+ std::string(proc_times[i].gpu_times[j].gpu_name) + '@' + ' ';
result += patch::to_string(proc_times[i].gpu_times[j].prod_time)+' ';
result += patch::to_string(proc_times[i].gpu_times[j].lost_time) + ' ';
// result += patch::to_string(proc_times[i].gpu_times[j].kernel_exec) + ' ';
// result += patch::to_string(proc_times[i].gpu_times[j].loop_exec) + ' ';
// result += patch::to_string(proc_times[i].gpu_times[j].get_actual) + ' ';
// result += patch::to_string(proc_times[i].gpu_times[j].data_reorg) + ' ';
// result += patch::to_string(proc_times[i].gpu_times[j].reduction) + ' ';
// result += patch::to_string(proc_times[i].gpu_times[j].gpu_runtime_compilation) + ' ';
// result += patch::to_string(proc_times[i].gpu_times[j].gpu_to_cpu) + ' ';
// result += patch::to_string(proc_times[i].gpu_times[j].cpu_to_gpu) + ' ';
// result += patch::to_string(proc_times[i].gpu_times[j].gpu_to_gpu)+ ' ';
// for (unsigned int k = 0; k < GNUMOP; k++) {
// result += patch::to_string(proc_times[i].gpu_times[j].op_times[k].cpu_to_gpu) + ' ';
// result += patch::to_string(proc_times[i].gpu_times[j].op_times[k].gpu_to_gpu) + ' ';
// result += patch::to_string(proc_times[i].gpu_times[j].op_times[k].gpu_to_cpu) + ' ';
// }
result += "@end_gpu" + patch::to_string(j) + "@";
}
result += "\n@end_gpu@\n";
// Col_op
// for (int i = 0; i < 4; i++) {
// result += patch::to_string(col_op[i].comm) + ' ';
// result += patch::to_string(col_op[i].ncall) + ' ';
// result += patch::to_string(col_op[i].overlap) + ' ';
// result += patch::to_string(col_op[i].real_comm) + ' ';
// result += patch::to_string(col_op[i].synch) + ' ';
// result += patch::to_string(col_op[i].time_var) + ' ';
// }
result += "@end_proc" + patch::to_string(i) + "@\n";
}
result += "@end_proc@\n";
}
result += "@end_interval@\n";
}
void CStatInter::to_json(json & result){
json col_op_json, proc_times_json;
for (int i = 0; i < RED; i++) {
col_op_json.push_back(
{
{"ncall", col_op[i].ncall},
{"comm", col_op[i].comm},
{"real_comm", col_op[i].real_comm},
{"synch", col_op[i].synch},
{"time_var", col_op[i].time_var},
{"overlap", col_op[i].overlap}
});
}
for (unsigned int i = 0; i < nproc; i++) {
json th_times_json, gpu_times_json;
// --- treads ---
// std::cout << ">> th_times_json\n";
for (unsigned int j = 0; j < proc_times[i].num_threads; ++j){
th_times_json.push_back(
{
{"sys_time", proc_times[i].th_times[j].sys_time},
{"user_time", proc_times[i].th_times[j].user_time}
});
}
// --- GPU ---
for (unsigned int j = 0; j < proc_times[i].num_gpu; j++) {
json metrics_json;
// std::cout << ">> metrics_json\n";
for (unsigned int k = 0; k < DVMH_STAT_METRIC_CNT; ++k) {
metrics_json.push_back(
{
{"countMeasures", proc_times[i].gpu_times[j].metrics[k].countMeasures},
{"timeProductive", proc_times[i].gpu_times[j].metrics[k].timeProductive},
{"timeLost", proc_times[i].gpu_times[j].metrics[k].timeLost},
{"min", proc_times[i].gpu_times[j].metrics[k].min},
{"mean", proc_times[i].gpu_times[j].metrics[k].mean},
{"max", proc_times[i].gpu_times[j].metrics[k].max},
{"sum", proc_times[i].gpu_times[j].metrics[k].sum}
});
}
// std::cout << ">> gpu_times_json\n";
gpu_times_json.push_back(
{
{"gpu_name", proc_times[i].gpu_times[j].gpu_name},
{"prod_time", proc_times[i].gpu_times[j].prod_time},
{"lost_time", proc_times[i].gpu_times[j].lost_time},
{"metrics", metrics_json}
});
}
// --- processors ---
// std::cout << ">> proc_times_json\n";
proc_times_json.push_back(
{
{"prod_cpu", proc_times[i].prod_cpu},
{"prod_sys", proc_times[i].prod_sys},
{"prod_io", proc_times[i].prod_io},
{"exec_time", proc_times[i].exec_time},
{"sys_time", proc_times[i].sys_time},
{"real_comm", proc_times[i].real_comm},
{"lost_time", proc_times[i].lost_time},
{"insuf_user", proc_times[i].insuf_user},
{"insuf_sys", proc_times[i].insuf_sys},
{"comm", proc_times[i].comm},
{"idle", proc_times[i].idle},
{"load_imb", proc_times[i].load_imb},
{"synch", proc_times[i].synch},
{"time_var", proc_times[i].time_var},
{"overlap", proc_times[i].overlap},
{"thr_user_time", proc_times[i].thr_user_time},
{"thr_sys_time", proc_times[i].thr_sys_time},
{"gpu_time_prod", proc_times[i].gpu_time_prod},
{"gpu_time_lost", proc_times[i].gpu_time_lost},
{"num_threads", proc_times[i].num_threads},
{"num_gpu", proc_times[i].num_gpu},
{"th_times", th_times_json},
{"gpu_times", gpu_times_json}
});
}
// std::cout << ">> New JSON OK\n";
result = {
{"id",
{
{"nlev", id.nlev},
{"t", id.t},
{"expr", id.expr},
{"nline", id.nline},
{"nline_end", id.nline_end},
{"nenter", id.nenter},
{"pname", id.pname}
}
},
{"times",
{
{"prod_cpu", prod_cpu},
{"prod_sys", prod_sys},
{"prod_io", prod_io},
{"exec_time", exec_time},
{"sys_time", sys_time},
{"efficiency", efficiency},
{"lost_time", lost_time},
{"insuf", insuf},
{"insuf_user", insuf_user},
{"insuf_sys", insuf_sys},
{"comm", comm},
{"real_comm", real_comm},
{"comm_start", comm_start},
{"idle", idle},
{"load_imb", load_imb},
{"synch", synch},
{"time_var", time_var},
{"overlap", overlap},
{"thr_user_time", thr_user_time},
{"thr_sys_time", thr_sys_time},
{"gpu_time_prod", gpu_time_prod},
{"gpu_time_lost", gpu_time_lost},
{"nproc", nproc},
{"threadsOfAllProcs", threadsOfAllProcs}
}
},
{"col_op", col_op_json},
{"proc_times", proc_times_json}
};
}
CStatInter::CStatInter(json source){
isjson = true;
// ----- id -----
json j_id = source["id"];
id.nenter = j_id["nenter"];
id.nline_end = j_id["nline_end"];
id.nline = j_id["nline"];
id.expr = j_id["expr"];
id.nlev = j_id["nlev"];
id.t = j_id["t"];
std::string tmp = (j_id["pname"]).dump();
id.pname = new char[tmp.length() + 1];
for (int i = 0; i < tmp.length(); ++i)
id.pname[i] = tmp[i];
id.pname[tmp.length()] = '\0';
// ----- times -----
json j_times = source["times"];
prod_cpu = j_times["prod_cpu"];
prod_sys = j_times["prod_sys"];
prod_io = j_times["prod_io"];
exec_time = j_times["exec_time"];
sys_time = j_times["sys_time"];
efficiency = j_times["efficiency"];
lost_time = j_times["lost_time"];
insuf = j_times["insuf"];
insuf_user = j_times["insuf_user"];
insuf_sys = j_times["insuf_sys"];
comm = j_times["comm"];
real_comm = j_times["real_comm"];
comm_start = j_times["comm_start"];
idle = j_times["idle"];
load_imb = j_times["load_imb"];
synch = j_times["synch"];
time_var = j_times["time_var"];
overlap = j_times["overlap"];
thr_user_time = j_times["thr_user_time"];
thr_sys_time = j_times["thr_sys_time"];
gpu_time_prod = j_times["gpu_time_prod"];
gpu_time_lost = j_times["gpu_time_lost"];
nproc = j_times["nproc"];
threadsOfAllProcs = j_times["threadsOfAllProcs"];
// ----- col_op -----
if (source.contains("col_op")) {
json j_col_op = source["col_op"];
for (int i = 0; i < RED; ++i) {
col_op[i].ncall = j_col_op[i]["ncall"];
col_op[i].comm = j_col_op[i]["comm"];
col_op[i].real_comm = j_col_op[i]["real_comm"];
col_op[i].synch = j_col_op[i]["synch"];
col_op[i].time_var = j_col_op[i]["time_var"];
col_op[i].overlap = j_col_op[i]["overlap"];
}
}
// std::cout << ">> Going to proc_times\n";
// ----- proc_times -----
if (source.contains("proc_times")){
proc_times = new struct ProcTimes[nproc];
json proc_times_json = source["proc_times"];
for (int i = 0; i < nproc; ++i){
json th_times_json = proc_times_json[i]["th_times"],
gpu_times_json = proc_times_json[i]["gpu_times"];
proc_times[i].prod_cpu = proc_times_json[i]["prod_cpu"];
proc_times[i].prod_sys = proc_times_json[i]["prod_sys"];
proc_times[i].prod_io = proc_times_json[i]["prod_io"];
proc_times[i].exec_time = proc_times_json[i]["exec_time"];
proc_times[i].sys_time = proc_times_json[i]["sys_time"];
proc_times[i].real_comm = proc_times_json[i]["real_comm"];
proc_times[i].lost_time = proc_times_json[i]["lost_time"];
proc_times[i].insuf_user = proc_times_json[i]["insuf_user"];
proc_times[i].insuf_sys = proc_times_json[i]["insuf_sys"];
proc_times[i].comm = proc_times_json[i]["comm"];
proc_times[i].idle = proc_times_json[i]["idle"];
proc_times[i].load_imb = proc_times_json[i]["load_imb"];
proc_times[i].synch = proc_times_json[i]["synch"];
proc_times[i].time_var = proc_times_json[i]["time_var"];
proc_times[i].overlap = proc_times_json[i]["overlap"];
proc_times[i].thr_user_time = proc_times_json[i]["thr_user_time"];
proc_times[i].thr_sys_time = proc_times_json[i]["thr_sys_time"];
proc_times[i].gpu_time_prod = proc_times_json[i]["gpu_time_prod"];
proc_times[i].gpu_time_lost = proc_times_json[i]["gpu_time_lost"];
proc_times[i].num_threads = proc_times_json[i]["num_threads"];
proc_times[i].num_gpu = proc_times_json[i]["num_gpu"];
// std::cout << ">> NumGPU - " << proc_times[i].num_gpu << std::endl;
proc_times[i].th_times = new struct ThreadTime[proc_times[i].num_threads];
for (int j = 0; j < proc_times[i].num_threads; ++j){
proc_times[i].th_times[j].user_time = th_times_json[j]["user_time"];
proc_times[i].th_times[j].sys_time = th_times_json[j]["sys_time"];
}
proc_times[i].gpu_times = new struct GpuTime[proc_times[i].num_gpu];
for (int j = 0; j < proc_times[i].num_gpu; ++j){
tmp = gpu_times_json[j]["gpu_name"].dump();
proc_times[i].gpu_times[j].gpu_name = new char[tmp.length() + 1];
for (int k = 0; k < tmp.length(); ++k)
proc_times[i].gpu_times[j].gpu_name[k] = tmp[k];
proc_times[i].gpu_times[j].gpu_name[tmp.length()] = '\0';
proc_times[i].gpu_times[j].prod_time = gpu_times_json[j]["prod_time"];
proc_times[i].gpu_times[j].lost_time = gpu_times_json[j]["lost_time"];
// std::cout << ">> Odl times OK\n";
json metrics_json = gpu_times_json[j]["metrics"];
// std::cout << ">> metrics_json = " << metrics_json << std::endl;
for (int m = 0; m < DVMH_STAT_METRIC_CNT; ++m){
proc_times[i].gpu_times[j].metrics[m].countMeasures = metrics_json[m]["countMeasures"];
proc_times[i].gpu_times[j].metrics[m].timeProductive = metrics_json[m]["timeProductive"];
proc_times[i].gpu_times[j].metrics[m].timeLost = metrics_json[m]["timeLost"];
proc_times[i].gpu_times[j].metrics[m].min = metrics_json[m]["min"];
proc_times[i].gpu_times[j].metrics[m].mean = metrics_json[m]["mean"];
proc_times[i].gpu_times[j].metrics[m].max = metrics_json[m]["max"];
proc_times[i].gpu_times[j].metrics[m].sum = metrics_json[m]["sum"];
}
}
}
}
next = NULL;
}
CStatInter::CStatInter(const CStatInter & si) {
std::cout << ">> In CStatInter(si)\n";
isjson = si.isjson;
id.t = si.id.t;
id.nlev = si.id.nlev;
id.expr = si.id.expr;
id.nline = si.id.nline;
id.nline_end = si.id.nline_end;
id.proc = si.id.proc;
id.nenter = si.id.nenter;
if (si.id.pname) {
id.pname = new char[strlen(si.id.pname) + 1];
strcpy(id.pname, si.id.pname);
}
else {
id.pname = new char [2];
id.pname[0] = '0';
id.pname[1] = '\0';
}
prod_cpu=si.prod_cpu;
prod_sys = si.prod_sys;
prod_io= si.prod_io;
prod = si.prod;
exec_time=si.exec_time;
sys_time=si.sys_time;
efficiency=si.efficiency;
lost_time=si.lost_time;
insuf=si.insuf;
insuf_user=si.insuf_user;
insuf_sys=si.insuf_sys;
comm=si.comm;
real_comm=si.real_comm;
comm_start=si.comm_start;
idle=si.idle;
load_imb=si.load_imb;
synch=si.synch;
time_var=si.time_var;
overlap=si.overlap;
thr_user_time=si.thr_user_time;
thr_sys_time=si.thr_sys_time;
gpu_time_prod=si.gpu_time_prod;
gpu_time_lost=si.gpu_time_lost;
nproc=si.nproc;
threadsOfAllProcs=si.threadsOfAllProcs;
for (int i = 0; i < RED; i++) {
col_op[i] = si.col_op[i];
}
// std::cout << ">> Prev OK\n";
if (!isjson) {
op_group = new OpGrp[nproc][StatGrpCount];
// for (int i = 0; i < nproc; ++i)
// op_group[i] = new OpGrp[StatGrpCount];
for (unsigned long j = 0; j < nproc; j++) {
for (int i = 0; i < StatGrpCount; i++) {
op_group[j][i].calls = si.op_group[j][i].calls;
op_group[j][i].prod = si.op_group[j][i].prod;
op_group[j][i].lost_time = op_group[j][i].lost_time;
}
}
}
// std::cout << ">> Going to ProcTimes - nproc = " << nproc << std::endl;
proc_times = new struct ProcTimes[nproc];
for (unsigned long i = 0; i < nproc; ++i) {
proc_times[i].prod_cpu = si.proc_times[i].prod_cpu;
proc_times[i].prod_sys = si.proc_times[i].prod_sys;
proc_times[i].prod_io = si.proc_times[i].prod_io;
proc_times[i].exec_time = si.proc_times[i].exec_time;
proc_times[i].sys_time = si.proc_times[i].sys_time;
proc_times[i].real_comm = si.proc_times[i].real_comm;
proc_times[i].lost_time = si.proc_times[i].lost_time;
proc_times[i].insuf_user = si.proc_times[i].insuf_user;
proc_times[i].insuf_sys = si.proc_times[i].insuf_sys;
proc_times[i].comm = si.proc_times[i].comm;
proc_times[i].idle = si.proc_times[i].idle;
proc_times[i].load_imb = si.proc_times[i].load_imb;
proc_times[i].synch = si.proc_times[i].synch;
proc_times[i].time_var = si.proc_times[i].time_var;
proc_times[i].overlap = si.proc_times[i].overlap;
proc_times[i].thr_user_time = si.proc_times[i].thr_user_time;
proc_times[i].thr_sys_time = si.proc_times[i].thr_sys_time;
proc_times[i].gpu_time_prod = si.proc_times[i].gpu_time_prod;
proc_times[i].gpu_time_lost = si.proc_times[i].gpu_time_lost;
proc_times[i].num_threads = si.proc_times[i].num_threads;
std::cout << ">> Going to ThreadTime\n";
proc_times[i].th_times = new struct ThreadTime[proc_times[i].num_threads];
for (unsigned long j = 0; j < proc_times[i].num_threads; j++) {
proc_times[i].th_times[j].user_time = si.proc_times[i].th_times[j].user_time;
proc_times[i].th_times[j].sys_time = si.proc_times[i].th_times[j].sys_time;
}
proc_times[i].num_gpu = si.proc_times[i].num_gpu;
// std::cout << ">> Going to GpuTime - num_gpu = " << proc_times[i].num_gpu << std::endl;
proc_times[i].gpu_times = new struct GpuTime[proc_times[i].num_gpu];
for (unsigned int j = 0; j < proc_times[i].num_gpu; j++) {
// std::cout << ">> Name = " << si.proc_times[i].gpu_times[j].gpu_name << std::endl;
if (si.proc_times[i].gpu_times[j].gpu_name) {
proc_times[i].gpu_times[j].gpu_name = new char[strlen(si.proc_times[i].gpu_times[j].gpu_name) + 1];
strcpy(proc_times[i].gpu_times[j].gpu_name, si.proc_times[i].gpu_times[j].gpu_name);
} else {
proc_times[i].gpu_times[j].gpu_name = new char[2];
proc_times[i].gpu_times[j].gpu_name[0] = '0';
proc_times[i].gpu_times[j].gpu_name[1] = '\0';
}
// std::cout << ">> Name OK\n";
proc_times[i].gpu_times[j].prod_time = si.proc_times[i].gpu_times[j].prod_time;
proc_times[i].gpu_times[j].lost_time = si.proc_times[i].gpu_times[j].lost_time;
for (int m = 0; m < DVMH_STAT_METRIC_CNT; ++m) {
proc_times[i].gpu_times[j].metrics[m] = si.proc_times[i].gpu_times[j].metrics[m];
}
}
}
next = NULL;
std::cout << ">> CStatInter(si) OK\n";
}
void CStatInter::clear() {
if (!isjson){
delete [] op_group;
for (unsigned int i = 0; i < nproc; i++) {
if (proc_times[i].num_threads)
delete [] proc_times[i].th_times;
for (unsigned int j = 0; j < proc_times[i].num_gpu; j++)
if (proc_times[i].gpu_times[j].gpu_name)
delete [] proc_times[i].gpu_times[j].gpu_name;
if (proc_times[i].num_gpu)
delete [] proc_times[i].gpu_times;
}
}
}
void CStatInter::delete_tail() {
if (next != NULL) {
next->delete_tail();
clear();
delete next;
}
}
CStatInter::~CStatInter() {
printf("Destructor: ~CStatInter()\n");
//delete_tail();
//clear();
}
//--- Copy dvmhStatMetric to metric in CStatInter ---//
void init_gpu_metric(GpuMetric &metric, dvmh_stat_interval_gpu_metric *dvmhStatMetric){
metric.countMeasures = dvmhStatMetric->countMeasures;
metric.max = dvmhStatMetric->max;
metric.mean = dvmhStatMetric->mean;
metric.min = dvmhStatMetric->min;
metric.sum = dvmhStatMetric->sum;
metric.timeLost = dvmhStatMetric->timeLost;
metric.timeProductive = dvmhStatMetric->timeProductive;
}
CStatInter::CStatInter(CStatRead * stat, int n)
{
isjson = false;
//printf("begin init %d\n", n);
qproc = stat->QProc();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
stat->ReadIdent(&id);
// string for processor characteristics - max
double min[ITER + 1];
double max[ITER + 1];
double sum[ITER + 1];
// communication
double minc[RED + 1];
double maxc[RED + 1];
double sumc[RED + 1];
// real communication
double minrc[RED + 1];
double maxrc[RED + 1];
double sumrc[RED + 1];
// synchronization
double mins[RED + 1];
double maxs[RED + 1];
double sums[RED + 1];
// variation
double minv[RED + 1];
double maxv[RED + 1];
double sumv[RED + 1];
// overlap
double minov[RED + 1];
double maxov[RED + 1];
double sumov[RED + 1];
// number of processor
unsigned long nprocmin[ITER + 1], nprocmax[ITER + 1];
unsigned long nprocminc[RED + 1], nprocmaxc[RED + 1];
unsigned long nprocminrc[RED + 1], nprocmaxrc[RED + 1];
unsigned long nprocmins[RED + 1], nprocmaxs[RED + 1];
unsigned long nprocminv[RED + 1], nprocmaxv[RED + 1];
unsigned long nprocminov[RED + 1], nprocmaxov[RED + 1];
stat->MinMaxSum(PRGEN, min, nprocmin, max, nprocmax, sum);
stat->MinMaxSum(PRCOM, minc, nprocminc, maxc, nprocmaxc, sumc);
stat->MinMaxSum(PRRCOM, minrc, nprocminrc, maxrc, nprocmaxrc, sumrc);
stat->MinMaxSum(PRSYN, mins, nprocmins, maxs, nprocmaxs, sums);
stat->MinMaxSum(PRVAR, minv, nprocminv, maxv, nprocmaxv, sumv);
stat->MinMaxSum(PROVER, minov, nprocminov, maxov, nprocmaxov, sumov);
//printf("main charecteristics\n");
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
nproc = n;
prod_cpu = sum[CPUUSR];
prod_sys = sum[CPU];
prod_io = sum[IOTIME];
prod = prod_cpu + prod_sys + prod_io;
exec_time = max[EXEC];
sys_time = nproc * max[EXEC];
efficiency = sys_time ? prod / sys_time : 0.0;
threadsOfAllProcs = 0;
for (unsigned int not_i = 1; not_i <= nproc; ++not_i)
threadsOfAllProcs += stat->getThreadsAmountByProcess(not_i);
lost_time = sum[LOST];
insuf = sum[INSUFUSR] + sum[INSUF];
insuf_user = sum[INSUFUSR];
insuf_sys = sum[INSUF];
comm = sum[SUMCOM];
real_comm = sum[SUMRCOM];
comm_start = sum[START];
idle = sum[IDLE];
load_imb = sum[IMB];
synch = sum[SUMSYN];
time_var = sum[SUMVAR];
overlap = sum[SUMOVERLAP];
thr_user_time = sum[DVMH_THREADS_USER_TIME];
thr_sys_time = sum[DVMH_THREADS_SYSTEM_TIME];
gpu_time_prod = sum[DVMH_GPU_TIME_PRODUCTIVE];
gpu_time_lost = sum[DVMH_GPU_TIME_LOST];
for (int i = 0; i < RED; i++) {
col_op[i].ncall = stat->ReadCall(typecom(i));
col_op[i].comm = sumc[i];
col_op[i].real_comm = sumrc[i];
col_op[i].synch = sums[i];
col_op[i].time_var = sumv[i];
col_op[i].overlap = sumov[i];
}
//return;
op_group = new OpGrp[qproc][StatGrpCount];
// for (int i = 0; i < qproc; ++i)
// op_group[i] = new OpGrp[StatGrpCount];
//printf("group\n");
for (unsigned long j = 0; j < qproc; j++) {
double prod[StatGrpCount], lost[StatGrpCount], sumprod = 0.0, sumlost = 0.0;
double calls[StatGrpCount], sumcalls = 0.0;
//printf("stat call\n");
stat->GrpTimes(prod, lost, calls, j + 1);
//printf("begin loop\n");
for (int i = 0; i < StatGrpCount - 1; i++) {
sumprod = sumprod + prod[i];
sumlost = sumlost + lost[i];
sumcalls = sumcalls + calls[i];
op_group[j][i].calls = calls[i];
op_group[j][i].prod = prod[i];
op_group[j][i].lost_time = lost[i];
}
op_group[j][StatGrpCount - 1].calls = sumcalls;
op_group[j][StatGrpCount - 1].prod = sumprod;
op_group[j][StatGrpCount - 1].lost_time = sumlost;
}
//printf("proc %d\n", qproc);
proc_times = new struct ProcTimes[qproc];
//printf("struct\n");
stat->ReadProcS(proc_times);
//printf("procs call\n");
for (unsigned long np = 1; np <= qproc; ++np)
{
proc_times[np-1].num_threads = 0;
proc_times[np - 1].th_times = NULL;
dvmh_stat_interval *dvmhStatInterval = stat->getDvmhStatIntervalByProcess(np);
if (!dvmhStatInterval) {
continue;
}
if (!dvmhStatInterval->threadsUsed)
continue;
proc_times[np - 1].num_threads = stat->getThreadsAmountByProcess(np);
proc_times[np - 1].th_times = new struct ThreadTime[proc_times[np - 1].num_threads];
for (unsigned long i = 0; i < proc_times[np - 1].num_threads; ++i)
{
proc_times[np - 1].th_times[i].user_time = dvmhStatInterval->threads[i].user_time;
proc_times[np - 1].th_times[i].sys_time = dvmhStatInterval->threads[i].system_time;
}
}
//printf("gpu\n");
for (unsigned long np = 1; np <= qproc; ++np)
{
dvmh_stat_interval *dvmhStatInterval = stat->getDvmhStatIntervalByProcess(np);
dvmh_stat_header_gpu_info *dvmhStatGpuInfo;
if (!dvmhStatInterval) {
continue;
}
proc_times[np - 1].gpu_times = new struct GpuTime[DVMH_STAT_MAX_GPU_CNT];
proc_times[np - 1].num_gpu = 0;
for (int gpu = 0; gpu < DVMH_STAT_MAX_GPU_CNT; ++gpu) {
if (((dvmhStatInterval->mask >> gpu) & 1) == 0) continue;
proc_times[np - 1].num_gpu++;
dvmhStatGpuInfo = stat->getDvmhStatGpuInfoByProcess(np, gpu);
dvmh_stat_interval_gpu *dvmhStatGpu = &dvmhStatInterval->gpu[gpu];
if ((char *)dvmhStatGpuInfo->name) {
int lenName = strlen((char *)dvmhStatGpuInfo->name);
proc_times[np - 1].gpu_times[proc_times[np - 1].num_gpu - 1].gpu_name = new char[lenName + 1];
strcpy(proc_times[np - 1].gpu_times[proc_times[np - 1].num_gpu - 1].gpu_name, (char *)dvmhStatGpuInfo->name);
}
else {
proc_times[np - 1].gpu_times[proc_times[np - 1].num_gpu - 1].gpu_name = new char[2];
proc_times[np - 1].gpu_times[proc_times[np - 1].num_gpu - 1].gpu_name[0]='0';
proc_times[np - 1].gpu_times[proc_times[np - 1].num_gpu - 1].gpu_name[1] = '\0';
}
//--- Init times ---//
dvmh_stat_interval_gpu_metric *dvmhStatMetric;
for (int m = 0; m < DVMH_STAT_METRIC_CNT; ++m)
init_gpu_metric(proc_times[np - 1].gpu_times[proc_times[np - 1].num_gpu - 1].metrics[m], &dvmhStatGpu->metrics[m]);
proc_times[np - 1].gpu_times[proc_times[np - 1].num_gpu - 1].prod_time = dvmhStatGpu->timeProductive;
proc_times[np - 1].gpu_times[proc_times[np - 1].num_gpu - 1].lost_time = dvmhStatGpu->timeLost;
//if (dvmhStatMetric->countMeasures <= 0) ????;
}
}
//printf("next\n");
n = stat->TreeWalk();
//printf("next %d\n", n);
if (n != 0)
{
next = new CStatInter(stat, n);
}
else
next = NULL;
//printf("end inter\n");
}