Page 1 of 1

Мегатурбо 14МГц в baseconf

PostPosted: 01 Dec 2021, 11:48
by psk7
Как всем известно, у Евы в baseconf есть режим мегатурбы 14МГц. Цикл доступа к памяти занимает 1/7Мгц, т.е. в мегатурбе любое обращение к памяти занимает как минимум 2 14МГц цикла, и требует притормаживания процессора. Отсюда следует, что в этом режиме ускорение работы относительно 7Мгц заметно меньше двух.
Также, ширина шины данных между ПЛИС и памятью 16 бит, т.е. за каждый цикл доступа к памяти ПЛИС получет, помимо затребованного процессором, еще и смежный с ним байт, который, с большой вероятностью, скоро тоже потребуется процессору. Совершенно понятно, что имеет смысл закешировать его и отдать, при необходимости, без тормозящего обращения к памяти.
И такой кеш в Еве есть. Без него коэффициент турбирования 1.38 (по замерам Turbo Test). С ним поднимается до 1.66.
Однако реализован он очень просто, пришедшее 16 битное слово запоминается и, при следующем обращении, байт из него отдается процессору (если конечно адрес требуемого слова совпадает с сохраненным).
Любая запись в память (равно как и обращение к портам и еще в некоторых случаях) инвалидирует этот кеш и приводит к обязательному обращению к памяти в следующем цикле доступа.
Такое решение приводит к некоторым неприятностям. Т.к. в кеш попадают смежные байты - логично предположить, что кеш эффективен именно как кеш инструкций, однако, любая инструкция, работающая с памятью, приводит к вымыванию байта следующей инструкции из кеша, и чтению его из памяти.
Т.е., как минимум, имеет смысл разделить его на кеш инструкций и кеш данных, благо z80 позволяет это сделать.
Такое разделение поднимает коэффициент турбирования (также, по замерам TurboTest) до 1.71.
Также, имеет смысл оптимизировать инвалидацию кеша. Очевидно, что запись в память по адресу слова, не совпадающего с хранимым в кеше, вполне может обойтись и без его инвалидации.
После такой оптимизации некоторые инструкции ускорились настолько, что перестали влезать в окно измерения в TurboTest. Но на 60Гц развертки тест вполне проходит.
Ниже приведена сводная таблица изменения таймингов команд на оригинальной 14МГц мегатурбе и оптимизированном кеше.
Average Turbo Ratio, похоже, считается неправильно в 60Гц развертке.

Устойчивость работы с новым кешем проверена суточным прогоном Вороны под nedoos - ни единого обрыва не зафиксировано.

зы. Подозреваю, что получу от папы Люка ушат известной субстанции, но, думается, ускорение мегатурбы Евы в интересах всех пользователей baseconf.

Code: Select all
TURBO TEST v1.0

                    | nonturbo |  turbo   | turbo |  turbo   |
      Command       | T-states | T-states | ratio | T-states | Δ
                    |          |  14 MHz  |       | 14 MHz   |
                    |          |   dumb   |       | smart    |
                    |          |  cache   |       | cache    |
