как использовать четырехъядерный ЦП в приложении

Для использования всех ядер четырехъядерного процессора, что, я должен измениться в своем коде, это о добавляющей поддержке много поточной обработки или это, который заботится самой ОС. У меня есть FreeBSD и язык, который я использую, C++. Я хочу дать полные циклы ЦП своему приложению по крайней мере 90%.

13
задан Mayank 30 March 2010 в 13:16
поделиться

7 ответов

Вам необходимо добавить в приложение поддержку параллелизма с помощью потоковой передачи.

Если у вас есть поддержка параллелизма, ОС должна назначить ваши потоки ядрам ЦП.

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

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

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

Boost.Thread - хорошая библиотека, если вы решили пойти по многопоточному маршруту.

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

Для многопоточных приложений на C++ могу предложить Boost.Thread, который поможет вам использовать весь потенциал вашей четырехъядерной машины.

Что касается изменения вашего кода, вы можете подумать о том, чтобы сделать вещи настолько неизменяемыми, насколько это возможно. Переходы состояний между потоками гораздо сложнее отлаживать. Существует множество вещей, которые потенциально могут произойти неожиданным образом. См. этот поток SO.

11
ответ дан 1 December 2019 в 17:45
поделиться

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

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

Я хочу предоставить моему приложению не менее 90% полных циклов ЦП.

Почему? Ваш чип недостаточно горячий?

Серьезно, мировым экспертам требуются десятки, если не сотни часов, чтобы распараллелить и балансировку нагрузки приложения, чтобы оно использовало 90% всех четырех ядра. Ваш процессор уже оплачен за , и он стоит одинаково независимо от того, используете вы его или нет. (На самом деле, с точки зрения электричества, он стоит немного дешевле, если вы его не используете.) Сколько стоит ваше время? Сколько часов вы готовы потратить, чтобы более эффективно использовать ресурс, который, возможно, стоил вам 300 долларов и, вероятно, большую часть времени бездействует?

Можно получить ускорение с помощью параллелизма, но это ] дорого по человеческому времени . Вам нужна веская причина, чтобы оправдать это. (Учиться как - это достаточно веская причина.)

Все известные мне хорошие книги по параллельному программированию предназначены для языков, отличных от C ++, и не зря. Если вам нужны интересные вещи о параллелизме, ознакомьтесь с Implicit Parallel Programmin in pH или Concurrent Programming in ML или Fortress Project .

2
ответ дан 1 December 2019 в 17:45
поделиться

Вам требуется некоторая форма параллелизма. Многопоточность или многопроцессорность подойдут.

Обычно несколько потоков легче обрабатывать (поскольку они могут получать доступ к общим данным), чем несколько процессов . Однако обычно несколько потоков труднее обрабатывать (поскольку они обращаются к общим данным), чем несколько процессов . И да, я написал это намеренно.

Если у вас есть сценарий SIMD, предложение Ninefingers взглянуть на OpenMP также очень хорошо. (Если вы не знаете, что означает SIMD, см. Полезный комментарий Ninefingers ниже.)

21
ответ дан 1 December 2019 в 17:45
поделиться

Другой вариант, не упомянутый здесь, помимо потоковой передачи, - это использование OpenMP, доступного через библиотеки -fopenmp и libgomp , которые я установил в своей системе FreeBSD 8. .

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

Взгляните на это: https://computing.llnl.gov/tutorials/openMP/

Что касается использования самих потоков / процессов, определенные процедуры и способы работы поддаются этому. Можно ли так разбивать задачи? Имеет ли смысл использовать fork () для вашего процесса или создавать поток? Если это так, сделайте это, но если нет, не пытайтесь заставить ваше приложение быть многопоточным только потому, что. Пример, который я обычно привожу, это алгоритм наибольшего общего делителя - он все время полагается на предшествующий шаг в традиционной реализации, поэтому его трудно сделать параллельным.

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

10
ответ дан 1 December 2019 в 17:45
поделиться
Другие вопросы по тегам:

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