일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Yes
- 빅데이터
- 컴퓨터비전
- 코딩
- 프로그래밍언어
- 컴퓨터공학
- 데이터베이스
- 웹개발
- 알고리즘
- 프로그래밍
- 버전관리
- 데이터과학
- 자료구조
- 보안
- 사이버보안
- 파이썬
- 소프트웨어
- 데이터구조
- 소프트웨어공학
- 머신러닝
- 컴퓨터과학
- 자바스크립트
- 네트워크
- 2
- 클라우드컴퓨팅
- I'm Sorry
- 딥러닝
- 데이터분석
- 네트워크보안
- 인공지능
- Today
- Total
스택큐힙리스트
인덱스 주소 모드를 사용할 때 병목 현상 본문
나는 Haswell 및 Coffee Lake 기계에서 다음 실험을 수행했습니다.
The instruction
'cmp rbx, qword ptr [r14+rax]
'
단리시 0.5의 처리량을 가지고 있습니다. 즉, 1사이클당 2개의 명령을 실행합니다. 이것은 예상한 대로입니다. 이 명령은 후에 언-와합 된 µ옵으로 디코딩되며 이에 따라 두 개의 은퇴 슬롯이 필요합니다. (마이크로 퓨전 및 주소 지정 모드 )
만약 우리가 'nop' 지시문을 추가한다면
'cmp rbx, qword ptr [r14+rax]; nop
'
이 시퀀스는 3개의 리타이어 슬롯을 필요로 하며, 백엔드에는 다른 병목 현상이 없어서 예상되는 처리량은 0.75입니다. 이는 IACA가 보고한 처리량과 일치합니다. 하지만 실제 처리량은 1입니다(µ옵스가 디코더에서 오든 DSB에서 오든 독립적으로 동일합니다). 이 경우 병목 현상은 무엇인가요?
인덱스 주소 지정 모드 없이
'cmp rbx, qword ptr [r14]; nop
'
기대했듯이 처리량은 0.5입니다.
답변 1
그것은 마이크로 퓨즈된 uop이 IDQ의 헤드에 도달할 때, 비양화와 일반적인 다중 uop 명령어 사이에 단점을 드러낸 것 같습니다. 아마도 4-와이드 이슈/리네임/할당과의 상호작용 중에서.
가설: 언램이드에서 발생하는 두 개의 uop 모두 동일한 이슈 그룹의 일부여야만 하며, 그 이슈 그룹에서만 'unlaminated; nop' 를 반복함으로써 클럭당 퓨즈 도메인 uop의 프런트엔드 처리량이 3이 됩니다.
그것은 IDQ의 처음에만 un-lamination이 일어난다면 의미가 있을 수도 있습니다. alloc/rename 단계에 도달할 때까지입니다. IDQ에 추가된 후가 아닙니다. 이를 테스트하기 위해 우리는 Haswell에서 LSD (루프 버퍼) 용량이 unlamination 이전 또는 이후의 uop count에 의존하는지 확인할 수 있습니다 - #$$@$^!& $ & # @! 는 Haswell에서 LSD에서 실행되는 55x 'cmp rbx, [r14+rax]' # @!를 포함하는 루프를 나타내므로 unlamination이 alloc/rename 도중에 발생한다는 강력한 증거입니다. IDQ 자체에서 여러 항목을 차지하는 것이 아닙니다.
비교를 위해, 'cmp dword [rip+rel32], 1'은 처음부터 디코더에서 마이크로 퓨즈되지 않으므로 언램인을 방지하지 않습니다. 만약 0.75c 처리량을 달성한다면, 그것은 동일한 이슈 그룹에서 공간이 필요한 언램인을 지원하는 증거일 것입니다.
어쩌면 'times 2 nop; unlaminate' 또는 'times 3 nop' 역시, 무날막 uop이 스스로 종료되거나 이슈 그룹에서 어느 위치든지 지연된 후에 신뢰성 있게 더 나설 수 있는 NOP 2개를 잡을 수 있는 흥미로운 테스트가 될 수도 있을 겁니다. 당신의 연속된 'cmp' - 날막 없는 테스트에서, 우리는 여전히 대체로 완전한 4-uop 이슈 그룹을 보게 될 것으로 예상합니다.
당신의 질문은 문제가 아니라 은퇴에 대해 언급합니다.
발행에 대한 은퇴는 최소한으로 넓은 범위입니다(Core2에서 Skylake까지 4개, Ice Lake에서 5개로 넓게 구현되었습니다).
4개의 퓨즈 도메인 uop를 클록 당 은퇴하세요. 스카이레이크는 두 개의 논리적 코어가 모두 사용 중인 경우, 한 개의 오래된 막힌 uop가 마칠 때마다 퀵하게 로드 버퍼와 같은 리소스를 해제할 수 있도록 클록 당 퓨즈 도메인 uop 4개를 은퇴할 수 있습니다. 싱글 스레드 모드에서 작동하는 경우, 8회/클록을 은퇴할 수 있는지 100% 확실하지 않으며, 인텔의 최적화 매뉴얼에 명확한 설명이 없어 상충하는 주장을 발견했습니다.
실제로 은퇴에 병목 현상을 만드는 것은 매우 어렵거나 불가능합니다 (발급은 아님). 지속적인 스트림은 은퇴보다 넓지 않은 발급 단계를 통과해야 합니다. ( 'uops_issued.any' 을 위한 성능 카운터는 언램제이션(un-lamination)이 발급 전 어딘가에서 발생한다는 것을 나타내므로 은퇴가 처리할 수 있는 uop보다 더 많은 uop을 프론트엔드를 통해 통과시키는 데 도움이 되지 않습니다. 그러나 그것이 오해를 불러일으키는 경우도 있을 수 있습니다. 동일한 루프를 동일한 물리적 코어의 논리적 코어 두 개에서 실행한다면, 전체적인 병목 현상은 동일해야 하지만, 만약 Skylake가 더 빠르다면, 그것은 병렬 SMT 은퇴의 도움을 받았다는 것을 알려줄 것입니다. 그렇게 확률은 낮지만, 제외하고 싶은 사람들이 있다면 확인해볼만한 사항입니다.)
이것은 IACA가 보고하는 대역폭입니다.
IACA의 파이프라인 모델은 꽤 순진해 보입니다. Sandybridge의 4배수 uop 이슈 효과(예: 6 uop 루프는 8과 같은 비용)를 알지 못하는 것 같습니다. IACA는 또한 Haswell이 파이프라인 내에서 'add eax, [rdi+rdx]' 마이크로 퓨즈드를 유지할 수 있다는 사실을 알지 못하기 때문에 언래미네이트(un-laminate)하지 않은 인덱스화된 uop에 대한 어떠한 분석도 잘못됩니다.
나는 IACA가 uop을 세고 어떻게 포트에 할당될지에 대해 야생적인 추측을 하는 것보다 더 많은 것을 할 수 있다고 믿지 않을 것이다.
답변 2
인덱스 주소 모드를 사용할 때 병목 현상
인덱스 주소 모드를 사용하면 프로그래밍 언어에서 포인터를 조작하는데 유용한 기능을 제공합니다. 그러나 이러한 주소 모드를 사용할 때 성능 저하가 발생할 수 있습니다. 이 글에서는 인덱스 주소 모드를 사용할 때 발생하는 병목 현상에 대해 알아보겠습니다.
인덱스 주소 모드는 메모리에 있는 요소들을 참조하는데 사용됩니다. 이 모드를 사용하면 메모리의 특정 위치에 저장된 요소에 쉽게 접근할 수 있습니다. 예를 들어, 배열의 요소에 접근하기 위해 인덱스 주소 모드를 사용할 수 있습니다.
그러나 인덱스 주소 모드를 사용하면 프로세서가 메모리에 접근하기 위해 추가적인 연산을 수행해야 합니다. 이 과정에서 시간이 소요되어 성능 저하가 발생할 수 있습니다. 이러한 작업으로 인해 프로그램이 실행되는 동안 지연이 발생하며, 이는 프로그램의 전체 실행 시간에 영향을 미칠 수 있습니다.
복잡한 배열 구조를 가진 프로그램에서 인덱스 주소 모드를 반복적으로 사용하는 경우 추가적인 연산이 많이 발생할 수 있습니다. 예를 들어, 다차원 배열을 다루는 프로그램에서 인덱스 주소 모드를 사용하면 여러 차원에 대한 인덱스 계산을 수행해야 합니다. 이런 계산은 추가 연산으로 인해 프로그램의 실행 속도를 느리게 만들 수 있습니다.
병목 현상을 해결하기 위해 최적화 기법을 적용할 수 있습니다. 가장 일반적인 최적화 기법은 반복문에서 인덱스 계산을 미리 처리하는 것입니다. 즉, 루프의 시작 부분에서 인덱스 계산을 수행하고 계산 결과를 임시 변수에 할당하면 됩니다. 이렇게 함으로써 프로세서가 루프의 각 반복마다 추가적인 계산을 수행하지 않아도 됩니다.
인덱스 주소 모드를 사용하는 것은 프로그래밍에서 중요한 기능 중 하나입니다. 그러나 병목 현상은 성능을 떨어뜨릴 수 있기 때문에 주의해야 합니다. 최적화 기법을 사용하면 성능을 향상시킬 수 있으므로, 프로그램 개발 시 고려해야 할 사항입니다.
이로써 인덱스 주소 모드를 사용할 때 발생하는 병목 현상에 대해 알아보았습니다. 이러한 주소 모드를 올바르게 사용하면 프로그램의 성능을 향상시킬 수 있으며, 최적화 기법을 적용하여 병목 현상을 해결할 수 있습니다. 프로그래머는 이러한 점을 염두에 두고 프로그램을 개발해야 합니다.