· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› x*x или x^2 что быстрее? Весьма принципиально и материально

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Дек 25, 2003 01:49:49

Поспорили тут с преподом. Потребовалось в матлабе возвести дробные числа в квадрат. Написал я "x*x". И состоялся примерно следующий диалог с преподавателем на эту тему:
- Что это такое?
- "х" в квадрате.
- Почему не написал x^2?
- Не знаю, может он ее через логарифмы считать будет как x^n. Все равно, быстрее чем x*x в квадрат не возвести.
- Так и будет возводить как x^n, сопроцессор аппаратно логарифмы считает поэтому так (x^2) будет быстрее, чем так, как ты написал (x*x)
- Наврядли, насколько я помню, сопроцессору придется ведь, как минимум, два действия делать - показательную функцию вычислять и логарифм, чтобы реализовать x^n
- (на всю аудиторию) Молодой человек! Вы вобще в системном программировании чего нибудь понимаете?!! У процессора есть еще конвейер, кеш и т.п.
- А причем тут конвейер? Что вы параллелить то собрались? Ведь в этом случае для следующей инструкции (показательной функции) потребуется результат предыдущей (логарифма).
- ????!!!! Вы что совсем тупой???? Не знаете, как конвейер работает????
- Ну ладно, даже если вы и запараллелите каким то немыслимым образом, все равно, при простом умножении то одна операция, то есть максимум что вы добъетесь - сравняетесь с x*x
- Я больше с вами (ламером) говорить не намерен. Мы с вами говорим на разных языках. Мне вам ничего не доказать. Последнее, что скажу - без сопроцессора быстрее x*x, с сопроцессором x^2, причем напорядок, потому что все делается аппаратно.

Пришел домой, пустил в матлабе цикл толи на 1000000000 толи больше прогонов x*x при x=2.1 Выполнялось примерно 10 секунд. Заменил x*x на x^2. результат - примерно столько же (по крайней мере с тоностью до секунды). Заменил x^2 на x^2.1. Точно такой же цикл. Результат - после 10 минут ожиданий программа все еще считала. Подумалось, что матлаб при компиляции, видя, что степень целая (2) заменил x^2 на умножение x*x. Ну то есть, препод уже, как минимум не прав - x^2 "напорядок" не быстрее, чем x*x. Да и логарифмами считать (о чем свидетельствовало x^2.1) как раз напорядок медленнее.
Хотим, с другом, поспорить с преподом на деньги, хочется услышать мнение профессионалов на этот счет


Дата: Дек 25, 2003 05:20:34

; 6    : 	z = x*x;

	fld	DWORD PTR _x$[ebp]
	fmul	DWORD PTR _x$[ebp]
	fstp	DWORD PTR _z$[ebp]

; 7    : 	z = x*2;

	fld	DWORD PTR _x$[ebp]
	fadd	ST(0), ST(0)
	fstp	DWORD PTR _z$[ebp]


Любопытно :)


Дата: Дек 25, 2003 08:58:44

volodya
Вторая операция должна быть возведение в степень, а не удвоение.


Дата: Дек 25, 2003 10:14:11

Видно Вовка не выспался!


Дата: Дек 25, 2003 12:01:36

GAV_of_ExE
У сопроцессора нет команды возведения в степень. Для вычисления нужно применять всякий изврат.
Так что x*x быстрее x^2 (если MatLab x*x вычисляет как написал volodya).

Я не люблю таких преподов, но думаю с другом, поспорить с преподом на деньги - не самая лучшая идея. Лучше публичное признание ошибки, имхо.

volodya
У меня fadd быстрее fmul.

Дата: Дек 25, 2003 05:20:34
Может и правде не выспался ;)


Дата: Дек 25, 2003 12:13:41

local y	:dword
	mov y, 2
	fild y
	fld x
	fyl2x
	fld st(0)
	frndint
	fsubr st(0),st(1)
	f2xm1
	fld1
	fadd
	fscale

fld x
	fld st(0)
	fmulp st(1), st(0)


Скорость на AMD
1. 236 тактов
2. 21 такт.

Так что пускай твой препод пойдет и застрелится, а перед этим публично извинится. Умные слова типа конвеера мы тоже знаем.


Дата: Дек 25, 2003 12:51:33

masquer
fld st(0)
fmulp st(1), st(0)


Можно чуть быстрее:
fmul st(0), st(0)

Умные слова типа конвеера мы тоже знаем
:)))))))))))))


Дата: Дек 25, 2003 17:24:29

Завтра на деньги пойду с ним спорить (26.12.2003), он сам предлагал, только я решил все проверить.


Дата: Дек 25, 2003 17:35:10

мои результаты: Atlon XP Thorton 2300Mhz (256Kb)

ассемблерная встатвка в Delphi7
x:=2;
asm
pushad
finit
rdtsc
mov ECX,EAX
fld x
fmul st(0), st(0)
rdtsc
sub EAX,ECX
mov k2,EAX

popad
end;
-> среднее время 16 тактов на умножение х*х

если вычислять так
asm
pushad
finit
fstcw p
and p,1111001111111111b
or p,1111011111111111b
fldcw p

fld y
fld x
rdtsc
mov ECX,EAX
//---------------------
fyl2x
fld st(0)
frndint
fsubr st(0),st(1)
f2xm1
fld1
fadd
fscale
//-----------------------------
rdtsc
sub EAX,ECX
mov k2,EAX
popad
end;

-> среднее время 202 тактов на умножение x^2=2^2*log2(x)


Дата: Дек 25, 2003 19:02:17

GAV_of_ExE
Завтра на деньги пойду с ним спорить (26.12.2003), он сам предлагал
Ты это... поаккуратнее там, тебе же еще учиться :), а то будешь в армии прапору про сопроцессор рассказывать :))

Кстати, делфя для целых степеней считает так:
function IntPower(Base: Extended; Exponent: Integer): Extended;
asm
        mov     ecx, eax
        cdq
        fld1                      { Result := 1 }
        xor     eax, edx
        sub     eax, edx          { eax := Abs(Exponent) }
        jz      @@3
        fld     Base
        jmp     @@2
@@1:    fmul    ST, ST            { X := Base * Base }
@@2:    shr     eax,1
        jnc     @@1
        fmul    ST(1),ST          { Result := Result * X }
        jnz     @@1
        fstp    st                { pop X from FPU stack }
        cmp     ecx, 0
        jge     @@3
        fld1
        fdivrp                    { Result := 1 / Result }
@@3:
        fwait
end;


Дата: Дек 25, 2003 19:17:58

GAV_of_ExE

ты неправильно меряешь rdtsc. Выполни поиск по форуму. Типичная ошибка - неочищенный кеш. Либо
xor eax, eax
cpuid
rdtsc


либо
rdtsc
rdtsc 


Дата: Дек 25, 2003 19:19:13

q_q
Zoda

ХТО ТУТ НЕ ВЫСПАЛСЯ, А???? :)))))
Сказано, что быстрее - x*x или x^2!!! Я это в компилер загнал и посмотрел!


Дата: Дек 25, 2003 19:43:08

А разве второе помогает?
Имхо, сколько их в ядро ни пихай, сериализации не будет...


Дата: Дек 25, 2003 19:54:52

А у тебя что написано? Фактически х*2 а не х^2...


Дата: Дек 26, 2003 19:14:34

FUCK! Я тогда действительно не выспался :((( Эту гребаную степень....

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.063