Эльбрус/портирование — различия между версиями

Материал из ALT Linux Wiki
Перейти к: навигация, поиск
м (тесты на порядок байтов/битность: +%changelog)
м (Примечания: вынес таковые)
Строка 9: Строка 9:
 
  cp -at . -- /usr/share/gnu-config/config.{guess,sub}
 
  cp -at . -- /usr/share/gnu-config/config.{guess,sub}
  
В %changelog можно добавить, например:
+
В %changelog можно добавить, например<ref>поскольку затрагивает и riscv64, и обычно aarch64</ref>:
  
 
  - fix build on newer arches
 
  - fix build on newer arches
Строка 17: Строка 17:
 
Нередко попадаются программы, которые интересует только длина указателей (размер integer) и, возможно, endianness; поскольку e2k -- [[эльбрус/архитектура|64-разрядная LE-архитектура]], ищем подстроку вроде <tt>__amd64__</tt>, читаем контекст, добавляем аналогично <tt>__e2k__</tt>.
 
Нередко попадаются программы, которые интересует только длина указателей (размер integer) и, возможно, endianness; поскольку e2k -- [[эльбрус/архитектура|64-разрядная LE-архитектура]], ищем подстроку вроде <tt>__amd64__</tt>, читаем контекст, добавляем аналогично <tt>__e2k__</tt>.
  
В альтовых пакетах на cmake исправления проверок битности порой выглядят примерно так (или можно задействовать <tt>%_libsuff</tt>):
+
В альтовых пакетах на cmake исправления проверок битности порой выглядят примерно так<ref>либо можно задействовать <tt>%_libsuff</tt></ref>:
  
 
  -%ifarch x86_64
 
  -%ifarch x86_64
Строка 26: Строка 26:
 
  - fixed build on 64-bit architectures
 
  - fixed build on 64-bit architectures
  
Про невыровненный доступ к памяти на версиях архитектуры до пятой включительно ("Эльбрус-8СВ") известно, что он достаточно дорогой, поэтому про unaligned access интересующемуся коду можно сообщить, что таковой отсутствует.
+
Про невыровненный доступ к памяти на версиях архитектуры до пятой включительно ("Эльбрус-8СВ") известно, что он достаточно дорогой; поэтому про unaligned access интересующемуся коду можно сообщить, что таковой отсутствует.
  
 
== SIMD ==
 
== SIMD ==
Строка 33: Строка 33:
 
# ищем в исходниках макрос <tt>__x86_64__</tt> или на худой конец <tt>i386</tt>; если они покрывают фрагменты кода с SIMD-интринсиками (функции, имена которых начинаются на <tt>_mm_</tt>), то нам повезло;
 
# ищем в исходниках макрос <tt>__x86_64__</tt> или на худой конец <tt>i386</tt>; если они покрывают фрагменты кода с SIMD-интринсиками (функции, имена которых начинаются на <tt>_mm_</tt>), то нам повезло;
 
# заменяем <tt>defined __x86_64__</tt> на <tt>defined __x86_64__ || defined __e2k__</tt>;
 
# заменяем <tt>defined __x86_64__</tt> на <tt>defined __x86_64__ || defined __e2k__</tt>;
# если попадается динамическая проверка наличия MMX/SSE, то указываем, что у нас всё есть до SSE4.1 (расширения системы команд SSE4.2 и AVX1 в каком-то виде также поддержаны в компиляторе, но, возможно, быстрее не будет);
+
# если попадается динамическая проверка наличия MMX/SSE, то указываем, что у нас всё есть до SSE4.1<ref>расширения системы команд SSE4.2 и AVX1 в каком-то виде также поддержаны в компиляторе, но, возможно, быстрее не будет</ref>;
 
# к asm-вставкам нужно творчески подходить, но чаще проще готовый generic-вариант кода использовать.  
 
# к asm-вставкам нужно творчески подходить, но чаще проще готовый generic-вариант кода использовать.  
  
Строка 47: Строка 47:
 
* Портирование Embox: [https://habr.com/ru/company/embox/blog/421441/], [https://habr.com/ru/company/embox/blog/447704/]
 
* Портирование Embox: [https://habr.com/ru/company/embox/blog/421441/], [https://habr.com/ru/company/embox/blog/447704/]
  
 +
= Примечания =
 +
<references/>
  
 
{{Category navigation|title=E2K|category=E2K|sortkey=*}}
 
{{Category navigation|title=E2K|category=E2K|sortkey=*}}
 
[[Категория:devel]]
 
[[Категория:devel]]

Версия 13:02, 5 октября 2019

Перенос ПО на платформу Эльбрус

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

configure: error: cannot guess build type; you must specify one

В архив исходников программы включены устаревшие копии этих файлов, поддержка e2k добавлена в gnu-config в 2015 году; достаточно обновить их вручную из свежей системной версии этого пакета:

cp -at . -- /usr/share/gnu-config/config.{guess,sub}

В %changelog можно добавить, например[1]:

- fix build on newer arches

тесты на порядок байтов/битность

Нередко попадаются программы, которые интересует только длина указателей (размер integer) и, возможно, endianness; поскольку e2k -- 64-разрядная LE-архитектура, ищем подстроку вроде __amd64__, читаем контекст, добавляем аналогично __e2k__.

В альтовых пакетах на cmake исправления проверок битности порой выглядят примерно так[2]:

-%ifarch x86_64
+%if "%_lib" == "lib64"
 export LIB_SUFFIX=64
 %endif
- fixed build on 64-bit architectures

Про невыровненный доступ к памяти на версиях архитектуры до пятой включительно ("Эльбрус-8СВ") известно, что он достаточно дорогой; поэтому про unaligned access интересующемуся коду можно сообщить, что таковой отсутствует.

SIMD

Алгоритм портирования таких программ простой:

  1. ищем в исходниках макрос __x86_64__ или на худой конец i386; если они покрывают фрагменты кода с SIMD-интринсиками (функции, имена которых начинаются на _mm_), то нам повезло;
  2. заменяем defined __x86_64__ на defined __x86_64__ || defined __e2k__;
  3. если попадается динамическая проверка наличия MMX/SSE, то указываем, что у нас всё есть до SSE4.1[3];
  4. к asm-вставкам нужно творчески подходить, но чаще проще готовый generic-вариант кода использовать.

отсутствие makecontext()

На Эльбрусах makecontext_e2k() выделяет память под дополнительные стеки, поэтому если просто заменить s/makecontext/makecontext_e2k/, в программе может появиться утечка памяти. Нужно ещё поставить вызов freecontext_e2k() там, где выделенный для makecontext_e2k() ucp.uc_stack перестаёт использоваться под данный контекст, т.е. где:

  1. ucp.uc_stack освобождается через free();
  2. ucp.uc_stack переиспользуется, например, под другой контекст.

Ссылки

Примечания

  1. поскольку затрагивает и riscv64, и обычно aarch64
  2. либо можно задействовать %_libsuff
  3. расширения системы команд SSE4.2 и AVX1 в каком-то виде также поддержаны в компиляторе, но, возможно, быстрее не будет