--------------------+----------+----------+-------+----------+-------------
NOP                 |       04 |     05.0 |  1.59 |     05.0 |
RET cc_false        |       05 |     06.0 |  1.66 |     06.0 |
INC HL              |       06 |     07.0 |  1.71 |     07.0 |
ADD HL,HL           |       11 |     12.0 |  1.83 |     12.0 |
LD A,(HL)           |       07 |     12.0 |  1.16 |     08.0 | -4
LD A,(addr)         |       13 |     21.0 |  1.23 |     21.0 |
LD HL,(addr)        |       16 |     23.0 |  1.39 |     23.0 |
LD A,(IX+disp)      |       19 |     26.0 |  1.46 |     25.0 | -1
POP HL              |       10 |     18.0 |  1.10 |     14.0 | -4
BIT n,(HL)          |       12 |     16.0 |  1.49 |     14.0 | -2
BIT n,(IX+disp)     |       20 |     26.0 |  1.53 |     26.0 |
LD (HL),A           |       07 |     10.0 |  1.39 |     08.0 | -2
LD (addr),A         |       13 |     18.0 |  1.44 |     17.0 | -1
LD (addr),HL        |       16 |     21.0 |  1.52 |     20.0 | -1
PUSH HL             |       11 |     14.0 |  1.57 |     12.0 | -2
LD (IX+disp),A      |       19 |     24.0 |  1.58 |     23.0 | -1
INC (HL)            |       11 |     16.0 |  1.37 |     15.0 | -1
INC (IX+disp)       |       23 |     30.0 |  1.53 |     30.0 |
RLC (HL)            |       15 |     20.0 |  1.49 |     20.0 |
RLC (IX+disp)       |       23 |     30.0 |  1.53 |     30.0 |
EX (SP),HL          |       19 |     24.0 |  1.58 |     23.0 | -1
JR addr             |       12 |     14.0 |  1.71 |     14.0 |
CALL addr           |       17 |     22.0 |  1.54 |     17.0 | -5
LDI                 |       16 |     20.0 |  1.59 |     20.0 |
LDIR                |       21 |     26.0 |  1.61 |     24.0 | -2
IN A,(addr)         |       11 |     14.0 |  1.57 |     14.0 |
OUT A,(addr)        |       11 |     14.0 |  1.57 |     14.0 |
IN A,(C)            |       12 |     14.0 |  1.71 |     14.0 |
OUT (C),A           |       12 |     14.0 |  1.71 |     14.0 |
INI                 |       16 |     04.9 |  6.46 |     18.0 | ?
OUTI                |       16 |     22.0 |  1.45 |     22.0 |
INIR                |       21 |     24.0 |  1.74 |     24.0 |
OTIR                |       21 |     27.1 |  1.60 |     27.1 |
--------------------+----------+----------+-------+----------+-------------

Averaged turbo ratio: 1.67 (v1.0)

Re: Мегатурбо 14МГц в baseconf

PostPosted: 01 Dec 2021, 18:53
by lvd
psk7 wrote:Устойчивость работы с новым кешем проверена суточным прогоном Вороны под nedoos - ни единого обрыва не зафиксировано.

Тут скорее надо гонять разный софт (весь что есть), ведь (теоретически) один и тот же софт может создавать нетривиальные ситуации только конечным числом способов или не создавать вообще (никаких там самомодификаций следующей команды и т.д.).

psk7 wrote:Ниже приведена сводная таблица изменения таймингов команд на оригинальной 14МГц мегатурбе и оптимизированном кеше.
Average Turbo Ratio, похоже, считается неправильно в 60Гц развертке.

Насколько я помню (почти 20 лет назад это было) average это просто среднее по всем измерениям. А калибровка тоже делалась на 60гц? Если на 50 -- будет неточно.

Re: Мегатурбо 14МГц в baseconf

PostPosted: 01 Dec 2021, 19:07
by lvd
psk7 wrote:
Code: Select all
        always @(posedge fclk)
        if( !rst_n )
        begin
-               cached_addr <= 15'd0;
+               //code_cached_addr <= 15'd0;
+               //data_cached_addr <= 15'd0;
        end


Иногда приходится добавлять сброс ненужного просто для того, чтобы потом в симуляции (где все регистры начинают в иксах) эти иксы не распространялись по дизайну. Но в данном случае вроде не это. Хотя если буду симуляцию запускать -- посмотрю )


PS: rev.984

Re: Мегатурбо 14МГц в baseconf

PostPosted: 02 Dec 2021, 00:09
by alone
psk7 wrote:Такое разделение поднимает коэффициент турбирования (также, по замерам TurboTest) до 1.71.

А можешь сделать префетч? На нём всякие ld de:push de будут выполняться с турбой ровно 4x.
Для этого надо помнить ещё одно слово - следующее за текущим прочитанным. Его префетчить на свободных тактах ОЗУ, если оно ещё не прочитано.
Когда процессор обращается к адресу после текущего слова (то есть по адресу префетченного слова), он пользуется уже не текущим, а префетченным, без доступа в ОЗУ, и тогда можно префетчить следующее.

Можно сделать два буфера префетча (примерно соответствует командам и данным, но реально не надо проверять M1, просто иметь два буфера с адресами и обновлять как получится). Но сначала надо с одним. Результат будет сразу видно на sprexamp.

