Как искать возможности распараллеливания? - PullRequest
3 голосов
/ 08 апреля 2011

У меня есть некоторый последовательный код, который я начал распараллеливать, используя Intel TBB.Моей первой целью было распараллелить почти все циклы for в коде (я даже распараллелил их внутри цикла for), и прямо сейчас, сделав это, я получаю некоторое ускорение. Я ищу больше мест / идей / опций для распараллеливания ...Я знаю, что это может звучать немного расплывчато, не имея большой ссылки на проблему, но я ищу общие идеи, которые я могу исследовать в своем коде.

Обзор алгоритма (следующий алгоритм выполняется на всех уровняхизображение, начиная с самого короткого и увеличивая ширину и высоту на 2 каждый раз, пока вы не достигнете фактической высоты и ширины).

For all image pairs starting with the smallest pair
    For height = 2 to image_height - 2
        Create a 5 by image_width ROI of both left and right images.
        For width = 2 to image_width - 2
            Create a 5 by 5 window of the left ROI centered around width and find best match in the right ROI using NCC
            Create a 5 by 5 window of the right ROI centered around width and find best match in the left ROI using NCC
            Disparity = current_width - best match
    The edge pixels that did not receive a disparity gets the disparity of its neighbors
    For height = 0 to image_height
        For width = 0 to image_width
            Check smoothness, uniqueness and order constraints*(parallelized separately)
    For height = 0 to image_height
        For width = 0 to image_width
            For disparity that failed constraints, use the average disparity of
            neighbors that passed the constraints
    Normalize all disparity and output to screen

Ответы [ 2 ]

0 голосов
/ 09 апреля 2011

Просто для некоторой перспективы не всегда целесообразно что-либо распараллеливать.

То, что у вас есть цикл for, где каждая итерация может выполняться независимо друг от друга, не всегда означает, что вы должны это делать.

У TBB есть некоторые накладные расходы для запуска этих циклов parallel_for, поэтому, если вы не выполняете большое количество раз, вам, вероятно, не следует распараллеливать это.

Но, если каждый цикл очень дорогой(Как в примере с CirrusFlyer), тогда не стесняйтесь распараллеливать его.

В частности, обратите внимание на моменты, когда издержки параллельного вычисления невелики по сравнению с затратами на его распараллеливание.

Кроме того, будьте осторожны при выполнении вложенных циклов parallel_for, так как это может привести кдорого.Вы можете просто придерживаться паралеллизации внешнего цикла for.

0 голосов
/ 08 апреля 2011

Глупый ответ - это все, что требует много времени или повторяется. Я использую Microsoft .NET v4.0 Task Parallel Library, и одна из интересных особенностей их настройки - это «выраженный параллелизм». Интересный термин для описания «попытки параллелизма». Тем не менее, ваши операторы кодирования могут сказать «используйте TPL здесь», если на платформе хоста нет необходимых ядер, вместо этого она просто вызовет старомодный серийный код.

Я начал использовать TPL во всех моих проектах. В любом месте, где есть циклы, особенно (это требует, чтобы я спроектировал свои классы и методы так, чтобы между итерациями цикла не было зависимостей). Но любое место, которое могло бы быть просто старым добрым многопоточным кодом, я смотрю, чтобы увидеть, могу ли я разместить его сейчас на разных ядрах.

До сих пор моим любимым было приложение, которое загружает ~ 7800 различных URL-адресов для анализа содержимого страниц, и, если он находит информацию, которую ищет, выполняет некоторую дополнительную обработку .... это обычно занимало 26 - 29 минут до завершения. Моя рабочая станция Dell T7500 с двухъядерными процессорами Xeon 3GHz с 24 ГБ ОЗУ и 64-разрядной версией Windows 7 Ultimate теперь занимают все это примерно за 5 минут. Огромная разница для меня.

У меня также есть механизм связи публикации / подписки, который я реорганизовал для использования преимуществ TPL (особенно при передаче данных с сервера на клиенты). У вас может быть 10 000 клиентских компьютеров, которые заявили о своей заинтересованности в конкретных вещи, которые, как только это событие происходит, мне нужно отправить данные для всех из них). Я еще этого не сделал, но я ДЕЙСТВИТЕЛЬНО ЖДУ, чтобы увидеть результаты на этом.

Пища для размышлений ...

...