Мне нужна короткая программа на C, которая работает медленнее на процессоре с HyperThreading, чем на одном без него - PullRequest
2 голосов
/ 04 марта 2011

Я хочу написать статью с оптимизацией компилятора для HyperTreading.Первым шагом было бы выяснить, почему процессор с HyperThreading (одновременная многопоточность) может привести к более низкой производительности, чем процессор без этой технологии.Первый шаг - найти приложение, которое лучше без HyperThreading, чтобы я мог запустить на нем некоторые счетчики производительности оборудования.Любое предложение о том, как или где я мог бы найти один?

Итак, подведем итог.Я знаю, что преимущества HyperThreading составляют от -10% до + 30%.Мне нужно приложение на C, которое снижает производительность на 10%.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 апреля 2011

Вероятно, основным недостатком гиперпоточности является эффективное сокращение размера кэша в два раза. Каждый поток будет заполнять кеш, поэтому каждый из них, по сути, имеет половину кеша.

Чтобы создать программу, которая работает с гиперпоточностью хуже, чем без, создайте однопоточную программу, которая выполняет задачу, которая просто помещается в кэш L1. Затем добавьте второй поток, который разделяет рабочую нагрузку и работает с «другого конца» данных. Вы обнаружите, что производительность падает до минимума - это потому, что оба потока теперь должны получить доступ к кэшу второго уровня.

Гиперпоточность может значительно улучшить или ухудшить производительность. Это полностью в зависимости от использования. Ничего из этого -10% / + 30% - это просто смешно.

0 голосов
/ 04 марта 2011

Я не знаком ни с оптимизацией компилятора для HT, ни с различием между i7 HT и P4, как указал Дэвид.Тем не менее, вы можете ожидать общего поведения.

Переключение контекста очень дорого.Поэтому, если у вас есть одно ядро ​​и одновременно запущены два потока, переключение одного потока с другого на другое всегда приводит к снижению производительности.Однако потоки не используют ядро ​​все время.Например, если поток читает или записывает память, он просто ожидает доступа к памяти без использования ядра, обычно более 100 циклов.Существует много других случаев, когда поток должен останавливаться таким образом, например, операции ввода-вывода, зависимости данных и т. Д. Здесь HT помогает, потому что он может отправить ожидающий (или заблокированный) поток и вместо этого выполнить другой поток.

Таким образом, вы можете подумать, что если все потоки действительно вряд ли будут заблокированы, переключение контекста вызовет только издержки.Подумайте об очень ограниченном в вычислениях приложении, работающем с небольшим набором данных.

...