2017-01-23 4 views
0

Я принимаю исполнение функции sqrt на AArch64 по академическим причинам. Код для одного поплавка sqrtf функция:Выполнение функции sqrt на AArch64

fsqrt s0, s0 
ret 

Код для двойного поплавка квадратный корень функции:

fsqrt d0, d0 
ret 

Я имею в виду теоретические латентности для FSQRT здесь: http://infocenter.arm.com/help/topic/com.arm.doc.uan0015b/Cortex_A57_Software_Optimization_Guide_external.pdf

latencies of FSQRT

Одноместный sqrt кажется 2x лучше, чем двойной.

Но, в то время как профилирование я получаю эти цифры:

326 ms sqrt 
82 ms sqrtf 

Я везу раз для такого же числа циклов. Из этих чисел sqrtf кажется в 4 раза лучше.

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

Некоторая информация или направление на это было бы действительно полезно.

+0

Не забудьте изменить выравнивание инструкции и снова измерить, повторите по мере необходимости. Если вы пытаетесь измерить один экземпляр инструкции, вряд ли вы добьетесь успеха. –

+0

@old_timer Я измеряю производительность для миллиона вызовов функций в цикле. Это не должно быть проблемой. –

ответ

1

Если вы посмотрите на примечание, прикрепленное к записям таблицы для инструкции FSQRT в руководстве по оптимизации Cortex-A57, в нем говорится, что «операции разделения FP и квадратного корня выполняются с использованием итеративного алгоритма».

Это означает, что в зависимости от ввода инструкции время задержки будет меняться. В этом смысл значений задержки «7-17» и «7-32» в таблице. В зависимости от ввода одноточечная FSQRT может занять от 7 до 32 циклов, тогда как вариант с двойной точностью может занимать от 7 до 32 циклов.

Так что, если для вычисления одной точности выполняется 7 циклов, но вычисление с двойной точностью занимает, скажем, 28 циклов, у вас есть 4-кратное несоответствие.

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