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 개가 필요합니다. 디비전 ( div및 idiv)은 더 나쁩니다. 마이크로 코드화되어 있고 또는 보다 대기 시간이 훨씬 길며 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.