
Мне интересно запустить на моем настольном компьютере/ноутбуке какую-нибудь достаточно тяжелую обработку (не настолько плохую, чтобы требовался кластер, но нужна хорошая домашняя машина). Мой вопрос в том, сколько потоков создать, чтобы работа выполнялась максимально быстро (предположим, что приложение распределяет рабочую нагрузку с очень небольшими накладными расходами).
Обычно я создаю один поток на процессор, но мне было интересно, означает ли возможность гиперпоточности на Core i5/i7, что мне на самом деле следует создавать два потока на процессор (т. е. один поток на виртуальный процессор). Кто-нибудь знает?
*Очевидно, разумным ответом было бы попробовать и посмотреть. Поскольку запуск занимает около 12 часов, я бы предпочел сделать все правильно с первого раза, но я с радостью опубликую результаты, если у меня будет возможность запустить его обоими способами.
решение1
Это открытый вопрос, требующий дорогостоящего бенчмаркинга. Я лично видел, как это работает в обоих направлениях. Если вы действительно не испортили многопоточность, разница будет около +-10%, поэтому стоит попробовать оба варианта. Даже если это займет много времени.
Во многих кластерах высокопроизводительных вычислений, построенных на компонентах Intel, HT отключен. Это имеет веские причины, поскольку эти коды имеют тенденцию перегружать оборудование, и, следовательно, их производительность очень привязана к насыщению доступа к памяти, что будет хуже в случае HT, поскольку потоки вычисляют и включаются и выключаются. Смотритеhttp://semiaccurate.com/2012/04/25/does-disabling-hyper-threading-increase-performance/.
Но если ваш код не настроен тщательно, вы вряд ли заметите такой же прирост производительности, см.http://semiaccurate.com/2012/04/25/does-disabling-hyper-threading-increase-performance/.
Похоже, что для вычислений с одним процессором отключение гиперпоточности может увеличить производительность некоторых программ на 1%, но также навредить другим программам значительно больше. Возможно, на ~10%.
Это означает, что если ваши тесты не говорят об обратном, вам следует создать 1 поток на каждое гиперпоточное/реальное ядро на вашем настольном компьютере.
решение2
Я говорю исключительно на основе опыта свёртывания F@H, говоря, что наилучшим вариантом будет один поток на ядро (будь то виртуальное или физическое).
При этом, возможно, было бы неплохо оставить одно ядро свободным для выполнения фоновых процессов и общих компьютерных задач, поскольку даже небольшая загрузка может поставить задачу на колени.
Посмотрите на CPU affinity, если вы хотите отслеживать, где что-то работает. Как правило, назначайтесначала физические ядра(т.е.:даженумерации), затем ядра гиперпотока.