mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-24 12:23:05 +08:00
Initial commit
Change-Id: I4bf1707bd3dfeadf2c17b0a7daff372b1925ebbd
This commit is contained in:
153
unit_tests/perf_tests/perf_test_utils.cpp
Normal file
153
unit_tests/perf_tests/perf_test_utils.cpp
Normal file
@@ -0,0 +1,153 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
Reference in New Issue
Block a user