Re: Мегатурбо 14МГц в baseconf

PostPosted: 02 Dec 2021, 12:46
by lvd
Собственно в патче и видна проблема таких вот буферов и префетчей -- расход LE. На каждое слово тратится 32 LE + еще сколько-то на логику. Для префетча есть смысл взять уж сразу блок памяти и разделив его пополам префетчить в него (заодно и записи можно туда писать).
Для экономии LE каждый такой блок имеет базовый адрес кратный 256, указатели внутри блока показывают начало и конец запрефетченного.

Re: Мегатурбо 14МГц в baseconf

PostPosted: 03 Dec 2021, 00:31
by psk7
lvd wrote:Насколько я помню (почти 20 лет назад это было) average это просто среднее по всем измерениям. А калибровка тоже делалась на 60гц? Если на 50 -- будет неточно.


Приложил репорт калибровка 7МГц-50 Гц, тест 14МГц-60Гц. Ерунда получается.
Отчет в 1 посте - там все на 60Гц.

psk7 wrote:Average Turbo Ratio, похоже, считается неправильно в 60Гц развертке.


Тут еще такой момент, в исходном репорте INI обозначена как имеющая кф. 6.48. Если общий кф. считается как среднее (а оно, похоже, так и есть, сложил все калькулятором - получилось 1.68), то кривое значение от INI сильно завышает общий результат. Если принять его кф. как у OUTI, например, получается общее Average Turbo Ratio равно 1.53.
С новым кешем в тесте с 60Гц тест дает более адекватное значение в 1.77.

Похоже, все это время мегатурба работала со средним ускорением в ~1.53, а не в 1.66 (как указано в доке к baseconf), а с кешем вернулись к паспортному значению, но уже более соответствующему реальности.

alone wrote:А можешь сделать префетч? На нём всякие ld de:push de будут выполняться с турбой ровно 4x.


Можно попробовать. Хотя места мало уже. (У меня так и еще меньше, запилил себе личных хотелок в прошивку)

lvd wrote:Собственно в патче и видна проблема таких вот буферов и префетчей -- расход LE. На каждое слово тратится 32 LE + еще сколько-то на логику. Для префетча есть смысл взять уж сразу блок памяти и разделив его пополам префетчить в него (заодно и записи можно туда писать).
Для экономии LE каждый такой блок имеет базовый адрес кратный 256, указатели внутри блока показывают начало и конец запрефетченного.


Смысла городить какой-нибудь ассоциативный кеш похоже нет. Если префетчем на 2 слова удастся выполнить сколь-нибудь длинную линейную последовательность команд без тормоза - уже имеем результат близкий к теоретически максимальному. Да и не влезет он в оставшиеся ~500LE. А если влезет - сожрет все остатки и никакого запаса на будущее.

Попробую сделать префетч, но быстро не обещаю, арбитра просматривал только обзорно.

Есть идея кешировать смежные слова, тогда регистров надо 32 бита(4 байта), 14 бит адреса первого слова и 2 бита валидности 1 и 2 слова. И компаратор нужен только 1 на 14 бит. Ну и на логику еще.

Жаль не взяли в свое время EP1K100, дорогой был или на плату не влезал?

Re: Мегатурбо 14МГц в baseconf

PostPosted: 03 Dec 2021, 20:10
by lvd
psk7 wrote:Смысла городить какой-нибудь ассоциативный кеш похоже нет.

Ну не совсем ассоциативный. Есть базовый адрес блока в 256 байт (8 бит) и 2 смещения в нём -- начало и конец (по 7 бит каждый). Даже бита valid не надо, если конец<начала -- нет валидных данных. Один блок памяти 512 байт (256 слов), делится на область префетча опкодов и данных. Друг другу оно не мешает т.к. всегда разделено по времени (запись только 1 слова за раз, чтение из первого попавшегося блока где совпали адреса).
Почти то же самое что и сейчас -- 15 бит адреса, 16 бит данных и это всё на LE :)

Re: Мегатурбо 14МГц в baseconf

PostPosted: 22 Dec 2021, 20:30
by alone
Что-нибудь получилось с префетчем?