Эльбрус/портирование: различия между версиями
м (→SIMD: +__amd64__) |
м (→тесты на порядок байтов/битность: +m4/ax_boost_base.m4) |
||
Строка 25: | Строка 25: | ||
- fixed build on 64-bit architectures | - fixed build on 64-bit architectures | ||
В проектах на boost порой попадается тот [https://www.gnu.org/software/autoconf-archive/ax_boost_base.html {{path|ax_boost_base.m4}}], где в тест на lib64 забит список архитектур; его придётся поправить перед запуском {{cmd|autoreconf}} (или найти этот фрагмент в уже сгенерированном configure, что несколько сложней). | |||
Про невыровненный доступ к памяти на версиях архитектуры до пятой включительно ("Эльбрус-8СВ") известно, что он достаточно дорогой; поэтому про unaligned access интересующемуся коду можно сообщить, что таковой отсутствует. | Про невыровненный доступ к памяти на версиях архитектуры до пятой включительно ("Эльбрус-8СВ") известно, что он достаточно дорогой; поэтому про unaligned access интересующемуся коду можно сообщить, что таковой отсутствует. |
Версия от 10:21, 8 октября 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
В проектах на boost порой попадается тот ax_boost_base.m4, где в тест на lib64 забит список архитектур; его придётся поправить перед запуском autoreconf (или найти этот фрагмент в уже сгенерированном configure, что несколько сложней).
Про невыровненный доступ к памяти на версиях архитектуры до пятой включительно ("Эльбрус-8СВ") известно, что он достаточно дорогой; поэтому про unaligned access интересующемуся коду можно сообщить, что таковой отсутствует.
SIMD
Алгоритм портирования таких программ простой:
- ищем в исходниках макрос __x86_64__[3] или на худой конец i386; если они покрывают фрагменты кода с SIMD-интринсиками (функции, имена которых начинаются на _mm_), то нам повезло;
- заменяем defined __x86_64__ на defined __x86_64__ || defined __e2k__;
- если попадается динамическая проверка наличия MMX/SSE, то указываем, что у нас всё есть до SSE4.1[4];
- к asm-вставкам нужно творчески подходить, но чаще проще готовый generic-вариант кода использовать.
отсутствие makecontext()
На Эльбрусах makecontext_e2k() выделяет память под дополнительные стеки, поэтому если просто заменить s/makecontext/makecontext_e2k/, в программе может появиться утечка памяти. Нужно ещё поставить вызов freecontext_e2k() там, где выделенный для makecontext_e2k() ucp.uc_stack перестаёт использоваться под данный контекст, т.е. где:
- ucp.uc_stack освобождается через free();
- ucp.uc_stack переиспользуется, например, под другой контекст.
Ссылки
- эльбрус/lcc
- Free software porting on the Elbrus architecture
- Портирование Embox: [1], [2]