Привет,
это с Lapack 3.8.0.
Segfault происходит в xeigtstz с lapack 3.8.0 и последним gfortran:
./EIG/xeigtstz < nep.in > znep.out 2>&1
/bin/sh: Zeile 1: 9026 Speicherzugriffsfehler (Speicherabzug geschrieben)./EIG/xeigtstz < nep.in > znep.out 2>&1
Это исчезает, когда предел стека увеличивается с 8192 КБ по умолчанию до 81920 КБ (т.
первое значение, которое я попробовал).
Кажется, это дубликат https://github.com/Reference-LAPACK/lapack/issues/276 .
gfortran9 помечает выход за границы в (среди прочего) TESTING/EIG/zhet21.f, строка 304 (выполнение цикла на J, работающем от 1 до N-1, доступ к элементу массива U(1, J-1 )... ой). Не уверен, что это фактическая и единственная причина этой проблемы, хотя...
РЕДАКТИРОВАТЬ: мое наблюдение не имеет отношения к делу (и я действительно пропустил, что вы уже открыли для него # 333) xeigtstz пытается выделить около 10 МБ в стеке для тестов NEP, как уже отмечалось в https://github.com/xianyi/OpenBLAS/ выпусков/1645
установка ulimit -s 16384
вместо 8192 по умолчанию устранила эту проблему и для меня.
Та же проблема №85.
Решение этой проблемы состояло в том, чтобы увеличить лимит стека, но, поскольку это тест, не будет ли выделение кучи лучшим решением?
Я считаю, что это выделяемые массивы, которые попадают в стек из-за «рекурсивной» опции (необходимой для безопасности потоков), но мне еще не удалось найти работающее решение.
@weslleyspereira попытается скомпилировать только zchkee.f без опции -frecursive. Таким образом, все файлы (в частности, liblapack.a) будут скомпилированы с параметром -frecursive, а zchkee.f будет скомпилирован без параметра -frecursive. Мы думаем/надеемся, что это поможет. Мы будем тестировать. Я думаю, что важно скомпилировать LAPACK с параметром -frecursive. Теперь zchkee.f можно компилировать без него. Это будет просто прекрасно. CMake и make будут выглядеть немного уродливее. Я думаю, что нам давно пора разработать новый набор тестов, поэтому мы предлагаем пока сделать это безобразно и сосредоточиться на новом наборе тестов.
У меня работало до тех пор, пока я не использовал OpenMP, но последний, к сожалению, подразумевает -frecursive
(Можно использовать filter_out в Makefile для удаления frecursive/Mrecursive из FFLAGS, так что не так много новых уродств)
У меня работало до тех пор, пока я не использовал OpenMP, но последний, к сожалению, подразумевает -frecursive
Ах. Да, это потенциальная проблема.
(Можно использовать filter_out в Makefile для удаления frecursive/Mrecursive из FFLAGS, так что не так много новых уродств)
А, хорошая идея. Понятия не имею, как работает filter_out в Makefile. Хуже расследования. Спасибо за совет.
TESTING/EIG/Makefile после добавления include ../../make.inc
FFLAGS := $(filter-out -frecursive -Mrecursive,$(FFLAGS))
FFLAGS_DRV := $(filter-out -frecursive -Mrecursive,$(FFLAGS_DRV))
LDFLAGS := $(filter-out -frecursive -Mrecursive,$(LDFLAGS))
для cmake это будет что-то вроде
string(REGEX REPLACE "-(fM)recursive" "" FFLAGS ${FFLAGS})
(не проверено)
Спасибо @martin-frbg! сейчас проверю