Профилирование простой операции за один цикл - PullRequest
0 голосов
/ 18 марта 2012

У нас есть задание, в котором нам нужно профилировать «простую инструкцию» (сложение или побитовое и, например).Это означает выполнение одной и той же операции большое количество раз (100K +) и измерение среднего времени в микросекундах.Результат должен быть представлен в длинах циклов: (totalTime/iterations)*cphMHz.

Таким образом, результаты могут отличаться, но в целом нам сказали, что мы должны получить результат, близкий к 1 длине цикла.Фактический результат не имеет значения, пока программирование правильное.

Мой вопрос: что такое хорошая операция для профилирования?Есть два момента, на которые нужно обратить внимание:

  1. Я использую развертывание цикла, чтобы быть немного более точным, поэтому в каждой итерации я выполняю 10 простых инструкций.Это означает, что я должен выбрать операцию, которая не будет выполняться только один раз из-за оптимизации компилятора (мы не можем использовать флаг -o0, как это делают школьные сотрудники).Плохой пример: var = i; - компилятор будет выполнять только последнюю команду.
  2. Что такое настоящая «простая инструкция»?Как узнать количество фактически выполненных операций?Я попытался прочитать вывод сборки, но не смог понять.

Надеюсь, я был достаточно ясен, любая идея была бы отличной.

В любом случае, спасибо

PS не знаю, имеет ли это значение, но я пишу в CPP

1 Ответ

1 голос
/ 18 марта 2012

1) Это звучит (для меня) как невыполнимая задача, если оптимизация включена (или может быть) включена. Вы никогда не можете быть уверены в том, что компилятор будет делать во время оптимизации. Я бы определенно сделал что-то вроде повторного использования предыдущего результата. Если бы это было возможно / возможно, я бы попытался включить необработанный фрагмент ассемблера для профилирования (так что вы можете быть уверены, что нет никаких дополнительных затрат, хотя они все еще могут быть оптимизированы).

2) Что касается инструкций: одна команда на ассемблере - это одна инструкция. Например. a += i будет - в зависимости от доступного набора команд и прочего - скорее всего, приведет к 4 инструкциям: прочитайте a, прочитайте i, добавьте, напишите a. Читать сборку довольно просто. В зависимости от набора инструкций / процессора могут быть разные «направления» для чтения (то есть «от -> до»). Ассемблеры x86 (и те, что для большинства других распространенных процессоров) предпочтут instruction target, source, в то время как DSP предпочитают использовать instruction source, target. Просто важно знать: перемещение данных должно происходить через регистры. Таким образом, даже одно назначение, такое как a = b, приведет к двум инструкциям (b для регистрации и регистрации к a).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...