Распараллеливание FPU команд

Тема в разделе "WASM.BEGINNERS", создана пользователем Y_Mur, 27 сен 2006.

  1. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Оцените конструкцию - работает правильно, но есть сомнения в оптимальности, вдруг есть лучший вариант?
    До распараллеливания:
    Код (Text):
    1. FLD   [A]
    2. FSUB  [X1]
    3. FMUL  [SCALE]
    4. FISTP [iA]
    5. FLD   [b]
    6. FSUB  [X1]
    7. FMUL  [SCALE]
    8. FISTP [iB]
    9. FLD   [C]
    10. FSUB  [Y1]
    11. FMUL  [SCALE]
    12. FISTP [iC]
    13. FLD   [D]
    14. FSUB  [Y1]
    15. FMUL  [SCALE]
    16. FISTP [iD]
    A, B, C, D расположены в памяти последовательно и недавно считаны в КЭШ, ИМХО рвать цепочки FLD, FSUB не стоит.
    После распараллеливания:
    Код (Text):
    1. FLD   [A]
    2. FSUB  [X1]
    3. FLD   [b]
    4. FSUB  [X1]
    5. FLD   [C]
    6. FSUB  [Y1]
    7. FLD   [D]
    8. FSUB  [Y1]
    9. FXCH  ST(3)
    10. FMUL  [SCALE]   ; *A
    11. FXCH  ST(3) ; вернуть A где взял
    12. FXCH  ST(2)
    13. FMUL  [SCALE]   ; *B
    14. FXCH  ST(1) ; B <-> C
    15. FMUL  [SCALE]   ; *C
    16. FXCH  ST(2) ; сохранять C предпоследней
    17. FMUL  [SCALE]   ; *D
    18. FXCH  ST(3) ; загнать D на самый верх, чтобы сохранялась последней
    19. FISTP [iA]  ; сохранять по мере готовности
    20. FISTP [iB]
    21. FISTP [iC]
    22. FISTP [iD]
    Ещё вызывает сомнение стоит ли заносить [SCALE] в ST(4)? ИМХО он тоже в КЭШ, а заносить\извлекать - две лишние команды.
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Тут специально "параллелить" ничего не нужно, т.к. глубина зависимостей всего 2-3 инструкции и планировщик сам прекрасно с этим справляется за счет переупорядочивания. Поэтому достаточно просто исключить лишние загрузки SCALE, X1 и Y1. А у тебя лишние FXCH лишь увеличивают нагрузку на декодер\T-кэш и к тому же подряд идущие fmul на пеньках не есть гуд, т.к. у них througput = 2 такта.
    Я бы сделал так
    Код (Text):
    1. fld [SCALE]
    2. fld [X1]
    3. fld [A]
    4. fsub st0,st1
    5. fmul st0,st2
    6. fistp [iA]
    7. fsubr [b]
    8. fmul st0,st1
    9. fistp [iB]
    10. fld [Y1]
    11. fld [C]
    12. fsub st0,st1
    13. fmul st0,st2
    14. fistp [iC]
    15. fsubr [D]
    16. fmulp st1,st0
    17. fistp [iD]
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Спасибо
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Теперь можно и подвергнуть код попугаеметрии:
    Тестер на: 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 :dntknw:
    Ну а код leo (третий столбец) ес-но вне конкуренции :)