Как структурировать приложение C++ для использования многоядерного процессора

Я создаю приложение, которое будет делать некоторое отслеживание объекта от канала видеокамеры и использовать информацию от этого для выполнения системы частиц в OpenGL. Код для обработки видео канала является несколько медленным, 200 - 300 миллисекунд на кадр прямо сейчас. Система, на которой это будет работать, имеет двухъядерный процессор. Для максимизации производительности, я хочу разгрузить материал обработки камеры к одному процессору и просто передать соответствующие данные назад к главному приложению, поскольку это доступно при отъезде удара главного приложения на другом процессоре.

Что я должен сделать для разгрузки работы камеры к другому процессору и как я обрабатываю связь с главным приложением?

Править: Я запускаю 64-разрядный Windows 7.

14
задан Peter Mortensen 19 April 2011 в 12:55
поделиться

5 ответов

Jon Skeet писал об этом некоторое время назад. Можно достичь некоторые преимуществ наследования с синглтоном, хотя использование вложенных внутренних классов оставляет немного желать желать. У него нет бесконечной расширяемости, это только методика для того, чтобы синглтон выбирал свою собственную реализацию во время выполнения.

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

-121--2827356-

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

OpenMP отлично, но в заднице это тад в заднице, особенно при присоединении от параллелизации. YMMV. Это легко использовать, но не вообще лучший вариант выполнения. Это также требует поддержки компилятора.

Если вы на Mac OS X 10.6 (Snow Leopard), вы можете использовать Grand Central Discatch . Интересно прочитать, даже если вы не используете его, так как его дизайн реализует некоторые лучшие практики. Он также не является оптимальным, но он лучше, чем OpenMP, даже если он также требует поддержки компилятора.

Если вы можете обернуть голову вокруг разбивки вашего приложения в «Задачи» или «рабочие места», вы можете засунуть эти задания в виде множества труб, поскольку у вас есть сердечники. Подумайте о дозировании вашей обработки в качестве атомных единиц работы. Если вы можете правильно отделить его, вы можете запустить обработку вашей камеры как в ядрах, а также в основной поток одновременно.

Если связь сводится к минимуму для каждого блока работы, то ваша потребность в mutexes и других блокирующих примитивов будет минимизирована. Конечно, зернистая резьба намного проще, чем мелкозернистая. И вы всегда можете использовать библиотеку или рамку для облегчения бремени. Рассмотрим Библиотеку потоков Boost , если вы принимаете подход вручную. Он предоставляет портативные обертки и хорошую абстракцию.

12
ответ дан 1 December 2019 в 13:33
поделиться

Это зависит от того, сколько у вас ядер. Если у вас есть только 2 ядра (процессор, процессоры, гипертерди, вы знаете, что я имею в виду), то OpenMP не может дать такое огромное увеличение производительности, но поможет. Максимальная выгода, которую вы можете иметь, это разделить свое время по количеству процессоров, поэтому все равно будет принимать 100 - 150 мс на кадр.

Уравнение
Параллельное время = (([Общее время для выполнения задачи] - [Код, который не может быть распараллерным]) / [Количество процессоров]) + [Код, который не может быть распараллерным]

в основном, openMP скалы при обработке параллельных петлей. Его достаточно простым в использовании

#pragma omp parallel for
for (i = 0; i < N; i++)
    a[i] = 2 * i;

и взрыв, ваш для параллелизован. Это не работает для каждого случая, а не каждый алгоритм может быть параллелен таким образом, но многие могут быть переписаны (взломаны), чтобы быть совместимым. Ключевым принципом является единичная инструкция, несколько данных (SIMD), применяя то же код свертки на несколько пикселей, например.

Но просто применение этой рецензии поваренной книги поступает против правил оптимизации.
1-позорный ваш код
2 - Найдите настоящие узкие места с «научными» доказательствами (цифрами) вместо того, чтобы просто угадать, где вы думаете, что есть узкое место
3 - если это действительно обработка петлей, то OpenMP для вас

, возможно, простые оптимизации на вашем существующем коде могут дать лучшие результаты, которые знают?

Другая дорога будет запущена в потоке и обработке данных на другой нить. Это поможет много помогать, если OpenGL или ваша система рендеринга частиц принимает много мощности, но помните, что резьба может привести к другому виду узких мест синхронизации.

3
ответ дан 1 December 2019 в 13:33
поделиться

Вам нужна какая-то структура для обработки многолетних. OpenMP кажется довольно простым выбором.

1
ответ дан 1 December 2019 в 13:33
поделиться

Как сообщил о том, что сказал, что вам просто нужно ваше приложение, чтобы быть многопоточным. Упомянутые многие рамки, такие как OpenMP, поэтому вот еще один:

блоки строительных блоков Intel

Я никогда не использовал его раньше, но я слышу великие об этом.

Надеюсь, это поможет!

0
ответ дан 1 December 2019 в 13:33
поделиться

Я бы порекомендовал не использовать OpenMP, OpenMP больше подходит для числовых кодов, нежели для модели потребителя/производителя, которая у вас, кажется, есть.

Я думаю, что можно сделать что-то простое, используя boost threads для порождения рабочего потока, общий сегмент памяти (для обмена полученными данными), а также доступен некоторый механизм оповещения о ваших данных (посмотрите на прерывания boost thread).

Я не знаю, какую обработку вы делаете, но, возможно, вы захотите взглянуть на строительные блоки потоков Intel и интегрированные примитивы Intel, у них есть несколько функций для обработки видео, которые могут быть более быстрыми (при условии, что у них есть ваша функциональность)

.
2
ответ дан 1 December 2019 в 13:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: