일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 데이터구조
- 데이터베이스
- 컴퓨터비전
- 빅데이터
- 인공지능
- 클라우드컴퓨팅
- 프로그래밍
- 컴퓨터과학
- 사이버보안
- 네트워크
- 머신러닝
- 코딩
- 웹개발
- 자료구조
- 데이터과학
- Yes
- 데이터분석
- 알고리즘
- 버전관리
- 컴퓨터공학
- 네트워크보안
- 딥러닝
- 자바스크립트
- 소프트웨어
- I'm Sorry
- Today
- Total
스택큐힙리스트
프로세서 폭의 배수가 아닌 uop 개수를 가진 루프를 실행할 때 성능이 감소되나요? 본문
저는 최근 x86 프로세서에서 다양한 크기의 루프가 몇 개의 uop에 따라 어떻게 수행되는지 궁금합니다.
다른 질문(링크)에서 이 문제를 제기한 Peter Cordes의 인용문이 있습니다:
루프가 4개의 uop의 배수가 아닌 경우 루프 버퍼에서 나오는 uop 대역폭이 상수적으로 1 사이클당 4개가 아니라는 점을 발견했습니다. (즉, abc, abc, ...가 아닌 abca, bcab, ...). Agner Fog의 마이크로아키텍처 문서에서는 루프 버퍼의 이러한 한계에 대해 명확히 설명되지 않았습니다.
이 문제는 루프가 최대 uop 처리량으로 실행되기 위해 N 개의 uop의 배수여야 하는지 여부에 대한 문제입니다. 여기서 N은 프로세서의 너비입니다. (최근 Intel 프로세서의 경우 4입니다). 너비와 uop 개수를 언급할 때 복잡한 요소가 많지만, 주로 무시하려고 합니다. 특히, 마이크로 또는 매크로-퓨전은 가정하지 않습니다.
Peter는 다음과 같은 7 uop이 있는 루프의 예를 들었습니다:
7-uop 루프는 그룹 단위로 4|3|4|3|...의 형태로 발행됩니다. 루프 버퍼에 들어가지 않는 큰 루프(다음 반복의 첫 번째 명령어가 함께 발행될 수 있는 그룹)를 테스트하지 않았으므로 가능하지 않다고 가정합니다.
일반적으로, 본 주장은 몸체에 x
uop이 있는 루프의 각 반복은 단순히 x / 4
가 아닌 적어도 ceil(x / 4)
의 반복을 수행할 것이라고 주장합니다.
이것은 최근의 x86 호환 프로세서 중 어떤 것에 대해서 참인가요?
답변 1
7 재미로, 나는 Firefox의 짧은 실행에서 perf stat
를 실행하여 몇 개의 Stack Overflow 질문에 대해 탭을 여러 번 열고 클릭해보았다. 받은 설명에 따르면, DSB에서는 46%, 레거시 디코더에서는 50%, 그리고 LSD에서는 4%를 얻었다. 이는 적어도 브라우저와 같이 크고 가지가 많은 코드의 경우 DSB가 여전히 대다수의 코드를 포착하지 못한다는 것을 보여준다 (운이 좋게도 레거시 디코더는 그렇게 나쁘지 않다).
8 이를 의미하는 바는 다른 모든 사이클 카운트는 단순히 유효한 루프 비용을 uops 단위로 취한 다음 4로 나누어 설명될 수 있다는 것이다 (실제 크기가 uops인 경우보다 높을 수 있다). 이러한 매우 짧은 루프의 경우에는 작동하지 않는다 - 어떤 정수를 4로 나누어도 반복당 1.333 사이클에 도달할 수 없다. 다른 말로, 다른 영역에서 비용은 어떤 정수 N에 대해 N/4 형태를 가지고 있다.
9 실제로 우리는 Skylake가 전통적인 디코더에서 1 사이클당 5개의 uop을 전달할 수 있다는 것을 알고 있습니다. 하지만 그 5개의 uop이 5개의 다른 명령어에서, 아니면 4개 이하의 명령어에서 나올 수 있는지는 모릅니다. 즉, Skylake가 2-1-1-1
패턴으로 디코딩 할 수 있다고 예상하지만, 1-1-1-1-1
패턴으로 디코딩 할 수 있는지는 확실하지 않습니다. 위의 결과는 Skylake가 실제로 1-1-1-1-1
패턴을 디코딩 할 수 있다는 몇 가지 근거를 제공합니다.
답변 2
제목: 프로세서 너비의 배수가 아닌 루프 실행 시 성능이 저하되나요?서론:
컴퓨터 프로세서의 기능은 컴퓨터 성능에 큰 영향을 미칩니다. 이를 위해 최적화된 코드 작성은 중요한 요소입니다. 이에 따라 루프(loop)의 실행 방식이 프로세서 너비와 관련이 있다는 질문이 제기됩니다. 이 에세이에서는 프로세서 너비가 루프의 uop(마이크로 연산) 개수의 배수가 아닐 경우 성능이 저하되는지에 대해 다룰 것입니다.
본론:
프로세서는 마이크로 아키텍처에 따라 한 번에 처리할 수 있는 연산 명령어의 개수에 제약을 받습니다. 이를 프로세서 너비라고 합니다. 일반적으로 프로세서의 너비는 4, 8, 16 또는 32와 같은 2의 거듭제곱으로 설정됩니다. 그러므로 프로세서 너비의 배수에 해당하는 uop 개수를 가진 루프는 가장 효율적으로 실행됩니다.
하지만 루프의 uop 개수가 프로세서 너비의 배수가 아니면 성능이 저하될 수 있습니다. 그 이유는 프로세서가 루프의 다음 반복을 시작하기 전에 다음 연산의 종료를 기다려야하기 때문입니다. 이렇게 되면 프로세서의 하나 이상의 실행 유닛은 비활성 상태로 남게 되어 성능 저하를 초래할 수 있습니다.
더 나아가, 비효율적인 루프 실행은 파이프라인(pipeline)의 효율성을 저하시킵니다. 파이프라인은 한 번에 여러 단계의 명령어를 처리하는데 사용되며, uop 개수가 프로세서 너비의 배수가 되지 않으면 파이프라인의 타이밍을 제대로 맞추기 어려워집니다. 이는 프로세서가 유휴 상태에 머무르는 비효율적인 사이클을 발생시켜 실행 지연을 유발할 수 있습니다.
결론:
프로세서 너비의 배수가 아닌 루프 실행 시 성능 저하의 가능성이 있습니다. 프로그래머는 최적화를 고려하여 루프의 uop 개수를 프로세서 너비의 배수로 조정하는 것이 좋습니다. 이를 통해 프로세서가 모든 실행 유닛을 최대한 활용하고, 파이프라인의 효율성을 유지할 수 있습니다. 성능 저하를 최소화하고 효율적인 실행을 달성하기 위해 프로세서와 루프 코드 간의 최적화된 상호작용이 필요합니다.