2012-06-07 6 views
7

Я заметил, что несколько моих многопоточных вычислений работают быстрее, если я отключу гиперпоточность в BIOS.Отключить гиперпотоки против изменения ProcessorAffinity?

Я также узнал, что можно программно отключить (логический) CPU: сек путем изменения сродства процессора для текущего процесса, например, как это в C#:

// using System.Diagnostics; 
var current = Process.GetCurrentProcess(); 
var affinity = current.ProcessorAffinity.ToInt32(); 
current.ProcessorAffinity = new IntPtr(affinity & 0x5555); 

По крайней мере, с точки производительности зрения, отключит каждый второй (логический) процессор, изменив сродство процессора, окажет такое же влияние, как и полное отключение гиперпотока?

+1

Хмм, ключевой вопрос: собираетесь ли вы отправить свою машину-разработчик вместе со своим программным обеспечением? –

+2

Другим фактором может быть операционная система. Если вы отключите гиперпоточность в BIOS, и ваше программное обеспечение пытается использовать все ядра, то при попытке запуска операционной системы (или другого фона) она будет конкурировать с вашим программным обеспечением для доступа к процессору. Лучшая ставка может заключаться в том, чтобы просто попробовать и сравнить оба варианта и посмотреть, какие различия вы найдете в процессе; разница может быть несущественной, что позволяет легко отключать гиперпоточность. ПРИМЕЧАНИЕ. Если у вас нет аппаратного контроля, проверьте процессоры AMD, у которых есть выделенные ядра без гиперпотока. –

+0

Спасибо, Крис, очень полезный ответ. Я сделаю еще один бенчмаркинг, чтобы узнать, будет ли какой-либо из вариантов иметь реальную разницу в обычной пользовательской среде. –

ответ

2

Вы можете попробовать использовать API NUMA или вручную узнать топологию CPU с инструкцией CPUID ... Но IMHO лучшее решение делает некоторые нормальные значения по умолчанию и позволяет конечным пользователям настраивать параметры потоковой передачи. Если у вас нет конкретной аппаратной цели, есть справедливые возможные сценарии для обработки: логические или физические ядра, гиперпоточность или нет, одно- или многосоставные системы, кеш и топология памяти.

+0

Спасибо, snemarch. Интересно узнать о [NUMA] (http://en.wikipedia.org/wiki/Non-Uniform_Memory_Access), это было ново для меня. Вы, безусловно, правы, вероятно, лучше всего предоставить общее решение и оставить настройку производительности до конечного пользователя. С принципиальной точки зрения, хотя бы вы сказали, что нет ответа «нет или нет» на мой первоначальный вопрос? –

+0

Это зависит от характера вашего кода, а также от аппаратного обеспечения, на котором он работает :) - если ваш код сражается за исполнительные блоки, то не работает на HT-ядрах (что не обязательно обязательно должно быть каждый второй) может помочь , Но есть разница между P4, Core2 и тем, что делает AMD. – snemarch