У меня проблема с запуском кода C ++ на мощном многоядерном сервере, который использует Ubuntu. Проблема в том, что мое приложение использует менее 10% одного процессора. Но то же приложение использует около 100% одного процессора в моем ноутбуке i3, который использует другую версию Ubuntu.
Моя ОС:
Linux version 3.11.0-23-generic (buildd@batsu) (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 (buildd@allspice) (gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu7) ) #19-Ubuntu SMP Wed Oct 9 16:20:46 UTC 2013
По крайней мере, на данный момент мне не нужно распараллеливать код или делать его более эффективным. Я просто хочу знать, как я могу добиться 100% использования ядра этого сервера.
Кто-нибудь может мне помочь?
Это может быть не ваша ОС, а компилятор. Компиляторы являются движущимися целями, год от года они улучшают (надеюсь) свою автоматическую оптимизацию. Ваш код все еще может векторизоваться, а вы этого не знаете. Да, я понимаю, что вы используете более новый компилятор на своем ноутбуке.
Посмотрите, если у вас все еще есть дельта производительности при отключении всех оптимизаций (-O0 или некоторые другие). Если вы пытаетесь максимизировать циклы процессора, вы можете использовать числовые вычисления, которые легко векторизовать. То же самое касается распараллеливания. Вы также можете получить общие отчеты по оптимизации, а также специальный отчет по векторизации от gcc. Я не помню этот параметр, но вы можете легко найти его в Интернете.
Кроме того, существует огромное количество различий между количеством ядер на сервере (возможно, многоядерном Xeon) и вашим i3. Ваш i3 имеет 2 ядра, каждое из которых может работать с двумя аппаратными потоками, что означает, что у вас фактически 4 процессора. В зависимости от конфигурации вашего сервера, вы можете иметь до 18 ядер с двумя аппаратными потоками в каждом процессоре. Это означает 36 эффективных процессоров. Кроме того, вы можете иметь несколько процессоров на материнскую плату. Ты можешь сделать математику.
И компилятор, и ОС могут влиять на использование процессора приложения. Если вы отбрасываете несколько потоков, чтобы попробовать и потреблять обработку, ОС может перенести их на разные процессоры, что снизит загрузку ЦП вашей системы. Даже если вы используете чистый последовательный код, умный компилятор может разбить код на несколько потоков, которые ваша библиотека потоков может распределить по этим 36 эффективным ЦП.
Ваша ОС может также измерять, сколько обработки вы можете потреблять. Если этот сервер не находится под вашим контролем, администратор, возможно, установил политику, ограничивающую процент обработки, которую может потреблять любое приложение.
Итак, в заключение:
(1) Отключить всю оптимизацию
(2) Проверьте использование отдельных основных процессоров, чтобы увидеть, какова нагрузка на все ваши эффективные процессоры.
(3) Реструктурируйте ваш код, чтобы выполнять задачи, которые будут распределены между вашими эффективными процессорами, каждая из которых потребляет как можно больше обработки.
(4) Убедитесь, что ваш администратор не ограничивает объем обработки, которую могут потреблять отдельные приложения.