Куда при сборке gcc с сорсов написать -mfloat-abi=hard ?
Добрый день,
У меня возник вопрос, который не могу решить сам уже больше недели, помогите, пожалуйста, советом.
Есть ембеддед линукс, вернее его вариант на DE10-Nano или DE0-Nano-SoC на нем стоит:
Linux de10-nano 4.1.33-ltsi-altera #1 SMP Thu Mar 30 10:37:56 PDT 2017 armv7l GNU/Linux
с очень стародавним репозитарием на http://feeds.angstrom-distribution.org/feeds/v2016.12/
в котором нет lapack/blas, и есть желание собрать gcc, по возможности новее (или какой получится) с исходников, но чтоб там точно был gfortran и не менее С++14.
Пробовал gcc-10.2, gcc-9-3, gcc-linaro-7.5 собирать там, и кросскомпиллить на 20.04 убунте. Во всех случаях после пары часов сборки возникает ошибка:
/mnt/data/1/gcc-l1/./gcc/xgcc -B/mnt/data/1/gcc-l1/./gcc/ -B/usr/local/armv7l-unknown-linux-gnueabihf/bin/ -B/usr/local/armv7l-unknown-linux-gnueabihf/lib/ -isystem /usr/local/armv7l-unknown-linux-gnueabihf/include -isystem /usr/local/armv7l-unknown-linux-gnueabihf/sys-include -g -O2 -O2 -g -O2 -DIN_GCC -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wno-format -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -isystem ./include -fPIC -fno-inline -g -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector -fPIC -fno-inline -I. -I. -I../.././gcc -I../../../gcc-linaro-snapshot-7.5-2019.11/libgcc -I../../../gcc-linaro-snapshot-7.5-2019.11/libgcc/. -I../../../gcc-linaro-snapshot-7.5-2019.11/libgcc/../gcc -I../../../gcc-linaro-snapshot-7.5-2019.11/libgcc/../include -DHAVE_CC_TLS -o _negdi2.o -MT _negdi2.o -MD -MP -MF _negdi2.dep -DL_negdi2 -c ../../../gcc-linaro-snapshot-7.5-2019.11/libgcc/libgcc2.c -fvisibility=hidden -DHIDE_EXPORTS In file included from /usr/include/features.h:392:0, from /usr/include/stdio.h:27, from ../../../gcc-linaro-snapshot-7.5-2019.11/libgcc/../gcc/tsystem.h:87, from ../../../gcc-linaro-snapshot-7.5-2019.11/libgcc/libgcc2.c:27: /usr/include/gnu/stubs.h:7:11: fatal error: gnu/stubs-soft.h: No such file or directory
#include <gnu/stubs-soft.h>
#include <gnu/stubs-soft.h>
Гугление на эту ошибку приводит к тому, что надо установить -mfloat-abi=hard во время компиляции.
Я пробовал собирать с такими флагами:
make BOOT_CFLAGS=‘-mfloat-abi=hard -O2’ -j 2
дополнительно засовывал в Makefile в каждый вызов компилера ‘-mfloat-abi=hard’ но падать не перестает.
В репозитарии прикомпилленого gfortran нет, в linaro подходящего уже собраннного gcc, который содержит хотя бы c,c++,fortran - тоже нет.
Пожалуйста, посоветуйте, что я делаю не так и куда правильно надо поместить эту опцию, чтобы избавитться от ошибки компилляции gcc c сорсов?
Спасибо!
Сильно сомневаюсь, что бы кто еще сталкивался с подобной проблемой сейчас.
Для АРМа придется повозится, думаю.
https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html
Рекомендуют в makefile добавить
FLAGS = -mfloat-abi=hard
или так
gcc test.o test1.o mfloat-abi=hard
Но что то кажется, что проблема в чём то другом.
ну, тут этой опции не видно. а Вы ./configure как запускали?
спасибо большое за содействие! Запускал по классике, в другой директории
../gcc-10.2.0/configure --enable-languages=c,c++,fortran
экспериментировал по включению и выключению использования тредов, причем запускал на самой борде, то есть в "native" режиме.
Уже после "configure" выставлял опции при компиляции
make BOOT_CFLAGS=‘-mfloat-abi=hard -O2’ -j 2
чтобы включить такую оптимизацию, так как в стандартном компилере нет режима -mfloat-abi=soft (там и include соответсвующих нет)
Это не помогало.
Пошел дальше, влез во внутренности Makefile и дописал эту опцию во все вызовы компилера, и родного, и того, что собираю. То есть
FLAGS = -mfloat-abi=hard
и более хардкорно я прописывал, но это не помогало... (спасибо большое, AlexNek за советы)
https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html
регулярно читаю, некоторые опции, как то -march, -mtune, -mcpu, -mfpu постоянно использую. Пробовал их тоже выставить, но тоже не помогло.
Пробовал реально и линаор и 4 разных версии обычного компилятора, везде одно и то же, то есть я, похоже, что-то кардинально не понимаю. В гугле пишут, что это стандартная ошибка, которая лечится опцией -mfloat-abi=hard но я ее же во все вызовы компилятора поставил, и все равно не помогает...
Сильно сомневаюсь, что бы кто еще сталкивался с подобной проблемой сейчас.
скажите, пожалуйста, а почему Вы так думаете, борда-то вроде только двухлетней давности, и, как я понимаю, проблема будет аналогичной, если кто-то просто захочет развести тот же Cyclone V SoC и поставить туда не бареметал, а линукс.
Ну железячников тут вроде не так уж и много.
это верно, хотя если смотреть на проблему так: есть борда от интела (вроде не последний производитель) надо бы в ее софтвере наладить что-то, чтоб по крайней мере работало.
Да и в продакшине использовать самособранный компилятор не каждый решится.
ой, золотые слова, если бы Вас еще в Интеле услышали, где эту борду спроектировали и по универам ее барыжат, а для нее даже живого репозитория нет и с сорсов почти ничего не ставится.
где эту борду спроектировали
Название платы я как то пока не заметил и с универами дел не имел Да и с железяк слез уже фиг знает когда.
Но зачем брать то, что нельзя нормально пользовать?
А это чем не подходит? 32 Бита тоже есть...
https://www.ni.com/de-de/support/downloads/software-produc...
Хотя похоже интел не спит
https://software.intel.com/content/www/us/en/develop/artic...
Название платы я как то пока не заметил
Простите, ссылка не вставилась, а так, да, DE10-Nano https://software.intel.com/content/www/us/en/develop/topic...
и ее младший вариант от Треасика DE0-Nano-SoC https://www.terasic.com.tw/cgi-bin/page/archive.pl?Languag...
Но зачем брать то, что нельзя нормально пользовать?
Честно говоря, я пользовал до этого два десятка кривых и всяких борд от очень даже noname производителей и таких косяков ни разу не видел.
В борде есть одна важная вещь, которой нет ни в одной другой - FPGA совмещенная с армом, мне именно это нужно, ну и чуть-чуть из софта, совсем стандартного - обычный gcc с поддержкой трех компиляторов c,c++,fortran, так как вся математика через lapack вычисляется, а собранных вариантов lapack-blas-fft на эту архитектуру не нашлось. Причем нужны
не абы какие, а с максимальной производительностью, типа как делает ATLAS (Automatically Tuned Linear Algebra Software). То есть нужны либо эти библиотеки, либо компилятор фортрана, чтобы ATLAS сам скомпилировал и оптимизировал.
А это чем не подходит? 32 Бита тоже есть...
не, к сожалению, тут только С и С++ и из-за этого lapack-blas-fft не прилинкуешь.
Есть ембеддед линукс, вернее его вариант на DE10-Nano или DE0-Nano-SoC на нем стоит
Я подумал что это о каких то вариантах линукса
обычный gcc с поддержкой трех компиляторов c,c++,fortran
Так получается в этом и состоит проблема С и С++ и fortran?
Хотя для меня немного странно звучит комбинация компилятора для С и фортрана.
А что lapack нельзя самому скомпилить?
https://math.nist.gov/lapack++/
http://lapackpp.sourceforge.net/
Удалите все сгенерированные файлы и деректории, которые автоматически были созданы при ошибочной компиляции и запустите компиляцию заново с уже известным флагом (-mfloat-abi=hard).
я только так и делаю, и собираю всегда в новой директории, чтоб ничего случайно не осталось. Флаг хоть в configure, хоть в Makefiile внутри ручками прописывай, все равно падает одинаково.
Можно залинковать soft + hard - тогда в этом месте компиляции все проходит, но падает позже где-то на час. До этого места компилируется около двух часов.
А что lapack нельзя самому скомпилить?
можно конечно, только там миллион строк на фортране и без фортрановского компилятора это довольно сложно сделать.
Можно сделать f2c, но тогда упадет производительность, причем упадет в 10-20 раз, так как во время компиляции происходит подгонка параметров, чтобы все в кеш влазило и по процессорным конвейерам распихивалось. Борда и так дохлая, если там вычисления в 10 раз медленнее будут проходить, то тогда ее уже использовать будет нельзя.
Хотя для меня немного странно звучит комбинация компилятора для С и фортрана.
может и не видно со стороны, но эту комбинацию используют все подряд, и NumPy, Octave, Matlab, Mathematics, Ansys, Comsol, и, с большой вероятностью остальные тоже. Просто от фортрана там фактически lapack, blas, иногда еще что-то, но в основном в виде библиотек.
скажите, пожалуйста, а почему Вы так думаете, борда-то вроде только двухлетней давности, и, как я понимаю, проблема будет аналогичной, если кто-то просто захочет развести тот же Cyclone V SoC и поставить туда не бареметал, а линукс.
У меня Cyclone V, вполне себе крутится линукс уже лет 5 как.
в котором нет lapack/blas, и есть желание собрать gcc, по возможности новее (или какой получится) с исходников, но чтоб там точно был gfortran и не менее С++14.
Возьми yocto посвежее, собери что надо и залей на свою плату весь дистр. Я посмотрел, lapack там есть. Если тебе нужно существующий расширить, то тут только секс.
Возьми yocto посвежее, собери что надо и залей на свою плату весь дистр. Я посмотрел, lapack там есть. Если тебе нужно существующий расширить, то тут только секс.
спасибо за совет! Это наверное очень правильное решение, ибо у меня там еще заморочки с USB имеются (не все драйверы есть и кернел всяко компиллить придется).
Единственно, что очень сильно останавливает, так это перетаскивание конфигурации ног FPGA-HPS на новый дистрибутив. Возможно я не нагуглил, или чего-то кординально не понимаю.
Скажите, пожалуйста, как перетащить такую "железячную" конфигурацию из моей сборки на свежую yoct-у?
Спасибо!
А как конфигурация FPGA связана с линукс? Они вообще ортогональны
у кого как, я, например, сгружаю прошивку из линукса, посылая ее на /dev/fpga (на DE0-Nano-SoC) и потом через DMA таскаю данные с HPS на FPGA и обратно. Более того, прошивку часто приходится менять - типа 2 минуты - первая прошивка, следующая минута - вторая прошивка, и так по циклу (ресурсов плиски не хватает для хороших таймингов, поэтому так все сложно). К сожалению и трафик между HPS и FPGA у меня не маленький, около 100МБ/с, поэтому правильно установленные модули и всякие настройки для меня важны. Я к сожалению, в этих настройках не очень хорошо разбираюсь и, поэтому, панически боюсь туда лезть, чтобы что-то не навредить.
посылая ее на /dev/fpga (на DE0-Nano-SoC)
Это только в альтеровском ядре есть. В upstream такого нету. Разве что у intel'a есть обновляшки с такими же дровами.
Скажите, пожалуйста, как перетащить такую "железячную" конфигурацию из моей сборки на свежую yoct-у?
Ну тут только разбираться. Это небыстро и дорого
ресурсов плиски не хватает для хороших таймингов, поэтому так все сложно).
Вангую, что в твоём fpga баг, раз так всё сложно.
Вангую, что в твоём fpga баг, раз так всё сложно.
в больший кристалл, например, в стратикс все лезет, но нет подходящей и не дорогой борды, а эта борда по пинам подходит. И где тут может быть баг?
Ну тут только разбираться. Это небыстро и дорого
да, я тоже как-то подозревал, что это сложно, поэтому и не хочу в этом направлении двигаться.
Какой у Вас toolchain на плате стоит? Может возможно есть новая сборка и можно просто актуализировать(update)?
Пробовали другой toolchain поставить? Вот здесь есть список.
Пробовали на Вашем Host PC этот GCC собрать?
Почему не хотите поставить на вашем компьютере кросс компилятор для АРМа и на нём же делать компиляцию и отладку для дев-платы?
Какой у Вас toolchain на плате стоит?
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/arm-angstrom-linux-gnueabi/6.2.1/lto-wrapper
Target: arm-angstrom-linux-gnueabi
Configured with: ../../../../../../work-shared/gcc-linaro-6.2-r2016.11/git/configure --build=x86_64-linux --host=arm-angstrom-linux-gnueabi --target=arm-angstrom-linux-gnueabi --prefix=/usr --exec_prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/libexec --datadir=/usr/share --sysconfdir=/etc --sharedstatedir=/com --localstatedir=/var --libdir=/usr/lib --includedir=/usr/include --oldincludedir=/usr/include --infodir=/usr/share/info --mandir=/usr/share/man --disable-silent-rules --disable-dependency-tracking --with-libtool-sysroot=/build/jenkins/v2016.12/machine/ifc6410/build/tmp-angstrom-glibc/sysroots/ifc6410 --with-gnu-ld --enable-shared --enable-languages=c,c++ --enable-threads=posix --enable-multilib --enable-c99 --enable-long-long --enable-symvers=gnu --enable-libstdcxx-pch --program-prefix=arm-angstrom-linux-gnueabi- --without-local-prefix --enable-lto --enable-libssp --enable-libitm --disable-bootstrap --disable-libmudflap --with-system-zlib --with-linker-hash-style=gnu --enable-linker-build-id --with-ppl=no --with-cloog=no --enable-checking=release --enable-cheaders=c_global --without-isl --with-float=hard --with-sysroot=/ --with-build-sysroot=/build/jenkins/v2016.12/machine/ifc6410/build/tmp-angstrom-glibc/sysroots/ifc6410 --with-gxx-include-dir=/usr/include/c++/6.2.1 --without-long-double-128 --enable-nls --enable-initfini-array --with-arch=armv7-a
Thread model: posix
gcc version 6.2.1 20161016 (Linaro GCC 6.2-2016.11)
Пробовали другой toolchain поставить? Вот здесь есть список.
Не получается, в ангстреме нет, другие не ставятся, вернее у меня не получилось.
Пробовали на Вашем Host PC этот GCC собрать?
надо cross-native, я несколько раз пробовал собирать на
9.3 и 10.2, но так и не получилось. crosstool-ng ставил, пытался с его помощью собрать, но, не все до конца понял и поставить не смог.
Почему не хотите поставить на вашем компьютере кросс компилятор для АРМа и на нём же делать компиляцию и отладку для дев-платы?
Нет, так нельзя. Если использовать софт с кросс-компилятора, то производительность будет около 200МФлоп/с, а если оптимизировать на самом арме, то где-то 1.5ГФлопс. Для меня эта разница критична. Оптимизация получается перекомпиляцией сотни вариантов с учетом размеров кеша и конвейерности инструкций, это очень сложно сделать даже для своего софта через cross-compile, а тут используется еще много стороннего софта, который не позволяет делать такую оптимизацию через cross-compile. Я не готов тот же атлас переписать. Я технически
понимаю как это сделать, но по времени это на пару лет разработки может потянуть.
ну вот и попробуйте собрать с ./configure --target=arm-angstrom-linux-gnueabihf
очевидно, что пробовал, и, к сожалению, не собралось. Или вы имеете ввиду как cross-native? Как cross-native не собирал, так как не смог дособрать необходимые тулсы, для этого, а как cross-compile - не интересно, так как это не решает моей задачи, я об этом писал выше.
Если использовать софт с кросс-компилятора, то производительность будет около 200МФлоп/с, а если оптимизировать на самом арме, то где-то 1.5ГФлопс.
-----
Так может быть только при неправильной конфигурации либо цeлевой системы, либо опций компилятора.
Так может быть только при неправильной конфигурации либо цeлевой системы, либо опций компилятора.
умножение матриц - требует в идеале N*N операций чтения из медленной общей памяти, и N*N*N операций умножения и сложения. Если скорость доступа к памяти в разы медленнее, чем флопы на процессоре (для конкретно этого экземпляра отношение примерно в 50 раз), то так и будет и ни от какой конфигурации системы не зависит. Более детально можно почитать, например, погуглив на ATLAS (Automatically Tuned Linear Algebra Software).
Стоит посмотреть в доки - поддерживает ли то что ты берешь из репозитория железо на котором планируешь использовать. По ощущениям - тот пакет что идет с бордой допилен именно под нее.
А, да, выше еще не успел сказать. На этом железе другая сборка без альтеровского ядра на раз поддерживает все, что мне надо, но там нет возможности общаться через DMA c FPGA, и пилить это мне самому не хочется.
Скопировать с того, на эту сборку - не получилось, было много unresolved, в общем, они конечно сильно разные одна - lubuntu, другая - yocto.
Если скорость доступа к памяти в разы медленнее, чем
------
Я этого "не пойму" - не в состоянии.
Есть два физически разных компилятора - один на борде, другой на кроссе.
Оба могут компилировать исходники и построить бинарник. ОБА.
Что именно они строят - определяется:
- возможностями компилятора - поскольку ты пытаешься заменить одно другим - принимаем равноценными.
- заданными параметрами построения.
Зависимости от того какой физический процессор выполняет процесс компиляции - нет.
Так что на кроссе нужно правильно выставить конфигурацию, правильно задать параметры и аккуратно закинуть на борду полученный бинарник.
Вроде все.
Извини - в версиях *никсов Я ничего не понимаю.
если не понимаешь, не суйся, будь так любезен. И с предыдущим твоим комментарием - иди мат часть учи. Твой уровень познания, это треугольник со сторонами 5, 10 и 15:
https://foren.germany.ru/programmer/f/37750965.html?Cat=&p...
а эта тема - не твоего уровня.