User Tag List

Показано с 1 по 10 из 136

Тема: HWYENC

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    07.01.2016
    Адрес
    г. Москва
    Сообщений
    27
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    6
    Поблагодарили
    4 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от MacBuster Посмотреть сообщение
    Ну почему, если не привязываться к архитектуре, то выполнение только команд процессора сводится к использованию индексной адресации и последовательнстям действий типа:
    При портировании с Z80 несколько проблем:
    1) неоптимальный доступ к памяти, потому что на исходном процессоре адресация в основном байтовая или словная невыровненному адресу. Особенно это печально при байтовой записи в память: разработчики процессора ВМ2 решили не делать цикл DATAOB и MOVB вместо одного цикла доступа к шине делает два (DATAI - modify byte - DATAO). Накладные расходы при загрузке байта в регистр (знаковое расширение, что решается, например, комбинацией CLR Rn/BISB src, Rn). Тут же чтение/запись слова по невырвненному адресу (MOVB ea -> SWAB -> MOVB ea+1): особенно печальна запись -- из-за отсутствия DATAOB на шине будет четыре цикла вместо двух + плюс фетчинг и декодинг трёх-четырёх команд вместо одной.
    2) косвенная адресация при обращении к видеобуферу и такие же проблемы с байтовой адресацией.
    3) команды блочного копирования LDIR сотоварищи
    Z80 реально фетчит и декодирует каждый раз (пока BC != 0) LDIR и затем выполняет два шинных цикла, то есть LDIR выглядит для исполнительно устройства как (READ BUS <fetch LDIR>, <decode/exec LDIR>, READ BUS, WRITE BUS) x N.
    если заменять это просто на
    Код:
    MOVB (Rs)+, (Rd)+
    SOB Rc, . - 2
    то это будет неоптимально и с точки зрения доступа к памяти (отстутствие цикла DATAOB) и с точки зрения выполнения: каждый раз выполняется ещё и SOB, который по времени составляет приблизительно треть от MOVB. Тут поможет аккуратный loop unrolling и, если заведомо известно выравнивание адресов или возможность его изменить, замена MOVB на MOV.
    Например, тупое
    Код:
    ; Rc = Rc / 2
    1$: 
    MOVB (Rs)+, (Rd)+
    MOVB (Rs)+, (Rd)+
    SOB Rc, 1$
    Даст прирост процентов на 20 (в зависимости от ситуации). Если ещё на x2 unroll'ить, то ещё 10-15% можно отыграть, x8 unroll даст почти 1.5 раза прироста по сравнению с x1. А если есть возможность заменить на MOV (Rs)+, (Rd)+ то почти в два раза сразу.


    Никита проделал офигительный объём работы, стоит ему отлить памятник только потому, что оно вообще работает. Дело то за малым: берём исходники и модифицируем код, чтобы логика осталась прежней, а код был оптимален с точки зрения целевого процессора. =)

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •