compute-runtime/unit_tests/perf_tests/perf_test_utils.cpp

137 lines
3.0 KiB
C++

/*
* Copyright (C) 2017-2019 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "perf_test_utils.h"
#include "core/helpers/aligned_memory.h"
#include "runtime/helpers/hash.h"
#include <fstream>
#include <string>
using namespace NEO;
using namespace std;
const char *perfLogPath = "perf_logs/";
// Global reference time
long long refTime = 0;
void setReferenceTime() {
if (refTime == 0) {
Timer t1, t2, t3;
long long time1 = 0;
long long time2 = 0;
long long time3 = 0;
Timer::setFreq();
void *bufferDst = alignedMalloc(128 * 4096, 4096);
void *bufferSrc1 = alignedMalloc(128 * 4096, 4096);
void *bufferSrc2 = alignedMalloc(128 * 4096, 4096);
void *bufferSrc3 = alignedMalloc(128 * 4096, 4096);
t1.start();
memset(bufferSrc1, 0, 128 * 4096);
memcpy(bufferDst, bufferSrc1, 128 * 4096);
t1.end();
t2.start();
memset(bufferSrc2, 1, 128 * 4096);
memcpy(bufferDst, bufferSrc2, 128 * 4096);
t2.end();
t3.start();
memset(bufferSrc3, 2, 128 * 4096);
memcpy(bufferDst, bufferSrc3, 128 * 4096);
t3.end();
time1 = t1.get();
time2 = t2.get();
time3 = t3.get();
refTime = majorityVote(time1, time2, time3);
alignedFree(bufferDst);
alignedFree(bufferSrc1);
alignedFree(bufferSrc2);
alignedFree(bufferSrc3);
}
}
bool getTestRatio(uint64_t hash, double &ratio) {
ifstream file;
string filename(perfLogPath);
double data = 0.0;
filename.append(std::to_string(hash));
file.open(filename);
if (file.is_open()) {
file >> data;
ratio = data;
file.close();
return true;
}
ratio = 0.0;
return false;
}
bool saveTestRatio(uint64_t hash, double ratio) {
ofstream file;
string filename(perfLogPath);
double data = 0.0;
filename.append(std::to_string(hash));
file.open(filename);
if (file.is_open()) {
file << ratio;
file.close();
return true;
}
return false;
}
bool isInRange(double data, double reference, double multiplier) {
double lower = reference / multiplier;
double higher = reference * multiplier;
return data >= lower && data <= higher;
}
bool isLowerThanReference(double data, double reference, double multiplier) {
double higher = multiplier * reference;
if (data <= higher) {
return true;
}
return false;
}
bool updateTestRatio(uint64_t hash, double ratio) {
double oldRatio = 0.0;
if (getTestRatio(hash, oldRatio)) {
if (oldRatio != 0.0) {
if (isInRange(ratio, oldRatio, 2.000)) {
double newRatio = (0.8000 * oldRatio + 0.2000 * ratio);
if (newRatio < 0.8 * oldRatio)
return false;
saveTestRatio(hash, newRatio);
return true;
}
}
} else {
saveTestRatio(hash, ratio);
}
return false;
}