Merge pull request #7171 from alalek:ocl_instrumentation

pull/7262/head
Alexander Alekhin 9 years ago
commit ca4b7e1e0f
  1. 5
      cmake/OpenCVCompilerOptions.cmake
  2. 2
      cmake/OpenCVGenABI.cmake
  3. 22
      modules/core/include/opencv2/core/private.hpp
  4. 49
      modules/core/include/opencv2/core/utility.hpp
  5. 10
      modules/core/src/ocl.cpp
  6. 44
      modules/core/src/system.cpp
  7. 19
      modules/ts/src/ts_perf.cpp

@ -233,6 +233,11 @@ if(CMAKE_COMPILER_IS_GNUCXX)
set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} --coverage") set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} --coverage")
endif() endif()
if(ENABLE_INSTRUMENTATION)
set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} --std=c++11")
set(WITH_VTK OFF) # There are issues with VTK 6.0
endif()
set(OPENCV_EXTRA_FLAGS_RELEASE "${OPENCV_EXTRA_FLAGS_RELEASE} -DNDEBUG") set(OPENCV_EXTRA_FLAGS_RELEASE "${OPENCV_EXTRA_FLAGS_RELEASE} -DNDEBUG")
set(OPENCV_EXTRA_FLAGS_DEBUG "${OPENCV_EXTRA_FLAGS_DEBUG} -O0 -DDEBUG -D_DEBUG") set(OPENCV_EXTRA_FLAGS_DEBUG "${OPENCV_EXTRA_FLAGS_DEBUG} -O0 -DDEBUG -D_DEBUG")
endif() endif()

@ -43,7 +43,7 @@ string(REPLACE ";" "\n " OPENCV_ABI_SKIP_HEADERS "${OPENCV_ABI_SKIP_HEADERS}"
string(REPLACE ";" "\n " OPENCV_ABI_SKIP_LIBRARIES "${OPENCV_ABI_SKIP_LIBRARIES}") string(REPLACE ";" "\n " OPENCV_ABI_SKIP_LIBRARIES "${OPENCV_ABI_SKIP_LIBRARIES}")
# Options # Options
set(OPENCV_ABI_GCC_OPTIONS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}") set(OPENCV_ABI_GCC_OPTIONS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} -DOPENCV_ABI_CHECK=1")
string(REGEX REPLACE "([^ ]) +([^ ])" "\\1\\n \\2" OPENCV_ABI_GCC_OPTIONS "${OPENCV_ABI_GCC_OPTIONS}") string(REGEX REPLACE "([^ ]) +([^ ])" "\\1\\n \\2" OPENCV_ABI_GCC_OPTIONS "${OPENCV_ABI_GCC_OPTIONS}")
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/opencv_abi.xml.in" "${path1}") configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/opencv_abi.xml.in" "${path1}")

