compute-runtime/unit_tests/perf_tests/perf_test_utils.cpp

154 lines
4.1 KiB
C++
Raw Normal View History

/*
* Copyright (c) 2017, Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
#include "perf_test_utils.h"
#include "runtime/helpers/aligned_memory.h"
#include "runtime/helpers/hash.h"
#include <fstream>
#include <string>
using namespace OCLRT;
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;
if ((data >= lower) && (data <= higher)) {
return true;
}
return false;
}
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;
}