ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
19 мая
48695 Топик полностью
Ксения (18.01.2006 13:17, просмотров: 1) ответил blackbit на ..раскопал старый букварь в кладовке:
Для FPP на ассемблере писать круто :-) FPP (float point processor) уже давно стал неотъемлемой частью Пентиумов и Атлонов, но сохранил свою стековою архитектуру и все те же 8 регистров. Компиляторы, к сожалению, не умеют использовать стековый механизм на полную катушку, а, тем не менее, использование глубоких регистров FPP для накопления сумм дает огромный выигрыш в призводительности для матричных операций. Посудите сами. Львиную долю там замимают вычисления т.н. скалярных вектоных сумм, а попросту говоря, накопление суммы произведений соответствующих (с одинаковым индексом) элементов двух массивов. На С это выглядит так: long double summa = 0; for (i=0, i<n; i++) summa += A[i]*B[i]; Компилятор не может реализовать операцию +=, поскольку с FPP такое не пройдет (складывать в памяти он не умеет), а накопление суммы в памяти приводит в двум лишним обращениям к памяти для загрузки и выгрузки значения summа. При том, что каждое значение 10-байтное! (накопление сумм требует максимальной разрядности мантиссы). А между тем, хранить сумму внутри FPP мило дело: fldz // загружаем в стек ноль, это и будет стартовая сумма mov ecx, n // устанавливаем счетчик цикла, он будет считать вниз cycle: // метка fld byte ptr [eax] // загружаем в стек *A fmul byte ptr [edx] // умножаем на *B faddp // прибавляем произведение к сумме с выталкиванием второго слагаемого add eax,8 // сдвигаем поинтер A на следующее значение add eвx,8 // сдвигаем поинтер B на следующее значение loop cycle // крутим цикл ret // готово, накопленая сумма лежит на верху стека, где и положено оставлять результат для функций, возвращающих float-значение. Выигрыш по скорости почти на порядок (в 5-9 раз)! Напоминаю, что при умножении двух матриц [m,k] и [k,n] нужно m*n раз вычислять такие суммы на массивах длиной k элементов. К тому же, точность тут максимальная, т.к. FPP не приходится на каждом шаге по нескольку раз преобразовывать рабочий формат числа в стандартный формат хранения чисел в памяти (это приводит к вынужденному округлению - усечению мантиссы). Кроме того FFT (Быстрое Приобразование Фурье) можно при старании делать внутри FPP, не заводя никаких дополнительных переменных. Это тоже дает ускорение в 4-7 раз (чем длиннее массив, тем больше выигрыш). Это может быть полезным для обработки очень длинных массивов (более миллиона элементов) или при работе в РЕЖИМЕ РЕАЛЬНОГО ВРЕМЕНИ, когда, например, требуется фильтровать звук в wav-формате в процессе воспроизведения.