"Оптимизация для PENTIUM процессора" - читать интересную книгу автора FSTP DSIZE PTR [EDI+ECX+DSIZE]
FLD DSIZE PTR [ESI+ECX+3*DSIZE] FXCH FSTP DSIZE PTR [EDI+ECX+2*DSIZE] ADD ECX, 3*DSIZE JS L1 ; цикл L2: FMUL DSIZE PTR [DA] ; завершение leftover операции FSUBR DSIZE PTR [EDI+ECX] SUB ECX, 2*DSIZE ; изменяем указатель смещения JZ SHORT L3 ; завершено FLD DSIZE PTR [DA] ; старт следующей операции FMUL DSIZE PTR [ESI+ECX+3*DSIZE] FXCH FSTP DSIZE PTR [EDI+ECX+2*DSIZE] FSUBR DSIZE PTR [EDI+ECX+3*DSIZE] ADD ECX, 1*DSIZE JZ SHORT L3 ; завершено FLD DSIZE PTR [DA] FMUL DSIZE PTR [ESI+ECX+3*DSIZE] FXCH FSTP DSIZE PTR [EDI+ECX+2*DSIZE] FSUBR DSIZE PTR [EDI+ECX+3*DSIZE] ADD ECX, 1*DSIZE L3: FSTP DSIZE PTR [EDI+ECX+2*DSIZE] L4: Причина, почему я показываю вам развертывание цикла в 3 раза - не рекомендация, а предупреждение как это трудно! Будьте готовы затратить значительное время на отладку и проверку кода, прежде чем получите что-то похожее на это. Есть несколько проблем, о которых придется заботиться: В большинстве случаев вам не удастся удалить все потери таков из кода с плавающей точкой, развернутого менее, чем в 4 раза (т.е. есть незаконченные операции в конце, которые будут завершены в следующей итерации). Последний FLD, в конце основного цикла продолжается в начале следующем проходе. Искушает решение читающее за концом цикла, а затем отвергающее дополнительную величину, как в примерах 9 и 10, но это не рекомендуется в циклах с плавающей точкой, потому что чтение дополнительного значения может привести к генерации исключения неверного операнда, если за данные концом массива не вписываются в стандарт плавающей точки. Что бы избежать этого мы должны делать по крайней мере еще одну операцию за пределами основного цикла. Количество операций, которые надо совершить за пределами развернутого цикла равно остатку от деления N на R, где N - количество операций, а R - фактор развертывания. Но в случае свернутого(с незаконченной операцией) цикла мы должны делать еще одно, т.е. остаток от деления (N-1) на R + 1, по вышеупомянутой причине. По идее, мы должны бы предпочесть выполнить дополнительные операции перед основным циклом, но здесь мы должны делать их после по двум причинам: Во-первых мы должны позаботиться о незавершенном операнде leftover. Во-вторых |
|
|