А ты ждал чудес?
Хотел понять - почему?
для этого изучай асмовый листинг.
По тактам на каждую машинную операцию. В кларе это 41 такт.
Точно? Ты точно уверен что на P4 эта операция занимает столько-то тактов, на P2 - столько-то, а на атлоне - вот столько?
Модифицируй свой код примерно так (эквивалент real1=real1*real2)
Мы - толпа придурков из 2-х человек
Всё очень просто:
d2 = d1 * d; -- первый цикл
d1 = d1 * d; -- второй
1. time taken: 11.086000, approx. speed is 193.711316 MOps/sec
2. time taken: 204.975000, approx. speed is 10.476808 MOps/sec
Щас глупость спрошу: у сопроцессора есть кеш?
В первом случае идет умножение 2-х констант, которые а) могут осесть в кеше сопроцессора и б) не так уж сложны, чтобы сопр их быстренько умножил.
Во 2-м случае идет постоянное изменение 2-го множителя, что может давать большее чем для 1-го случая время умножения.
Дико стыдно, что не знаю особенностей архитектуры процов после 386-го, может кто раскритикует предположение?
То есть, может ли fmul отработать быстрее, чем ее максимальное время, или эта и все другие операции занимают константное число тактов сопра невзирая на операнды?
Хм, а я так и не понял, как подключать АСМ к кларе.
В смысле компилится всё нормально, а вот как заставить это работать - непонятки. Примерчик нужен или внятное объяснение.
Я имел в виду - написать библиотеку нужных алгоритмов на чем-то кроме клары, если уж хочется экспериментов. И линковать ее к проекту.
Неее, так глубоко я не лезу. Хотя и перечитал всё что можно найти в инете по поводу оптимизации кода, но конкретных предложений как сделать быстро целое=вещ. так и не нашёл
Я не о том. Я о том, что ты: а) знаешь свой код и б) предполагаешь, _какие_
именно данные _чаще_ всего будут поступать на вход твоему алгоритму. И,
соответственно, сможешь оптимизировать алгоритм (на уровне логики) так, чтобы в _большинстве_ случаев он давал выигрыш по сравнению с изначальным вариантом.
--
Best regards,
Maxim Yemelyanov
(Добавление)
Точно? Ты точно уверен что на P4 эта операция занимает столько-то тактов, на P2 - столько-то, а на атлоне - вот столько?
У меня П-4. Другие операции, например real=long, почти точно соответствуют расчёту. Такты считал по таблице для П-3. Для П-4 не нашёл так запросто.
Предполагаю, что если и будет расхождение, то в лучшую сторону.
Если не трудно, пришли мне АСМ-код этих двух циклов - поглазею ещё
Как насчет кода?
Мы - толпа придурков из 2-х человек
Хм, навеяло: "На груди его могучей три волоска толпились кучей"
1. time taken: 11.086000, approx. speed is 193.711316 MOps/sec
2. time taken: 204.975000, approx. speed is 10.476808 MOps/sec
О! И я о том же! А почему? Кто б просвятил...
Кстати, а чегой-то у тебя цифры резко вниз пошли?
Вроде было 331, а теперь 193?
Щас глупость спрошу: у сопроцессора есть кеш?
Насколько я понял у процессора (вообще) есть кеш, куда он блоками загоняет код и данные из опер.памяти по мере необходимости.
С ним работают как процессор так и сопроцессор.
В первом случае идет умножение 2-х констант, ...
Не-а, насколько я понял!
Идет именно перемножение двух вещ.переменных (блоков памяти по 8 байт).
... которые а) могут осесть в кеше сопроцессора и
б) не так уж сложны, чтобы сопр их быстренько умножил.
А ему до лампочки какие перемножать
Внутри он всегда работает с вещ. расширенного типа (80 бит).
Во 2-м случае идет постоянное изменение 2-го множителя, что может давать большее чем для 1-го случая время умножения.
Не-а. Код (по крайней мере в кларе!) абсолютно один и тот же, кроме адресации памяти.
То есть, может ли fmul отработать быстрее, чем ее максимальное время, или эта и все другие операции занимают константное число тактов сопра невзирая на операнды?
В данном случае неважно. Т.к. если машинные операции могут (а некоторые могут) перекрываться другой операцией, то это только убыстрит время работы (за счет параллельного выполнения) от простого расчёта по тактам.
Я имел в виду - написать библиотеку нужных алгоритмов на чем-то кроме клары, если уж хочется экспериментов. И линковать ее к проекту.
А я о чём? Ну написал я что-то на АСМе, а дальше что? Как это дело использовать в кларе?
И, соответственно, сможешь оптимизировать алгоритм (на уровне логики) так, чтобы в _большинстве_ случаев он давал выигрыш по сравнению с изначальным вариантом.
Свой код я знаю. И оптимизирую в меру сил и возможностей.
Но иногда упираешься в то, что не в моей власти. Как в данном случае.
Сергей
А я о чём? Ну написал я что-то на АСМе, а дальше что?
Как это дело использовать в кларе?
Да очень просто!
Пишешь исходник на ASM-е, даешь ему расширение .A
Болванка исходника:
Код: Выделить всё
module MyAsmLib (* Начало модуля *)
segment SUPPORT_TEXT(CODE,48H)
(* ----------------- *)
public MyFunc1: (* Обьявление процедуры *)
(* ----------------- *)
ret near 0 (* Конец процедуры MyFunc1 *)
end (* Конец модуля *)
Только сразу предупреждаю - у Клары несколько свое,
отличное от стандарта, понимание ASM-кода!
Так что - прийдется много ручками адаптировать.
А некоторые операторы вообще записывать прямо в виде кода!
К примеру, простенькая процедура сохранения текущих
значений регистров:
(* ---------------------------------------------- *)
public SaveRegs: (* (LONG _AddrSaveArray),LONG *)
(* ---------------------------------------------- *)
cmp ax,0
je DoRet
push di
mov di,ax
pop ax
dw 01F89H (* mov [edi],ebx *)
add di,4
dw 00F89H (* mov [edi],ecx *)
add di,4
dw 01789H (* mov [edi],edx *)
add di,4
dw 03789H (* mov [edi],esi *)
add di,4
dw 00789H (* mov [edi],eax *)
push di
mov di,ax
pop ax
DoRet:
ret near 0
На Кларионе эта процедура обьявляется просто:
Код: Выделить всё
MAP
SaveRegs(STRING _Regs),LONG,PROC,RAW,NAME('SaveRegs')
END
Кстати, если заметил, вместо EAX и т.д. Клара понимает только обычную форму AX/BX...
После написания A-модуля цепляешь его в проект к нужной проге и в MAP-секции прописываешь нужные прототипы. И все!
Как видишь - проблем практически никаких!
Основная проблема - правильно написать сам ASM-код так, что-бы Кларин компилятор его смог обработать!
=============================
С уважением,
Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru
Написал: ClaList(2)