Как измерить производительность независимо от используемой машины

У меня был хороший распорядок дня. Однако мне пришлось внести в него изменения. Это изменение повысило точность процедуры, но ухудшило ее производительность.

Процедура состоит из множества математических вычислений и, вероятно, связана с нехваткой процессора (мне все еще нужно провести более тщательное тестирование, но я уверен на 99%). Написан на C ++ (компилятор - Borland C ++ 6).

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

Тогда я столкнулся с этой темой: Методы для измерения производительности приложения - Stack Overflow. Мне понравилась идея измерения через MFlops.

Мой босс предложил попробовать использовать какое-то измерение по тактовым циклам процессора, чтобы тесты были машинно-независимыми, однако я думаю, что этот подход относится к тестированию MFlops.

На мой взгляд, лучше всего измерить обе вещи (время выполнения и MFlops), но я хотел бы услышать от экспертов по stackoverflow, что вы думаете, ребята.

Каким образом можно измерить производительность процедуры, известной как привязка процессора?


person Edison Gustavo Muenz    schedule 12.06.2009    source источник
comment
Это изменение улучшило производительность программы, но ухудшило ее. Что это обозначает?   -  person samoz    schedule 12.06.2009
comment
@samoz Ops, тип здесь, спасибо, что заметили   -  person Edison Gustavo Muenz    schedule 12.06.2009


Ответы (6)


Тактовые циклы процессора тоже не так много значат, если ваше приложение привязано к памяти. На более быстром процессоре вы просто потратите больше циклов процессора, ожидая того же промаха кеша. (Математические приложения, вероятно, не привязаны к вводу-выводу).

Другая проблема заключается в том, что количество тактовых циклов для определенной последовательности инструкций по-прежнему будет варьироваться в зависимости от архитектуры (и даже между Intel Core1 / Core2). Таким образом, в качестве абсолютного показателя производительности тактовые циклы на одном процессоре вряд ли можно назвать улучшением.

Я бы сказал, что они на самом деле хуже в качестве меры. В отличие от времени, пользователей не волнуют циклы. Это особенно важно для современных многоядерных процессоров. «Неэффективные» алгоритмы, использующие вдвое большее количество циклов и 3 ядра, завершаются в 67% случаев. Наверное, пользователям это понравится.

person MSalters    schedule 12.06.2009

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

Я бы предположил, что измерение упускает из виду.

Что вам действительно нужно сделать, так это найти операторы или инструкции (не функции), 1) которые отвечают за значительную часть времени настенных часов, и 2) которые вы можете найти способ оптимизации .

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

Это очень хороший способ найти их, и это является примером его использование.

person Mike Dunlavey    schedule 12.06.2009
comment
Я знаю, что могу рассчитывать на отрицательный голос, если плыву против течения, говоря, что ловить дорогостоящие инструкции более эффективно, чем измерять стоимость < i> functions, даже с графами вызовов. - person Mike Dunlavey; 12.06.2009

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

person Stephen Doyle    schedule 12.06.2009
comment
Тактовые циклы процессора не обязательно имеют значение. - person David Thornley; 12.06.2009
comment
Ага, Дэвид - это то, что я имел в виду под другими происходящими событиями, такими как промахи в кэше! Как и в случае с любым другим измерением, отдельное измерение редко бывает значимым и должно быть помещено в контекст. - person Stephen Doyle; 13.06.2009

В настоящее время тактовые циклы ЦП не зависят от машины, даже если ЦП используют один и тот же набор команд. Машинный код x86 (или любой другой) будет нарезан и нарезан самыми разными способами. Дни, когда это что-то значило, давно прошли (а когда-то циклы ЦП что-то значили, использовалось так много разных типов ЦП, что они в любом случае зависели от машины).

Не говоря уже о том, что привязка к процессору не так ясна, как раньше, что с промахами в кеше и всем остальным. Раньше считалось, что процесс, привязанный к ЦП, ограничивался только вводом-выводом и т. Д., Поскольку доступ к памяти занимал определенное количество циклов ЦП.

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

person David Thornley    schedule 12.06.2009

Вы можете измерить аппаратные счетчики ЦП, профили VTune Intel в этом неплохо справляются. он покажет вам подробную информацию, основанную на счетчиках ЦП (инструкция удалена, пропуски кэша, неверное прогнозирование ветки), а также коррелирует это с каждым оператором в ваших функциях, так что вы будете иметь довольно хорошее представление о том, что требует наибольших затрат.

предполагается, что ваша функция не привязана к памяти.

Спасибо

person mfawzymkh    schedule 14.06.2009

Измерение времени выполнения - это лучший способ.

В этом случае, я думаю, вы хотите свести к минимуму то, что вы измеряете, чтобы уменьшить количество переменных.

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

relative_time = measured_time_for_routine / measured_time_for_baseline
person Alan Jackson    schedule 12.06.2009