@Andrei1penguin1

Как замерить частоты тактов, отводимых на операцию в C?

Доброго времени суток, я знаю, что умножение через битовые операции на константы занимает несколько единиц тактов процессора по сравнению с нативным умножением, которое занимает несколько десятков тактов
Также мне известно, что умножение на константу 13 с помощью битовых операций занимает 3 такта (два сдвига и ещё какая-то битовая операция) и я хочу узнать, сколько тактов занимает нативное умножение числа на константу 13:
int main() {
    int x = 5;
    x * 13; //Количество тактов, отводимых на эту операцию, я и хочу замерить

Собственно вопрос:
Как в языке C замерить это самое количество тактов, отводимых на конкретное действие?
  • Вопрос задан
  • 78 просмотров
Решения вопроса 1
@vabka
Токсичный
Например так: https://godbolt.org/
Например если собрать с -O3 будет 0 операций, тк x не используется.

Узнать сколько именно тактов исполняется каждая инструкция - не известно, тк каждый процессор по разному их реализовывает и + ещё есть спекулятивное выполнение.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
wataru
@wataru
Разработчик на С++, гуглер, экс-олимпиадник.
Никак.

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

Во-вторых, даже если вы смотрите на итоговый ассемблерный код, сколько тактов он занимает - некорректный вопрос. Операции в современных CPU разбиваются на микроперации, перемешиваются и выполняются в конвеере параллельно. А если там еще всякие обращения к памяти, то зависит от того в какой кеш оно попадет, сколько тактов процессор будет синхронизировать кеши и так далее. Даже если нет обращения к памяти, то есть переименование регистров. И нет никакой гарантии что одна и та же операция будет выполнятся одинаковое количество тактов всегда.
Ответ написан
CityCat4
@CityCat4
Если я чешу в затылке - не беда!
Вопрос поставлен неверно.

Первое. Компиляторы нынче жутко умные и могут весьма вольно обращаться с кодом (что весьма бесит, когда делаешь отладку - непременно нужно -O0 ("о ноль"). Поэтому имеет смысл рассматривать только код, откомпилированный с этой опцией, если ее убрать, все будет нафиг по-другому.
Второе. Смотрим ассемблерный код, сгенерированный компилятором и считаем такты по командам.
Третье. И выкидываем свои расчеты в мусорку, потому что процы - они тоже умные, у них всякие оптимизации, конвейеры, предикативные блоки и прочее.

Смысл считать растактовку есть только для слабых процов - берется даташит на конкрентую модель проца - и считается.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы