Эльбрус/портирование: различия между версиями
м (+SIMD, makecontext()) |
м (+ссылки: bircoph@ на LVEE 2019) |
||
Строка 32: | Строка 32: | ||
# <tt>ucp.uc_stack</tt> освобождается через <tt>free()</tt>; | # <tt>ucp.uc_stack</tt> освобождается через <tt>free()</tt>; | ||
# <tt>ucp.uc_stack</tt> переиспользуется, например, под другой контекст. | # <tt>ucp.uc_stack</tt> переиспользуется, например, под другой контекст. | ||
= Ссылки = | |||
* [https://lvee.org/ru/abstracts/303 Free software porting on the Elbrus architecture] | |||
{{Category navigation|title=E2K|category=E2K|sortkey=*}} | {{Category navigation|title=E2K|category=E2K|sortkey=*}} | ||
[[Категория:devel]] | [[Категория:devel]] |
Версия от 17:52, 29 августа 2019
Перенос ПО на платформу Эльбрус
При сборке существующих программ порой возникает ряд типичных проблем и вопросов, которые отчасти систематизированы ниже (см. тж. страничку по компилятору).
configure: error: cannot guess build type; you must specify one
В архив исходников программы включены устаревшие копии этих файлов, поддержка e2k добавлена в gnu-config в 2015 году; достаточно обновить их вручную из свежей системной версии этого пакета:
cp -at . -- /usr/share/gnu-config/config.{guess,sub}
тесты на порядок байтов/битность
Нередко попадаются программы, которые интересует только длина указателей (размер integer) и, возможно, endianness; поскольку e2k -- 64-битная LE-архитектура, ищем подстроку вроде __amd64__, читаем контекст, добавляем аналогично __e2k__.
Где-то будет достаточно
export LIB_SUFFIX=64
Про невыровненный доступ к памяти на версиях архитектуры до пятой включительно ("Эльбрус-8СВ") известно, что он достаточно дорогой, поэтому про unaligned access интересующемуся коду можно сообщить, что таковой отсутствует.
SIMD
Алгоритм портирования таких программ простой:
- ищем в исходниках макрос __x86_64__ или на худой конец i386; если они покрывают фрагменты кода с SIMD-интринсиками (функции, имена которых начинаются на _mm_), то нам повезло;
- заменяем defined __x86_64__ на defined __x86_64__ || defined __e2k__;
- если попадается динамическая проверка наличия MMX/SSE, то указываем, что у нас всё есть до SSE4.1 (расширения системы команд SSE4.2 и AVX1 в каком-то виде также поддержаны в компиляторе, но, возможно, быстрее не будет);
- к asm-вставкам нужно творчески подходить, но чаще проще готовый generic-вариант кода использовать.
отсутствие makecontext()
На Эльбрусах makecontext_e2k() выделяет память под дополнительные стеки, поэтому если просто заменить s/makecontext/makecontext_e2k/, в программе может появиться утечка памяти. Нужно ещё поставить вызов freecontext_e2k() там, где выделенный для makecontext_e2k() ucp.uc_stack перестаёт использоваться под данный контекст, т.е. где:
- ucp.uc_stack освобождается через free();
- ucp.uc_stack переиспользуется, например, под другой контекст.