mirror of
https://github.com/opencv/opencv.git
synced 2024-11-29 22:00:25 +08:00
fix null stream initialization for multi-gpu systems
This commit is contained in:
parent
05d40946f3
commit
68e08bbecd
@ -330,14 +330,11 @@ namespace cv { namespace cuda
|
|||||||
void initStreams();
|
void initStreams();
|
||||||
void initPools();
|
void initPools();
|
||||||
|
|
||||||
Mutex streams_mtx_;
|
|
||||||
volatile bool streams_initialized_;
|
|
||||||
|
|
||||||
Mutex pools_mtx_;
|
|
||||||
volatile bool pools_initialized_;
|
|
||||||
|
|
||||||
std::vector<Ptr<Stream> > streams_;
|
std::vector<Ptr<Stream> > streams_;
|
||||||
|
Mutex streams_mtx_;
|
||||||
|
|
||||||
std::vector<MemoryPool> pools_;
|
std::vector<MemoryPool> pools_;
|
||||||
|
Mutex pools_mtx_;
|
||||||
};
|
};
|
||||||
|
|
||||||
DefaultDeviceInitializer::DefaultDeviceInitializer()
|
DefaultDeviceInitializer::DefaultDeviceInitializer()
|
||||||
@ -359,59 +356,43 @@ namespace cv { namespace cuda
|
|||||||
|
|
||||||
Stream& DefaultDeviceInitializer::getNullStream(int deviceId)
|
Stream& DefaultDeviceInitializer::getNullStream(int deviceId)
|
||||||
{
|
{
|
||||||
initStreams();
|
AutoLock lock(streams_mtx_);
|
||||||
|
|
||||||
|
if (streams_.empty())
|
||||||
|
{
|
||||||
|
int deviceCount = getCudaEnabledDeviceCount();
|
||||||
|
|
||||||
|
if (deviceCount > 0)
|
||||||
|
streams_.resize(deviceCount);
|
||||||
|
}
|
||||||
|
|
||||||
CV_DbgAssert( deviceId >= 0 && deviceId < static_cast<int>(streams_.size()) );
|
CV_DbgAssert( deviceId >= 0 && deviceId < static_cast<int>(streams_.size()) );
|
||||||
|
|
||||||
|
if (streams_[deviceId].empty())
|
||||||
|
{
|
||||||
|
cudaStream_t stream = NULL;
|
||||||
|
Ptr<Stream::Impl> impl = makePtr<Stream::Impl>(stream);
|
||||||
|
streams_[deviceId] = Ptr<Stream>(new Stream(impl));
|
||||||
|
}
|
||||||
|
|
||||||
return *streams_[deviceId];
|
return *streams_[deviceId];
|
||||||
}
|
}
|
||||||
|
|
||||||
MemoryPool* DefaultDeviceInitializer::getMemoryPool(int deviceId)
|
MemoryPool* DefaultDeviceInitializer::getMemoryPool(int deviceId)
|
||||||
{
|
|
||||||
initPools();
|
|
||||||
|
|
||||||
CV_DbgAssert( deviceId >= 0 && deviceId < static_cast<int>(pools_.size()) );
|
|
||||||
|
|
||||||
return &pools_[deviceId];
|
|
||||||
}
|
|
||||||
|
|
||||||
void DefaultDeviceInitializer::initStreams()
|
|
||||||
{
|
|
||||||
AutoLock lock(streams_mtx_);
|
|
||||||
|
|
||||||
if (!streams_initialized_)
|
|
||||||
{
|
|
||||||
int deviceCount = getCudaEnabledDeviceCount();
|
|
||||||
|
|
||||||
if (deviceCount > 0)
|
|
||||||
{
|
|
||||||
streams_.resize(deviceCount);
|
|
||||||
|
|
||||||
for (int i = 0; i < deviceCount; ++i)
|
|
||||||
{
|
|
||||||
cudaStream_t stream = NULL;
|
|
||||||
Ptr<Stream::Impl> impl = makePtr<Stream::Impl>(stream);
|
|
||||||
streams_[i] = Ptr<Stream>(new Stream(impl));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
streams_initialized_ = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DefaultDeviceInitializer::initPools()
|
|
||||||
{
|
{
|
||||||
AutoLock lock(pools_mtx_);
|
AutoLock lock(pools_mtx_);
|
||||||
|
|
||||||
if (!pools_initialized_)
|
if (pools_.empty())
|
||||||
{
|
{
|
||||||
int deviceCount = getCudaEnabledDeviceCount();
|
int deviceCount = getCudaEnabledDeviceCount();
|
||||||
|
|
||||||
if (deviceCount > 0)
|
if (deviceCount > 0)
|
||||||
pools_.resize(deviceCount);
|
pools_.resize(deviceCount);
|
||||||
|
|
||||||
pools_initialized_ = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CV_DbgAssert( deviceId >= 0 && deviceId < static_cast<int>(pools_.size()) );
|
||||||
|
|
||||||
|
return &pools_[deviceId];
|
||||||
}
|
}
|
||||||
|
|
||||||
DefaultDeviceInitializer initializer;
|
DefaultDeviceInitializer initializer;
|
||||||
|
Loading…
Reference in New Issue
Block a user