как использовать четырехъядерный процессор в приложении - PullRequest
12 голосов
/ 30 марта 2010

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

Ответы [ 7 ]

21 голосов
/ 30 марта 2010

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

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

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

11 голосов
/ 30 марта 2010

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

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

10 голосов
/ 30 марта 2010

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

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

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

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

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

3 голосов
/ 30 марта 2010

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

2 голосов
/ 31 марта 2010

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

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

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

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

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

1 голос
/ 30 марта 2010

Вам необходимо добавить поддержку вашего приложения для параллелизма с использованием Threading.

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

0 голосов
/ 30 марта 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...