@ -476,7 +476,7 @@ public:
class CV_EXPORTS IntrumentationRegion class CV_EXPORTS IntrumentationRegion
{ {
public: public:
IntrumentationRegion(const char* funName, const char* fileName, int lineNum, int instrType = TYPE_GENERAL, int implType = IMPL_PLAIN); IntrumentationRegion(const char* funName, const char* fileName, int lineNum, TYPE instrType = TYPE_GENERAL, IMPL implType = IMPL_PLAIN);
~IntrumentationRegion(); ~IntrumentationRegion();
private: private:
@ -492,7 +492,7 @@ CV_EXPORTS InstrNode* getCurrentNode();
///// General instrumentation ///// General instrumentation
// Instrument region // Instrument region
#define CV_INSTRUMENT_REGION_META(TYPE, IMPL, ...) ::cv::instr::IntrumentationRegion __instr_region__(__FUNCTION__, __FILE__, __LINE__, TYPE, IMPL); #define CV_INSTRUMENT_REGION_META(NAME, TYPE, IMPL) ::cv::instr::IntrumentationRegion __instr_region__(NAME, __FILE__, __LINE__, TYPE, IMPL);
// Instrument functions with non-void return type // Instrument functions with non-void return type
#define CV_INSTRUMENT_FUN_RT_META(TYPE, IMPL, ERROR_COND, FUN, ...) ([&]()\ #define CV_INSTRUMENT_FUN_RT_META(TYPE, IMPL, ERROR_COND, FUN, ...) ([&]()\
{\ {\
@ -502,12 +502,12 @@ CV_EXPORTS InstrNode* getCurrentNode();
auto status = ((FUN)(__VA_ARGS__));\ auto status = ((FUN)(__VA_ARGS__));\
if(ERROR_COND){\ if(ERROR_COND){\
::cv::instr::getCurrentNode()->m_payload.m_funError = true;\ ::cv::instr::getCurrentNode()->m_payload.m_funError = true;\
CV_INSTRUMENT_MARK_META(IMPL, ##FUN - BadExit);\ CV_INSTRUMENT_MARK_META(IMPL, #FUN " - BadExit");\
}\ }\
return status;\ return status;\
}catch(...){\ }catch(...){\
::cv::instr::getCurrentNode()->m_payload.m_funError = true;\ ::cv::instr::getCurrentNode()->m_payload.m_funError = true;\
CV_INSTRUMENT_MARK_META(IMPL, ##FUN - BadExit);\ CV_INSTRUMENT_MARK_META(IMPL, #FUN " - BadExit");\
throw;\ throw;\
}\ }\
}else{\ }else{\
@ -523,7 +523,7 @@ CV_EXPORTS InstrNode* getCurrentNode();
(FUN)(__VA_ARGS__);\ (FUN)(__VA_ARGS__);\
}catch(...){\ }catch(...){\
::cv::instr::getCurrentNode()->m_payload.m_funError = true;\ ::cv::instr::getCurrentNode()->m_payload.m_funError = true;\
CV_INSTRUMENT_MARK_META(IMPL, ##FUN - BadExit);\ CV_INSTRUMENT_MARK_META(IMPL, #FUN "- BadExit");\
throw;\ throw;\
}\ }\
}else{\ }else{\
@ -531,17 +531,17 @@ CV_EXPORTS InstrNode* getCurrentNode();
}\ }\
}()) }())
// Instrumentation information marker // Instrumentation information marker
#define CV_INSTRUMENT_MARK_META(IMPL, NAME, ...) {::cv::instr::IntrumentationRegion __instr_mark__(#NAME, __FILE__, __LINE__, ::cv::instr::TYPE_MARKER, IMPL);} #define CV_INSTRUMENT_MARK_META(IMPL, NAME, ...) {::cv::instr::IntrumentationRegion __instr_mark__(NAME, __FILE__, __LINE__, ::cv::instr::TYPE_MARKER, IMPL);}
///// General instrumentation ///// General instrumentation
// General OpenCV region instrumentation macro // General OpenCV region instrumentation macro
#define CV_INSTRUMENT_REGION() CV_INSTRUMENT_REGION_META(cv::instr::TYPE_GENERAL, cv::instr::IMPL_PLAIN) #define CV_INSTRUMENT_REGION() CV_INSTRUMENT_REGION_META(__FUNCTION__, cv::instr::TYPE_GENERAL, cv::instr::IMPL_PLAIN)
// Parallel OpenCV region instrumentation macro // Parallel OpenCV region instrumentation macro
#define CV_INSTRUMENT_REGION_MT() CV_INSTRUMENT_REGION_MT_META(cv::instr::TYPE_GENERAL, cv::instr::IMPL_PLAIN) #define CV_INSTRUMENT_REGION_MT() CV_INSTRUMENT_REGION_MT_META(cv::instr::TYPE_GENERAL, cv::instr::IMPL_PLAIN)
///// IPP instrumentation ///// IPP instrumentation
// Wrapper region instrumentation macro // Wrapper region instrumentation macro
#define CV_INSTRUMENT_REGION_IPP() CV_INSTRUMENT_REGION_META(::cv::instr::TYPE_WRAPPER, ::cv::instr::IMPL_IPP) #define CV_INSTRUMENT_REGION_IPP() CV_INSTRUMENT_REGION_META(__FUNCTION__, ::cv::instr::TYPE_WRAPPER, ::cv::instr::IMPL_IPP)
// Function instrumentation macro // Function instrumentation macro
#define CV_INSTRUMENT_FUN_IPP(FUN, ...) CV_INSTRUMENT_FUN_RT_META(::cv::instr::TYPE_FUN, ::cv::instr::IMPL_IPP, status < 0, FUN, __VA_ARGS__) #define CV_INSTRUMENT_FUN_IPP(FUN, ...) CV_INSTRUMENT_FUN_RT_META(::cv::instr::TYPE_FUN, ::cv::instr::IMPL_IPP, status < 0, FUN, __VA_ARGS__)
// Diagnostic markers // Diagnostic markers
@ -549,12 +549,15 @@ CV_EXPORTS InstrNode* getCurrentNode();
///// OpenCL instrumentation ///// OpenCL instrumentation
// Wrapper region instrumentation macro // Wrapper region instrumentation macro
#define CV_INSTRUMENT_REGION_OPENCL() CV_INSTRUMENT_REGION_META(::cv::instr::TYPE_WRAPPER, ::cv::instr::IMPL_OPENCL) #define CV_INSTRUMENT_REGION_OPENCL() CV_INSTRUMENT_REGION_META(__FUNCTION__, ::cv::instr::TYPE_WRAPPER, ::cv::instr::IMPL_OPENCL)
#define CV_INSTRUMENT_REGION_OPENCL_(NAME) CV_INSTRUMENT_REGION_META(NAME, ::cv::instr::TYPE_WRAPPER, ::cv::instr::IMPL_OPENCL)
// Function instrumentation macro // Function instrumentation macro
#define CV_INSTRUMENT_FUN_OPENCL_KERNEL(FUN, ...) CV_INSTRUMENT_FUN_RT_META(::cv::instr::TYPE_FUN, ::cv::instr::IMPL_OPENCL, status == 0, FUN, __VA_ARGS__) #define CV_INSTRUMENT_FUN_OPENCL_KERNEL(FUN, ...) CV_INSTRUMENT_FUN_RT_META(::cv::instr::TYPE_FUN, ::cv::instr::IMPL_OPENCL, status == 0, FUN, __VA_ARGS__)
// Diagnostic markers // Diagnostic markers
#define CV_INSTRUMENT_MARK_OPENCL(NAME) CV_INSTRUMENT_MARK_META(::cv::instr::IMPL_OPENCL, NAME) #define CV_INSTRUMENT_MARK_OPENCL(NAME) CV_INSTRUMENT_MARK_META(::cv::instr::IMPL_OPENCL, NAME)
#else #else
#define CV_INSTRUMENT_REGION_META(...)
#define CV_INSTRUMENT_REGION() #define CV_INSTRUMENT_REGION()
#define CV_INSTRUMENT_REGION_MT() #define CV_INSTRUMENT_REGION_MT()
@ -563,6 +566,7 @@ CV_EXPORTS InstrNode* getCurrentNode();
#define CV_INSTRUMENT_MARK_IPP(NAME) #define CV_INSTRUMENT_MARK_IPP(NAME)
#define CV_INSTRUMENT_REGION_OPENCL() #define CV_INSTRUMENT_REGION_OPENCL()
#define CV_INSTRUMENT_REGION_OPENCL_(...)
#define CV_INSTRUMENT_FUN_OPENCL_KERNEL(FUN, ...) ((FUN)(__VA_ARGS__)) #define CV_INSTRUMENT_FUN_OPENCL_KERNEL(FUN, ...) ((FUN)(__VA_ARGS__))
#define CV_INSTRUMENT_MARK_OPENCL(NAME) #define CV_INSTRUMENT_MARK_OPENCL(NAME)
#endif #endif

