Эльбрус/портирование: различия между версиями
(нач) |
м (+SIMD, makecontext()) |
||
Строка 18: | Строка 18: | ||
Про невыровненный доступ к памяти на версиях архитектуры до пятой включительно ("Эльбрус-8СВ") известно, что он достаточно дорогой, поэтому про unaligned access интересующемуся коду можно сообщить, что таковой отсутствует. | Про невыровненный доступ к памяти на версиях архитектуры до пятой включительно ("Эльбрус-8СВ") известно, что он достаточно дорогой, поэтому про unaligned access интересующемуся коду можно сообщить, что таковой отсутствует. | ||
== SIMD == | |||
<!-- 2291, А.Т. --> | |||
Алгоритм портирования таких программ простой: | |||
# ищем в исходниках макрос <tt>__x86_64__</tt> или на худой конец <tt>i386</tt>; если они покрывают фрагменты кода с SIMD-интринсиками (функции, имена которых начинаются на <tt>_mm_</tt>), то нам повезло; | |||
# заменяем <tt>defined __x86_64__</tt> на <tt>defined __x86_64__ || defined __e2k__</tt>; | |||
# если попадается динамическая проверка наличия MMX/SSE, то указываем, что у нас всё есть до SSE4.1 (расширения системы команд SSE4.2 и AVX1 в каком-то виде также поддержаны в компиляторе, но, возможно, быстрее не будет); | |||
# к asm-вставкам нужно творчески подходить, но чаще проще готовый generic-вариант кода использовать. | |||
== отсутствие makecontext() == | |||
<!-- 2320, А.Ф. --> | |||
На Эльбрусах <tt>makecontext_e2k()</tt> выделяет память под дополнительные стеки, поэтому если просто заменить <tt>s/makecontext/makecontext_e2k/</tt>, в программе может появиться утечка памяти. Нужно ещё поставить вызов <tt>freecontext_e2k()</tt> там, где выделенный для <tt>makecontext_e2k()</tt> <tt>ucp.uc_stack</tt> перестаёт использоваться под данный контекст, т.е. где: | |||
# <tt>ucp.uc_stack</tt> освобождается через <tt>free()</tt>; | |||
# <tt>ucp.uc_stack</tt> переиспользуется, например, под другой контекст. | |||
{{Category navigation|title=E2K|category=E2K|sortkey=*}} | {{Category navigation|title=E2K|category=E2K|sortkey=*}} | ||
[[Категория:devel]] | [[Категория:devel]] |
Версия от 18:07, 19 июля 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 переиспользуется, например, под другой контекст.