А вот эти «такты» — это окргугление попугаев по среднему? Просто слабо представляется работа clock_gettime на таких промежутках времени в многозадачной ОС (ведь многозадачной?)
Такты = наносекунды *3.2
У меня много ядер. Вообще, есть предпосылки считать, что это именно такты. Большинство значений получились круглыми + 0,04 (остаток от временной доли обвязки после деления). Я эти 0,04 отовсюду вычел.
Да, мне тоже всегда было интересно. Версии GMP всегда меня по производительности уделывали, но оно и понятно — в документации сказано, что библиотека при компиляции умеет определять множество разных процессоров и соответствующим образом выбирать исходник.
Кстати, система Mathematica использует какую-то свою версию GMP, потому, что она, в свою очередь, уделывает собранный мной GMP. Что, кстати, удивительно, ведь я-то собираю на целевой машине, а WR вынуждены собирать универсально.
Буду ждать более подробную статью со сравнением с GMP.
Кстати, неплохо было бы еще разобраться с умножением и делением. Вот тут настоящий челендж вам, а сложение так, фигня :)
По поводу умножения — у меня помнится на x86 катастрофически нехватало регистра. Там же, если делать столбиком, необходимо хранить 2 счетчика цикла. Ух, как я мучался, помню… Хотя это наверное потому, что ассемблер я довольно ознакомительно знаю.
Кстати, по поводу gcc версии. Вы, наверное, зря циклы переделывали из индексной формы в хитрые операции с указателями — компилятору сложнее оптимизировать код в этом случае. Возможно, если бы вы переписали код более высокоуровнево, получилось бы даже быстрее.
Оптимизация длинной арифметики на C++