"Оптимизация для PENTIUM процессора" - читать интересную книгу авторапредыдущий FMUL был запущен в предыдущем такте. Однако, вы можете легко
улучшить этот код, просто вставив инструкцию FLD, между другими FMULами: FLD [a1] ; такт 1 FMUL [a2] ; такты 2-4 FLD [b1] ; такт 3 FMUL [b2] ; такты 4-6 FLD [c1] ; такт 5 FMUL [c2] ; такты 6-8 FXCH ST(2) ; такт 6 FSTP [a3] ; такты 7-8 FSTP [b3] ; такты 9-10 FSTP [c3] ; такты 11-12 В других случаях вы можете установить FADD, FSUB или что-нибудь еще между FMUL, чтобы избежать остановки AGI. Перекрытие инструкций с плавающей точкой предполагает, конечно, что у вас есть несколько потоков расчетов, которые вы можете чередовать. Если у вас есть только одна большая формула, то вы можете считать разные ее части параллельно, для того чтобы достичь перекрытия. Если вы хотите сложить, например, 6 чисел, то вы можете разделить этот процесс на две части, по 3 числа, а результаты сложить в конце: FLD [a] ; clock cycle 1 FLD [c] ; clock cycle 3 FADD [d] ; clock cycle 4-6 FXCH ; clock cycle 4 FADD [e] ; clock cycle 5-7 FXCH ; clock cycle 5 FADD [f] ; clock cycle 7-9 (остановка AGI) FADD ; clock cycle 10-12 (остановка AGI) Здесь у нас есть остановка AGI, на один такт, до FADD [f], потому что она ждет результата FADD [d] и два такта остановки AGI перед последним FADD, потому что идет ожидание результата FADD [f]. Последнюю остановку AGI можно замаскировать, вставив несколько целочисленных инструкций, но с первой такой фокус не пройдет, потому что в таком случае не спариться FXCH. Первую остановку AGI можно анулировать, если иметь не две, а три потока, но это будет стоить дополнительного FLD, таким образом мы не выиграем времени и в этом нет необходимости до тех пор пока мы не складываем по крайней мере восемь чисел. Не все инструкции с плавающей точкой могут перекрываться. Но некоторые инструкции с плавающей точкой могут перекрывать последующие инструкции с целым операндом. К примеру инструкция FDIV исполняется 39 тактов. Все первые такты могут перекрываться с целочисленными инструкциями, но только последние два такта могут перекрыть инструкции с плавающей точкой. Пример: |
|
|