
Сколько циклов требуется для сложения длинных целых чисел на Xeon?
Из хронометрических испытаний следует, что необходимо 2 такта часов.
/proc/info говорит
Название модели: Intel(R) Xeon(R) CPU X5660 @ 2.80GHz
пример кода на языке c (loop.02.c)
unsigned long i, j=0;
for(i=0; i<(0xFFFFFFFF);i++) j+=3;
ассемблерный код
21:loop.02.c **** for(i=0; i<(0xFFFFFFFF);i++) j+=3;
34 .loc 1 21 0
35 001e 48C745F0 movq $0, -16(%rbp)
35 00000000
36 0026 EB0A jmp .L2
37 .L3:
38 0028 488345F8 addq $3, -8(%rbp)
38 03
39 002d 488345F0 addq $1, -16(%rbp)
39 01
40 .L2:
41 0032 B8FEFFFF movl $4294967294, %eax
41 FF
42 0037 483945F0 cmpq %rax, -16(%rbp)
43 003b 76EB jbe .L3
поэтому цикл выполняет 5 инструкций:addq addq movl cmpq jbe
цикл повторяется 0xFFFFFFFF = 16^8 = 4294967296 = 4G раз
/usr/bin/time -f %e ./loop.02
дает 10,78 секунд, почти все из которых в цикле
4G*5 инструкций / 10,78 секунд = 1,85G инструкций/сек
по сравнению с заявленными 2,80 ГГц циклов/сек
в среднем 2,8/1,8 = 1,6 цикла/инструкция
такая скорость имеет смысл, если, скажем, 2 из 5 инструкций в цикле занимают 2 такта, а остальные — 1 такт.
это правильная интерпретация результатов хронометража?
где указание количества циклов на инструкцию?