Merge pull request #5660 from jet47:cuda-wrap-stream-3.0
This commit is contained in:
commit
0de6165863
@ -528,6 +528,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Ptr<Impl> impl_;
|
Ptr<Impl> impl_;
|
||||||
|
Event(const Ptr<Impl>& impl);
|
||||||
|
|
||||||
friend struct EventAccessor;
|
friend struct EventAccessor;
|
||||||
};
|
};
|
||||||
|
@ -540,6 +540,16 @@ Stream::Stream(const Ptr<Impl>& impl)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===================================================================================
|
||||||
|
// Event
|
||||||
|
//===================================================================================
|
||||||
|
|
||||||
|
inline
|
||||||
|
Event::Event(const Ptr<Impl>& impl)
|
||||||
|
: impl_(impl)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
//===================================================================================
|
//===================================================================================
|
||||||
// Initialization & Info
|
// Initialization & Info
|
||||||
//===================================================================================
|
//===================================================================================
|
||||||
|
@ -52,7 +52,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <cuda_runtime.h>
|
#include <cuda_runtime.h>
|
||||||
#include "opencv2/core/cvdef.h"
|
#include "opencv2/core/cuda.hpp"
|
||||||
|
|
||||||
namespace cv
|
namespace cv
|
||||||
{
|
{
|
||||||
@ -62,14 +62,12 @@ namespace cv
|
|||||||
//! @addtogroup cudacore_struct
|
//! @addtogroup cudacore_struct
|
||||||
//! @{
|
//! @{
|
||||||
|
|
||||||
class Stream;
|
|
||||||
class Event;
|
|
||||||
|
|
||||||
/** @brief Class that enables getting cudaStream_t from cuda::Stream
|
/** @brief Class that enables getting cudaStream_t from cuda::Stream
|
||||||
*/
|
*/
|
||||||
struct StreamAccessor
|
struct StreamAccessor
|
||||||
{
|
{
|
||||||
CV_EXPORTS static cudaStream_t getStream(const Stream& stream);
|
CV_EXPORTS static cudaStream_t getStream(const Stream& stream);
|
||||||
|
CV_EXPORTS static Stream wrapStream(cudaStream_t stream);
|
||||||
};
|
};
|
||||||
|
|
||||||
/** @brief Class that enables getting cudaEvent_t from cuda::Event
|
/** @brief Class that enables getting cudaEvent_t from cuda::Event
|
||||||
@ -77,6 +75,7 @@ namespace cv
|
|||||||
struct EventAccessor
|
struct EventAccessor
|
||||||
{
|
{
|
||||||
CV_EXPORTS static cudaEvent_t getEvent(const Event& event);
|
CV_EXPORTS static cudaEvent_t getEvent(const Event& event);
|
||||||
|
CV_EXPORTS static Event wrapEvent(cudaEvent_t event);
|
||||||
};
|
};
|
||||||
|
|
||||||
//! @}
|
//! @}
|
||||||
|
@ -280,32 +280,37 @@ class cv::cuda::Stream::Impl
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cudaStream_t stream;
|
cudaStream_t stream;
|
||||||
Ptr<StackAllocator> stackAllocator_;
|
bool ownStream;
|
||||||
|
|
||||||
|
Ptr<StackAllocator> stackAllocator;
|
||||||
|
|
||||||
Impl();
|
Impl();
|
||||||
Impl(cudaStream_t stream);
|
explicit Impl(cudaStream_t stream);
|
||||||
|
|
||||||
~Impl();
|
~Impl();
|
||||||
};
|
};
|
||||||
|
|
||||||
cv::cuda::Stream::Impl::Impl() : stream(0)
|
cv::cuda::Stream::Impl::Impl() : stream(0), ownStream(false)
|
||||||
{
|
{
|
||||||
cudaSafeCall( cudaStreamCreate(&stream) );
|
cudaSafeCall( cudaStreamCreate(&stream) );
|
||||||
|
ownStream = true;
|
||||||
|
|
||||||
stackAllocator_ = makePtr<StackAllocator>(stream);
|
stackAllocator = makePtr<StackAllocator>(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
cv::cuda::Stream::Impl::Impl(cudaStream_t stream_) : stream(stream_)
|
cv::cuda::Stream::Impl::Impl(cudaStream_t stream_) : stream(stream_), ownStream(false)
|
||||||
{
|
{
|
||||||
stackAllocator_ = makePtr<StackAllocator>(stream);
|
stackAllocator = makePtr<StackAllocator>(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
cv::cuda::Stream::Impl::~Impl()
|
cv::cuda::Stream::Impl::~Impl()
|
||||||
{
|
{
|
||||||
stackAllocator_.release();
|
stackAllocator.release();
|
||||||
|
|
||||||
if (stream)
|
if (stream && ownStream)
|
||||||
|
{
|
||||||
cudaStreamDestroy(stream);
|
cudaStreamDestroy(stream);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -516,6 +521,11 @@ cudaStream_t cv::cuda::StreamAccessor::getStream(const Stream& stream)
|
|||||||
return stream.impl_->stream;
|
return stream.impl_->stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Stream cv::cuda::StreamAccessor::wrapStream(cudaStream_t stream)
|
||||||
|
{
|
||||||
|
return Stream(makePtr<Stream::Impl>(stream));
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////
|
||||||
@ -660,7 +670,7 @@ void cv::cuda::setBufferPoolConfig(int deviceId, size_t stackSize, int stackCoun
|
|||||||
|
|
||||||
#ifdef HAVE_CUDA
|
#ifdef HAVE_CUDA
|
||||||
|
|
||||||
cv::cuda::BufferPool::BufferPool(Stream& stream) : allocator_(stream.impl_->stackAllocator_.get())
|
cv::cuda::BufferPool::BufferPool(Stream& stream) : allocator_(stream.impl_->stackAllocator.get())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -693,20 +703,29 @@ class cv::cuda::Event::Impl
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cudaEvent_t event;
|
cudaEvent_t event;
|
||||||
|
bool ownEvent;
|
||||||
|
|
||||||
Impl(unsigned int flags);
|
explicit Impl(unsigned int flags);
|
||||||
|
explicit Impl(cudaEvent_t event);
|
||||||
~Impl();
|
~Impl();
|
||||||
};
|
};
|
||||||
|
|
||||||
cv::cuda::Event::Impl::Impl(unsigned int flags) : event(0)
|
cv::cuda::Event::Impl::Impl(unsigned int flags) : event(0), ownEvent(false)
|
||||||
{
|
{
|
||||||
cudaSafeCall( cudaEventCreateWithFlags(&event, flags) );
|
cudaSafeCall( cudaEventCreateWithFlags(&event, flags) );
|
||||||
|
ownEvent = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
cv::cuda::Event::Impl::Impl(cudaEvent_t e) : event(e), ownEvent(false)
|
||||||
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
cv::cuda::Event::Impl::~Impl()
|
cv::cuda::Event::Impl::~Impl()
|
||||||
{
|
{
|
||||||
if (event)
|
if (event && ownEvent)
|
||||||
|
{
|
||||||
cudaEventDestroy(event);
|
cudaEventDestroy(event);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cudaEvent_t cv::cuda::EventAccessor::getEvent(const Event& event)
|
cudaEvent_t cv::cuda::EventAccessor::getEvent(const Event& event)
|
||||||
@ -714,6 +733,11 @@ cudaEvent_t cv::cuda::EventAccessor::getEvent(const Event& event)
|
|||||||
return event.impl_->event;
|
return event.impl_->event;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Event cv::cuda::EventAccessor::wrapEvent(cudaEvent_t event)
|
||||||
|
{
|
||||||
|
return Event(makePtr<Event::Impl>(event));
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
cv::cuda::Event::Event(CreateFlags flags)
|
cv::cuda::Event::Event(CreateFlags flags)
|
||||||
|
@ -47,6 +47,7 @@
|
|||||||
#include <cuda_runtime.h>
|
#include <cuda_runtime.h>
|
||||||
|
|
||||||
#include "opencv2/core/cuda.hpp"
|
#include "opencv2/core/cuda.hpp"
|
||||||
|
#include "opencv2/core/cuda_stream_accessor.hpp"
|
||||||
#include "opencv2/ts/cuda_test.hpp"
|
#include "opencv2/ts/cuda_test.hpp"
|
||||||
|
|
||||||
using namespace cvtest;
|
using namespace cvtest;
|
||||||
@ -129,6 +130,27 @@ CUDA_TEST_P(Async, Convert)
|
|||||||
stream.waitForCompletion();
|
stream.waitForCompletion();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CUDA_TEST_P(Async, WrapStream)
|
||||||
|
{
|
||||||
|
cudaStream_t cuda_stream = NULL;
|
||||||
|
ASSERT_EQ(cudaSuccess, cudaStreamCreate(&cuda_stream));
|
||||||
|
|
||||||
|
{
|
||||||
|
cv::cuda::Stream stream = cv::cuda::StreamAccessor::wrapStream(cuda_stream);
|
||||||
|
|
||||||
|
d_src.upload(src, stream);
|
||||||
|
d_src.convertTo(d_dst, CV_32S, stream);
|
||||||
|
d_dst.download(dst, stream);
|
||||||
|
|
||||||
|
Async* test = this;
|
||||||
|
stream.enqueueHostCallback(checkConvert, test);
|
||||||
|
|
||||||
|
stream.waitForCompletion();
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT_EQ(cudaSuccess, cudaStreamDestroy(cuda_stream));
|
||||||
|
}
|
||||||
|
|
||||||
CUDA_TEST_P(Async, HostMemAllocator)
|
CUDA_TEST_P(Async, HostMemAllocator)
|
||||||
{
|
{
|
||||||
cv::cuda::Stream stream;
|
cv::cuda::Stream stream;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user