"Оптимизация для PENTIUM процессора" - читать интересную книгу автораFADD [a3] ; такты 7-9
FXCH ST(1) ; такт 7 FADD [b3] ; такты 8-10 FXCH ST(2) ; такт 8 FADD [c3] ; такты 9-11 FXCH ST(1) ; такт 9 FADD [a4] ; такты 10-12 FXCH ST(2) ; такт 10 FADD [b4] ; такты 11-13 FXCH ST(1) ; такт 11 FADD [c4] ; такты 12-14 FXCH ST(2) ; такт 12 В вышеуказанном примере, мы используем три независимых потока. Каждый FADD исполняется 3 такта, так что у нас есть время, чтобы запустить другие FADD. Когда мы запускаем FADD в потоке "a" у нас есть время, чтобы запустить два новых FADD в потоке "b" и с "c", до того как мы вернемся к потоку "a", таким образом все три FADD принадлежат одному потоку. Мы используем инструкцию FXCH, каждый раз, когда нам надо получить регистр, принадлежащий к желаемому потоку ST(0). Как вы можете увидеть в вышеуказанном примере, мы создали неплохой блок, однако не очень хорошо, что FXCH периодически повторяется. Вам придется основательно "поиграться" с компьютером, чтобы всегда знать какой регистр используется. Все виды инструкций FADD, FSUB, FMUL, и FILD исполняются по 3 такта, и могут алгоритм. Операнд адреса не занимает больше времени, чем операнд регистра, если он находиться в кеше L1 и правильно выравнен. Теперь пришло время познакомиться с правилами исключений, препядствующих перекрытиям: Вы не можете запустить инструкцию FMUL, такт спустя после другой инструкции FMUL, поскольку инструкция FMUL не очень хорошо реализована в конвеере. Рекомендуется ставить другую инструкцию между двумя FMUL. Например: FLD [a1] ; clock cycle 1 FLD [b1] ; clock cycle 2 FLD [c1] ; clock cycle 3 FXCH ST(2) ; clock cycle 3 FMUL [a2] ; clock cycle 4-6 FXCH ; clock cycle 4 FMUL [b2] ; clock cycle 5-7 (остановка AGI) FXCH ST(2) ; clock cycle 5 FMUL [c2] ; clock cycle 7-9 (остановка AGI) FXCH ; clock cycle 7 FSTP [a3] ; clock cycle 8-9 FXCH ; clock cycle 10 (неспарено) FSTP [b3] ; clock cycle 11-12 FSTP [c3] ; clock cycle 13-14 У нас получилась остановка AGI после FMUL [b2] и перед FMUL [c2], потому что |
|
|