"Оптимизация для PENTIUM процессора" - читать интересную книгу автораFDIV ; такты 1-39 FXCH ; такты 1-2 CMC ; такты 3-4 RCR EAX,1 ; такт 5 INC EBX ; такт 5 FADD [x] ; такты 38-40 FXCH ; такты 38 FMUL [y] ; такты 40-42 Сначала FXCH спаривается с FDIV, но использует дополнительный такт из=за того, что не сопровождает инструкцию с плавающей точкой. CMC начала бы исполняться сразу после FDIV, но вынуждена ждать окончания FXCH. Инструкции RCR и INC спариваются. Инструкция FADD начинает исполняться в 38 такте, т.к. инструкции с плавающей точкой могут начать перекрытие только в двух последних тактах инструкции FDIV. Следующая инструкция FXCH спаривается с FADD. Инструкция FMUL ждет окончания FDIV, т.к. использует результат ее деления. Если у вас нет выбора и приходиться использовать инструкцию с плавающей точкой после долго исполняемой инструкции типа FDIV или SQRT, то вы можете подставить адрес из памяти и убедиться, что все значения находятся на уровне L1 кеша. Например: FDIV QWORD PTR [EBX] CMP [ESI],EAX FMUL QWORD PTR [ESI] значение ESI в кеш(нам абсолютно не важен результат сравнения). В разделе 21 приведен список полный инструкций с плавающей точкой, а так же отражены их способности спариваться и перекрываться. Особого упоминания требует инструкция FST или FSTP с операндом памяти. Эта инструкция исполняется два такта, но в процессе старта, похоже, начинает конвертировать значение в ST(0), так что один такт конвеер занят и не готов к декодированию. Это полностью аналогично остановке AGI. Пример: FLD [a1] ; такт 1 FADD [a2] ; такты 2-4 FLD [b1] ; такт 3 FADD [b2] ; такты 4-6 FXCH ; такт 4 FSTP [a3] ; такты 6-7 FSTP [b3] ; такты 8-9 FSTP [a3] ждет один такт, поскольку результат FADD [a2] не готов в предыдущем такте. Во многих случаях этого нельзя замаскировать не разбив вычисление на четыре пути или не вставив несколько инструкций после. Никакие другие инструкции не имеют этой странной особенности. Все два такта инструкция FST(P) не может спариваться или перекрываться с другими инструкциями. |
|
|