"Оптимизация для PENTIUM процессора" - читать интересную книгу автораЧередование операций с плавающей точкой здесь работает превосходно: Задержка ы 2 такта между FMUL и FSUBR заполняется FSTP предыдущего результата. Задержка в 3 такта между FSUBR и FSTP заполняется целочисленными операциями обслуги цикла. Остановка AGI анулируется путем чтения единственного параметра в первом такте, после того как счетчик-индекс был увеличен. Данное решение дает нам 6 тактов на операцию, это лучше, чем развернутое решение, представленное Intel! Развертывание циклов с плавающей точкой --------------------------------------- Цикл DAXPY, развернутый в 3 раза весьма усложнился: Пример 12: DSIZE = 8 ; размер данных IF DSIZE EQ 4 SHIFTCOUNT = 2 ELSE SHIFTCOUNT = 3 ENDIF MOV EAX, [N] ; количество элементов MOV ECX, 3*DSIZE ; счетчик смещения JZ L4 ; N = 0 MOV ESI, [X] ; указатель на X SUB ECX, EAX ; (3-N)*DSIZE MOV EDI, [Y] ; указатель на Y SUB ESI, ECX ; указатель конца - смещение SUB EDI, ECX TEST ECX, ECX FLD DSIZE PTR [ESI+ECX] ; первый X JNS SHORT L2 ; менее чем 4 операции L1: ; main loop FMUL DSIZE PTR [DA] FLD DSIZE PTR [ESI+ECX+DSIZE] FMUL DSIZE PTR [DA] FXCH FSUBR DSIZE PTR [EDI+ECX] FXCH FLD DSIZE PTR [ESI+ECX+2*DSIZE] FMUL DSIZE PTR [DA] FXCH FSUBR DSIZE PTR [EDI+ECX+DSIZE] FXCH ST(2) FSTP DSIZE PTR [EDI+ECX] FSUBR DSIZE PTR [EDI+ECX+2*DSIZE] FXCH |
|
|