"Оптимизация для PENTIUM процессора" - читать интересную книгу автораЕсли искомое значение не ноль, то вы можете использовать XOR для всех
четырех байт, значением, которое вы хотите найти, а затем использовать вышеизложенный метод. Обработка нескольких операндов в одном регистре проще на MMX процессорах, где для этого есть специальные инструкции и специальные 64 битные регистры. Однако при использовании MMX инструкций можно получить большие задержки, если после них вы используете инструкции с плавающей точкой, таким образом, возможно, вы захотите использовать 32 бинтые инструкции. Циклы с операциями с плавающей точкой ------------------------------------- Методы, оптимизации таких циклов базируются на оптимизации обычных циклов, с целочисленными инструкциями, хотя инструкции с плавающей точкой перекрываются, а не спариваются. Рассмотрим код языка C: int i, n; double * X; double * Y; double DA; for (i=0; i Эта часть кода (называемая DAXPY) изучается специально потому, что это ключ к решению линейных уравнений. Пример 11: MOV EAX, [N] ; количество элементов MOV ESI, [X] ; указатель на X MOV EDI, [Y] ; указатель на Y XOR ECX, ECX LEA ESI, [ESI+DSIZE*EAX] ; указатель на конец X SUB ECX, EAX ; -N LEA EDI, [EDI+DSIZE*EAX] ; указатель на конец Y JZ SHORT L3 ; проверка N = 0 FLD DSIZE PTR [DA] FMUL DSIZE PTR [ESI+DSIZE*ECX] ; DA * X[0] JMP SHORT L2 ; переход в цикл L1: FLD DSIZE PTR [DA] FMUL DSIZE PTR [ESI+DSIZE*ECX] ; DA * X[i] FXCH ; берем старый результат FSTP DSIZE PTR [EDI+DSIZE*ECX-DSIZE] ; сохраняем Y[i] L2: FSUBR DSIZE PTR [EDI+DSIZE*ECX] ; вычитаем из Y[i] INC ECX ; увеличиваем индекс JNZ L1 ; цикл FSTP DSIZE PTR [EDI+DSIZE*ECX-DSIZE] ; сохраняем последний результат L3: Здесь мы используем те же методу, что и в примере 6: Используем счетчик цикла в качестве индекса и ведем счет через отрицательные значения вплоть до нуля. Конец одной операции перекрывается с началом другой. |
|
|