programing

IACA란 무엇이며 어떻게 사용하는가?

copysource 2022. 8. 31. 23:23
반응형

IACA란 무엇이며 어떻게 사용하는가?

IACA(Intel Architecture Code Analyzer)라고 하는 흥미롭고 강력한 툴은 발견했지만 이해하기 어렵습니다.이 기능을 통해 수행할 수 있는 작업, 제한 사항 및 다음 작업을 수행할 수 있습니다.

  • C 또는 C++의 코드를 분석하는 데 사용할 수 있습니까?
  • x86 어셈블러의 코드를 분석하기 위해 사용하시겠습니까?

2019-04: EOL 도달.대체 방법: LLVM-MCA

2017-11 버전 3.0 출시(2019년 5월 18일 현재 최신)

2017-03: 버전 2.3 출시

개요:

IACA(Intel Architecture Code Analyzer)는 최신 인텔 프로세서에서 실행될 때 명령 스케줄링을 정적으로 분석하기 위해 인텔이 만든 (2019: 종료) 프리웨어, 클로즈드 소스 정적 분석 도구입니다.이를 통해 특정 스니펫에 대해

  • throughput 모드에서는 최대 throughput(스니펫은 가장 안쪽 루프의 본체로 간주)
  • 지연 모드에서 첫 번째 명령에서 마지막 명령까지의 최소 지연 시간입니다.
  • 추적 모드에서 파이프라인 단계를 통해 명령의 진행률을 인쇄합니다.

최적의 실행 조건(모든 메모리액세스가 L1 캐시에 히트해, 페이지 장해가 없는 경우)을 전제로 합니다.

IACA는 버전 2.3에서는 Nehalem, Westmere, Sandy Bridge, Ivy Bridge, Haswell, Broadwell 및 Skylake 프로세서의 컴퓨팅 스케줄링을 지원하며 버전 3.0에서는 Haswell, Broadwell 및 Skylake의 컴퓨팅 스케줄링을 지원합니다.

IACA는 ASCII 텍스트보고서 및 Graphviz 다이어그램을 생성하는 명령줄 도구입니다.버전 2.1 이하에서는 32비트 및 64비트 Linux, Mac OS X 및 Windows 및 32비트 및 64비트 코드 분석을 지원하며 버전 2.2 이상은 64비트 OS 및 64비트 코드 분석만 지원합니다.

사용방법:

IACA의 입력은 코드를 컴파일한 바이너리입니다.이 바이너리에는 시작 마커와 끝 마커라는2개의 마커가 주입되어 있습니다.마커를 사용하면 코드를 실행할 수 없지만 도구가 관련 코드를 신속하게 찾아 분석할 수 있습니다.

시스템에서 바이너리를 실행하는 기능은 필요하지 않습니다.실제로 IACA에 제공된 바이너리는 코드에 삽입된 마커가 존재하기 때문에 실행할 수 없습니다.IACA는 분석 대상 바이너리 읽기 기능만 필요로 합니다.따라서 IACA를 사용하여 Pentium III 머신에서 FMA 명령을 사용하여 Haswell 바이너리를 분석할 수 있습니다.

C/C++

및 C++, C++를 사용하여 마커 주입 에 액세스 할 수 .#include "iacaMarks.h"서, snowledge.iacaMarks.h입니다.include/서브 디렉토리

그런 다음 다음과 같이 관심의 가장 안쪽 루프 또는 관심의 직선 청크 주위에 마커를 삽입합니다.

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

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

그런 다음 최적화를 활성화한 경우와 마찬가지로 응용 프로그램이 재구성됩니다(Visual Studio와 같은 IDE 사용자의 경우 릴리스 모드).출력은 마크가 있는 경우를 제외하고 Release 빌드와 모든 면에서 동일한 바이너리이므로 응용 프로그램을 실행할 수 없습니다.

IACA는 컴파일러가 과도하게 마크를 재정렬하지 않는 것에 의존합니다.따라서 그러한 분석을 위해 가장 안쪽 루프에 관계없는 코드를 포함하도록 마크를 재정렬하거나 그 안에 코드를 제외하는 경우 강력한 최적화를 비활성화해야 할 수 있습니다.

어셈블리(x86)

IACA의 마커는 코드 내의 올바른 위치에 삽입된 매직바이트 패턴입니다.「」를 사용하고 iacaMarks.hC 또는 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에 붙입니다.jneLinux에서는 IACA를 상정하고 ).bin/내에 및 "Directory" 입니다.fooIACA ELF64:

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

바이너리 64비트 fooHaswell 프로세서에서 실행되는 경우 및 Graphviz에서 볼 수 있는 명령 종속성 그래프.

, 파일에는 「 the with 」, 「Directed to 」, 「Directed to the file with the 」, 「Directed to the file with the 」, 「Directed to 」가 붙어 있는 경우도 ).-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보다 오래된 프로세서를 지원하지 않으며 스루풋모드에서는 비내부 루프를 지원하지 않습니다(어느 브랜치가 얼마나 자주 어떤 패턴으로 사용되고 있는지 추측할 수 없습니다).

언급URL : https://stackoverflow.com/questions/26021337/what-is-iaca-and-how-do-i-use-it

반응형