Архитектура компьютераТройственная буферизация стека.

В своих троичных ЭВМ линии "Сетунь" разработчиками предложен принцип двухстэковой архитектуры. Ключевым элементом этой архитектуры ЭВМ является область памяти, обращение к которой возможно по принципу FIFO, так называемый стэк. Логично предположить, что увеличение скорости обращений к такой памяти увеличит общую эффективность подобных (да и вобще любых, использующих стэки) ЭВМ.

Как реализовывать стэк? Практически всегда это линейно адресуемая память, плюс указатель текущего положения вершины стэка. Указатель вершины - это всегда один из регистров процессора, скорость обращения к нему не повысишь. А вот скорость обращения к линейно организованной памяти, используемой в режиме FIFO, можно повышать следующим образом:
1. пусть память у нас разбита на участки размером в одну строку процессорного кэша ОЗУ
2. в кэше стэка отводим место под три таких участка
3. всегда являются закэшированными (но не всегда уже сброшенными в ОЗУ) используемая сейчас страница и предыдущая страница, заполненная данными стэка последней.

Например, пусть в кэше есть три области: A,B,C. Объём каждой строки кэша – 10 байт.
Сейчас указатель вершины стэка имеет значение 82. Состояние областей стэка в самом простом случае может быть таким:
A – адреса памяти 60..69 (заполнена предпоследней, данные этой области кэша уже отосланы в ОЗУ)
B – адреса памяти 70..79 (заполнена последней, данные этой области кэша отсылаются в ОЗУ сейчас)
C – адреса памяти 80..89 (текущая страница кэша, ещё не заполнена, отсылать в ОЗУ пока не нужно).

Пока указатель стэка находится в пределах адресов 80..89 механизму кэширования ничего делать не нужно.
Если текущая страница заполнилась до адреса 89 и исполняемая команда пытается поместить в стэк новые данные, то:
1. предпоследняя страница (в нашем случае это будет страница A) делается текущей и используется для кэширования адресов 90..99,
2. последняя страница (в нашем случае – B) становится предпоследней, к этому моменту она будет либо уже скопирована в ОЗУ, либо будет продолжать копироваться,
3. cтраница, только что бывшая текущей, (страница C) становится последней и должна начаться отсылка её содержимого в ОЗУ (возможно – после завершения отсылки в ОЗУ страницы B).

Если команды, исполняемые процессором, исчерпали содержимое страницы C (указатель вершины равен 80 и команда требует следующий элемент из стэка), то:
1. текущей делается страница, бывшая перед этим последней (в нашем случае - B),
2. последней становится страница, бывшая перед этим предпоследней (в нашем случае - A),
3. страница, освободившаяся от текущих данных стэка (в нашем случае – C) становится предпоследней и должна начать обмен с памятью, чтобы закэшировать адреса, предшествующие последней странице (в нашем случае – адреса 50..59).

Если размер страницы (строки кэша) будет выбран так, что обмен данными этого объёма с памятью может быть осуществлён не медленнее, чем самое быстрое заполнение такой страницы результатами работы процессора, то такое использование позволит полностью исключить ожидание очередной страницы памяти из ОЗУ. Правда будет труднореализуемо и вряд ли целесообразно. Думаю, правильнее будет стремиться, чтобы время обмена одной страницей с памятью было не больше типичного времени заполнения одной страницы данными стэка.

kvas,

Мнения

  • 001Андрей Куликов

    FIFO - это регистр сдвига, а стек - это LIFO (Last In First Out)
    (Википедия. Стек http://ru.wikipedia.org/wiki/LIFO).

    • 002kvas

      Согласен, лажанулся. Имелось в виду именно LIFO. Спасибо за поправку.

      • 004Alexander ObukhovТринари

        Бывает, главное что все поняли что стек :)

  • 003Alexander ObukhovТринари

    Идея здравая.

    Ещё отмечу что современные процессоры идут с внушительными объёмами внутренней памяти,
    так что стек вполне может уместиться внутри процессора, а следовательно обеспечит
    наибольшую скорость работы.