Профилирование использования плавающей запятой в C - PullRequest
4 голосов
/ 22 октября 2011

Есть ли простой способ подсчитать количество умножений, фактически выполненных фрагментом стандартного кода C?Код, который я имею в виду, в основном просто делает сложения и умножения, и это умножения, которые представляют первостепенный интерес, но не мешало бы получить подсчет и других операций.

Если бы это был вариант, Я полагаю, я мог бы заменить 'a * b' на 'multiply (a, b)' и написать функцию покрытия для нативного оператора *, b / c. Мне действительно все равно во время выполнения теста, ноосновное возражение против выполнения того, что - это необходимость переделывать кучу исходного кода только для запуска теста.

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

Ответы [ 4 ]

4 голосов
/ 22 октября 2011

Примечание: бесстыдная экстраполяция моего комментария для максимально возможного количества повторений.

PAPI имеет две высокоуровневые API-функции, называемые PAPI_flips и PAPI_flops, которые можно использовать для записи FLOPS, а также количества операций с плавающей запятой. Кроме того, PAPI предлагает множество других возможностей мониторинга счетчиков производительности, в зависимости от архитектуры вашего процессора ... кэш, шина, память, ветви и т. Д. Я думаю, что появляется поддержка или поддержка для графических ускорителей и CUDA / GPGPU.

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

Приятной особенностью PAPI является то, что вам не нужно ничего знать о коде; просто настройте его (интерфейс такой же, как секундомер для FLOPS) и запустите его. Он основан на реальном динамическом выполнении вашей программы, поэтому он учитывает вещи, которые трудно объяснить аналитически, такие как (псевдо) случайное поведение, ввод данных пользователем / переменной и связанные ветви.

4 голосов
/ 22 октября 2011

Скомпилируйте исходный код в язык ассемблера и затем выполните поиск команд умножения.

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

2 голосов
/ 22 октября 2011

Если ваш компилятор поддерживает soft-float (т.е. использует функции с целочисленными реализациями для эмуляции с плавающей запятой), вы можете скомпилировать вашу программу в этом режиме (-msoft-float в GCC) и использовать свой любимый инструмент профилирования, чтобы измерить, сколько раз они вызваны.

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

1 голос
/ 22 октября 2011

Лучшее, что я могу придумать (если вы используете GDB):

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

Да, это очень грубо. Конечно, есть и другие решения; Тем не менее, я бы колебался поменять свой стек на что-то простое, например, на счет.

...