@ -1076,7 +1076,10 @@ public:
// Instrumentation external interface // Instrumentation external interface
namespace instr namespace instr
{ {
enum
#if !defined OPENCV_ABI_CHECK
enum TYPE
{ {
TYPE_GENERAL = 0, // OpenCV API function, e.g. exported function TYPE_GENERAL = 0, // OpenCV API function, e.g. exported function
TYPE_MARKER, // Information marker TYPE_MARKER, // Information marker
@ -1084,48 +1087,60 @@ enum
TYPE_FUN, // Simple function call TYPE_FUN, // Simple function call
}; };
enum enum IMPL
{ {
IMPL_PLAIN = 0, IMPL_PLAIN = 0,
IMPL_IPP, IMPL_IPP,
IMPL_OPENCL, IMPL_OPENCL,
}; };
enum
{
FLAGS_MAPPING = 0x01,
};
class CV_EXPORTS NodeData class CV_EXPORTS NodeData
{ {
public: public:
NodeData(const char* funName = 0, const char* fileName = NULL, int lineNum = 0, int instrType = TYPE_GENERAL, int implType = IMPL_PLAIN); NodeData(const char* funName = 0, const char* fileName = NULL, int lineNum = 0, cv::instr::TYPE instrType = TYPE_GENERAL, cv::instr::IMPL implType = IMPL_PLAIN);
NodeData(NodeData &ref); NodeData(NodeData &ref);
~NodeData(); ~NodeData();
NodeData& operator=(const NodeData&); NodeData& operator=(const NodeData&);
cv::String m_funName; cv::String m_funName;
int m_instrType; cv::instr::TYPE m_instrType;
int m_implType; cv::instr::IMPL m_implType;
cv::String m_fileName; const char* m_fileName;
int m_lineNum; int m_lineNum;
bool m_funError;
volatile int m_counter; volatile int m_counter;
bool m_stopPoint; volatile uint64 m_ticksTotal;
uint64 m_ticksMean;
// No synchronization
double getTotalMs() const { return (double)m_ticksTotal * 1000. / cv::getTickFrequency(); }
// No synchronization
double getMeanMs() const { return (double)m_ticksTotal * 1000. / (m_counter * cv::getTickFrequency()); }
bool m_funError;
bool m_stopPoint;
}; };
bool operator==(const NodeData& lhs, const NodeData& rhs); bool operator==(const NodeData& lhs, const NodeData& rhs);
typedef Node<NodeData> InstrNode; typedef Node<NodeData> InstrNode;
CV_EXPORTS InstrNode* getTrace();
#endif // !defined OPENCV_ABI_CHECK
CV_EXPORTS bool useInstrumentation(); CV_EXPORTS bool useInstrumentation();
CV_EXPORTS void setUseInstrumentation(bool flag); CV_EXPORTS void setUseInstrumentation(bool flag);
CV_EXPORTS InstrNode* getTrace();
CV_EXPORTS void resetTrace(); CV_EXPORTS void resetTrace();
CV_EXPORTS void setFlags(int modeFlags);
CV_EXPORTS int getFlags(); enum FLAGS
{
FLAGS_NONE = 0,
FLAGS_MAPPING = 1 << 0,
};
CV_EXPORTS void setFlags(FLAGS modeFlags);
static inline void setFlags(int modeFlags) { setFlags((FLAGS)modeFlags); }
CV_EXPORTS FLAGS getFlags();
} }
} //namespace cv } //namespace cv

