3. Отличия в интерфейсах¶
Глава описывает любые отличия в поведении системных компонент на Эльбрусе, из-за которых может понадобиться адаптация программ для их корректной работы.
3.1. Совместимость с компиляторами¶
Компилятор lcc стремится к максимальной совместимости с gcc. Версия lcc-1.24 соответствует gcc-7.3.0.
3.1.1. Конструкции языка¶
3.1.1.1. Variable length array inside a struct¶
Не поддержана недокументированная функция gcc: Variable length arrays (VLA) в середине структуры.
3.1.1.2. Nested functions¶
Не поддержан элемент диалекта GNU C: nested functions.
3.1.2. gcc builtins¶
Ряд билтинов (builtin) gcc поддержан с ограничениями. Некоторые из них вызваны особенностями реализации компилятора, другие отсутствием практической необходимости. С выходом новых версий lcc расширяется состав поддержанных билтинов.
Ограничения перечислены в разделе документации на компилятор:
/opt/mcst/doc/builtin_gnu.html
.
3.1.3. Прагмы¶
Информация о поддержанных прагмах в документации компилятора:
/opt/mcst/doc/pragma.html
3.1.4. OpenMP¶
3.1.4.1. Возможности¶
Поддержан стандарт OpenMP 3.1.
Доступны языки C, C++, Fortran.
3.1.4.2. Ограничения¶
Для e2k не поддержано в режиме -m128.
Nested параллелизм не поддержан. Если при исполнении уже распараллеленного цикла встречаются циклы, которые нужно распараллелить, то эти (вложенные) циклы будут исполняться последовательно.
Не поддержан clause collapse.
Для C/C++ после директивы
#pragma omp
всегда должен следовать statement языка. Проблемы могут возникнуть для#pragma omp barrier
и#pragma omp flush
, если за ними нет statement’а. Для обхода проблемы рекомендуется в следующей строке поставить пустой statement, например “0;” или “;”Переменные, перечисленные в clause’ах private, lastprivate, firstprivate и threadprivate должны иметь скалярный базовый тип или массив скалярного базового типа. В противном случае результат программы неопределен.
Директива
#pragma omp for
не поддержана для итераторов C++.Для C/C++ clause’ы if и num_threads своими параметрами могут иметь только константы и переменные целого типа, выражения не допускаются.
3.1.4.3. Справочный файл¶
В компиляторе информация об OpenMP хранится здесь:
/opt/mcst/doc/openmp.html
3.2. Системные интерфейсы¶
3.2.1. makecontext¶
Функция makecontext()
для управления контекстом пользователя реализована на Эльбрусе с другой семантикой.
Отличия:
Вместо вызова
makecontext()
необходимо вызыватьmakecontext_e2k()
;В конце области видимости необходимо вызвать
freecontext_e2k()
.makecontext_e2k()
возвращает значениеint
, а неvoid
. Значение вызова необходимо проверять на статус ошибки (< 0).
Функции дано другое название, чтобы отображать несовместимость с реализацией на других архитектурах.