Обсуждение:Эльбрус/архитектура: различия между версиями
м (→выравнивание) |
EntityFX (обсуждение | вклад) Нет описания правки |
||
Строка 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 |
Версия от 13: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