Обсуждение:Эльбрус/архитектура: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
Строка 26: Строка 26:
   
   
  -- Alexander Troosh в e2k_chat
  -- Alexander Troosh в e2k_chat
== Предикаты ==
<pre>
{
    pass %pred0, @p0
    pass %pred1, @p1
    andp @p0, @p1, @p4
    pass @p4, %pred0
}
</pre>
Это всё 1 слог PLS. В ШК может быть до 3 таких слогов. Эквивалентно следующему:
p0 = load %pred0
p1 = load %pred1
p4 = p0 && p1
store p4 to %pred0
@pM (где M от 0 до 6) это локальный предикат для логических операций.
pass %predN, @pM — чтение предикатного регистра N в локальный предикат M.
pass @pM, %predN — запись локального предиката M в предикатный регистр N.
Номера локальных предикатов жёстко прибиты к PLS.
PLS0
* Читает предикатные регистры в @p0 и @p1.
* Результат логической операции сохраняется в @p4.
* Пишет @p4 в предикатный регистр.
PLS1
* Читает предикатные регистры в @p2 и @p3.
* Результат логической операции сохраняется в @p5.
* Пишет @p5 в предикатный регистр.
PLS2
* Не может читать предикатные регистры.
* Результат логической операции сохраняется в @p6.
* Пишет @p6 в предикатный регистр.
Логические операции могут читать @p0, @p1, @p2 и @p3 без каких либо ограничений. Читать результат другой логической операции можно только при определённых условиях.
Например в таком случае.
<pre>
{
    ! PLS0
    pass %pred0, @p0
    pass %pred1, @p1
    andp @p0, @p1, @p4
    pass @p4, %pred4
   
    ! PLS1
    pass %pred2, @p2
    pass %pred3, @p3
    andp @p2, @p3, @p5
    pass @p5, %pred5
   
    ! PLS2
    andp @p4, @p5, @p6 ! результаты пред. лог. операций
    pass @p6, %pred6
}
</pre>
-- numas13 в e2k_chat

Версия от 10:31, 12 марта 2021

выравнивание

На до E2Kv5 достаточно, чтоб выравнивание адресов было на 8.
А для E2Kv5 и для E2Kv6 – 16. Да и у E2Kv7 изменений не планируется,
регистры там останутся 128-битными.

В общем, делайте выравнивание на 16 – не ошибётесь.

Если в исходниках работают с 256 и 512 битными регистрами AVX, то выравнивание
там должно быть 32 и 64 соответственно, - так и оставляйте это (вряд ли будет
лучше, если уменьшить до безопасных 8 или 16 для эльбрусов).

(вроде компилятору нужно еще постараться задать выравнивание более 16, что-то
там в ir мало бит под это свойство отвели – переделывать накладно/лень, пока
никто не занялся убежать в важности этого, точнее бага была, но бодаться было лень).

А так невыровненные обращения e2k переживёт, это не спарк... Одно на кластер
в широкой команде ещё нормально и почти даром, а дальше очень большие штрафы
были у e2k до 4 версии включительно (до полусотни тактов). В пятой начали это
улучшать, в 6й должно быть совсем хорошо.

Проблема в то, что компилятор лепит обращения к памяти в широкой команде как
получается, он не следит за возможными невыровненными обращениями и часто просто
не имеет такой информации. (Как-то предлагалось поддержать атрибут __unaligned
как у Microsoft, да как-то не прижилось).

-- Alexander Troosh в e2k_chat

Предикаты

{
    pass %pred0, @p0
    pass %pred1, @p1
    andp @p0, @p1, @p4
    pass @p4, %pred0
}

Это всё 1 слог PLS. В ШК может быть до 3 таких слогов. Эквивалентно следующему:

p0 = load %pred0 p1 = load %pred1 p4 = p0 && p1 store p4 to %pred0

@pM (где M от 0 до 6) это локальный предикат для логических операций.

pass %predN, @pM — чтение предикатного регистра N в локальный предикат M. pass @pM, %predN — запись локального предиката M в предикатный регистр N.

Номера локальных предикатов жёстко прибиты к PLS.

PLS0

  • Читает предикатные регистры в @p0 и @p1.
  • Результат логической операции сохраняется в @p4.
  • Пишет @p4 в предикатный регистр.

PLS1

  • Читает предикатные регистры в @p2 и @p3.
  • Результат логической операции сохраняется в @p5.
  • Пишет @p5 в предикатный регистр.

PLS2

  • Не может читать предикатные регистры.
  • Результат логической операции сохраняется в @p6.
  • Пишет @p6 в предикатный регистр.

Логические операции могут читать @p0, @p1, @p2 и @p3 без каких либо ограничений. Читать результат другой логической операции можно только при определённых условиях.

Например в таком случае.

{
    ! PLS0
    pass %pred0, @p0
    pass %pred1, @p1
    andp @p0, @p1, @p4
    pass @p4, %pred4
    
    ! PLS1
    pass %pred2, @p2
    pass %pred3, @p3
    andp @p2, @p3, @p5
    pass @p5, %pred5
    
    ! PLS2
    andp @p4, @p5, @p6 ! результаты пред. лог. операций
    pass @p6, %pred6
}

-- numas13 в e2k_chat