Автоматический способ получения числа операций с плавающей точкой для некоторого фрагмента кода

У меня есть довольно сложный и сильно шаблонизированный код (C ++, но это, возможно, не очень актуально), из которого я хотел бы знать количество операций добавления, подпрограмм, муль, делений и sqrts при исполнении. Существует ли автоматический способ получения этой информации (компилятор может легко ее обработать)? Я пытался посчитать это сам в сгенерированном коде ассемблера, но запутался jp, jmp, а также calls.

1

Решение

Я бы предложил переопределить +, -, *, / операторы и sqrt функция для некоторого типа типа float, в котором вы можете сосчитать их использование.

Что-то вроде этого:

struct Double {
double val;
Double(double v): val(v) {}
static unsigned add_count = 0;
Double operator+(Double other) {
++add_count;
return Double(val + other.val);
}
};

do_your_stuff<Double>();
1

Другие решения

Да, вы можете, но путь немного сложнее:

Попробуйте заменить ваши «add», «sub», «mul», «div», «sqrt» в двоичном коде на недопустимый код операции. Не забудьте определить недопустимый обработчик ошибок кода операции для восстановления кода операции. Когда вы запустите программу, процессор вызовет ошибку недопустимого кода операции при этих измененных «add», «sub», «mul», «div», «sqrt». Посчитав, сколько раз сработала ошибка кода операции, вы можете получить именно то, что вы хотите.

0

По вопросам рекламы [email protected]