compute-runtime/unit_tests/os_interface/mock_performance_counters.cpp

162 lines
6.6 KiB
C++

/*
* 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 "mock_performance_counters.h"
#include "runtime/os_interface/os_interface.h"
namespace OCLRT {
MockPerformanceCounters::MockPerformanceCounters(OSTime *osTime)
: PerformanceCounters(osTime) {
autoSamplingStartFunc = autoSamplingStart;
autoSamplingStopFunc = autoSamplingStop;
hwMetricsEnableFunc = hwMetricsEnableFuncPassing;
getPmRegsCfgFunc = getPmRegsCfgPassing;
loadPmRegsCfgFunc = loadPmRegsCfgPassing;
checkPmRegsCfgFunc = checkPmRegsCfgPassing;
setPmRegsCfgFunc = setPmRegsCfgFuncPassing;
sendReadRegsCfgFunc = sendReadRegsCfgFuncPassing;
getPerfCountersQueryDataFunc = getPerfCountersQueryData;
PerfCounterFlags::resetPerfCountersFlags();
}
void MockPerformanceCounters::initialize(const HardwareInfo *hwInfo) {
PerfCounterFlags::initalizeCalled++;
}
int PerfCounterFlags::autoSamplingFuncCalled;
int PerfCounterFlags::autoSamplingStarted;
int PerfCounterFlags::autoSamplingStopped;
int PerfCounterFlags::checkPmRegsCfgCalled;
int PerfCounterFlags::escHwMetricsCalled;
int PerfCounterFlags::getPerfCountersQueryDataCalled;
int PerfCounterFlags::getPmRegsCfgCalled;
int PerfCounterFlags::hwMetricsEnableStatus;
int PerfCounterFlags::initalizeCalled;
int PerfCounterFlags::loadPmRegsCfgCalled;
int PerfCounterFlags::setPmRegsCfgCalled;
int PerfCounterFlags::sendReadRegsCfgCalled;
bool hwMetricsEnableFuncFailing(InstrEscCbData cbData, bool enable) {
PerfCounterFlags::escHwMetricsCalled++;
PerfCounterFlags::hwMetricsEnableStatus = enable;
return false;
}
bool hwMetricsEnableFuncPassing(InstrEscCbData cbData, bool enable) {
PerfCounterFlags::escHwMetricsCalled++;
PerfCounterFlags::hwMetricsEnableStatus = enable;
return true;
}
bool autoSamplingStart(InstrEscCbData cbData, void **ppOAInterface) {
PerfCounterFlags::autoSamplingFuncCalled++;
PerfCounterFlags::autoSamplingStarted++;
ppOAInterface[0] = new char[1];
return true;
}
bool autoSamplingStartFailing(InstrEscCbData cbData, void **ppOAInterface) {
PerfCounterFlags::autoSamplingFuncCalled++;
PerfCounterFlags::autoSamplingStarted++;
ppOAInterface[0] = nullptr;
return false;
}
bool autoSamplingStop(void **ppOAInterface) {
PerfCounterFlags::autoSamplingFuncCalled++;
PerfCounterFlags::autoSamplingStopped++;
if (ppOAInterface[0]) {
delete[] static_cast<char *>(ppOAInterface[0]);
ppOAInterface[0] = nullptr;
return true;
}
return false;
}
bool getPmRegsCfgPassing(InstrEscCbData cbData, uint32_t cfgId, InstrPmRegsCfg *pCfg, InstrAutoSamplingMode *pAutoSampling) {
PerfCounterFlags::getPmRegsCfgCalled++;
if (cfgId == 1) {
pCfg->ReadRegs.RegsCount = 2;
pCfg->ReadRegs.Reg[0].BitSize = 32;
pCfg->ReadRegs.Reg[1].BitSize = 64;
}
return true;
}
bool getPmRegsCfgFailing(InstrEscCbData cbData, uint32_t cfgId, InstrPmRegsCfg *pCfg, InstrAutoSamplingMode *pAutoSampling) {
PerfCounterFlags::getPmRegsCfgCalled++;
return false;
}
bool checkPmRegsCfgPassing(InstrPmRegsCfg *pQueryPmRegsCfg, uint32_t *pLastPmRegsCfgHandle, const void *pASInterface) {
PerfCounterFlags::checkPmRegsCfgCalled++;
return true;
}
bool checkPmRegsCfgFailing(InstrPmRegsCfg *pQueryPmRegsCfg, uint32_t *pLastPmRegsCfgHandle, const void *pASInterface) {
PerfCounterFlags::checkPmRegsCfgCalled++;
return false;
}
bool loadPmRegsCfgPassing(InstrEscCbData cbData, InstrPmRegsCfg *pCfg, bool hardwareAccess) {
PerfCounterFlags::loadPmRegsCfgCalled++;
return true;
}
bool loadPmRegsCfgFailing(InstrEscCbData cbData, InstrPmRegsCfg *pCfg, bool hardwareAccess) {
PerfCounterFlags::loadPmRegsCfgCalled++;
return false;
}
bool setPmRegsCfgFuncPassing(InstrEscCbData cbData, uint32_t count, uint32_t *pOffsets, uint32_t *pValues) {
PerfCounterFlags::setPmRegsCfgCalled++;
return true;
}
bool setPmRegsCfgFuncFailing(InstrEscCbData cbData, uint32_t count, uint32_t *pOffsets, uint32_t *pValues) {
PerfCounterFlags::setPmRegsCfgCalled++;
return false;
}
bool sendReadRegsCfgFuncPassing(InstrEscCbData cbData, uint32_t count, uint32_t *pOffsets, uint32_t *pBitSizes) {
PerfCounterFlags::sendReadRegsCfgCalled++;
return true;
}
bool sendReadRegsCfgFuncFailing(InstrEscCbData cbData, uint32_t count, uint32_t *pOffsets, uint32_t *pBitSizes) {
PerfCounterFlags::sendReadRegsCfgCalled++;
return false;
}
template <typename GTDI_QUERY, typename HwPerfCountersLayout>
void getPerfCountersQueryData(InstrEscCbData cbData, GTDI_QUERY *pData, HwPerfCountersLayout *pLayout, uint64_t cpuRawTimestamp, void *pASInterface, InstrPmRegsCfg *pPmRegsCfg, bool useMiRPC, bool resetASData, const InstrAllowedContexts *pAllowedContexts) {
PerfCounterFlags::getPerfCountersQueryDataCalled++;
}
void PerfCounterFlags::resetPerfCountersFlags() {
PerfCounterFlags::autoSamplingFuncCalled = 0;
PerfCounterFlags::autoSamplingStarted = 0;
PerfCounterFlags::autoSamplingStopped = 0;
PerfCounterFlags::checkPmRegsCfgCalled = 0;
PerfCounterFlags::escHwMetricsCalled = 0;
PerfCounterFlags::getPerfCountersQueryDataCalled = 0;
PerfCounterFlags::getPmRegsCfgCalled = 0;
PerfCounterFlags::hwMetricsEnableStatus = 0;
PerfCounterFlags::initalizeCalled = 0;
PerfCounterFlags::loadPmRegsCfgCalled = 0;
PerfCounterFlags::setPmRegsCfgCalled = 0;
PerfCounterFlags::sendReadRegsCfgCalled = 0;
}
void PerformanceCountersFixture::SetUp() {
osInterfaceBase = std::unique_ptr<OSInterface>(new OSInterface());
createOsTime();
fillOsInterface();
PerfCounterFlags::resetPerfCountersFlags();
}
} // namespace OCLRT