Страница 1 из 1

Калькулятор скорости ассемблерного кода

СообщениеДобавлено: 26.01.2016 19:46:28
Дож
Никто не знает, есть ли в природе программа или сервис, куда вбиваешь кусок ассемблерного кода, а тебе выдаётся по каждой строчке сколько она требует времени (типа требует 5 тактов, L1 cache промах, обращение к памяти, condition prediction possible и т.д.)?

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

Re: Калькулятор скорости ассемблерного кода

СообщениеДобавлено: 26.01.2016 20:00:52
Pavia
Давай подробнее что за математический код? Почему решили переписывать на ассемблер?

Добавлено спустя 15 минут 25 секунд:
Мне нравиться программа AQtime полная версия позволяет посмотреть сколько тактов приходиться на каждую ассемблерную команду. Подсчитывает кэш промахи и промахи предсказания ветвлений. В Delphi XE такой возможности нет.
Но два минуса, графический интерфейс пользователя очень не удобный. И цена больно большая.

Может здесь поискать может что получше найдёте:
https://en.wikipedia.org/wiki/List_of_p ... ysis_tools

А так обычно пользуешься таблицами
http://www.intel.ru/content/www/ru/ru/a ... anual.html
У Агнерера Фога, таблицы подробнее:
http://www.agner.org/optimize/

А вообще практика говорит следующее чем меньше команд в теле цикла тем быстрее он исполняется.

Re: Калькулятор скорости ассемблерного кода

СообщениеДобавлено: 26.01.2016 20:19:07
Дож
Математический код — линейная алгебра (вектора, матрицы, решение систем), пересечения объектов, классическая механика. Я не буду переписывать на ассемблер, я хочу просто перекомпоновать код. Я хочу компилировать паскалевский код, дальше брать полученные куски ассемблера и прикидывать их скорость.

Например, в алгоритме C нужно звать тяжёлую функцию A, но если 4 раза сделать проверку B, то с вероятностью 50% функцию A звать не потребуется, — соответственно хочется знать что больше Такты(A) или 1/2*Такты(A)+4*Такты(B).

Или, например, общая задача X имеет два важных частных случаях X1, X2, — соответственно писать ли функцию X в самом общем случае, или на входе проверить не является ли задача одной из частной и уже выполнить частное? Много ли я выиграю от такого преобразования?

inline или не inline?

Integer или Double?

Такие вопросы часто возникают, но не всегда понятно что лучше.

Re: Калькулятор скорости ассемблерного кода

СообщениеДобавлено: 26.01.2016 21:06:03
Pavia
Дож писал(а):Integer или Double?

Integer если это Int32 всегда быстрее чем Double.


Дож писал(а): Я не буду переписывать на ассемблер, я хочу просто перекомпоновать код. Я хочу компилировать паскалевский код, дальше брать полученные куски ассемблера и прикидывать их скорость.Например, в алгоритме C нужно звать тяжёлую функцию A, но если 4 раза сделать проверку B, то с вероятностью 50% функцию A звать не потребуется, — соответственно хочется знать что больше Такты(A) или 1/2*Такты(A)+4*Такты(B).

С таким подходом и ассемблер не нужен. Справиться любой измеритель скорости с алгоритмом пристрелки. В англ иском sample profiler, hit poins.

Re: Калькулятор скорости ассемблерного кода

СообщениеДобавлено: 26.01.2016 21:11:24
Дож
Integer если это Int32 всегда быстрее чем Double.

А Int32 или Single?

С таким подходом и ассемблер не нужен. Справиться любой измеритель скорости с алгоритмом пристрелки. В англ иском sample profiler, hit poins.

Мне же тогда придётся репрезентативные test case'ы писать на каждое тестирование, правильно?

Re: Калькулятор скорости ассемблерного кода

СообщениеДобавлено: 26.01.2016 21:29:56
kazalex
Дож писал(а):А Int32 или Single?

Целочисленная арифметика всегда быстрее плавучки.

Дож писал(а):Мне же тогда придётся репрезентативные test case'ы писать на каждое тестирование, правильно?

Тесты писать всё равно придётся. Я вылизывал свою хеш-таблицу, по скорости, на процессоре одной архитектуры и был доволен результатом. Потом запустил на процессоре с другой архитектурой и прифигел от падения скорости. Оба проца x86, только первый AMD Phenom II X4 (Deneb), а второй Intel Pentium Mobile (Dothan). Пришлось много чего переписать чтобы результаты стали сопоставимы.

Re: Калькулятор скорости ассемблерного кода

СообщениеДобавлено: 26.01.2016 21:54:35
Pavia
А Int32 или Single?

В теории Single чуть быстрее. Но вот практически разница может качнуть весы в любую сторону. Притом зависит от процессора.

Мне же тогда придётся репрезентативные test case'ы писать на каждое тестирование, правильно?
Я выше уже давал ссылки на руководство по оптимизации от интела и Агнера Фога.
Там приводятся советы по оптимизации. Половина из них относятся к произвольному языку. И могут быть выполнены зарания. К примеру вынос условия из цикла. Раскрутка цикла.

А вот другую часть кроме как писать тесты никак не получиться. И достаточно универсальная чем меньше в цикле команд тем быстрее код.
Хотя со временем уже запоминаешь такты. Цифры примерные.
Деление 12-100 тактов. В зависимости от длины данных.
Все операции тригонометрии основаны на делении порядка 100 тактов.
Умножение 6-24 В зависимости от длины данных.
Сложение 1-3 такта
Битовые операции 0.3-1 такта
Доступ к памяти:
-Доступ в случайном порядке
--КЭШ L1 3 такта
--КЭШ L2 10 тактов.
--КЭШ L3 30 тактов
--ОЗУ 70 тактов.
-Последовательный доступ к памяти:
3-10 такта

Ветвление:
Без промаха 2 такта.
С промахом 12-14 тактов. Любой if примерно столько и стоит.

Re: Калькулятор скорости ассемблерного кода

СообщениеДобавлено: 26.01.2016 23:29:29
Mirage
Для серьезной оптимизации у Интела есть тулзы. VTune, кажется, умеет показывать что да как. И по предсказанию переходов, и по кэшу. По куску ассемблерного кода он, конечно, кэш-промахи не угадает. Надо на приложение натравливать.
Еще есть Valgrind.
Такты сейчас мало что дают, т.к. выполнение команд может идти параллельно даже на одном ядре. И вариант с большим числом тактов, выполняющийся параллельно, может выиграть у варианта с меньшим числом тактов, но не взаимнопараллелящимися инструкциями.

Re: Калькулятор скорости ассемблерного кода

СообщениеДобавлено: 24.02.2016 17:31:26
Саш_а
Я пользуюсь программой AQtime полная, платная версия позволяет посмотреть сколько тактов приходиться на каждую ассемблерную команду