@ -45,6 +45,7 @@
#include <string> #include <string>
#include <sstream> #include <sstream>
#include <iostream> // std::cerr #include <iostream> // std::cerr
#include <inttypes.h>
#define CV_OPENCL_ALWAYS_SHOW_BUILD_LOG 0 #define CV_OPENCL_ALWAYS_SHOW_BUILD_LOG 0
#define CV_OPENCL_SHOW_RUN_ERRORS 0 #define CV_OPENCL_SHOW_RUN_ERRORS 0
@ -3169,6 +3170,9 @@ struct Kernel::Impl
{ {
cl_program ph = (cl_program)prog.ptr(); cl_program ph = (cl_program)prog.ptr();
cl_int retval = 0; cl_int retval = 0;
#ifdef ENABLE_INSTRUMENTATION
name = kname;
#endif
handle = ph != 0 ? handle = ph != 0 ?
clCreateKernel(ph, kname, &retval) : 0; clCreateKernel(ph, kname, &retval) : 0;
CV_OclDbgAssert(retval == CL_SUCCESS); CV_OclDbgAssert(retval == CL_SUCCESS);
@ -3221,6 +3225,9 @@ struct Kernel::Impl
IMPLEMENT_REFCOUNTABLE(); IMPLEMENT_REFCOUNTABLE();
#ifdef ENABLE_INSTRUMENTATION
cv::String name;
#endif
cl_kernel handle; cl_kernel handle;
cl_event e; cl_event e;
enum { MAX_ARRS = 16 }; enum { MAX_ARRS = 16 };
@ -3441,6 +3448,8 @@ int Kernel::set(int i, const KernelArg& arg)
bool Kernel::run(int dims, size_t _globalsize[], size_t _localsize[], bool Kernel::run(int dims, size_t _globalsize[], size_t _localsize[],
bool sync, const Queue& q) bool sync, const Queue& q)
{ {
CV_INSTRUMENT_REGION_META(p->name.c_str(), instr::TYPE_FUN, instr::IMPL_OPENCL);
if(!p || !p->handle || p->e != 0) if(!p || !p->handle || p->e != 0)
return false; return false;
@ -3552,6 +3561,7 @@ struct Program::Impl
Impl(const ProgramSource& _src, Impl(const ProgramSource& _src,
const String& _buildflags, String& errmsg) const String& _buildflags, String& errmsg)
{ {
CV_INSTRUMENT_REGION_OPENCL_(cv::format("Compile: %" PRIx64 " options: %s", _src.hash(), _buildflags.c_str()).c_str());
refcount = 1; refcount = 1;
const Context& ctx = Context::getDefault(); const Context& ctx = Context::getDefault();
src = _src; src = _src;

@ -1337,7 +1337,7 @@ void resetTrace()
#endif #endif
} }
void setFlags(int modeFlags) void setFlags(FLAGS modeFlags)
{ {
#ifdef ENABLE_INSTRUMENTATION #ifdef ENABLE_INSTRUMENTATION
getInstrumentStruct().enableMapping = (modeFlags & FLAGS_MAPPING); getInstrumentStruct().enableMapping = (modeFlags & FLAGS_MAPPING);
@ -1345,33 +1345,34 @@ void setFlags(int modeFlags)
CV_UNUSED(modeFlags); CV_UNUSED(modeFlags);
#endif #endif
} }
int getFlags() FLAGS getFlags()
{ {
#ifdef ENABLE_INSTRUMENTATION #ifdef ENABLE_INSTRUMENTATION
int flags = 0; int flags = 0;
if(getInstrumentStruct().enableMapping) if(getInstrumentStruct().enableMapping)
flags |= FLAGS_MAPPING; flags |= FLAGS_MAPPING;
return flags; return (FLAGS)flags;
#else #else
return 0; return (FLAGS)0;
#endif #endif
} }
NodeData::NodeData(const char* funName, const char* fileName, int lineNum, int instrType, int implType) NodeData::NodeData(const char* funName, const char* fileName, int lineNum, cv::instr::TYPE instrType, cv::instr::IMPL implType)
{ {
m_instrType = TYPE_GENERAL; m_instrType = TYPE_GENERAL;
m_implType = IMPL_PLAIN; m_implType = IMPL_PLAIN;
m_funError = false;
m_counter = 0;
m_stopPoint = false;
m_ticksMean = 0;
m_funName = funName; m_funName = funName;
m_instrType = instrType; m_instrType = instrType;
m_implType = implType; m_implType = implType;
m_fileName = fileName; m_fileName = fileName;
m_lineNum = lineNum; m_lineNum = lineNum;
m_counter = 0;
m_ticksTotal = 0;
m_funError = false;
m_stopPoint = false;
} }
NodeData::NodeData(NodeData &ref) NodeData::NodeData(NodeData &ref)
{ {
@ -1382,13 +1383,12 @@ NodeData& NodeData::operator=(const NodeData &right)
this->m_funName = right.m_funName; this->m_funName = right.m_funName;
this->m_instrType = right.m_instrType; this->m_instrType = right.m_instrType;
this->m_implType = right.m_implType; this->m_implType = right.m_implType;
this->m_funError = right.m_funError;
this->m_counter = right.m_counter;
this->m_stopPoint = right.m_stopPoint;
this->m_ticksMean = right.m_ticksMean;
this->m_fileName = right.m_fileName; this->m_fileName = right.m_fileName;
this->m_lineNum = right.m_lineNum; this->m_lineNum = right.m_lineNum;
this->m_counter = right.m_counter;
this->m_ticksTotal = right.m_ticksTotal;
this->m_funError = right.m_funError;
this->m_stopPoint = right.m_stopPoint;
return *this; return *this;
} }
NodeData::~NodeData() NodeData::~NodeData()
@ -1418,7 +1418,7 @@ InstrNode* getCurrentNode()
return getInstrumentTLSStruct().pCurrentNode; return getInstrumentTLSStruct().pCurrentNode;
} }
IntrumentationRegion::IntrumentationRegion(const char* funName, const char* fileName, int lineNum, int instrType, int implType) IntrumentationRegion::IntrumentationRegion(const char* funName, const char* fileName, int lineNum, TYPE instrType, IMPL implType)
{ {
m_disabled = false; m_disabled = false;
m_regionTicks = 0; m_regionTicks = 0;
@ -1483,17 +1483,17 @@ IntrumentationRegion::~IntrumentationRegion()
else else
{ {
if (pTLS->pCurrentNode->m_payload.m_implType == cv::instr::IMPL_OPENCL && if (pTLS->pCurrentNode->m_payload.m_implType == cv::instr::IMPL_OPENCL &&
pTLS->pCurrentNode->m_payload.m_instrType == cv::instr::TYPE_FUN) (pTLS->pCurrentNode->m_payload.m_instrType == cv::instr::TYPE_FUN ||
cv::ocl::finish(); pTLS->pCurrentNode->m_payload.m_instrType == cv::instr::TYPE_WRAPPER))
{
cv::ocl::finish(); // TODO Support "async" OpenCL instrumentation
}
uint64 ticks = (getTickCount() - m_regionTicks); uint64 ticks = (getTickCount() - m_regionTicks);
{ {
cv::AutoLock guard(pStruct->mutexCount); // Concurrent ticks accumulation cv::AutoLock guard(pStruct->mutexCount); // Concurrent ticks accumulation
pTLS->pCurrentNode->m_payload.m_counter++; pTLS->pCurrentNode->m_payload.m_counter++;
if(pTLS->pCurrentNode->m_payload.m_counter <= 1) pTLS->pCurrentNode->m_payload.m_ticksTotal += ticks;
pTLS->pCurrentNode->m_payload.m_ticksMean = ticks;
else
pTLS->pCurrentNode->m_payload.m_ticksMean = (pTLS->pCurrentNode->m_payload.m_ticksMean*(pTLS->pCurrentNode->m_payload.m_counter-1) + ticks)/pTLS->pCurrentNode->m_payload.m_counter;
} }
pTLS->pCurrentNode = pTLS->pCurrentNode->m_pParent; pTLS->pCurrentNode = pTLS->pCurrentNode->m_pParent;

@ -767,7 +767,7 @@ static void printShift(cv::instr::InstrNode *pNode, cv::instr::InstrNode* pRoot)
static double calcLocalWeight(cv::instr::InstrNode *pNode) static double calcLocalWeight(cv::instr::InstrNode *pNode)
{ {
if(pNode->m_pParent && pNode->m_pParent->m_pParent) if(pNode->m_pParent && pNode->m_pParent->m_pParent)
return ((double)pNode->m_payload.m_ticksMean*100/pNode->m_pParent->m_payload.m_ticksMean); return ((double)pNode->m_payload.m_ticksTotal*100/pNode->m_pParent->m_payload.m_ticksTotal);
else else
return 100; return 100;
} }
@ -779,7 +779,7 @@ static double calcGlobalWeight(cv::instr::InstrNode *pNode)
while(globNode->m_pParent && globNode->m_pParent->m_pParent) while(globNode->m_pParent && globNode->m_pParent->m_pParent)
globNode = globNode->m_pParent; globNode = globNode->m_pParent;
return ((double)pNode->m_payload.m_ticksMean*100/(double)globNode->m_payload.m_ticksMean); return ((double)pNode->m_payload.m_ticksTotal*100/(double)globNode->m_payload.m_ticksTotal);
} }
static void printNodeRec(cv::instr::InstrNode *pNode, cv::instr::InstrNode *pRoot) static void printNodeRec(cv::instr::InstrNode *pNode, cv::instr::InstrNode *pRoot)
@ -811,7 +811,7 @@ static void printNodeRec(cv::instr::InstrNode *pNode, cv::instr::InstrNode *pRoo
if(pNode->m_pParent) if(pNode->m_pParent)
{ {
printf(" - C:%d", pNode->m_payload.m_counter); printf(" - C:%d", pNode->m_payload.m_counter);
printf(" T:%.4fms", (double)pNode->m_payload.m_ticksMean/cv::getTickFrequency()*1000); printf(" T:%.4fms", pNode->m_payload.getMeanMs());
if(pNode->m_pParent->m_pParent) if(pNode->m_pParent->m_pParent)
printf(" L:%.0f%% G:%.0f%%", calcLocalWeight(pNode), calcGlobalWeight(pNode)); printf(" L:%.0f%% G:%.0f%%", calcLocalWeight(pNode), calcGlobalWeight(pNode));
} }
@ -886,12 +886,15 @@ static cv::String nodeToString(cv::instr::InstrNode *pNode)
return string; return string;
} }
static uint64 getNodeTimeRec(cv::instr::InstrNode *pNode, int type, int impl) static uint64 getNodeTimeRec(cv::instr::InstrNode *pNode, cv::instr::TYPE type, cv::instr::IMPL impl)
{ {
uint64 ticks = 0; uint64 ticks = 0;
if(pNode->m_pParent && pNode->m_payload.m_instrType == type && pNode->m_payload.m_implType == impl) if (pNode->m_pParent && (type < 0 || pNode->m_payload.m_instrType == type) && pNode->m_payload.m_implType == impl)
ticks = pNode->m_payload.m_ticksMean; {
ticks = pNode->m_payload.m_ticksTotal;
return ticks;
}
for(size_t i = 0; i < pNode->m_childs.size(); i++) for(size_t i = 0; i < pNode->m_childs.size(); i++)
ticks += getNodeTimeRec(pNode->m_childs[i], type, impl); ticks += getNodeTimeRec(pNode->m_childs[i], type, impl);
@ -899,7 +902,7 @@ static uint64 getNodeTimeRec(cv::instr::InstrNode *pNode, int type, int impl)
return ticks; return ticks;
} }
static uint64 getImplTime(int impl) static uint64 getImplTime(cv::instr::IMPL impl)
{ {
uint64 ticks = 0; uint64 ticks = 0;
cv::instr::InstrNode *pRoot = cv::instr::getTrace(); cv::instr::InstrNode *pRoot = cv::instr::getTrace();
@ -915,7 +918,7 @@ static uint64 getTotalTime()
cv::instr::InstrNode *pRoot = cv::instr::getTrace(); cv::instr::InstrNode *pRoot = cv::instr::getTrace();
for(size_t i = 0; i < pRoot->m_childs.size(); i++) for(size_t i = 0; i < pRoot->m_childs.size(); i++)
ticks += pRoot->m_childs[i]->m_payload.m_ticksMean; ticks += pRoot->m_childs[i]->m_payload.m_ticksTotal;
return ticks; return ticks;
} }

Loading…
Cancel
Save