forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   Делить нельзя, умножить (http://forum.boolean.name/showthread.php?t=102)

impersonalis 17.01.2006 21:19

Кстати - лишнее доказательство тезиса Декарта:
сомнение есть способ познания.
Сомневаться нельзя лишь в необходимости сомнений.

Исходя из этого не стоит 100% доверять какой-либо теории.

alex-mad 17.01.2006 22:23

AsmLover, спасиба за столь подробное описания приимужества деления на 2 перед умножнием на 0.5!
бинарные операции считаются намного быстрее арифмитеческих действии.
сдвиг рулит полюбе!

AsmLover 17.01.2006 22:57

Цитата:

Originally posted by impersonalis@Jan 17 2006, 08:17 PM
Не совсем правда понял - почему AsmLover сдивгает на 2 разряда (т.е. делит на 2^2=4, а не на один разряд :dontknow: )

Да какая разница для топика? Время выполнение SHR 1 и SHR $FFFFFFF одинаковое.

Для тех, кто интенсивно использует вычисления (матрицы транспонирует всякие :) ), необходимо знать, что если в примере

Код:

time4=MilliSecs()
For j=1 To 3000000
  b# = j / 3
Next
time4=MilliSecs()-time4

написать b# = j / 3.0,

то время выполнения таких операций уменьшится в два раза и будет быстрее цикла умножения, а в случае

b = j / 3.0

время, по сраснению с вариантом с b# возрастет процентов на 5 и сравняется с циклом умножения.
Это связано с использованием неявного приведения типов в компиляторе.

AsmLover 21.01.2006 12:49

Вообще говоря, сдвиг не по-любому рулит. Как бы Impersonalisu снова слоган не поменять... Сдвиг рулит на языках, не имеющих нормальной возможности обработки битов, таких как Бейсик.
На ассемблере релизация, например, целочисленного умножения сдвигом и сложением уже не является самой быстрой, хоть и быстрее команды IMUL (14 тактов на P4). Быстрее выполняется команды LEA (4 такта), например вот как выглядит умножение на 9:
lea eax, [eax+eax*8],
и это выполняется быстрее, кстати, (в тактах) на P3, чем на P4. Также можно оптимизировать и одновременное выполнение (4 инструкций для АЛУ P4) RISC-подобное умножение командами MOV и ADD или, с интерливом, плюс LEA. Хотя из описания оптимизации кода под процессоры P4 уже интерлив не упоминается, однако он по-прежнему эффективен, как и для P3. А оптимальным алгоритмом целочисленного умножения ax на bx по-прежнему является:

Для каждого бита слева направо, если бит =1 выполняется
add ebx, eax
add eax, eax,
а если бит =0, то
add eax, eax.

Быстрее этого ничего нет ( разве оптимизация шитого кода, но это уже доступно только самим разработчикам процессоров).

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

Кстати, использование LEA эффективнее по тактам на AMD, чем на P4.

Знание архитектуры процессоров рулит! :super:

Platon 26.12.2006 11:01

Re: Делить нельзя, умножить
 
Вложений: 2
Звиняюсь что поднимаю старую тему, но
Для вещественных переменных обе операции будут равны по скорости, ибо обе идентичны по коду, обе используют FPU (FDIVRP и FMULP)
Для целочисленных переменных в умножении так же используется FPU, а в делении битовый сдвиг, поэтому быстрее выполняется он, но только для целочисленных.

Errthou 26.01.2007 22:18

Re: Делить нельзя, умножить
 
при 30000000 повторах деление стабильно выигрывает у умножения :)
ПС у мну 64битный атлончег :)


Часовой пояс GMT +4, время: 01:34.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot