text.cc

来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· CC 代码 · 共 751 行 · 第 1/2 页

CC
751
字号
        ScalarPrint print;        string base = name + (compat ? "_" : "::");        print.precision = precision;        print.flags = flags;        print.compat = compat;        print.descriptions = descriptions;        print.desc = desc;        print.pdf = NAN;        print.cdf = NAN;        print.name = base + "mean";        print.value = samples ? sum / samples : NAN;        print(stream);        print.name = base + "stdev";        print.value = samples ? sqrt((samples * squares - sum * sum) /                                     (samples * (samples - 1.0))) : NAN;        print(stream);        print.name = "**Ignore: " + base + "TOT";        print.value = samples;        print(stream);        return;    }    assert(size == vec.size());    Result total = 0.0;    total += underflow;    for (int i = 0; i < size; ++i)        total += vec[i];    total += overflow;    string base = name + (compat ? "." : "::");    ScalarPrint print;    print.desc = compat ? "" : desc;    print.flags = flags;    print.compat = compat;    print.descriptions = descriptions;    print.precision = precision;    print.pdf = NAN;    print.cdf = NAN;    if (compat) {        ccprintf(stream, "%-42s", base + "start_dist");        if (descriptions && !desc.empty())            ccprintf(stream, "                     # %s", desc);        stream << endl;    }    print.name = base + "samples";    print.value = samples;    print(stream);    print.name = base + "min_value";    print.value = min_val;    print(stream);    if (!compat || underflow > 0.0) {        print.name = base + "underflows";        print.value = underflow;        if (!compat && total) {            print.pdf = underflow / total;            print.cdf += print.pdf;        }        print(stream);    }    if (!compat) {        for (int i = 0; i < size; ++i) {            stringstream namestr;            namestr << name;            Counter low = i * bucket_size + min;            Counter high = ::min(low + bucket_size, max);            namestr << low;            if (low < high)                namestr << "-" << high;            print.name = namestr.str();            print.value = vec[i];            if (total) {                print.pdf = vec[i] / total;                print.cdf += print.pdf;            }            print(stream);        }    } else {        Counter _min;        Result _pdf;        Result _cdf = 0.0;        print.flags = flags | __substat;        for (int i = 0; i < size; ++i) {            if (flags & nozero && vec[i] == 0.0 ||                flags & nonan && isnan(vec[i]))                continue;            _min = i * bucket_size + min;            _pdf = vec[i] / total * 100.0;            _cdf += _pdf;            print.name = ValueToString(_min, 0, compat);            print.value = vec[i];            print.pdf = (flags & pdf) ? _pdf : NAN;            print.cdf = (flags & cdf) ? _cdf : NAN;            print(stream);        }        print.flags = flags;    }    if (!compat || overflow > 0.0) {        print.name = base + "overflows";        print.value = overflow;        if (!compat && total) {            print.pdf = overflow / total;            print.cdf += print.pdf;        } else {            print.pdf = NAN;            print.cdf = NAN;        }        print(stream);    }    print.pdf = NAN;    print.cdf = NAN;    if (!compat) {        print.name = base + "total";        print.value = total;        print(stream);    }    print.name = base + "max_value";    print.value = max_val;    print(stream);    if (!compat && samples != 0) {        print.name = base + "mean";        print.value = sum / samples;        print(stream);        print.name = base + "stdev";        print.value = sqrt((samples * squares - sum * sum) /                           (samples * (samples - 1.0)));        print(stream);    }    if (compat)        ccprintf(stream, "%send_dist\n\n", base);}voidText::visit(const ScalarData &data){    if (noOutput(data))        return;    ScalarPrint print;    print.value = data.result();    print.name = data.name;    print.desc = data.desc;    print.flags = data.flags;    print.compat = compat;    print.descriptions = descriptions;    print.precision = data.precision;    print.pdf = NAN;    print.cdf = NAN;    print(*stream);}voidText::visit(const VectorData &data){    if (noOutput(data))        return;    int size = data.size();    VectorPrint print;    print.name = data.name;    print.desc = data.desc;    print.flags = data.flags;    print.compat = compat;    print.descriptions = descriptions;    print.precision = data.precision;    print.vec = data.result();    print.total = data.total();    if (!data.subnames.empty()) {        for (int i = 0; i < size; ++i) {            if (!data.subnames[i].empty()) {                print.subnames = data.subnames;                print.subnames.resize(size);                for (int i = 0; i < size; ++i) {                    if (!data.subnames[i].empty() &&                        !data.subdescs[i].empty()) {                        print.subdescs = data.subdescs;                        print.subdescs.resize(size);                        break;                    }                }                break;            }        }    }    print(*stream);}voidText::visit(const Vector2dData &data){    if (noOutput(data))        return;    bool havesub = false;    VectorPrint print;    print.subnames = data.y_subnames;    print.flags = data.flags;    print.compat = compat;    print.descriptions = descriptions;    print.precision = data.precision;    if (!data.subnames.empty()) {        for (int i = 0; i < data.x; ++i)            if (!data.subnames[i].empty())                havesub = true;    }    VResult tot_vec(data.y);    Result super_total = 0.0;    for (int i = 0; i < data.x; ++i) {        if (havesub && (i >= data.subnames.size() || data.subnames[i].empty()))            continue;        int iy = i * data.y;        VResult yvec(data.y);        Result total = 0.0;        for (int j = 0; j < data.y; ++j) {            yvec[j] = data.cvec[iy + j];            tot_vec[j] += yvec[j];            total += yvec[j];            super_total += yvec[j];        }        print.name = data.name + "_" + (havesub ? data.subnames[i] : to_string(i));        print.desc = data.desc;        print.vec = yvec;        print.total = total;        print(*stream);    }    if ((data.flags & ::Stats::total) && (data.x > 1)) {        print.name = data.name;        print.desc = data.desc;        print.vec = tot_vec;        print.total = super_total;        print(*stream);    }}voidText::visit(const DistData &data){    if (noOutput(data))        return;    DistPrint print;    print.name = data.name;    print.desc = data.desc;    print.flags = data.flags;    print.compat = compat;    print.descriptions = descriptions;    print.precision = data.precision;    print.min_val = data.data.min_val;    print.max_val = data.data.max_val;    print.underflow = data.data.underflow;    print.overflow = data.data.overflow;    print.vec.resize(data.data.cvec.size());    for (int i = 0; i < print.vec.size(); ++i)        print.vec[i] = (Result)data.data.cvec[i];    print.sum = data.data.sum;    print.squares = data.data.squares;    print.samples = data.data.samples;    print.min = data.data.min;    print.max = data.data.max;    print.bucket_size = data.data.bucket_size;    print.size = data.data.size;    print.fancy = data.data.fancy;    print(*stream);}voidText::visit(const VectorDistData &data){    if (noOutput(data))        return;    for (int i = 0; i < data.size(); ++i) {        DistPrint print;        print.name = data.name +            (data.subnames[i].empty() ? ("_" + to_string(i)) : data.subnames[i]);        print.desc = data.subdescs[i].empty() ? data.desc : data.subdescs[i];        print.flags = data.flags;        print.compat = compat;        print.descriptions = descriptions;        print.precision = data.precision;        print.min_val = data.data[i].min_val;        print.max_val = data.data[i].max_val;        print.underflow = data.data[i].underflow;        print.overflow = data.data[i].overflow;        print.vec.resize(data.data[i].cvec.size());        for (int j = 0; j < print.vec.size(); ++j)            print.vec[j] = (Result)data.data[i].cvec[j];        print.sum = data.data[i].sum;        print.squares = data.data[i].squares;        print.samples = data.data[i].samples;        print.min = data.data[i].min;        print.max = data.data[i].max;        print.bucket_size = data.data[i].bucket_size;        print.size = data.data[i].size;        print.fancy = data.data[i].fancy;        print(*stream);    }}voidText::visit(const FormulaData &data){    visit((const VectorData &)data);}boolinitText(const string &filename, bool desc, bool compat){    static Text text;    static bool connected = false;    if (connected)        return false;    extern list<Output *> OutputList;    text.open(*simout.find(filename));    text.descriptions = desc;    text.compat = compat;    OutputList.push_back(&text);    connected = true;    return true;}/* namespace Stats */ }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?