E.3 Компиляция Octave с 64-битными индексами
Примечание: следующее относится только к системам с 64-битными указателями. Настройка Octave с --enable-64 не может магическим образом сделать 32-битную систему иметь 64-битное адресное пространство.
На 64-битных системах Octave по умолчанию использует 64-битные целые числа для индексирования массивов. Если скрипт конфигурации определяет, что ваша библиотека BLAS использует 32-битные целые числа, операции, использующие следующие библиотеки, ограничены массивами с размерами, меньшими, чем 2^{31} элементов:
- BLAS
- LAPACK
- QRUPDATE
- SuiteSparse
- SUNDIALS IDA
- ARPACK
Кроме того, следующие библиотеки используют int внутри, поэтому максимальные размеры задач всегда ограничены:
- GLPK
- Qhull
За исключением GLPK и Qhull, эти библиотеки также могут быть настроены на использование 64-битных целых чисел, но большинство систем не предоставляют пакеты, построенные таким образом. Если вы хотите поэкспериментировать с большими массивами, следующая информация может быть полезной.
Чтобы определить размер целых чисел библиотеки BLAS, используемой Octave, можно выполнить следующий код:
clear all; N = 2^31; ## The following line requires about 8 GB of RAM! a = b = ones (N, 1, "single"); c = a' * b
Если библиотека BLAS использует 32-битные целые числа, будет выброшено исключение:
error: integer dimension or index out of range for Fortran INTEGER type
В противном случае, если библиотека BLAS использует 64-битные целые числа, результат будет:
c = 2^31 = 2147483648
Обратите внимание, что приведенный выше тестовый случай обычно требует в два раза больше памяти, если a и b не назначены a = b = …. Кроме того, тип данных single имеет точность около 23 двоичных бит. В этом конкретном примере ошибки округления не возникают.
В общем случае лучше всего иметь все эти библиотеки в версиях, поддерживающих 32-битное индексирование, или все эти библиотеки должны поддерживать 64-битное индексирование. Смешивание библиотек с 64-битным индексированием с библиотеками с 32-битным индексированием может привести к непредсказуемому поведению, включая сбои программы с возможной потерей данных.
Следующие инструкции были протестированы с развитием версии Octave и GCC 4.3.4 на системе x86_64 Debian и могут быть устаревшими. Пожалуйста, сообщите о любых проблемах или исправлениях на трекере ошибок Octave.
Перечисленные ниже версии — это версии, используемые для тестирования. Если доступны более новые версии этих пакетов, вы должны попробовать использовать их, хотя могут быть некоторые различия.
Все библиотеки и заголовочные файлы будут установлены в подкаталогах $prefix64 (вы должны выбрать расположение этого каталога).
- BLAS и LAPACK (http://www.netlib.org/lapack)
Справочные версии обоих библиотек включены в дистрибутив LAPACK 3.2.1 из http://www.netlib.org/.
- - Скопируйте файл make.inc.example и переименуйте его в make.inc. Параметры -fdefault-integer-8 и -fPIC (на 64-битных процессорах) необходимо добавить к переменной
OPTSиNOOPT. - - После компиляции этой библиотеки убедитесь, что вы используете её для компиляции Suite Sparse и Octave. Далее мы предполагаем, что вы установили библиотеку LAPACK как $prefix64/lib/liblapack.a.
- - Скопируйте файл make.inc.example и переименуйте его в make.inc. Параметры -fdefault-integer-8 и -fPIC (на 64-битных процессорах) необходимо добавить к переменной
- QRUPDATE (https://sourceforge.net/projects/qrupdate)
В файле Makeconf:
- - Добавьте -fdefault-integer-8 в
FFLAGS. - - При необходимости скорректируйте переменные BLAS и LAPACK, если ваши 64-битные библиотеки BLAS и LAPACK находятся в нестандартном расположении.
- - Установите
PREFIXв верхнеуровневую директорию дерева вашей установки. - - Запустите
make solibдля создания разделяемой библиотеки. - - Запустите
make installдля установки библиотеки.
- - Добавьте -fdefault-integer-8 в
- SuiteSparse (http://faculty.cse.tamu.edu/davis/suitesparse.html)
Передайте следующие параметры в
makeдля включения 64-битных целых чисел для вызовов библиотеки BLAS. На 64-битных системах Windows используйте-DLONGBLAS="long long"вместо этого.CFLAGS='-DLONGBLAS=long' CXXFLAGS='-DLONGBLAS=long'
Файлы Make SuiteSparse не генерируют разделяемые библиотеки. В некоторых системах вы можете сгенерировать их, сделав что-то столь же простое, как
top=$(pwd) for f in *.a; do mkdir tmp cd tmp ar vx ../$f gcc -shared -o ../${f%%.a}.so *.o cd $top rm -rf tmp doneВ других системах может потребоваться другое решение.
- SUNDIALS IDA (https://computing.llnl.gov/projects/sundials/ida)
При конфигурации с
cmakeдобавьте флаг -DSUNDIALS_INDEX_SIZE=64. - ARPACK (https://forge.scilab.org/index.php/p/arpack-ng/)
- - Добавьте -fdefault-integer-8 в
FFLAGSпри запуске configure. - - Запустите
makeдля построения библиотеки. - - Запустите
make installдля установки библиотеки.
- - Добавьте -fdefault-integer-8 в
- ATLAS вместо справочных BLAS и LAPACK
Предложения по компиляции ATLAS будут весьма приветствуемы.
- GLPK
- Qhull (http://www.qhull.org)
И GLPK, и Qhull используют
intвнутри, поэтому максимальные размеры задач могут быть ограничены. - Octave
Поддержка 64-битных индексов в Octave активируется с помощью опции конфигурации --enable-64.
./configure \ LD_LIBRARY_PATH="$prefix64/lib" \ CPPFLAGS="-I$prefix64/include" LDFLAGS="-L$prefix64/lib" \ --enable-64
Необходимо убедиться, что все Fortran-исходники, кроме тех, что находятся в каталоге liboctave/external/ranlib, скомпилированы таким образом, что целые числа имеют ширину 8 байт. Если вы используете gfortran, скрипт configure автоматически установит переменную Makefile
F77_INTEGER_8_FLAGв -fdefault-integer-8. Если вы используете другой компилятор, вы должны установить эту переменную самостоятельно. Не устанавливайте этот флаг вFFLAGS, иначе файлы в liboctave/external/ranlib будут скомпилированы неправильно. - Другие зависимости
Вероятно, для следующих зависимостей ничего особенного делать не нужно. Если вы обнаружите, что что-то нужно сделать, пожалуйста, отправьте сообщение об ошибке.
- - pcre
- - zlib
- - hdf5
- - fftw3
- - cURL
- - GraphicsMagick++
- - OpenGL
- - freetype
- - fontconfig
- - fltk
© 1996–2022 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v7.2.0/Compiling-Octave-with-64_002dbit-Indexing.html