Подтвердить что ты не робот

Как профилировать функцию С++ на уровне сборки?

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

Я исхожу из фона в оптимизации кода SPU на PS3, где вы берете программу SPU и запускаете ее через анализатор конвейера, где вы можете поместить каждый оператор сборки в свой собственный столбец и минимизировать количество циклов, которые выполняет функция. Затем вы накладываете петли, чтобы еще больше минимизировать зависимость конвейера. С этой программой и списком всех циклов, которые принимает каждая инструкция по сборке, я мог бы оптимизировать гораздо лучше, чем когда-либо мог компилятор.

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

Теперь я делаю проект хобби в Windows с помощью Visual Studio С++ 2010 с процессором Core i7 Intel. У меня нет денег, чтобы оправдать оплату большой стоимости VTune.

Мой вопрос:

Как профилировать функцию на уровне сборки для процессора Intel в Windows?

Я хочу компилировать, просматривать дизассемблирование, получать показатели производительности, корректировать код и повторять.

4b9b3361

Ответ 1

Есть несколько отличных бесплатных инструментов, в основном AMD CodeAnalyst (из моего опыта в моем i7 против моего феномена II, его немного недостатка на процессоре Intel, потому что у него нет доступа к прямым аппаратным конкретным счетчикам, хотя это Возможно, это была плохая конфигурация).

Однако менее известный инструмент - это Intel Code Code Analyzer (который является бесплатным, как CodeAnalyst), который похож на инструмент spu, который вы описанный, поскольку он детализирует латентность, пропускную способность и давление порта (в основном запрос отправляется в ALU, MMU и т.п.) по очереди для сборки ваших программ. Стэн Мелакс дал хороший talk об этом и x86-оптимизации в эти годы GDC, под заголовком "Горячие точки", "flops and uops: to-the-metal" оптимизация процессора ".

В Intel также есть еще несколько инструментов в том же ключе, что и IACA, avaibale в разделе настройки производительности их экспериментальный/код кода if-if, например, PTU, который является (или был) экспериментальной эволюцией VTune, из того, что я вижу, его свободного.

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

EDIT: как заметил Бен, тайминги могут быть неправильными для более старых процессоров, но это может быть легко составлено для использования Руководства по оптимизации Agner Fog, который также содержит много других драгоценных камней.

Ответ 2

Возможно, вы захотите попробовать некоторые утилиты, включенные в valgrind, такие как callgrind или cachegrind.

Callgrind может выполнять сборку профилей и дампов.

И kcachegrind - это хороший графический интерфейс, и он покажет дампы, включая сборку и количество обращений на каждую команду и т.д.