2016-08-15 4 views
0

다음 두 코드 중 가장 빠른 x86_64 코드 조각은 무엇입니까? 아니면 전혀 차이가 있습니까?x86 - 명령어 수준의 병렬 처리 - 최적의 명령어 순서

; #1 
    bsf rax, rdi 
    mov rdx, -1 
    cmove rax, rdx 

; #2 
    mov rdx, -1 
    bsf rax, rdi 
    cmove rax, rdx 

(또는 레지스터와 경제적 # 1에 대한 대안.

; #1a 
    bsf rax, rdi 
    mov rdi, -1 
    cmove rax, rdi 

)

그리고 그래, 내가해야 그냥 벤치 마크를 알고 그러나 나는 도구가 없으며 현재의 장기간의 질병을 없애기 때문에 지금 상황을 설정할 수 없습니다.

+0

자주 묻는 질문은 코드를 작성하고 여러 번 반복하여 타이밍을 맞추는 것이 가장 좋은 방법입니다. –

+2

@DavidHoelzer : 저는 마이크로 벤치마킹이 어렵고 관련성이없는 이유로 한 버전이 다른 버전보다 빠르게 보일 수도 있습니다. 시퀀스의 대기 시간과 처리량이 다른 경우 오류가 발생하기 쉽습니다. 마이크로 벤치는 처리량을 테스트 할 수 있으며 실제 사용은 대기 시간에 민감합니다. 훌륭한 질문은 아니지만 답변은 "Agner Fog의 기사 읽기"가 아니라 "스스로 시간을 정하십시오"입니다. 내가 준 답을 모르는 사람에게는 운이 아닌 좋은 마이크로 벤치 마크를 쓸 수 없습니다. –

답변

3

은 때문에 아웃 오브 오더 실행의 모든 ​​ 기본적으로 동일한 것 , 디코딩/프론트 엔드의 효과가 놀이에 와서 특히 Agner Fog's microarch pdf and his Optimizing Assembly guide.


하지 않는 한, 또한 태그 위키 성능 링크를 참조하십시오.

이들 모두는 동일한 병렬 처리량 (두 개의 체인 : 독립 mov (입력 없음)과 bsf (입력 1 개)에 종속 cmov를 더한 양)을 가지고 있습니다. . 이 병렬성을 찾기 위해 순서가 벗어난 실행이 중요하지 않을 정도로 작습니다. in-order Atom에 관심이 있다면, bsf와 mov가 아마 쌍을 이룰 수 있습니다.

차이점은 주변 코드에 따라 다릅니다.

내가 선택해야하는 경우 movbsf에서 실행 포트를 훔칠 기회가 줄어들어 #1a을 선택할 수 있습니다. mov r64, imm32-sign-extended은 대부분의 CPU에서 모든 포트에서 실행할 수 있지만 보통 bsf 수 없습니다. insn 앞의 중요한 경로에 명령어를 배치하면 리소스 충돌을 줄일 수 있습니다. 이전 반복의 중요하지 않은 명령어가 중요한 경로를 지연시킬 수있는 루프 밖에서 적어도 발생합니다. (mov은 중요한 경로에 있지만 일종의 입력 뎁스가 없기 때문에 명령이 실행 된 후 임의의 지점에서 실행될 수 있습니다.

#1보다 #1a을 사용하면 미리보기에서 향후 교정을 위해 더 적은 수의 레지스터를 사용하게 할 수 있습니다. 나중에 어떤 명령어에 대해 새로운 종속성 체인을 시작하는 데 특정 용도로 사용했다면 #1을 사용할 것입니다. 예를 들어 나중의 명령어가 거짓 종속성을 가지며 레지스터의 값이 긴 종속성 체인 (또는 캐시 미스가 발생할 수있는로드)에 의존하는 경우입니다. 예 : 8 비트 또는 16 비트 레지스터 또는 output register for popcnt을 사용하고 싶다면

말하자면, bsf은 인텔 CPU에 대해 잘못된 종속성이있을 수 있습니다. 입력 값이 0이면 Intel CPU가 목적지를 변경하지 않습니다. ISA는 dest가 정의되지 않았지만 Core2가 실제로 수행하는 것입니다. 예를 들어 대상 레지스터와 소스에 대한 종속성이 필요합니다. 이것이 이유라고 생각합니다 lzcnt/tzcnt/popcnt 출력 레지스터에 대한 의존성이 있습니다.

거짓 종속성이라고하면 : or rdx, -1 (or r64, imm8), with a false dependency on the dst register.을 수행하면 더 적은 바이트의 기계어로 모든 레지스터를 설정할 수 있습니다. 일반적으로 나쁜 생각입니다.

+0

많은 도움을 주신 Peter 께 감사드립니다. –

+0

Agner Fog의 탁월한 작업에 익숙합니다. 그는 영웅이며 강력하게 추천합니다. –