Что такое IACA и как его использовать?


Я нашел этот интересный и мощный инструмент под названием IACA (анализатор кода архитектуры Intel), но мне трудно это понять. Что я могу сделать с ним, каковы его ограничения и как я могу:

  • использовать его для анализа кода на C или c++?
  • использовать его для анализа кода в ассемблере x86?
1 52

1 ответ:

2017-11 версия 3.0 освобожден (последний по состоянию на 2017-11-03)

2017-03 версия 2.3 освобожден

что это такое:

IACA (анализатор кода архитектуры Intel) это бесплатный инструмент статического анализа с закрытым исходным кодом, созданный Intel для статического анализа планирования инструкций при выполнении современными Intel процессоры. Это позволяет ему вычислить для данного фрагмента

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

когда предполагая оптимальные условия выполнения (Все обращения к памяти попадают в кэш L1 и нет ошибок страницы).

МАА поддерживает вычислительной диспетчеризации для Нихалем, у Westmere, песчаные мосты, плющ, архитектуре Haswell, Broadwell и процессоров, оперативной памяти, начиная с версии 2.3 и Haswell, Broadwell и модельного ряда начиная с версии 3.0.

IACA-это инструмент командной строки, который создает текстовые отчеты ASCII и диаграммы Graphviz. Версии 2.1 и ниже поддерживаются 32-и 64-разрядные Linux, Mac OS X и Windows и анализ 32-разрядного и 64-разрядного кода; версия 2.2 и выше поддерживают только 64-разрядные ОС и анализ 64-разрядного кода.

как использовать:

вход IACA представляет собой скомпилированный двоичный код вашего кода, в который были введены два метки: a метки и конечный маркер. Маркеры делают код неуправляемым, но позволяют инструменту быстро находить соответствующие фрагменты кода и анализировать их.

вы не нужна возможность запускать двоичный файл в вашей системе; на самом деле, двоичный файл поставляется в IACA не могу запуск в любом случае из-за наличия введенных маркеров в коде. МАА требуется только умение читать двоичный файл, который будет проанализирован. Таким образом, с помощью IACA можно анализировать двоичный файл Haswell, используя инструкции FMA на машине Pentium III.

C / C++

в C и C++, один получает доступ к маркер-инъекционных макросов с #include "iacaMarks.h", где iacaMarks.h - это заголовок, который поставляется с инструментом в include/ поддиректории.

затем вставляет маркеры вокруг внутренний петля интереса, или прямолинейный кусок интереса, следующим образом:

/* C or C++ usage of IACA */

while(cond){
    IACA_START
    /* Loop body */
    /* ... */
}
IACA_END

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

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

сборка (x86)

маркеры IACA-это магические байтовые шаблоны, введенные в правильное место внутри код. При использовании iacaMarks.h в C или C++ компилятор обрабатывает вставку магических байтов, указанных заголовком в правильном месте. Однако в сборке необходимо вручную вставить эти метки. Таким образом, необходимо сделать следующее:

    ; NASM usage of IACA

    mov ebx, 111          ; Start marker bytes
    db 0x64, 0x67, 0x90   ; Start marker bytes

.innermostlooplabel:
    ; Loop body
    ; ...
    jne .innermostlooplabel ; Conditional branch backwards to top of loop

    mov ebx, 222          ; End marker bytes
    db 0x64, 0x67, 0x90   ; End marker bytes

для программистов на C/C++ очень важно, чтобы компилятор достиг такого же шаблона.

что он выводит:

в качестве примера, проанализируем следующий пример ассемблера на Haswell архитектура:

.L2:
    vmovaps         ymm1, [rdi+rax] ;L2
    vfmadd231ps     ymm1, ymm2, [rsi+rax] ;L2
    vmovaps         [rdx+rax], ymm1 ; S1
    add             rax, 32         ; ADD
    jne             .L2             ; JMP

добавим непосредственно перед .L2 обозначьте начальный маркер и сразу после jne конечный маркер. Затем мы перестраиваем программное обеспечение и вызываем IACA таким образом (в Linux предполагается чтобы быть в пути, и foo быть объектом ELF64, содержащим метки IACA):

iaca.sh -64 -arch HSW -graph insndeps.dot foo

, таким образом производя отчет о анализа 64-разрядного двоичного foo при запуске на процессоре Haswell и графике инструкции зависимости, видимые с помощью Graphviz.

отчет печатается на стандартный вывод (хотя он может быть направлен в файл с -o переключатель). Отчет приведенный выше фрагмент кода:

Intel(R) Architecture Code Analyzer Version - 2.1
Analyzed File - ../../../tests_fma
Binary Format - 64Bit
Architecture  - HSW
Analysis Type - Throughput

Throughput Analysis Report
--------------------------
Block Throughput: 1.55 Cycles       Throughput Bottleneck: FrontEnd, PORT2_AGU, PORT3_AGU

Port Binding In Cycles Per Iteration:
---------------------------------------------------------------------------------------
|  Port  |  0   -  DV  |  1   |  2   -  D   |  3   -  D   |  4   |  5   |  6   |  7   |
---------------------------------------------------------------------------------------
| Cycles | 0.5    0.0  | 0.5  | 1.5    1.0  | 1.5    1.0  | 1.0  | 0.0  | 1.0  | 0.0  |
---------------------------------------------------------------------------------------

N - port number or number of cycles resource conflict caused delay, DV - Divider pipe (on port 0)
D - Data fetch pipe (on ports 2 and 3), CP - on a critical path
F - Macro Fusion with the previous instruction occurred
* - instruction micro-ops not bound to a port
^ - Micro Fusion happened
# - ESP Tracking sync uop was issued
@ - SSE instruction followed an AVX256 instruction, dozens of cycles penalty is expected
! - instruction not supported, was not accounted in Analysis

| Num Of |                    Ports pressure in cycles                     |    |
|  Uops  |  0  - DV  |  1  |  2  -  D  |  3  -  D  |  4  |  5  |  6  |  7  |    |
---------------------------------------------------------------------------------
|   1    |           |     | 1.0   1.0 |           |     |     |     |     | CP | vmovaps ymm1, ymmword ptr [rdi+rax*1]
|   2    | 0.5       | 0.5 |           | 1.0   1.0 |     |     |     |     | CP | vfmadd231ps ymm1, ymm2, ymmword ptr [rsi+rax*1]
|   2    |           |     | 0.5       | 0.5       | 1.0 |     |     |     | CP | vmovaps ymmword ptr [rdx+rax*1], ymm1
|   1    |           |     |           |           |     |     | 1.0 |     |    | add rax, 0x20
|   0F   |           |     |           |           |     |     |     |     |    | jnz 0xffffffffffffffec
Total Num Of Uops: 6

инструмент услужливо указывает, что в настоящее время узким местом является интерфейс Haswell и порт 2 и 3 AGU. Этот пример позволяет нам диагностировать проблему, поскольку хранилище не обрабатывается портом 7, и принять меры по исправлению действие.

ограничения:

IACA не поддерживает некоторые несколько инструкций, которые игнорируются в анализе. Он не поддерживает процессоры старше Nehalem и не поддерживает не самые внутренние циклы в режиме пропускной способности (не имея возможности угадать, какая ветвь берется, как часто и в каком шаблоне).