2015-07-28 3 views
1

У меня есть базовое приложение VS2012 C++/CLI, которое извлекает изображения из нескольких веб-камер, а затем распознает объекты с помощью OpenCV. В настоящее время каждая веб-камера имеет свою собственную нить. Это работает, но я не получаю частоту кадров, я бы хотел.Многопоточный процессор для GPU с использованием CUDA 7.0/VS2012 C++/CLI/OpenCV

Я хотел бы реализовать некоторый код на моем графическом процессоре NVidia. Таким образом, я хочу, чтобы каждый из моих потоков процессора мог асинхронно вызывать GPU и выполнять ряд функций.

Я ГПУ новичок, так мне интересно, что делает больше смысла:

1) блокировка доступа к GPU в одном поток процессора в то время; или

2) что-то там, где каждый поток ЦП может совершать вызовы на графический процессор, и только некоторые ядра работают над этим потоком (и другие ядра работают с другими потоками); или

3) что-то, где выполняются задания.

Если # 2 - хороший вариант, есть ли какой-нибудь справочник о том, как это сделать? Мне нужно было бы сохранить что-то в памяти GPU для каждого потока ЦП.

Спасибо за любые рекомендации.

+0

Я бы предложил просто разрешить ему разорвать (т. Е., Возможно, ни одно из вышеперечисленных). Пока вы не используете всю память на графическом процессоре, при асинхронном, более или менее неуправляемом способе мало вреда, пусть несколько потоков используют графический процессор волей-неволей (при условии, что каждый поток более или менее работает независимо, например, один поток на веб-камеру, как вы говорите). Учитывая, что у вас есть что-то, работающее в OpenCV, первым шагом может быть вопрос о том, какие части вашего алгоритма могут уже иметь возможность использовать ускоренную функцию OpenCV GPU. Не единственный способ ускорить работу GPU, но это могут быть низко висящие фрукты. –

+0

Спасибо за предложение. Я предполагаю, что один процессорный поток, пытающийся вызвать команду GPU, когда команда GPU уже запущена, не вызовет ошибку потока. – user1805103

+0

Я знаю об ускоренных функциях с графическим процессором OpenCV, но, учитывая, что для каждого изображения с веб-камеры мне нужно запустить несколько функций на графическом процессоре (например, переназначить, cvtColor, surfkeypoints, findhomography), я предположил, что все будет намного быстрее, если все было сделано на GPU. – user1805103

ответ

1

Следующий шаг может заключаться в использовании CUDA-Streams. Таким образом, независимые потоки могут работать одновременно на графическом процессоре. Но будьте осторожны, с тем, что становится все более сложным взглянуть на используемую память, регистры и ядра. Это означало бы, что вам нужен дополнительный код, чтобы избежать переполнения или исчерпания регистров. В любое время имейте в виду, что каждый ресурс на GPU ограничен. Для Кеплера посмотрите на Kepler Whitepaper на стр. 6 - 8 и в Руководстве по эффективности в CUDA Programming Guide на стр. 79 и 80.

Смежные вопросы