Анализ сигналов

From
Alex Astafiev (2:5000/228.16)
To
Igor Bury
Date
2003-01-05T02:40:42Z
Area
RU.ALGORITHMS
[skip]


Кэш-промахи это история вообще отдельная.
Так что оставим это за кадром. Имелось в виду просто выполнение по тактам, как
и приведено в документации. Если сильно не устраивает документация, то можете
сами написать короткие подпрограммки на ассемблере где замер выполняется
командой RDTSC в начале перед циклом и в конце. Цикл нужен для интегральной
оценки и для возможности спаривать команды. В целом, да, при интегральной
оценке производительность системы с double по сравнению с float/int32 упадет
именно из-за возросшего обьема данных и промахов кэша. Но у нас речь шла не о
общей системной производительности, а о производительности уже выровненных
закэшированных данных, с полностью загруженной очередью команд и проч.

Экспоненциальные типы на Intel/AMD/Pentium реализованы очень быстро, и
согласитесь,
если бы integer-типы выполняли бы работу float-алгоритмов быстрее, то
вернее всего было бы построить эмулятор FPU и считать все в integer.

Внешняя шина данных (к динамическому ОЗУ) у pentium имеет ширину 64 бита.
только у экзотических Pentium Overdrive ширина внешней шины 32бита.
Видимо вы не застали время, когда появились первые pentium и (какая жалость),
им требовалось ставить всенепременно ДВА модуля памяти Simm, в отличии от 486-х
машин, которым хватало и одного. Модули памяти DIMM стали делать уже 64-битные.

Зря вы пользуетесь GetTickCount(), которая возвращает погоду.
Для измерения точных промежутков времени пригодных для измерения
производительности я бы советовал вам взять на вооружение
QueryPerformanceFrequency() или QueryPerformanceCounter() или напрямую
пользоваться командой
RDTSC, возвращающей в EDX:EAX текущий такт процессора.

Полезно также знать, что экспоненциальные типы загружаясь в FP-регистры
расширяются до необходимой точности и алгоритмы CPU работают с внутренним
представлением. Биты 8 и 9 control word управляют точностью (PC-field)
и соответственно, скоростью вычислений. Для FDIV в зависимости от состяния pc
она варьируется от 19 до 39 тактов (P-I).


И еще возьму на себя смелость посоветовать вот что:
Судя по строке
void __fastcall TForm1::Button1Click(TObject *Sender)
вы пользуетесь Borland C++ Builder.

Так вот, если есть желание выйграть в скорости,
лучше взять на вооружение Microsoft Visual C++, Intel Optimising
C++ Compiler или Open Watcom.   На худой уж конец, GCC.
В отличие от Bilder они строят нормальный быстрый код и с Double....
(Intel Compiler встроит в код prefetch-команды, и несмотря на то что в случае с
double возрастает размер массивов и cache-trashing, это будет скрадено).

Alex Raider/Flash inc.

---
 * Origin: Фидонет - сеть друзей. Будьте дружественнее! (2:5000/228.16)