Я использую OpenCV 3.4 с библиотеками cuda для обработки видеоизображений. Изображение захватывается и загружается через устройство с помощью GpuMat::upload()
. После этого изображение подвергается двойному порогу для создания двух разных двоичных изображений (Th1 и Th2). Мой первый вопрос: могу ли я использовать потоки cuda в обеих пороговых функциях для одновременного запуска? Это проблема, поскольку они оба используют один и тот же GpuMat в качестве ввода.
После порогового значения я буду использовать оба двоичных GpuMats для дополнительной обработки их с использованием других функций cv :: cuda. Второй вопрос: должен ли я использовать Stream::waitForCompletion()
, чтобы дождаться окончания потоковых настроек, прежде чем использовать Th1 и Th2 для дальнейшей обработки? или эта зависимость данных определяется автоматически? в основном я пытаюсь обработать эти 2 двоичных изображения отсюда параллельно, а не обрабатывать сначала Th1, а затем th2. Они будут обрабатываться точно так же, как и функции cuda, но с разными значениями.
Я использую cuda 9.0. По-прежнему ли проблема , если одна и та же операция ставится в очередь дважды с разными данными для разных потоков?
пример моего кода показан ниже:
src.upload(IMG); //upload cv::Mat to device
//threashold src with different values and write them in dst0 and dst1
// Can I have 2 stream on the same functions that are both using src as input?
cv::cuda::threshold(src, dst0, 10, 1, THRESH_BINARY, s0); //Stream s0
cv::cuda::threshold(src, dst1, 40, 1, THRESH_BINARY, s1); // Stream S1
s0.waitForCompletion();// I dont know if this is necessary
cv::cuda::reduce(dst0, Vx0, 0, CV_REDUCE_SUM, CV_32S);
s1.waitForCompletion();// also this one
cv::cuda::reduce(dst1, Vx1, 0, CV_REDUCE_SUM, CV_32S);