Какой хороший инструмент для профилирования использовать, когда исходный код недоступен? - PullRequest
0 голосов
/ 11 февраля 2009

У меня большая проблема. Мой начальник сказал мне, что хочет два «волшебных черных ящика»: 1 - что-то, что получает микропроцессор, такой как ввод и возврат, как вывод, MIPS и / или MFLOPS. 2 - что-то, что получает код c, такой как ввод и возврат, как вывод, что-то, что может характеризовать код с точки зрения производительности (что-то вроде необходимых MIPS, которые должен выполнять uP для выполнения кода через некоторое время).

Так что первый «черный ящик», я думаю, мог бы быть эталоном EEMBC или SPEC ... другого uP, того же эталона, который возвращает MIPS / MFLOPS каждого uP. Первая проблема в порядке (я надеюсь)

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

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

Спасибо всем

Ответы [ 3 ]

0 голосов
/ 12 февраля 2009

Вы не найдете инструмент, который будет делать то, что вы хотите.

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

Звучит глупо, но почему вы хотите, чтобы ваш код соответствовал uP, а uP - вашему коду? Если вы пишете обработку сигналов, купите DSP. Если вы строите коробку SCADA, посмотрите на Atmel или ARM. Вы строите универсальное устройство с пользовательским интерфейсом? Посмотрите на PPC или X86-совместимые вещи.

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

Исправьте архитектуру на что-то примерно подходящее, примерно отработайте требования к обработке (вы можете вручную набрать оценку, которая всегда будет слишком высока при просмотре кода C) и купить uP для соответствия.

0 голосов
/ 16 февраля 2009

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

На положительной ноте вот что я бы предложил:

  • Запустите код C на процессоре, любом процессоре. На этом процессоре выясните, что занимает больше всего времени.

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

  • Если этому занятию поможет какой-то специальный процессор, попробуйте этот процессор.

Важно не угадать . Если вы скажете: «Я думаю, что для этого нужен чип DSP» или «Я думаю, что для этого нужен многоядерный чип», это предположение. Догадка может быть правильной, но, вероятно, нет. Вероятно, это тот случай, когда больше всего времени занимает то, о чем вы никогда не догадались, например, управление памятью или форматирование ввода / вывода. Проблемы с производительностью очень хорошо скрывают от вас.

0 голосов
/ 11 февраля 2009

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

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

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