Оптимальное количество потоков при отключенной гиперпоточности
У меня есть вопрос, на который я пытался найти ответ, но все больше запутался из-за всей найденной информации - к сожалению, не смог получить четкий ответ
Итак, допустим, у меня есть компьютер с отключенной гиперпоточностью.
Какое оптимальное количество потоков я должен использовать в написанной мной программе?
Я понимаю, что если моя программа НЕ на 100% связана с процессором (имеет дело с IO), то оптимальное количество потоков будет БОЛЕЕ больше, чем один поток на ядро - поскольку у меня будет несколько потоков, которые ожидают и имеют больше (не слишком много) из-за переключения контекста) будет лучше для таких программ.
НО, в случае, если моя программа на 100% связана с процессором - один поток на ядро является оптимальным? Я в замешательстве, поскольку имею больше потоков, то есть, возможно, получаю больше времени для каждого потока, что может улучшить производительность.
Спасибо!
1 ответ
При чисто нагрузке на процессор без гиперпоточности ответ всегда равен 1 потоку на ядро.
При включенном HT может быть меньше одного потока на ядро HT, потому что потоки борются за один и тот же кеш. Но обычно даже здесь один поток на ядро HT является лучшим.
С рабочими нагрузками ввода-вывода это намного сложнее, но здесь это не применимо.
так как имеет больше потоков, то есть, возможно, получить большее время среза для каждого потока
Не уверен, что я следую рассуждениям. ОС будет раздавать временные срезы потокам примерно в циклическом порядке. Срезы времени составляют 4-40 мс, и их размер не изменяется в зависимости от количества потоков.
В идеале, когда количество потоков точно правильное, нет никаких контекстных переключателей, о которых можно было бы говорить. Чем больше потоков вы добавите, тем больше переключений контекста.