#c #class #optimization #branch
#c #класс #оптимизация #ветвление
Вопрос:
Я оптимизирую программу и пытаюсь избежать неправильного предсказания ветвей. У меня есть два объекта класса. В основной функции класса есть несколько if
ветвей. Каждый объект принимает различное направление в каждой из этих ветвей, и каждый из них выполняет функцию один за другим. Мои вопросы:
Поскольку они являются членами одного и того же класса и, следовательно, совместно используют эту функцию, используют ли они также одно и то же предсказание ветвления? По сути, я заставляю систему перейти на TFTFTFTF…
Или, поскольку они являются их собственными объектами, имеют ли они свои собственные прогнозы ветвления и, следовательно, поддерживают согласованные прогнозы (TTTTTTT … и FFFFFFFF …)
Комментарии:
1. Прогнозирование бренда? Как кока-кола или пепси? Apple или ПК? Я предсказываю, что OS / 2 станет операционной системой будущего.
2. @KerrekSB Ты не слышал? Brand — это единственная форма ветвей. Может быть где-то скрыто в спецификации C 11.
3. @Joe: Я забыл об этом — все эти переопределения. Я слышал, что больше нет «точек последовательности», и
auto
сейчасcar
.
Ответ №1:
Да, метод является общим для экземпляров класса.
Это также означает, что прогнозы являются общими.
Однако предсказание ветвления — это нечто большее, чем «последнее» время. Процессор запомнит некоторые из последних результатов и определит «простые» (циклические) шаблоны. Поэтому, если вы постоянно переключаетесь между вашими двумя объектами, и шаблон заканчивается TFTFTFTFTF
, тогда процессор правильно угадает, что следующим результатом будет a T
.
Однако с семантической точки зрения, думали ли вы об использовании базового класса и двух разных производных классов ( обычный виртуальный механизм)?
Комментарии:
1. Ага. Это интересно. И нет, я не думал о производном методе. Это еще один вариант, который я обязательно рассмотрю. Спасибо за совет.
Ответ №2:
Не беспокойтесь о таких низкоуровневых деталях, как предсказание ветвлений (оно будет варьироваться от одной модели процессора к другой). Оставьте эту оптимизацию компилятору (и это, вероятно, достаточно хорошо).
Если вы хотите улучшить свое приложение, больше работайте над самими алгоритмами. И используйте профилирование и измерения. Не забывайте, что преждевременная оптимизация — это зло.
Комментарии:
1. Что ж, я закончил работу с программным обеспечением, так что теперь следующим логическим шагом является улучшение его использования в цикле, потому что на данный момент он слишком высок. И хотя основная часть моей работы по оптимизации сосредоточена на улучшении алгоритмов, этот конкретный цикл вызывается так много раз, что мне нужно уменьшить неверное предсказание ветвлений. Я просто не уверен, действительно ли происходит неправильное предсказание, отсюда и мой первоначальный вопрос.
2. @Henley: используйте приличный профилировщик, чтобы увидеть, где на самом деле находятся узкие места и является ли неправильное предсказание ветвей проблемой — держу пари, что это не так, и что у вас гораздо большие проблемы с производительностью, о которых нужно беспокоиться, прежде чем переходить к этим крошечным микрооптимизациям.
3. Это хороший совет, и он есть в моем списке дел. Причина, по которой я поднимаю это сейчас, заключается в том, что я нахожусь в процессе переписывания большого фрагмента программы по структурным причинам, и поскольку у меня есть несколько путей (к if или не к if), я решил, что лучше определить это сейчас. PS Я использую XCode. Считается ли профилировщик «приличным»?
Ответ №3:
Поскольку неправильное предсказание ветвления обычно будет стоить порядка 10-20 циклов, это действительно важно только тогда, когда оно находится внутри цикла, который выполняется миллионы раз в секунду. Современные процессоры в любом случае неплохо справляются с предсказанием ветвлений, поэтому довольно редко приходится беспокоиться о подобных вещах (по сравнению, скажем, 5-10 лет назад).
Комментарии:
1. Моя программа представляет собой синтезатор, и эта конкретная функция вызывается столько раз в секунду, что это общепринятая мудрость среди программистов audio DSP, чтобы избежать неправильного предсказания ветвлений в этом цикле. Так что в моем случае, хотя я знаю, что это редко, мне нужно решить эту проблему.
2. @Hanley: если вам не нужно, чтобы это работало на очень старых процессорах, тогда вам, вероятно, не нужно беспокоиться — мифология оптимизации имеет тенденцию сохраняться задолго до ее «лучшей даты».