Документация Engee

RISC-V (Linux)

В Julia реализована экспериментальная поддержка 64-разрядных процессоров RISC-V (RV64), работающих под управлением Linux. Здесь приводятся общие рекомендации по компиляции, а также инструкции для конкретных устройств.

Компиляция Julia

В настоящее время Julia необходимо компилировать из исходного кода полностью, включая все зависимости. Для этого можно использовать следующую переменную в Make.user:

USE_BINARYBUILDER := 0

Кроме того, требуется указать архитектуру и при необходимости процессор, для которого следует выполнить сборку. Для этого можно задать переменные MARCH и MCPU в Make.user.

Переменной MARCH необходимо присвоить строку ISA RISC-V, которую можно найти в документации вашего устройства или в /proc/cpuinfo. Используйте только те флаги, которые поддерживает ваш компилятор. Чтобы увидеть список поддерживаемых флагов, можно выполнить команду gcc -march=help. Распространенным значением, с которого можно начать, является rv64gc.

Переменная MCPU является необязательной и может использоваться для дальнейшей оптимизации сформированного кода для конкретного ЦП. Если вы не уверены, рекомендуется оставить ее без значения. Список поддерживаемых значений можно получить, выполнив команду gcc --target-help.

Например, если используется StarFive VisionFive2 с процессором JH7110 на базе SiFive U74, эти флаги можно задать следующим образом:

MARCH := rv64gc_zba_zbb
MCPU := sifive-u74

Если желательна переносимая сборка, можно поступить так:

MARCH := rv64gc

# также присваиваем JULIA_CPU_TARGET расширенную форму rv64gc
# (обычно копируется значение MCPU, которое мы не задаем)
JULIA_CPU_TARGET := generic-rv64,i,m,a,f,d,zicsr,zifencei,c

Кросс-компиляция

Машинная сборка на устройстве RISC-V может занимать очень много времени, поэтому можно выполнить кросс-компиляцию Julia на более быстром компьютере.

Сначала получите набор инструментальных средств кросс-компиляции RISC-V, поддерживающий языки C, C++ и Fortran. Для этого можно извлечь репозиторий riscv-gnu-toolchain и выполнить его сборку следующим образом:

sudo mkdir /opt/riscv && sudo chown $USER /opt/riscv
./configure --prefix=/opt/riscv --with-languages=c,c++,fortran
make linux -j$(nproc)

Затем установите эмулятор пользовательского режима QEMU для RISC-V, а также поддержку binfmt, позволяющую запускать двоичные файлы RISC-V на хост-компьютере. Конкретные действия зависят от вашего дистрибутива. Например, в Arch Linux необходимо установить пакеты qemu-user-static и qemu-user-static-binfmt. Обратите внимание, что для фактического выполнения двоичных файлов RISC-V эмулятору QEMU необходимо найти корневой каталог системы RISC-V. Для этого можно присвоить переменной среды QEMU_LD_PREFIX путь к корневой файловой системе.

Наконец, скомпилируйте Julia со следующими переменными Make.user (в дополнение к переменным из предыдущего раздела):

XC_HOST=riscv64-unknown-linux-gnu
OS=Linux
export QEMU_LD_PREFIX=/opt/riscv/sysroot

Обратите внимание, что для включения набора инструментальных средств кросс-компиляции необходимо выполнить make с заданной переменной PATH, например, выполнив следующую команду:

PATH=/opt/riscv/bin:$PATH make -j$(nproc)

Поскольку используемый нами системный корневой каталог RISC-V почти пустой, может потребоваться добавить дополнительные библиотеки, которые согласно требованиям системы сборки Julia в настоящее время должны быть доступны во всей системе. Например, в настоящее время сборка использует системную библиотеку libz, поэтому вам может потребоваться скопировать ее из сборки Julia в корневой каталог системы:

make -C deps install-zlib
cp -v usr/lib/libz.*   /opt/riscv/sysroot/usr/lib
cp -v usr/include/z*.h /opt/riscv/sysroot/usr/include