2015-01-22 6 views
1

У меня возникла проблема с запуском кода C++ на мощном многоядерном сервере, использующем Ubuntu. Проблема в том, что мое приложение использует менее 10% одного процессора. Но одно и то же приложение использует около 100% одного процессора в моем ноутбуке i3, который использует другую версию Ubuntu.C++: Низкое использование ЦП на многоядерном сервере Ubuntu

Моя ОС:

Linux version 3.11.0-23-generic ([email protected]) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)) #40~precise1-Ubuntu SMP Wed Jun 4 22:06:36 UTC 2014 

Операционный сервер:

Linux version 3.11.0-12-generic ([email protected]) (gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu7)) #19-Ubuntu SMP Wed Oct 9 16:20:46 UTC 2013 

По крайней мере, на данный момент, мне не нужно распараллелить код, ни сделать мой код более эффективным. Я просто хочу знать, как я могу добиться 100% использования ядра этого сервера.

Может ли кто-нибудь мне помочь?

+0

Какой инструмент вы используете для показа использования ЦП? Возможно, что инструмент показывает использование как часть * всех * процессоров, поэтому, если ваш код является однопоточным, он просто будет использовать небольшую часть мультипроцессора. – Rufflewind

+0

Я использую верх. Но время, затрачиваемое на работу на сервере, больше, чем в моем ноутбуке. –

+0

Я думаю, что ваш подход неправильный. Вы должны думать о том, «как я могу заставить это приложение вычислять/выполнять то, что ему нужно делать наиболее эффективно», а не «как я могу сделать такую ​​программу с ограниченным процессором, что она использует как можно больше времени процессора». , – twalberg

ответ

0

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

Посмотрите, есть ли у вас дельта производительности, когда вы отключите все оптимизации (-O0 или некоторые такие). Если вы пытаетесь максимизировать циклы CPU, вы можете использовать численные вычисления, которые легко векторизовать. То же самое касается распараллеливания. Вы также можете получить общие отчеты об оптимизации, а также специальный отчет по векторизации от gcc. Я не помню параметр, но вы можете легко найти его в режиме онлайн.

Также существует мир различий между # ядрами на сервере (возможно, многоядерным Xeon) и вашим i3. Ваш i3 имеет 2 ядра, каждый из которых способен работать на двух аппаратных потоках, что означает, что у вас есть 4 процессора. В зависимости от конфигурации вашего сервера вы можете иметь до 18 ядер с двумя аппаратными потоками в процессоре. Это соответствует 36 эффективным процессорам. Кроме того, вы можете иметь несколько процессоров на материнскую плату. Ты можешь сделать математику.

Оба компилятора и ОС могут влиять на использование процессора приложения. Если вы пытаетесь обработать несколько потоков, чтобы попробовать и потреблять обработку, ОС может обрабатывать их на разных процессорах, что снижает использование ЦП в вашей системе. Даже если вы используете чистый последовательный код, интеллектуальный компилятор может разбить код на несколько потоков, которые ваша библиотека потоков может распространять на эти 36 эффективных процессоров.

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

Итак, в заключении: (1) Отключить все оптимизации (2) Проверьте на индивидуальном использовании ядра процессора, чтобы увидеть, что нагрузка на все ваши эффективных процессоры (3) реструктуризировать ваш код откупа задачи, которые будут распределенных по вашим эффективным процессорам, каждый из которых потребляет как можно больше обработки. (4) Убедитесь, что ваш администратор не ограничивает объем обработки отдельными приложениями.

Смежные вопросы