x86 및 x64 프로세서의 CPU 명령 지연


14

어셈블리 코드의 효율성을 계산하는 데 도움이되는 테이블이나 유사한 것을 찾고 있습니다.

내가 알다시피 비트 이동에는 1 CPU 클럭이 필요하지만 실제로 얼마나 많은 덧셈 (빼기도 동일해야 함), 곱셈 및 나누는 값을 알면 나눗셈 시간을 계산하는 방법을 실제로 찾고 있습니다.

정수 값에 대한 정보가 필요하지만 float 실행 시간도 환영합니다.


답변:


10

일반적으로 이러한 각 작업은 인수가 파이프 라인의 다양한 단계에서 레지스터에있는 경우 단일 클럭주기를 실행하여 실행됩니다.

대기 시간이란 무엇입니까? 작업이 ALU에서 얼마나 많은주기를 소비합니까?

이 테이블이 유용 할 수 있습니다. http://www.agner.org/optimize/instruction_tables.pdf

최신 프로세서는 수 스칼라이고 순서가 잘못 실행될 수 있으므로주기 당 총 명령어 수는 1을 초과 할 수 있습니다. 매크로 명령에 대한 인수가 가장 중요하지만 나누기가 XOR보다 길기 때문에 연산도 중요합니다 (<1 사이클 대기 시간).

많은 x86 명령어는 복잡한 경우 일부 단계를 완료하는 데 여러 번의주기가 걸릴 수 있습니다 (예 : REP 명령 또는 더 나쁜 MWAIT).


3
정수 곱하기는 모든 최근 x86 CPU에서 최소 3c 대기 시간이며 일부 구형 CPU에서는 더 높습니다. 많은 CPU에서 완전히 파이프 라인되어 있으므로 처리량은 클럭 당 1이지만 3 개의 독립적 인 곱셈이있는 경우에만 달성 할 수 있습니다. Haswell에서의 FP 곱셈은 5c 대기 시간, 0.5c 처리량이므로 처리량을 포화 시키려면 비행 중에 10 개가 필요합니다. 디비전 ( dividiv)은 더 나쁩니다. 마이크로 코드화되어 있고 또는 보다 대기 시간이 훨씬 길며 CPU에서 완전히 파이프 라인되지 않습니다. 이 모든 것은 Agner Fog의 지시 테이블에서 나온 것이므로 연결하는 것이 좋습니다. addshr
Peter Cordes


7

어셈블리 코드의 효율성을 계산하는 것이 요즘 고장난 수퍼 스칼라 파이프 라인의 가장 좋은 방법은 아닙니다. 프로세서 유형에 따라 다릅니다. 이전과 이후의 지침에 따라 다릅니다 ( 추가 코드를 추가 하고 때로는 더 빠르게 실행할 수 있습니다). 일부 연산 (특히 분할)은 더 예측 가능한 구형 칩에서도 다양한 실행 시간을 가질 수 있습니다. 실제로 많은 반복 타이밍이 유일한 방법입니다.


나는 그것을 알고 있지만 실제 프로젝트가 아니라 재미있는 프로그래밍 프로젝트에 필요합니다.
ST3

실제 또는 재미를 위해 필요한지 여부는이 프로세서 라인의 답변을 변경하지 않습니다. 프로펠러 칩과 같은보다 결정적인 프로세서로 전환하는 것을 고려해 보셨습니까?
Brian Knoblauch

3
스칼라를 사용하더라도 순서가 잘못된 분기 예측 및 캐시 누락으로 인해 런타임이 달라질 수 있습니다.
Paul A. Clayton

순전히 CPU 바운드 항목 (캐시 누락, 분기 오판 없음)의 경우 정적 분석이 루프가 특정 CPU (예 : Intel Haswell)에서 반복 당 얼마나 많은주기를 수행하는지 거의 정확하게 예측할 수 있다는 점에서 CPU 동작을 충분히 자세하게 이해합니다. 예를 들어 컴파일러에서 생성 한 asm을 살펴보면 이 SO 답변을 참조하십시오 . 분기 버전이 OP의 Sandybridge CPU에서 CMOV 버전보다 거의 1.5 배 빠르지 만 Skylake에서 훨씬 더 가까운 이유를 설명하겠습니다.
Peter Cordes

성능상의 이유로 수동으로 asm을 작성하는 경우 실제로 인텔 및 AMD CPU에서 대기 시간 및 처리량 병목 현상을 찾는 것이 유용합니다. 그러나 어렵고 때로는 AMD에 최적 인 것이 인텔에 최적이 아닌 경우도 있습니다.
Peter Cordes

4

인텔 소프트웨어 개발자 매뉴얼 에서 인텔 CPU에 대한 정보를 찾을 수 있습니다 . 예를 들어 대기 시간은 정수 더하기의 경우 1주기이고 정수 곱셈의 경우 3주기입니다.

곱셈에 대해서는 모르지만 덧셈은 항상 한주 기가 걸릴 것으로 예상합니다.


"무료"(파이프 라인이 올바르게 정렬 될 때 병렬)이거나 캐시 누락으로 인해 더 오래 걸리는 경우를 제외하고 한주기. :-)
Brian Knoblauch

2
현재 (2018)이 정보는이 질문에 링크 된 페이지의 "인텔 ® 64 및 IA-32 아키텍처 최적화 참조 설명서"문서 248966의 "명령 대기 시간 및 처리량"도 가능라는 이름의 부록 C에서 사용할 수 있습니다
stefanct
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.