Merge pull request #5659 from jet47:cuda-wrap-stream-2.4
This commit is contained in:
commit
739d7caa32
@ -57,6 +57,7 @@ namespace cv
|
|||||||
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);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -89,6 +89,7 @@ struct Stream::Impl
|
|||||||
}
|
}
|
||||||
|
|
||||||
cudaStream_t stream;
|
cudaStream_t stream;
|
||||||
|
bool own_stream;
|
||||||
int ref_counter;
|
int ref_counter;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -335,6 +336,7 @@ void cv::gpu::Stream::create()
|
|||||||
impl = (Stream::Impl*) fastMalloc(sizeof(Stream::Impl));
|
impl = (Stream::Impl*) fastMalloc(sizeof(Stream::Impl));
|
||||||
|
|
||||||
impl->stream = stream;
|
impl->stream = stream;
|
||||||
|
impl->own_stream = true;
|
||||||
impl->ref_counter = 1;
|
impl->ref_counter = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -342,9 +344,23 @@ void cv::gpu::Stream::release()
|
|||||||
{
|
{
|
||||||
if (impl && CV_XADD(&impl->ref_counter, -1) == 1)
|
if (impl && CV_XADD(&impl->ref_counter, -1) == 1)
|
||||||
{
|
{
|
||||||
cudaSafeCall( cudaStreamDestroy(impl->stream) );
|
if (impl->own_stream)
|
||||||
|
{
|
||||||
|
cudaSafeCall( cudaStreamDestroy(impl->stream) );
|
||||||
|
}
|
||||||
cv::fastFree(impl);
|
cv::fastFree(impl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Stream StreamAccessor::wrapStream(cudaStream_t stream)
|
||||||
|
{
|
||||||
|
Stream::Impl* impl = (Stream::Impl*) fastMalloc(sizeof(Stream::Impl));
|
||||||
|
|
||||||
|
impl->stream = stream;
|
||||||
|
impl->own_stream = false;
|
||||||
|
impl->ref_counter = 1;
|
||||||
|
|
||||||
|
return Stream(impl);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* !defined (HAVE_CUDA) */
|
#endif /* !defined (HAVE_CUDA) */
|
||||||
|
@ -44,6 +44,8 @@
|
|||||||
|
|
||||||
#ifdef HAVE_CUDA
|
#ifdef HAVE_CUDA
|
||||||
|
|
||||||
|
#include "opencv2/gpu/stream_accessor.hpp"
|
||||||
|
|
||||||
using namespace cvtest;
|
using namespace cvtest;
|
||||||
|
|
||||||
#if CUDART_VERSION >= 5000
|
#if CUDART_VERSION >= 5000
|
||||||
@ -125,6 +127,25 @@ GPU_TEST_P(Async, Convert)
|
|||||||
stream.waitForCompletion();
|
stream.waitForCompletion();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GPU_TEST_P(Async, WrapStream)
|
||||||
|
{
|
||||||
|
cudaStream_t cuda_stream = NULL;
|
||||||
|
ASSERT_EQ(cudaSuccess, cudaStreamCreate(&cuda_stream));
|
||||||
|
|
||||||
|
cv::gpu::Stream stream = cv::gpu::StreamAccessor::wrapStream(cuda_stream);
|
||||||
|
|
||||||
|
stream.enqueueUpload(src, d_src);
|
||||||
|
stream.enqueueConvert(d_src, d_dst, CV_32S);
|
||||||
|
stream.enqueueDownload(d_dst, dst);
|
||||||
|
|
||||||
|
Async* test = this;
|
||||||
|
stream.enqueueHostCallback(checkConvert, test);
|
||||||
|
|
||||||
|
stream.waitForCompletion();
|
||||||
|
|
||||||
|
ASSERT_EQ(cudaSuccess, cudaStreamDestroy(cuda_stream));
|
||||||
|
}
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(GPU_Stream, Async, ALL_DEVICES);
|
INSTANTIATE_TEST_CASE_P(GPU_Stream, Async, ALL_DEVICES);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user