2014-02-19 4 views
0

Я знаю, что xorq %rax,%rax быстрее, чем movq $0,%rax, потому что мой компилятор сказал мне. Однако, если я не знаю ответа, что мне делать, чтобы сравнить xorq и movq выступления?Как сравнить скорости команд 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 0, один раз #if 1), я получаю очень близкие результаты (5.876 ± 0,001 секунды). FYI, я установил регулятор масштабирования на самую низкую частоту, и я проверил пользователя , возвращенный time(1).

Я также пробовал с addq %rax,%rax против imulq $2,%rax, снова не повезло.

Я знаю, что современные процессоры довольно умны в оптимизации выполнения кода, и я думаю, именно поэтому я не получаю полезные результаты. Поэтому я здесь, чтобы спросить: как мне продолжить? Я на правильном пути?

+0

@MikeDunlavey: aah, вы правы. Я изменил цикл и использовал 16 _movq/xorq_ за каждое вмешательство вместо одного. Теперь я начинаю видеть некоторые различия. См. Http://pastebin.com/QfWjAGvj – user16538

+0

@MikeDunlavey: с _addq_ vs _imulq_, разница составляет почти 10 секунд. Если вы включите свой комментарий в ответ, я приму его как можно скорее. – user16538

+0

Существуют и другие преимущества: вы можете обнулить 64-битный регистр, используя 'xorl% eax,% eax', хотя вы можете сделать это с помощью' movl', но все равно меньше байтов. Шаблон «xor R, R» также является выключателем зависимостей, а на более новых архитектурах не требуется блок исполнения (нулевая латентность). –

ответ

1

Вам придется развернуть кишки петли много раз, например 10 или 100. В противном случае, в основном вы измеряете накладные расходы цикла. Также я бы предложил for (i = 1000...; --i>=0;), который мог бы скомпилировать меньшее количество инструкций.

 Смежные вопросы

  • Нет связанных вопросов^_^