mirror of
https://github.com/opencv/opencv.git
synced 2026-07-28 06:43:01 +04:00
core: parallel_for_(): update RNG state of the main thread
This commit is contained in:
@@ -166,7 +166,8 @@ namespace
|
||||
class ParallelLoopBodyWrapper : public cv::ParallelLoopBody
|
||||
{
|
||||
public:
|
||||
ParallelLoopBodyWrapper(const cv::ParallelLoopBody& _body, const cv::Range& _r, double _nstripes)
|
||||
ParallelLoopBodyWrapper(const cv::ParallelLoopBody& _body, const cv::Range& _r, double _nstripes) :
|
||||
is_rng_used(false)
|
||||
{
|
||||
|
||||
body = &_body;
|
||||
@@ -181,13 +182,23 @@ namespace
|
||||
pThreadRoot = cv::instr::getInstrumentTLSStruct().pCurrentNode;
|
||||
#endif
|
||||
}
|
||||
#ifdef ENABLE_INSTRUMENTATION
|
||||
~ParallelLoopBodyWrapper()
|
||||
{
|
||||
#ifdef ENABLE_INSTRUMENTATION
|
||||
for(size_t i = 0; i < pThreadRoot->m_childs.size(); i++)
|
||||
SyncNodes(pThreadRoot->m_childs[i]);
|
||||
}
|
||||
#endif
|
||||
if (is_rng_used)
|
||||
{
|
||||
// Some parallel backends execute nested jobs in the main thread,
|
||||
// so we need to restore initial RNG state here.
|
||||
cv::theRNG() = rng;
|
||||
// We can't properly update RNG state based on RNG usage in worker threads,
|
||||
// so lets just change main thread RNG state to the next value.
|
||||
// Note: this behaviour is not equal to single-threaded mode.
|
||||
cv::theRNG().next();
|
||||
}
|
||||
}
|
||||
void operator()(const cv::Range& sr) const
|
||||
{
|
||||
#ifdef ENABLE_INSTRUMENTATION
|
||||
@@ -207,6 +218,9 @@ namespace
|
||||
r.end = sr.end >= nstripes ? wholeRange.end : (int)(wholeRange.start +
|
||||
((uint64)sr.end*(wholeRange.end - wholeRange.start) + nstripes/2)/nstripes);
|
||||
(*body)(r);
|
||||
|
||||
if (!is_rng_used && !(cv::theRNG() == rng))
|
||||
is_rng_used = true;
|
||||
}
|
||||
cv::Range stripeRange() const { return cv::Range(0, nstripes); }
|
||||
|
||||
@@ -215,6 +229,7 @@ namespace
|
||||
cv::Range wholeRange;
|
||||
int nstripes;
|
||||
cv::RNG rng;
|
||||
mutable bool is_rng_used;
|
||||
#ifdef ENABLE_INSTRUMENTATION
|
||||
cv::instr::InstrNode *pThreadRoot;
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user