ПО, ЭВМ и АСУ из Таможенного Союза

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » кодогенерация для ЦП (CPU) » Оптимальное число регистров для хранения промежуточных значений выраже


Оптимальное число регистров для хранения промежуточных значений выраже

Сообщений 1 страница 6 из 6

1

Собственно, для хранения промежуточных значений выражений, используется регистровый стэк. Просто он состоит всего из трех регистров (eax, ecx, edx) или (rax, rcx, rdx). Когда свободные регистры заканчиваются, регистр, который находится на дне регистрового стэка заносится в программный стэк, а остальные сдвигаются на одну позицию и компилятор запоминает, что один операнд находится в программном стэке. Есть кое-какие нюансы, но в общем, идея понятна.

Но так было не всегда. Сначала было шесть регистров: eax, ecx, edx, ebx, esi, edi. Но регистры в x86 неравноценны: eax, ecx, edx, ebx включают в себя 8- и 16-битные части (al, cl... ax, cx...), a esi и edi единые и неделимые. Некоторые операции требуют именно 8- или 16-битный регистр в качестве операнда. Это конечно не проблема, но всё же, это обстоятельство несколько усложняет компилятор. Я попробовал отключить регистры esi и edi -- скорость выполнения тестовых программ не изменилась. Регистр ebx по соглашению stdcall требуется сохранять перед использованием и восстанавливать после. Это неудобно, и я отключил еще и ebx. Скорость уменьшилась на 5%. Ради интереса, я отключил еще и edx, оставив только eax и ecx. И только после этого производительность заметно просела. Я сделал вывод, что оптимальное число регистров для хранения промежуточных значений выражений - 4 (можно 3). Поэтому, я решил не усложнять компилятор, использовать регистровый стэк из трех регистров. Остальные регистры зарезервированы и теоретически могут быть использованы под хранение переменных (но с этим пока сложно).

соотв. тема (собственный рабочий компилятор для Оберона)
Выход под FASM.

Отредактировано MihalNik (2018-12-21 12:40:39)

0

2

Вообще регистров довольно много (16 штук для x86_64), достаточно почитать описание Linux ABI на тему как они используются).
Нельзя сказать, что их всего три, и что этим надо ограничиться.

Я бы свёл всё к задаче оптимизации. Есть регистры, есть кеши, есть память, есть диск. Нужно оптимизировать использование всего, в том числе и всей наиболее быстрой памяти. Если часть регистров не используется - значит аппаратура просто была куплена зря и простаивает. Точнее не куплена зря, а виноват автор компилятора, что не использует регистры.

Отредактировано Лис (2018-12-21 13:55:37)

0

3

Лис написал(а):

Вообще регистров довольно много (16 штук для x86_64), достаточно почитать описание Linux ABI на тему как они используются).
Нельзя сказать, что их всего три, и что этим надо ограничится.

Я бы свёл всё к задаче оптимизации. Есть регистры, есть кеши, есть память, есть диск. Нужно оптимизировать использование всего, в том числе и всей наиболее быстрой памяти. Если часть регистров не используется - значит аппаратура просто была куплена зря и простаивает. Точнее не куплена зря, а виноват автор компилятора, что не использует регистры.

Отредактировано Лис (Сегодня 10:31:14)

Надо сравнить цены и производительности машин с разным числом регистров.
И стоимость разработки компиляторов: использующего 3-4 регистра (имеющихся практически в любой машине) и полностью всего набора возможностей конкретной архитектуры.
К тому же Лис не учитывает, что сотруднику надо платить и последовательно эффективно его загружать, а также потери прибыли от временных задержек (наверняка выгоднее скорее запустить менее эффективный компилятор, а потом заниматься его оптимизацией).

Отредактировано MihalNik (2018-12-21 14:02:42)

0

4

MihalNik
Большинство процессоров имеет 16 регистров и более. AMD64, ARM, RISC, MIPS, PIC
Более того в каждом втором встроен блок переименования регистров.

MihalNik написал(а):

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

О каких мифических задержках вы толкуете? Любой сложные проект, а компилятор является таковым начинается с планирования. Так вот большинство крупных игроков выбрали LLVM в качестве оптимизатора. Ибо разделение труда.  Они  берут готовый блок ещё на стадии проектирования, а не пишут оптимизатор с изного.

0

5

Павиа написал(а):

MihalNik
Большинство процессоров имеет 16 регистров и более. AMD64, ARM, RISC, MIPS, PIC
Более того в каждом втором встроен блок переименования регистров.

И что? Написано, что дает 70-80% производительности от ст. Оберона, это с половину от Сей. И смысл парить голову кучей остальных регистров или LLVM, когда может дешевле взять вдвое больше ядер/процессоров?
И да, тут еще куча тем, как быстро написать ассемблер/компилятор.

Павиа написал(а):

Любой сложные проект, а компилятор является таковым начинается с планирования.

Что мешает сделать простой?

Павиа написал(а):

Так вот большинство крупных игроков выбрали LLVM в качестве оптимизатора.

О каких крупных игроках речь, где Вы их тут видели?

Начало GCC было положено Ричардом Столлманом, который реализовал первый вариант GCC в 1985 году на нестандартном и непереносимом диалекте языка Паскаль

Отредактировано MihalNik (2018-12-21 18:01:41)

0

6

MihalNik написал(а):

Что мешает сделать простой?

Дык ничего не мешает. Распределение регистров это 1-3 функции от силы. По сравнению с остальными задачами это мелочь.

MihalNik написал(а):

И смысл парить голову кучей остальных регистров или LLVM, когда может дешевле взять вдвое больше ядер/процессоров?

Есть задачи которые относятся к трудно распаралеливаемым. Это значит что они либо вовсе не паралелятся либо на 2-х кратный прирост надо 4 процессора, на 4 кратный 16 процессоров.

Регистрами в основном парятся энерго-эффективные контролёры. Но сейчас за счёт тонких норм STM позволяет выполнять 10-100 Мгц и не парится.

А если говорить про простой компилятор. То у меня 2 регистра для стека(вводные и локальные переменные) и 1 регистр на цикл и 4 регистров для всего остального.
база+ смещение+разыменование и регистр для правой части.

0


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » кодогенерация для ЦП (CPU) » Оптимальное число регистров для хранения промежуточных значений выраже