Друзья, насколько Ваши Асм-коды реально эффективны?

Тема в разделе "WASM.HEAP", создана пользователем UbIvItS, 17 июн 2018.

  1. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    561
    Интересный факт про циклы. Оказывается, выравнивать надо не только адрес цикла на 16, это можно делать не всегда. Но и сам конвейер надо выравнивать. Лишний NOP в цикле, вроде зачем? А чтобы цикл быстрей начинал работать. Проверено. Вот только не понятно, как там на других CPU с большим IPC.

    Кто понял о чём я?
     
  2. algent

    algent Member

    Публикаций:
    0
    Регистрация:
    11 апр 2018
    Сообщения:
    101
    Отсюда:
    https://web.archive.org/web/20150815080935/http://wasm.ru/wault/article/show/1010016 ?
    А пробовали переформатировать цикл, дублируя несколько раз его "тело", чтобы кратно уменьшить кол-во переходов/циклов ?
    И соотв-но, реже перезагружать конвеер.
    Конечно, будет дополнительный расход кэша команд, но если узкое место не в нем, то стоит попробовать.
     
    Последнее редактирование: 19 июн 2021
  3. R81...

    R81... Active Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    141
    по ссылке выше
    1021h DEC ECX
    1022h JNZ LL
    Это при длинных ссылках, а здесь-то

    LoopD LL - его время бывает и "встроено" в цикл, т.е. 0.
    --- Сообщение объединено, 19 июн 2021 ---
    а
    1007h MOV [MEM], 0

    не лучше ли выполнить до цикла.
    --- Сообщение объединено, 19 июн 2021 ---
    И вообще eAx, eSi в цикле не меняются, eDx и eBx только присваиваются, ввод\вывод отображенный на память? Как-то мне не очень нравится этот пример.
     
  4. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    561
    Выравнивание конвейера, это чтобы к началу цикла конвейер должен быть пуст, и к концу так должен быть пуст. Чтобы в начале цикла первые инструкции сразу загрузились, насколько это возможно.
     
  5. algent

    algent Member

    Публикаций:
    0
    Регистрация:
    11 апр 2018
    Сообщения:
    101
    Если по взрослому, оптимизация циклов, попытки выбросить пару команд, это часто бессмысленно.
    Во 1-х, когда много тригонометрии. В последних даташитах где была колонка "количество тактов" в описании команд, sin, cos, log и т.п., вычислялись аж до 130-140 тактов. Эти команды можно выбросить только на уровне математика, но не программиста. И пока FPU будет их считать, всё целочисленное 10 раз отработает.
    Во 2-х, операции с памятью, когда данных нет в кэше. Это бывает когда 10-100 тысяч операций R/W, с большим шагом адреса. Пример такого алгоритма - FFT. В кэш не грузятся отдельные байты/дворды, грузятся только большие блоки - подряд идущие данные. А одиночное чтение даже памяти DDR4, это реально кошмар. Что-то около 10 тактов клока памяти(не проца), одна операция. Динамическая память приемлемо читается/пишется, только бёрстами(burst), т.е. большими блоками. Кстати, в Memtest`е можно видеть соотношение скоростей доступа к регистрам/кэшу/памяти.
     
    R81... нравится это.