2013-08-25 6 views
2

Интересно, как opencv выполняет операции над матрицами. Например, когда я пишу код дляopencv function implementation

cv::add (Mat mat1, Mat mat2, Mat &result) 

с использованием двух for loops, она занимает около 120-130 мс для 1000x750 изображения. Но используя функцию opencv add, она занимает 6-7 мс. Кто-нибудь знает, что их трюк? Я хочу научиться, чтобы он мог писать функции, которых нет у opencv.

Я искал внутри opencv и нашел два .cpp-файла (first, second), но я не знаю, ищу ли я правильное место.

Я просто хочу знать, как использовать эту мощность. Может ли кто-нибудь мне помочь?

Спасибо,

ответ

4

Два файла cpp, которые вы предоставили, предназначены для операций с графическим процессором (CUDA и OpenCL). С вашего вопроса, я думаю, вы ищете не-графические операции, и это correct file..

OpenCV славится своей скоростью, и он исходит из множества оптимизаций, которые они выполняют в своих кодах. Я просто дам некоторые подсказки некоторым из них.

1. SIMD Оптимизация

Это один из основных источников оптимизации в OpenCV. Почти все арифметические операции оптимизированы SIMD. В вашем случае также оптимизация SIMD - лучший вариант (который OpenCV уже сделал). Это повышает производительность в несколько раз в зависимости от уровня вашей реализации. Все современные процессоры имеют встроенную поддержку SIMD (SSE, AVX и т. Д.).

Это немного сложнее по сравнению с нашим обычным C++. Вместо того, чтобы одновременно добавлять только два пикселя из обеих матриц, вы добавляете примерно 16 пикселей (зависит от типа данных) одновременно. Теоретически он обеспечивает 16-кратное ускорение. Here is a simple example, который я написал во время обучения SIMD-сборке (вы можете использовать Intrinsics, которые намного проще). Он не очень оптимизирован (написан только для его изучения), по-прежнему обеспечивает ускорение в 20 раз.

Аналогичным образом, для использования на платформе ARM коды оптимизируются NEON (в основном, это команда Nvidia для своих процессоров Tegra). Example

2. Многопоточность с помощью TBB

Другим важным является использование ТВВ, некоторые из уже упоминали в своем ответе, и вы должны собрать источник OpenCV с TBB для ее достижения. Как он упоминал, это может быть непростой задачей. Многие функции, такие как распознавание лиц и т. Д., Оптимизированы TBB в OpenCV.

OpenCV также выполняет некоторые другие методы, такие как цикл разворачивания. (Example) Это дает небольшое улучшение. Современные компиляторы уже очень хороши в этом.

Вы можете прочитать Agner Fog's optimization techniques manuals для получения более подробной информации об оптимизации кодов C++. Все эти детали актуальны.

2

В this страницы они говорят, в конце документа, что это быстрее, потому что функции ядра являются многопоточной поддержкой с помощью Intel винтового Building Blocks.

+0

Спасибо, есть способ, которым я могу использовать многопоточность, введя что-то вроде 'MULTI_THREAD_ENABLED' где-то в моем коде. Я много не знаю о многопоточности. Если нет такого простого использования, можете ли вы направить меня о том, с чего мне начать? – smttsp

+0

многопоточность - задача непростая, для создания многопоточного приложения достаточно создать, вы можете посмотреть [там] (http://softpixel.com/~cwright/programming/threads/threads.c.php). – jambono