Оцените конструкцию - работает правильно, но есть сомнения в оптимальности, вдруг есть лучший вариант? До распараллеливания: Код (Text): FLD [A] FSUB [X1] FMUL [SCALE] FISTP [iA] FLD [b] FSUB [X1] FMUL [SCALE] FISTP [iB] FLD [C] FSUB [Y1] FMUL [SCALE] FISTP [iC] FLD [D] FSUB [Y1] FMUL [SCALE] FISTP [iD] A, B, C, D расположены в памяти последовательно и недавно считаны в КЭШ, ИМХО рвать цепочки FLD, FSUB не стоит. После распараллеливания: Код (Text): FLD [A] FSUB [X1] FLD [b] FSUB [X1] FLD [C] FSUB [Y1] FLD [D] FSUB [Y1] FXCH ST(3) FMUL [SCALE] ; *A FXCH ST(3) ; вернуть A где взял FXCH ST(2) FMUL [SCALE] ; *B FXCH ST(1) ; B <-> C FMUL [SCALE] ; *C FXCH ST(2) ; сохранять C предпоследней FMUL [SCALE] ; *D FXCH ST(3) ; загнать D на самый верх, чтобы сохранялась последней FISTP [iA] ; сохранять по мере готовности FISTP [iB] FISTP [iC] FISTP [iD] Ещё вызывает сомнение стоит ли заносить [SCALE] в ST(4)? ИМХО он тоже в КЭШ, а заносить\извлекать - две лишние команды.
Тут специально "параллелить" ничего не нужно, т.к. глубина зависимостей всего 2-3 инструкции и планировщик сам прекрасно с этим справляется за счет переупорядочивания. Поэтому достаточно просто исключить лишние загрузки SCALE, X1 и Y1. А у тебя лишние FXCH лишь увеличивают нагрузку на декодер\T-кэш и к тому же подряд идущие fmul на пеньках не есть гуд, т.к. у них througput = 2 такта. Я бы сделал так Код (Text): fld [SCALE] fld [X1] fld [A] fsub st0,st1 fmul st0,st2 fistp [iA] fsubr [b] fmul st0,st1 fistp [iB] fld [Y1] fld [C] fsub st0,st1 fmul st0,st2 fistp [iC] fsubr [D] fmulp st1,st0 fistp [iD]
Теперь можно и подвергнуть код попугаеметрии: Тестер на: http://www.wasm.ru/forum/viewtopic.php?pid=135807#p135807 #59 Вариант: 1 | 2 | 3 PII(266 МГц): 16 | 18 | 14 Celeron(2,8ГГц):17 | 15 | 12 Итого: моё "распараллеливание" (второй столбец) даёт эффект на новом камне и проигрыш на PII Ну а код leo (третий столбец) ес-но вне конкуренции