У меня есть большой расчет, чтобы сделать. Хотя я могу использовать все ядра, я подумал, есть ли какая-то причина, чтобы оставить 1 ядро и не использовать его? (расчетный процессор только без ввода-вывода). Или я недооцениваю ОС, которую она не знает, чтобы справиться и правильно переключить контекст, даже если я использую все ядра?
12
Ответы:
Основные операционные системы достаточно развиты, чтобы знать, как обрабатывать процессы, использующие все доступные ядра. Другие процессы могут (и часто будут) затронуты, но вычисления не станут медленнее, потому что вы использовали каждое доступное ядро.
Выбор количества ядер зависит больше от вашего намерения сделать что-то еще во время выполнения расчета.
Если на настольном компьютере вы хотите иметь возможность использовать свой веб-браузер или смотреть видео во время вычислений, вам лучше оставить одно ядро свободным для него. Точно так же, если сервер выполняет две вещи (например, выполняет вычисления и одновременно обрабатывает и сообщает свои метрики), хорошей идеей будет оставить ядро свободным для побочной задачи.
С другой стороны, если ваш приоритет - сделать вычисления максимально быстрыми, вы должны использовать все ядра.
источник
По-разному.
Если машина предназначена для этих вычислений, вы должны использовать все ядра - неиспользуемые вычислительные ресурсы не ускоряют процесс .
Если вы используете планировщик реального времени, планировщик без вытеснения или привязку к процессору, то вам следует быть немного более осторожным, поскольку легко случайно лишить других процессов всех вычислительных ресурсов. Однако вам придется вручную изменить эти настройки, чтобы что-то пошло не так, поэтому по умолчанию здесь нет проблем в большинстве операционных систем.
Если машина не предназначена для вычислений, предоставление 100% вычислений может быть не идеальным. Например, если вы используете веб-браузер во время вычислений. Поскольку нагрузка на вашу машину иногда достигает пика выше 100%, она будет вялой. Задачи, ориентированные на пропускную способность, такие как вычисления, на самом деле не будут замедляться, но чувствительные к задержкам задачи, такие как GUI, не будут реагировать так быстро. Тогда имеет смысл запускать только потоки / процессы NPROC-1 для вычислений. В качестве альтернативы, явное использование более низкого приоритета для вычислений, чем для обычных задач, могло бы решить эту проблему, и в этом случае вычисления должны использовать процессы NPROC, чтобы не тратить какие-либо ресурсы.
источник
nice
.Я немного осмотрительно согласен с @motoDrizzt, ниже, из-за его отрицательных голосов :), но это действительно был мой реальный опыт - чем больше, тем лучше, даже помимо фактического количества ядер (но не тысяч). Например, взгляните на http://www.forkosh.com/images/avoronoi.gif, где каждая 2D-плоскость этой 3D-voronoi_diagram может быть сгенерирована независимо. И программа берет атрибут nfork = n query_string, чтобы раскошелиться на вычисления для n плоскостей "одновременно".
В случае с четырехъядерным процессором время (пользователь) для завершения диаграммы линейно уменьшается с nfork, примерно до nfork = 8 (гиперядь с четырьмя ядрами). Но после 8 время все еще уменьшается, хотя и медленнее. И около 16 или около того, никаких дальнейших заметных улучшений. Я вообще не анализировал это поведение, но наивно относил его к операциям жонглирования ОС (в данном случае linux slackware 14.2x64) для еще большего сокращения общего времени простоя.
источник
Лучший выбор зависит от системы. Итак, вы хотите запустить обе версии в реальной системе, а затем проверить, как система реагирует. Можете ли вы по-прежнему использовать браузер, текстовый редактор и другие вещи в вашей системе? И лучше ли производительность при использовании n потоков, а не n-1? Что произойдет, если вы запустите приложение вместе с другим приложением, которое пытается использовать все процессоры?
И тогда вам нужно рассмотреть гиперпоточность. С четырьмя ядрами плюс гиперпоточность, вы можете использовать 8 ядер или 7 ядер. Снова, попробуйте отзывчивость системы и время, чтобы закончить.
И наконец, рассмотрите возможность разделения вашей работы на большее количество блоков, чем потоков. Причина в том, что разные потоки завершат работу в разное время, а затем вы захотите, чтобы часть работы была передана более быстрым потокам. В противном случае вам придется подождать, пока последний поток не закончится.
PS. «Гиперпоточность не может помочь с интенсивным кодом FPU, потому что есть только один FPU». Абсолютно неправильно. Невероятно сложно, даже с интенсивным кодом FPU, полностью использовать FPU из-за задержек. Гиперпоточность помогает, потому что для планирования доступно в два раза больше независимых операций.
источник
Я не знаю, как написать это так, чтобы это не звучало «плохо», поэтому просто примите это как дружеское замечание, хорошо?
Учитывая, что средний ПК уже имеет обычно тысячи или более потоков, что заставляет вас думать, что использование 8 против 7 будет иметь какое-то значение? :-)
Используйте как можно больше потоков. И если вам не нужно заботиться об ответе ОС, и ваши потоки работают довольно долго (более секунды), вы даже можете поэкспериментировать, используя вдвое больше ядер.
источник