vak: (Default)
[personal profile] vak
Я писал недавно, что у меня на плате RISC-V крэшился компилятор clang, установленный из репозитория Debian. Пересобрал его с текстов - всё отлично работает. И сам компилятор, и код, который он генерит.
$ clang --version                                                           
clang version 13.0.0 (https://github.com/llvm/llvm-project.git 4e2aee8d3bab6010420d9be96480f1d8ae0f35c1)
Target: riscv64-unknown-linux-gnu. .
Thread model: posix
InstalledDir: /home/vak/bin
Как выяснилось, дело было в машинной команде FENCE.TSO. Это вариант более общей команды FENCE, которая вынуждает систему памяти завершить все операции чтения-записи, накопленные к этому моменту, и только потом приступать к следующей команде. Специальный "спотыкач" для целей синхронизации.

Вариант FENCE.TSO чуть более хитрый чем просто FENCE, и за счёт этого меньше просаживает производительность. Он разделяет операции чтения на "до" и "после", а также операции записи на "до" и "после". Но не определяет порядок операций чтения относительно операций записи. Эта команда необязательная, и разработчики чипа Allwinner D1 решили её не делать.

Их ошибка состояла в том, что команда FENCE.TSO вызывает исключение "Illegal Instruction". На самом деле, если она не реализована, этот код операции должен отрабатываться как обычный FENCE. Тогда компилятор мог бы генерить FENCE.TSO вместо FENCE, когда это уместно, и давать большую производительность на некоторых процессорах. Из-за ошибки так не получится, увы. Похоже, нынешние компиляторы вообще не используют эту хитрую команду. Я гонял довольно много разного линуксного софта на плате Nezha, и всё отлично работает.

Сборка clang с текстов заняла несколько дней. Понятно, что одноядерный процессор 1ГГц с памятью 1Гбайт не самая мощная платформа для компиляции такого огромного проекта. Пришлось добавить 8Гбайт свопа, иначе на некоторых компонентах сборка падала. Но в конце концов всё получилось.

Запускается сборка так:
git clone https://github.com/llvm/llvm-project
cd llvm-project
mkdir build
cd build
cmake -DLLVM_ENABLE_PROJECTS=clang -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="RISCV" -G "Unix Makefiles" ../llvm
make
make install

Date: 2021-06-29 07:26 (UTC)
sab123: (Default)
From: [personal profile] sab123
А что, кросс-компилить на писюке не получается?

Date: 2021-06-29 17:55 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
На самом деле, если она не реализована, этот код операции должен отрабатываться как обычный FENCE.

У них где-нибудь есть errata sheet?

Date: 2021-06-29 18:20 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
"Тогда извините". Значит, надо или делать binary patching tool, или искать/просить в clang ключик "не использовать fence.tso", какие ещё варианты?