Переполнение стека производительности операций с плавающей запятой

Возможный дубликат:
Деление с плавающей точкой против умножения с плавающей точкой

Недавно я написал программу, которая рассчитывает, сколько времени занимает мой компьютер
рассчитать реальные умножения, деления и сложения.

для этого я использовал функции QueryPerformanceFrequency и QueryPerformanceCounter
для того, чтобы получить временные интервалы.

я проверил свою программу, используя 6000000 итераций: 6000000 умножений, делений и сумм (с переменными числами) и получаю следующие результаты:

O.S = Windows Vista (TM) Home Premium, 32-bit (Service Pack 2)
Processor = Intel Core (TM)2 Quad CPU Q8200
Processor Freq = 2.33 GHz

Compiler = Visual C++ Express Editionnº iterations                              time in micro seconds
6000000 x real    mult + assignment ->     15685.024214 us
6000000 x real     div + assignment ->     51737.441490 us
6000000 x real     sum + assignment ->     15448.471803 us
6000000 x real           assignment ->     12987.614348 us

nº iterations                              time in micro seconds
6000000 x real                mults ->      2697.409866 us
6000000 x real                 divs ->     38749.827143 us
6000000 x real                 sums ->      2460.857455 us

1 Iteration                          time in nano seconds
real                 mult ->         0.449568 ns
real                  div ->         6.458305 ns
real                  sum ->         0.410143 ns

Возможно ли, что деление в шесть раз медленнее, чем умножение, и
сложение практически равно, чем умножение (~ 0,42 нс)?

4

Решение

Да, это. Если вы когда-либо делали деление вручную, то вы знаете, что оно включает в себя множество подопераций.

Что касается сложения и умножения примерно одинаковой скорости: они больше связаны с настройкой операндов и сохранением результата, чем с фактическим вычислением. Вы могли бы получить больше различий между ними, компилируя, используя инструкции SSE для сложения и умножения (на x86).

0

Другие решения

С современным процессором, умножения примерно одинаковы по скорости.

На Intel Sandy Bridge умножение с использованием SSE занимает 4/3 времени добавления. Но с учетом ILP, когда несколько инструкций могут обрабатываться одновременно, они фактически занимают одинаковое количество времени. На одном и том же процессоре с ILP деления одинарной точности занимают в 7-14 раз больше времени!

Источник: Таблицы инструкций Агнера Фога. Много очень хорошего чтения на его сайте.

0

По вопросам рекламы [email protected]