|
|
| Посл.отвђт | Сообщен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:41local 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! Я тогда действительно не выспался :((( Эту гребаную степень.... |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.063 |