2014-02-19 2 views
0

필자의 컴파일러에서 말한 것 때문에 보다 xorq %rax,%rax이 더 빠릅니다. 그러나 대답을 모르는 경우 xorqmovq 공연을 비교하려면 어떻게해야합니까?ASM 명령어 속도를 어떻게 비교합니까?

은 내가 시도하는 것은 이것이다 :

int main(void) 
{ 
    long a; 
    long i = 0; 
    for (i = 0; i < 10000000000l; i++) { 
    a = 10; 
    __asm__(
#if 0 
      "movq $0, %%rax" 
#else 
      "xorq %%rax, %%rax" 
#endif 
      : "=a" (a) : "a" (a)) 
    } 
    return 0; 
} 

그러나 때 시간 (한 번 #if 1에 한 번 #if 0와) 프로그램, 나는 매우 비슷한 결과 (5.876 ± 0.001 초)가 계속합니다. 참고로, 저비용 조정기를 가장 낮은 주파수로 설정했고 사용자 회선이 time(1)에 의해 반환되었는지 확인했습니다.

나는 또한 addq %rax,%raximulq $2,%rax으로 시도했지만 다시 운이 없었습니다.

나는 최신 프로세서가 코드 실행을 최적화하는 데 매우 영리하다는 것을 알고 있으며 이것이 내가 도움이되는 결과를 얻지 못하는 이유라고 생각합니다. 그래서 저는 물어볼 것입니다 : 어떻게해야합니까? 나는 올바른 길을 가고 있는가?

+0

@MikeDunlavey : 네, 맞습니다. 나는 루프를 변경하고 단지 하나 대신 intermation 당 16_movq/xorq_를 사용했다. 이제 나는 약간의 차이점을보기 시작했습니다. http://pastebin.com/QfWjAGvj – user16538

+0

@MikeDunlavey를 참조하십시오. _addq_와 _imulq_의 차이는 거의 10 초입니다. 귀하가 귀하의 의견을 답변으로 바꾸면 최대한 빨리 동의하겠습니다. – user16538

+0

다른 장점이 있습니다. 'xorl % eax, % eax'를 사용하여 64 비트 레지스터를 0으로 만들 수 있습니다. 그러나'movl '로도이 작업을 수행 할 수 있지만 여전히 바이트 수가 더 적습니다. 'xor R, R' 패턴은 의존성 차단기이기도하며, 새로운 아키텍처에서는 실행 단위 (대기 시간 없음)를 필요로하지 않습니다. –

답변

1

루프의 내장을 10 또는 100과 같이 많이 열어야합니다. 그렇지 않으면 주로 루프 오버 헤드를 측정하고 있습니다. 또한 더 적은 수의 명령어로 컴파일 할 수있는 for (i = 1000...; --i>=0;)을 제안합니다.

관련 문제