Обработка изображения с использованием реализации CUDA, Python (Pycuda) или C ++? - PullRequest
4 голосов
/ 11 февраля 2011

Я нахожусь в проекте для обработки изображения с использованием CUDA. Проект - это просто сложение или вычитание изображения.

Могу ли я спросить ваше профессиональное мнение, что является лучшим и каковы преимущества и недостатки этих двух?

Я ценю все мнения и / или предложения, так как этот проект очень важен для меня.

Ответы [ 4 ]

6 голосов
/ 11 февраля 2011

Общий ответ: Неважно.Используйте язык, который вам удобнее.

Имейте в виду, однако, что pycuda является лишь оболочкой для интерфейса CUDA C, поэтому она не всегда актуальна, а также добавляет еще один потенциальный источник ошибок ...1006 * Python великолепен в быстром прототипировании, поэтому я бы лично выбрал Python.Вы всегда можете переключиться на C ++ позже, если вам нужно.

3 голосов
/ 11 февраля 2011

Если остальная часть вашего конвейера находится на Python, и вы уже используете Numpy для ускорения, pyCUDA - хорошее дополнение для ускорения дорогостоящих операций. Однако, в зависимости от размера ваших изображений и потока вашей программы, вы можете не получить слишком много ускорения с помощью pyCUDA. Задержка при передаче данных назад и вперед по шине PCI, которая компенсируется только с большими размерами данных.

В вашем случае (сложение и вычитание) в pyCUDA есть встроенные операции, которые вы можете использовать в своих интересах. Однако, по моему опыту, использование pyCUDA для чего-то нетривиального требует много знаний о том, как CUDA работает в первую очередь. Для тех, кто не знает CUDA, pyCUDA может стать крутой кривой обучения.

2 голосов
/ 11 февраля 2011

Взгляните на openCV , он содержит множество функций обработки изображений и все помощники для загрузки / сохранения / отображения изображений и управления камерами.

Теперь он также поддерживает CUDA, некоторые функции обработки изображений были переопределены в CUDA, и это дает вам хорошую основу для самостоятельной работы.

0 голосов
/ 14 февраля 2011

Алекс ответ правильный.Время, затрачиваемое на упаковку, минимально.Обратите внимание, что PyCUDA имеет несколько хороших конструкций метапрограммирования для генерации ядер, которые могут быть полезны.

Если все, что вы делаете, это добавление или вычитание элементов изображения, вам, вероятно, вообще не следует использовать CUDA для этого.Время, необходимое для передачи данных по шине PCI-E туда и обратно, уменьшит объем экономии, которую вы получаете от параллелизма.

Каждый раз, когда вы имеете дело с CUDA, полезно подумать об отношении CGMA (отношение вычислений к глобальному доступу к памяти).Ваше сложение / вычитание - только 1 операция с плавающей запятой для 2 обращений к памяти (1 чтение и 1 запись).Это в конечном итоге очень паршиво с точки зрения CUDA.

...