일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 알고리즘
- 프로그래밍
- 클라우드컴퓨팅
- 프로그래밍언어
- 빅데이터
- 소프트웨어
- 2
- I'm Sorry
- 컴퓨터비전
- 보안
- 파이썬
- 머신러닝
- 딥러닝
- 코딩
- 데이터구조
- 자바스크립트
- Yes
- 데이터과학
- 인공지능
- 컴퓨터과학
- 소프트웨어공학
- 웹개발
- 컴퓨터공학
- 데이터분석
- 사이버보안
- 네트워크보안
- 버전관리
- 자료구조
- 데이터베이스
- 네트워크
- Today
- Total
스택큐힙리스트
마이크로 퓨전 및 주소 지정 모드 본문
나는 IACA (IACA)를 사용하여 예상치 못한 것을 발견했습니다.
'[base+index]' 주소 지정을 사용하는 다음 지시사항은 다음과 같습니다.
'addps xmm1, xmmword ptr [rsi+rax*1]
'
I'm sorry, but the phrase provided is not translatable due to the use of symbols that do not have corresponding meanings in the Korean language. If you can provide a clearer and more meaningful sentence, I would be happy to assist you with the translation.
'addps xmm1, xmmword ptr [rsi]
'
IACA 보고서에 따르면, 그것은 fust 혼합한다.
제 @@ # @ * ^ * # @ $ & # @!의 섹션 2-11은 다음을 모든 디코더가 처리할 수 있는 마이크로 퓨즈드 마이크로-옵션의 예로 제시합니다.
'FADD DOUBLE PTR [RDI + RSI*8]
'
그리고 # $ # & # &! # $ & # @! 또한 # $$ & ^ # $ & $ & # @! 주소 지정을 사용한 마이크로 옵 퓨전의 예제도 제공합니다. 예를 들어, Core2의 섹션 12.2 동일한 예제를 참조하십시오. 그래서 정답은 무엇인가요?
답변 1
복호화기와 uop-cache에서 addressing mode는 마이크로 퓨전에 영향을 주지 않습니다 (단, 즉시 피연산자를 가진 명령어는 RIP 상대 addressing mode를 마이크로 퓨전할 수 없습니다).
하지만 일부의 uop 및 addressing mode 조합은 ROB(비순서형 코어)에서 미크로 퓨즈 상태를 유지할 수 없기 때문에 인텔 SnB 패밀리 CPU는 필요한 경우 이를 언라미네이트합니다. 이슈/리네임 단계 이전의 어느 시점에서도 이 작업이 수행됩니다. 이슈 처리량 및 비순서 윈도우 크기(ROB 크기)에 대해서는, 언라미네이션 이후의 퓨즈 도메인 uop 수가 중요합니다.
'Intel's optimization manual'은 섹션 E.2.2.4의 Sandybridge를 위한 비갈라짐을 설명하며, 그러나 이후의 다른 마이크로아키텍처에 대한 변경 사항은 설명하지 않습니다.
업데이트: 인텔 매뉴얼에는 해스웰의 해체에 대해 자세히 설명하는 E.1.5 해체(언라미네이션) 섹션이 있습니다. 그리고 샌디브릿지에 대한 간략한 설명은 섹션 E.2.2.4에 있습니다.
SnB (Slice and Bake), HSW (Hot Swap), 그리고 SKL (Skittle) 에 대한 실험을 통해 얻은 가장 정확한 규칙은 다음과 같습니다:
SnB (그리고 IvB도 그렇다고 가정합니다): 인덱스 주소 지정 모드는 항상 unlaminated이며, 다른 모드는 micro-fused로 유지됩니다. IACA는 (대부분?) 올바른 것으로 판단됩니다.
HSW, SKL: 이들은 2개의 피연산자를 갖고 dst 레지스터를 읽기-수정-쓰기로 취급하는 인덱스 된 ALU 명령어 마이크로 퓨즈만 유지합니다. 여기서 피연산자에는 플래그도 포함되므로, 'adc' 및 'cmov' 는 마이크로 퓨스되지 않습니다. 대부분의 VEX로 인코딩된 명령어도 세 개의 피연산자를 갖기 때문에 퓨즈되지 않습니다 (따라서 'paddb xmm0, [rdi+rbx]' 은 퓨즈되지만 'vpaddb xmm0, xmm0, [rdi+rbx]' 는 퓨즈되지 않습니다). 마지막으로, 첫 번째 피연산자가 쓰기 전용인 경우에도 'pabsb xmm0, [rax + rbx]' 와 같은 2개의 피연산자를 가진 명령어는 퓨즈되지 않습니다. IACA는 틀렸고, SnB 규칙을 적용하고 있습니다.
관련: 단순 (비색인) 주소 지정 모드만 전용 저장 주소 단위 (Haswell 이후 버전)가 처리할 수 있으므로 저장을 위한 색인 주소 지정 모드를 피하는 것이 여전히 잠재적으로 유용합니다. (이를 위한 좋은 방법은 dst를 단일 레지스터로 주소 지정하고, src는 'dst+(initial_src-initial_dst)' 와 같이 주소를 지정하는 것입니다. 그럼으로써 루프 안에서는 dst 레지스터만 증가시키면 됩니다.)
주목해야 할 것은 일부 명령은 전혀 마이크로 퓨즈되지 않는다는 것입니다(디코더/업-캐시에서도 마찬가지입니다). 예를 들어, 'shufps xmm, [mem], imm8' 또는 'vinsertf128 ymm, ymm, [mem], imm8' 같은 명령은 스카이레이크까지 2개의 uop을 항상 가지지만, 해당 레지스터 소스 버전은 1개의 uop만 가집니다. 이는 imm8 제어 피연산자와 일반적인 대상/소스1, 소스2 레지스터/메모리 피연산자를 가진 명령에 대한 전형적인 형태이지만, 몇 가지 다른 경우도 있습니다. 예를 들어, 메모리 피연산자에서 벡터 시프트 카운트를 가져오는 'PSRLW/D/Q xmm,[mem]'와 PMULLD도 마이크로 퓨즈되지 않습니다.
HSW/SKL에서 많은 레지스터를 읽을 때 디스커션에 대한 문제 처리량 제한에 대해 알아보려면 'this post on Agner Fog's blog'을 참조하세요. 인덱스 주소 지정 모드를 사용하는 많은 마이크로 퓨전은 적은 레지스터 피연산자를 사용하는 동일한 명령에 비해 속도 저하로 이어질 수 있습니다: 1개의 레지스터 주소 지정 모드와 즉시 값. 아직 원인을 알지 못하지만, PRF에서 많은 차가운 레지스터를 읽는 것과 관련된 어떤 종류의 레지스터 읽기 제한이 있다고 의심합니다.
테스트 케이스, 실제 측정치에서의 숫자: 이 모든 마이크로 퓨즈는 디코더에서 피복이 제거되더라도 최초로 퓨즈됩니다.
'# store
mov [rax], edi SnB/HSW/SKL: 1 fused-domain, 2 unfused. The store-address uop can run on port7.
mov [rax+rsi], edi SnB: unlaminated. HSW/SKL: stays micro-fused. (The store-address can't use port7, though).
mov [buf +rax*4], edi SnB: unlaminated. HSW/SKL: stays micro-fused.
# normal ALU stuff
add edx, [rsp+rsi] SnB: unlaminated. HSW/SKL: stays micro-fused.
# I assume the majority of traditional/normal ALU insns are like add
'
HSW/SKL가 분리해야 할 수도 있는 세 개의 입력 명령어.
'vfmadd213ps xmm0,xmm0,[rel buf] HSW/SKL: stays micro-fused: 1 fused, 2 unfused.
vfmadd213ps xmm0,xmm0,[rdi] HSW/SKL: stays micro-fused
vfmadd213ps xmm0,xmm0,[0+rdi*4] HSW/SKL: un-laminated: 2 uops in fused & unfused-domains.
(So indexed addressing mode is still the condition for HSW/SKL, same as documented by Intel for SnB)
# no idea why this one-source BMI2 instruction is unlaminated
# It's different from ADD in that its destination is write-only (and it uses a VEX encoding)
blsi edi, [rdi] HSW/SKL: 1 fused-domain, 2 unfused.
blsi edi, [rdi+rsi] HSW/SKL: 2 fused & unfused-domain.
adc eax, [rdi] same as cmov r, [rdi]
cmove ebx, [rdi] Stays micro-fused. (SnB?)/HSW: 2 fused-domain, 3 unfused domain.
SKL: 1 fused-domain, 2 unfused.
# I haven't confirmed that this micro-fuses in the decoders, but I'm assuming it does since a one-register addressing mode does.
adc eax, [rdi+rsi] same as cmov r, [rdi+rsi]
cmove ebx, [rdi+rax] SnB: untested, probably 3 fused&unfused-domain.
HSW: un-laminated to 3 fused&unfused-domain.
SKL: un-laminated to 2 fused&unfused-domain.
'
저는 브로드웰이 adc/cmov에서 스카이레이크와 비슷하게 동작한다고 가정합니다.
HSW가 메모리 소스 ADC와 CMOV를 비 접착시킨 것은 이상하다. 아마도 Intel은 Haswell을 배송하는 마감 기한 전에 SnB에서 변경하지 못했을 것이다.
Agner의 insn 테이블에 따르면 HSW/SKL에서 'cmovcc r,m'과 'adc r,m'는 전혀 마이크로 퓨즈되지 않지만, 그것은 내 실험과 일치하지 않습니다. 측정한 사이클 수는 퓨즈 도메인 uop 이슈 수와 일치하며, 클럭 병목 상태에서 4개의 uop을 발행합니다. 그래서 그가 그것을 다시 확인하고 테이블을 수정할 것을 희망합니다.
메모리 대상 정수 ALU:
'add [rdi], eax SnB: untested (Agner says 2 fused-domain, 4 unfused-domain (load + ALU + store-address + store-data)
HSW/SKL: 2 fused-domain, 4 unfused.
add [rdi+rsi], eax SnB: untested, probably 4 fused & unfused-domain
HSW/SKL: 3 fused-domain, 4 unfused. (I don't know which uop stays fused).
HSW: About 0.95 cycles extra store-forwarding latency vs. [rdi] for the same address used repeatedly. (6.98c per iter, up from 6.04c for [rdi])
SKL: 0.02c extra latency (5.45c per iter, up from 5.43c for [rdi]), again in a tiny loop with dec ecx/jnz
adc [rdi], eax SnB: untested
HSW: 4 fused-domain, 6 unfused-domain. (same-address throughput 7.23c with dec, 7.19c with sub ecx,1)
SKL: 4 fused-domain, 6 unfused-domain. (same-address throughput ~5.25c with dec, 5.28c with sub)
adc [rdi+rsi], eax SnB: untested
HSW: 5 fused-domain, 6 unfused-domain. (same-address throughput = 7.03c)
SKL: 5 fused-domain, 6 unfused-domain. (same-address throughput = ~5.4c with sub ecx,1 for the loop branch, or 5.23c with dec ecx for the loop branch.)
'
네, 맞아요, 'adc [rdi],eax' / 'dec ecx' / 'jnz'로 동일한 루프보다 더 빠릅니다. SKL에서는 'add' 대신에 'adc'을 사용하는 것이 성능이 더 좋습니다. 같은 주소를 반복해서 재쓰는 것은 SKL에서 좋아하지 않기 때문에 다른 주소를 사용해 보진 않았습니다 (예상보다 저장-전달 지연이 높음. 'this post about repeated store/reload to the same address being slower than expected on SKL'도 참고하세요.
Memory-destination 'adc'은 Intel P6 패밀리 (그리고 아마도 SnB 패밀리) 때문에 여러 개의 uop을 가진 명령어의 모든 uop에 대해 동일한 TLB 항목을 유지할 수 없기 때문에 많은 수의 uop입니다. 그래서 'needs an extra uop to work around the problem-case where the load and add complete, and then the store faults, but the insn can't just be restarted because CF has already been updated'라고 합니다. Andy Glew (@krazyglew)의 흥미로운 의견 시리즈입니다.
아마도 디코더에서의 퓨전과 후에 언라미네이션은 우리에게 'needing microcode ROM' 로부터 더 많은 퓨즈 도메인 uop을 생성하지 않아도 되게 해줍니다. 'adc [base+idx], reg' 에서.
SnB-가족이 어떻게 분리 되는지 :
Sandybridge는 전력과 트랜지스터를 절약하기 위해 내부 uop 형식을 단순화했습니다 (ROB에 입력/출력 데이터를 유지하는 대신 물리적 레지스터 파일을 사용하는 주요한 변화를 함께했습니다). SnB 계열 CPU는 비순차적인 코어에서 퓨즈 도메인 uop의 제한된 수의 입력 레지스터만 허용합니다. SnB/IvB의 경우, 이 제한은 2개의 입력 (플래그 포함)입니다. HSW 이후로는 uop의 입력에 대해 3개의 제한이 있습니다. 메모리 대상 #와 같은 것들이 이 제한을 완전히 활용하는지 또는 인텔이 몇 가지 명령어로 Haswell을 제공해야했는지는 확실하지 않습니다.
네헬렘 이전에는 퓨즈되지 않은 도메인 uop에 대해 2개의 입력 제한이 있었지만, ROB는 3개의 입력 레지스터(비메모리 레지스터 피연산자, 베이스 및 인덱스)를 가진 마이크로-퓨즈 uop을 추적할 수 있는 것으로 보입니다.
인덱스된 저장소와 ALU+로드 명령은 여전히 효율적으로 디코딩될 수 있으며 (그룹의 첫 번째 uop이 아니어도), uop 캐시에서 추가 공간을 차지하지 않지만, 그외에는 마이크로 퓨전의 이점은 실질적으로 튜닝된 루프에 대해 없어지게 됩니다. 언램이네이션(un-lamination)은 4개의 퓨즈 도메인 uop(매 주기마다)이슈/리타이어 폭이 순서대로 동작되는 코어 이전에 발생합니다. 퓨즈 도메인 성능 카운터(uops_issued / uops_retired.retire_slots)는 언램이네이션 후 퓨즈 도메인 uop을 카운트합니다.
인텔의 Renamer에 대한 설명(Section 2.3.3.1: Renamer)은 문제/이름 변경 단계가 실제로 비해체화를 수행한다는 것을 의미합니다. 따라서 비해체화 대상인 uop은 여전히 28/56/64 퓨즈 도메인 uop 문제 대기열/루프 버퍼(IDQ)에서 마이크로 퓨즈 될 수 있습니다.
TODO: 이를 테스트하세요. 루프 버퍼에 정확히 맞게 들어갈 수 있는 루프를 만드세요. 그리고 무언가를 변경하여 uop 중 하나가 방출되기 전에 재조립되는지 확인하세요. 그리고 루프 버퍼(LSD)에서 여전히 실행되는지, 아니면 모든 uop이 uop 캐시(DSB)에서 다시 가져오는지 확인하세요. uop이 어디에서 나오는지 추적하는 성능 카운터가 있으므로 이 작업은 쉬워야 합니다.
더 어려운 TODO: UOP 캐시에서 읽는 동안과 IDQ에 추가하는 사이에 철거가 발생하는 경우, UOP 캐시 대역폭을 줄일 수 있는지 테스트해야 합니다. 또는 철거가 발생하는 경우에는 바로 이슈 단계에서 이슈 처리량을 해치는지 알아야 합니다. (즉, 첫 번째 4개의 UOP를 이슈 한 후 남은 UOP를 어떻게 처리하는지).
(룩업테이블 코드를 조정하여 몇 가지 추측을 본 이전 버전의 답변을 참조하십시오. 'vpgatherdd'가 'pinsrw' 반복문보다 약 1.7배 더 많은 사이클을 소요한다는 것에 대한 일부 참고 사항이 있습니다.)
SnB에 대한 실험적 테스트
HSW/SKL 숫자는 i5-4210U와 i7-6700k에서 측정되었습니다. 둘 다 HT가 활성화되어 있었지만 (하지만 시스템은 비활동 상태였기 때문에 쓰레드가 전체 코어를 사용할 수 있었습니다). 두 시스템 모두 동일한 정적 이진 파일을 실행하였으며, SKL에서는 Linux 4.10을 사용하였고 HSW에서는 Linux 4.8을 사용하였습니다. ('ocperf.py'를 사용하였습니다. (HSW 노트북은 SKL 데스크톱의 /home을 NFS로 마운트하였습니다.)
SnB 숫자는 다음과 같은 방식으로 측정되었으며, 더 이상 작동하지 않는 i5-2500k에서 측정되었습니다.
설정된 uops와 사이클의 성능 카운터로 확인되었습니다.
리눅스의 'perf' 명령어와 함께 사용하기 위해 'a table of PMU events for Intel Sandybridge' 를 찾았습니다. (표준 'perf' 에는 uops와 같은 대부분의 하드웨어별 PMU 이벤트에 대한 상징적인 이름이 없습니다.) 그것을 'recent answer' 을 위해 사용했습니다.
'ocperf.py provides symbolic names for these uarch-specific PMU events', 당신은 테이블을 찾아보지 않아도됩니다. 또한, 동일한 기호 이름은 여러 uarches에서 작동합니다. 이 답변을 처음 작성할 때는 그것을 알지 못했습니다.
uop 마이크로 퓨전을 테스트하기 위해, 인텔 CPU의 4-uop-퍼-사이클 퓨즈-도메인 한도에 병목을 일으키는 테스트 프로그램을 구성했습니다. 실행 포트 간의 경합을 피하기 위해 이 중 많은 uop은 'nop'이며, 여전히 uop 캐시에 위치하고 다른 uop과 마찬가지로 파이프라인을 통과하지만 실행 포트로 디스패치되지 않습니다. (제거된 이동 또한 동일합니다.)
시험 프로그램: 'yasm -f elf64 uop-test.s && ld uop-test.o -o uop-test'
'GLOBAL _start
_start:
xor eax, eax
xor ebx, ebx
xor edx, edx
xor edi, edi
lea rsi, [rel mydata] ; load pointer
mov ecx, 10000000
cmp dword [rsp], 2 ; argc >= 2
jge .loop_2reg
ALIGN 32
.loop_1reg:
or eax, [rsi + 0]
or ebx, [rsi + 4]
dec ecx
nop
nop
nop
nop
jg .loop_1reg
; xchg r8, r9 ; no effect on flags; decided to use NOPs instead
jmp .out
ALIGN 32
.loop_2reg:
or eax, [rsi + 0 + rdi]
or ebx, [rsi + 4 + rdi]
dec ecx
nop
nop
nop
nop
jg .loop_2reg
.out:
xor edi, edi
mov eax, 231 ; exit(0)
syscall
SECTION .rodata
mydata:
db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
'
나는 또한 루프 버퍼 외부의 uop 대역폭이 주기당 상수 4가 아니라는 것을 발견했다. 루프가 4의 배수가 아닌 경우 (즉, 'abc' , 'abc' , ...인 경우; 'abca' , 'bcab' , ...이 아닌 경우). Agner Fog의 마이크로아키텍처 문서는 불행하게도 이 루프 버퍼의 제한에 대해 명확하지 않았다. HSW/SKL에 대한 추가 조사를 위해 'Is performance reduced when executing loops whose uop count is not a multiple of processor width?' 를 참조하십시오. 이 경우 SnB가 HSW보다 나쁠 수 있지만, 확실치 않으며 여전히 작동하는 SnB 하드웨어를 가지고 있지 않습니다.
나는 macro-fusion(비교 및 분기)을 제외하고 싶었기 때문에, 분기와 루프 사이에 'nop'을 사용했습니다. 4개의 'nop'을 사용하여, 마이크로 퓨전과 함께 루프는 8개의 uop이 되고, 1 반복에 2 사이클씩 파이프라인을 채울 수 있습니다.
다른 버전의 루프에서는 마이크로 퓨즈가 되지 않는 2-오퍼랜드 주소 지정 모드를 사용하여 루프는 퓨즈 도메인 단위 uop 10개가되고 3개의 사이클에서 실행됩니다.
제 3.3GHz 인텔 샌디브리지(i5 2500k)에서의 결과입니다. 테스트하기 전에 cpufreq 지배자가 클록 속도를 높이기 위해 어떤 작업을 하지 않았습니다. 왜냐하면 메모리와 상호작용하지 않을 때는 주기가 주기일 뿐이기 때문입니다. 성능 카운터 이벤트에 대한 주석을 추가했습니다. (16진수로 입력해야 했습니다.)
1-레지스터 주소 지정 모드를 테스트 중입니다: 명령 줄 인수 없음
'$ perf stat -e task-clock,cycles,instructions,r1b1,r10e,r2c2,r1c2,stalled-cycles-frontend,stalled-cycles-backend ./uop-test
Performance counter stats for './uop-test':
11.489620 task-clock (msec) # 0.961 CPUs utilized
20,288,530 cycles # 1.766 GHz
80,082,993 instructions # 3.95 insns per cycle
# 0.00 stalled cycles per insn
60,190,182 r1b1 ; UOPS_DISPATCHED: (unfused-domain. 1->umask 02 -> uops sent to execution ports from this thread)
80,203,853 r10e ; UOPS_ISSUED: fused-domain
80,118,315 r2c2 ; UOPS_RETIRED: retirement slots used (fused-domain)
100,136,097 r1c2 ; UOPS_RETIRED: ALL (unfused-domain)
220,440 stalled-cycles-frontend # 1.09% frontend cycles idle
193,887 stalled-cycles-backend # 0.96% backend cycles idle
0.011949917 seconds time elapsed
'
2-reg addressing mode: cmdline 인수로 테스트 중입니다.
'$ perf stat -e task-clock,cycles,instructions,r1b1,r10e,r2c2,r1c2,stalled-cycles-frontend,stalled-cycles-backend ./uop-test x
Performance counter stats for './uop-test x':
18.756134 task-clock (msec) # 0.981 CPUs utilized
30,377,306 cycles # 1.620 GHz
80,105,553 instructions # 2.64 insns per cycle
# 0.01 stalled cycles per insn
60,218,693 r1b1 ; UOPS_DISPATCHED: (unfused-domain. 1->umask 02 -> uops sent to execution ports from this thread)
100,224,654 r10e ; UOPS_ISSUED: fused-domain
100,148,591 r2c2 ; UOPS_RETIRED: retirement slots used (fused-domain)
100,172,151 r1c2 ; UOPS_RETIRED: ALL (unfused-domain)
307,712 stalled-cycles-frontend # 1.01% frontend cycles idle
1,100,168 stalled-cycles-backend # 3.62% backend cycles idle
0.019114911 seconds time elapsed
'
그래서, 두 버전 모두 80M의 명령을 실행하고 60M의 uop을 실행 포트로 보냈습니다. ('or'는 메모리 소스입니다. 나머지 파이프라인에서 마이크로 퓨즈된 것인지 아니면 아닌지와 상관없이 ALU에 'or'를 보냅니다. $ # &!뿌 \ *! 및 메모리 소스가 로드되면 로드 포트로 보냅니다. #$&!^#!@ $&! 및 전혀 실행 포트로 전송되지 않습니다. 이와 마찬가지로, 두 버전 모두 100M의 비퓨즈 도메인 uop을 은퇴시키며, 여기에 40M의 nops가 포함됩니다.
차이점은 융합 도메인의 카운터에 있습니다.
1-레지스터 주소 버전은 오직 8000만개의 융합 도메인 uops를 발행하고 폐기합니다. 이는 명령어의 개수와 동일합니다. 각명령은 하나의 융합 도메인 uop으로 변환됩니다.
2-레지스터 주소 버전은 1억 개의 퓨즈 도메인 uop를 발생시킵니다. 이는 미크로 퓨전이 발생하지 않았음을 나타내는 퓨즈되지 않은 도메인 uop의 수와 동일합니다.
제 생각에는 분기 예측 오류로 인해 uop이 발행 후에 취소되지만 퇴역 전에 uop 발행이 발생하는 경우에만 UOPS_ISSUED와 UOPS_RETIRED(사용된 퇴역 슬롯) 사이에 차이점을 볼 수 있다고 생각합니다.
그리고 마지막으로, 성능 영향이 실제로 나타납니다. 비-융합 버전은 시계 주기를 1.5배 더 많이 소비했습니다. 이는 대부분의 실제 경우와 비교하여 성능 차이를 과장시킵니다. 루프는 정수 주기로 실행되어야 합니다 ( 'on Sandybridge where the LSD is less sophisticated' ), 그리고 2개의 추가 uop으로 인해 2에서 3으로 변합니다. 종종, 2개의 융합 도메인 uop이 더 적은 차이를 만들 것입니다. 그리고 코드가 4개의 융합 도메인 uop 대신 다른 것으로 병목이 된 경우 차이가 없을 수도 있습니다.
그럼에도 불구하고, 반복문에서 많은 메모리 참조를 수행하는 코드는 복잡한 주소 지정 모드를 사용하는 대신 일반적인 주소 지정과 함께 몇 번 롤링하고 여러 포인터를 증가시키는 방식으로 구현된다면 더 빠를 수 있습니다.
더불어 추가적인 것들
'Bottleneck when using indexed addressing modes' - 해체 작업은 일반적으로 추가 1 uop보다 프론트엔드 속도를 더 늦출 수 있습니다.
가까운 상대원 매크로 퓨즈가 불가능합니다. Agner Fog의 실험 결과, 이것은 디코더/마이크로오퍼레이션 캐시에서도 마찬가지로 적용되므로, 이들은 처음부터 퓨즈되지 않습니다(비완성이 아님).
IACA는 이를 잘못 이해하고, 이 두 개의 마이크로퓨즈를 모두 주장합니다.
'cmp dword [abs mydata], 0x1b ; fused counters != unfused counters (micro-fusion happened, and wasn't un-laminated). Uses 2 entries in the uop-cache, according to Agner Fog's testing
cmp dword [rel mydata], 0x1b ; fused counters ~= unfused counters (micro-fusion didn't happen)
'
(마이크로 + 매크로 융합이 모두 발생하려면 'cmp' / 'jcc' 에 대한 몇 가지 추가 제한 사항이 있습니다. 테스트를 위해 메모리 위치에 기록해보세요.)
RIP-rel은 즉각적으로 없을 때 마이크로 퓨즈가 작동하며 계속 퓨즈됩니다.
'or eax, dword [rel mydata] ; fused counters != unfused counters, i.e. micro-fusion happens
'
마이크로 퓨전은 명령어의 지연시간을 증가시키지 않습니다. 다른 입력이 준비되기 전에 로드할 수 있습니다.
'ALIGN 32
.dep_fuse:
or eax, [rsi + 0]
or eax, [rsi + 0]
or eax, [rsi + 0]
or eax, [rsi + 0]
or eax, [rsi + 0]
dec ecx
jg .dep_fuse
'
이 루프는 반복당 5번의 주기로 실행되며, 이는 'eax' 의존 체인 때문입니다. 'or eax, [rsi + 0 + rdi]' 또는 'mov ebx, [rsi + 0 + rdi] / or eax, ebx' 순서보다 빠릅니다. (퓨즈되지 않은 버전과 'mov' 버전은 모두 동일한 수의 uop을 실행합니다.) 스케줄링 / 의존성 체크는 퓨즈되지 않은 도메인에서 발생합니다. 새로이 발급된 uop은 스케줄러 (Reservation Station (RS)로도 알려진)와 ROB(Reorder Buffer)에 들어갑니다. 디스패치 이후 스케줄러를 떠나 실행 유닛에 보내지지만, 리타이어먼트(ROB에서 제거)할 때까지 ROB에 남아 있습니다. 따라서 로드 지연을 숨기기 위한 비순차 윈도우 크기는 최소한 스케줄러 크기 ( '54 unfused-domain uops in Sandybridge, 60 in Haswell' , Skylake에서 97)입니다.
마이크로 퓨전은 베이스와 오프셋이 동일한 레지스터에 대한 단축키를 갖고 있지 않습니다. rdi가 0으로 초기화된 'or eax, [mydata + rdi+4*rdi]' (형태의 루프)는 'or eax, [rsi+rdi]' (형태의 루프)와 같은 uop과 사이클을 실행합니다. 이 addressing 모드는 고정된 주소에서 시작하는 홀수 크기의 구조체 배열을 반복하는 데에 사용될 수 있습니다. 이는 대부분의 프로그램에서는 거의 사용되지 않으므로, 인텔이 마이크로 퓨즈의 2개의 레지스터 모드 특수 케이스에 대해 트랜지스터를 사용하지 않을 것임은 놀라운 일이 아닙니다. (또한 인텔은 이를 인덱스된 주소 모드로 문서화하고 있으며, 레지스터와 스케일 팩터가 필요합니다.)
매크로 퓨전 'cmp' / 'jcc' 또는 @!'dec' / 'jcc'은 퓨즈 도메인에서라도 단일 uop으로 유지되는 uop을 생성합니다. 'dec / nop / jge'는 여전히 단일 사이클에서 실행 가능하지만 하나가 아닌 세 개의 uop입니다.
답변 2
마이크로 퓨전과 주소 지정 모드마이크로 퓨전은 혁신적인 에너지 생산 방법으로, 천체물리학 분야에서 주목받고 있는 기술입니다. 이 기술은 미래의 에너지 문제를 해결할 수 있는 잠재력을 가지고 있으며, 전기차, 경제성 및 환경 문제에 대한 대안적인 솔루션을 제공할 수 있습니다.
마이크로 퓨전은 핵융합을 이용하여 에너지를 생성하는 과정입니다. 이 과정에서 두 개의 탄소 핵이 결합하여 헬륨 핵을 생성하고, 그 과정에서 엄청난 양의 에너지가 방출됩니다. 이 방법은 탄소 핵의 결합 및 분리에 사용되는 과학기술에 의존하며, 포용력이 크고 비행성 매체를 필요로하지 않으므로 그 기술은 상당히 어렵고 고도의 정밀도를 요구합니다.
마이크로 퓨전은 현재 실험적인 단계에 있지만, 이미 상용화된 대규모 핵융합 장치보다 소형이어서 잠재력이 있습니다. 또한, 마이크로 퓨전은 전력 및 소비 전력의 효율성에서 장점을 가지고 있으며, 경제적으로 적합한 에너지 소스로 인정 받을 수 있습니다.
또한, 마이크로 퓨전은 주소 지정 모드에 대한 연구에서 더욱 발전될 수 있습니다. 주소 지정 모드는 CPU(중앙 처리 장치)가 데이터나 명령을 참조하는 방식입니다. 주소 지정 모드는 기계어 프로그래밍과 컴퓨터 아키텍처에서 중요한 역할을 합니다. 명령어에서 데이터를 가져오거나 저장하는 데 사용되는 방식으로, 주소 지정 모드는 프로그래머가 데이터를 효율적으로 처리하고 메모리를 관리할 수 있도록 도와줍니다.
마이크로 퓨전과 주소 지정 모드는 둘 다 혁신적인 기술이며, 에너지 및 컴퓨터 분야에서의 중요성을 갖고 있습니다. 이러한 기술은 지구의 에너지 문제와 정보 처리에 대한 요구사항을 충족시키는 해결책을 제공할 수 있습니다. 더 많은 연구와 개발을 통해 우리는 이러한 기술들을 개선하고 보다 지속 가능한 미래를 구축할 수 있을 것입니다.