Merge pull request #3823 from lupustr3:pvlasov/implementation_detector_update

This commit is contained in:
Vadim Pisarevsky 2015-03-19 12:47:22 +00:00
commit 9997e6d337
3 changed files with 47 additions and 30 deletions

View File

@ -61,7 +61,7 @@ CV_EXPORTS void addImpl(int flag, const char* func = 0); // add implementation a
// Each implementation entry correspond to function name entry, so you can find which implementation was executed in which fucntion // Each implementation entry correspond to function name entry, so you can find which implementation was executed in which fucntion
CV_EXPORTS int getImpl(std::vector<int> &impl, std::vector<String> &funName); CV_EXPORTS int getImpl(std::vector<int> &impl, std::vector<String> &funName);
CV_EXPORTS bool useCollection(); // return implementation colelction state CV_EXPORTS bool useCollection(); // return implementation collection state
CV_EXPORTS void setUseCollection(bool flag); // set implementation collection state CV_EXPORTS void setUseCollection(bool flag); // set implementation collection state
#define CV_IMPL_PLAIN 0x01 // native CPU OpenCV implementation #define CV_IMPL_PLAIN 0x01 // native CPU OpenCV implementation

View File

@ -232,15 +232,30 @@ inline bool checkScalar(InputArray sc, int atype, int sckind, int akind)
void convertAndUnrollScalar( const Mat& sc, int buftype, uchar* scbuf, size_t blocksize ); void convertAndUnrollScalar( const Mat& sc, int buftype, uchar* scbuf, size_t blocksize );
#ifdef CV_COLLECT_IMPL_DATA
struct ImplCollector
{
ImplCollector()
{
useCollection = false;
implFlags = 0;
}
bool useCollection; // enable/disable impl data collection
int implFlags;
std::vector<int> implCode;
std::vector<String> implFun;
cv::Mutex mutex;
};
#endif
struct CoreTLSData struct CoreTLSData
{ {
CoreTLSData() : device(0), useOpenCL(-1), useIPP(-1), useCollection(false) CoreTLSData() : device(0), useOpenCL(-1), useIPP(-1)
{ {
#ifdef HAVE_TEGRA_OPTIMIZATION #ifdef HAVE_TEGRA_OPTIMIZATION
useTegra = -1; useTegra = -1;
#endif
#ifdef CV_COLLECT_IMPL_DATA
implFlags = 0;
#endif #endif
} }
@ -251,13 +266,6 @@ struct CoreTLSData
int useIPP; // 1 - use, 0 - do not use, -1 - auto/not initialized int useIPP; // 1 - use, 0 - do not use, -1 - auto/not initialized
#ifdef HAVE_TEGRA_OPTIMIZATION #ifdef HAVE_TEGRA_OPTIMIZATION
int useTegra; // 1 - use, 0 - do not use, -1 - auto/not initialized int useTegra; // 1 - use, 0 - do not use, -1 - auto/not initialized
#endif
bool useCollection; // enable/disable impl data collection
#ifdef CV_COLLECT_IMPL_DATA
int implFlags;
std::vector<int> implCode;
std::vector<String> implFun;
#endif #endif
}; };

View File

@ -1163,47 +1163,56 @@ TLSData<CoreTLSData>& getCoreTlsData()
#ifdef CV_COLLECT_IMPL_DATA #ifdef CV_COLLECT_IMPL_DATA
ImplCollector& getImplData()
{
static ImplCollector *value = new ImplCollector();
return *value;
}
void setImpl(int flags) void setImpl(int flags)
{ {
CoreTLSData* data = getCoreTlsData().get(); cv::AutoLock lock(getImplData().mutex);
data->implFlags = flags;
data->implCode.clear(); getImplData().implFlags = flags;
data->implFun.clear(); getImplData().implCode.clear();
getImplData().implFun.clear();
} }
void addImpl(int flag, const char* func) void addImpl(int flag, const char* func)
{ {
CoreTLSData* data = getCoreTlsData().get(); cv::AutoLock lock(getImplData().mutex);
data->implFlags |= flag;
getImplData().implFlags |= flag;
if(func) // use lazy collection if name was not specified if(func) // use lazy collection if name was not specified
{ {
size_t index = data->implCode.size(); size_t index = getImplData().implCode.size();
if(!index || (data->implCode[index-1] != flag || data->implFun[index-1].compare(func))) // avoid duplicates if(!index || (getImplData().implCode[index-1] != flag || getImplData().implFun[index-1].compare(func))) // avoid duplicates
{ {
data->implCode.push_back(flag); getImplData().implCode.push_back(flag);
data->implFun.push_back(func); getImplData().implFun.push_back(func);
} }
} }
} }
int getImpl(std::vector<int> &impl, std::vector<String> &funName) int getImpl(std::vector<int> &impl, std::vector<String> &funName)
{ {
CoreTLSData* data = getCoreTlsData().get(); cv::AutoLock lock(getImplData().mutex);
impl = data->implCode;
funName = data->implFun; impl = getImplData().implCode;
return data->implFlags; // return actual flags for lazy collection funName = getImplData().implFun;
return getImplData().implFlags; // return actual flags for lazy collection
} }
bool useCollection() bool useCollection()
{ {
CoreTLSData* data = getCoreTlsData().get(); return getImplData().useCollection;
return data->useCollection;
} }
void setUseCollection(bool flag) void setUseCollection(bool flag)
{ {
CoreTLSData* data = getCoreTlsData().get(); cv::AutoLock lock(getImplData().mutex);
data->useCollection = flag;
getImplData().useCollection = flag;
} }
#endif #endif