У меня есть код, который выполняет инвертирование и умножение упакованных симметричных матриц с использованием подпрограмм LAPACK DPPTRF
, DPPTRI
и DSPMV
. Здесь - старая тема, в которой вы можете увидеть код C ++, который я использую для вызова подпрограмм LAPACK.
Мой код в настоящее время собирает симметричную матрицу, которая в основном заполнена по диагонали.
Я тестирую разные реализации BLAS и LAPACK и сравниваю GotoBLAS2 с эталонной реализацией LAPACK из netlib.
Вот как я компилирую код LAPACK netlib. Я выбираю файлы кода .f
из исходного кода и собираю их все в компактную статическую библиотеку, например:
$ ls
ddot.f dpptrf.f dscal.f dspr.f dtpsv.f lsame.f
dgemm.f dpptri.f dspmv.f dtpmv.f dtptri.f xerbla.f
$ gfortran -c *.f
$ ar rcs liblapack_lite.a *.o
Затем я могу связать эту библиотеку со своим приложением C ++, используя -llapack_lite -lgfortran
.
Затем я попытался использовать GotoBLAS2. Я получил это от здесь . Пакет содержал сценарии, которые автоматически компилировали массивную статическую библиотеку размером 19 МБ. Он отлично работает с моим существующим кодом, связав его: -lgoto2_nehalemp-r1.13
.
Сначала я почувствовал, что все прошло хорошо. С GotoBLAS2 на больших проблемных наборах (инвертируя матрицы 1000x1000 или более) я увидел увеличение производительности в 6 раз. Поскольку GotoBLAS является многопоточным для моей архитектуры, а эталонный LAPACK является однопоточным, я подумал, что это разумно. Системный монитор также показал> 300% загрузки ЦП для подтверждения.
Вот где это становится странным. Я думаю, что если я оптимизирую эталонную реализацию?
Я перекомпилирую свою библиотеку lapack_lite следующим образом: gfortran -c -O3 *.f
Моя библиотека lapack_lite теперь превосходит GotoBLAS2 даже при инверсии матрицы 3200x3200, при использовании только одного потока . Он также потребляет на 80 МБ меньше оперативной памяти.
Однако последующее умножение упакованного матричного вектора происходит быстрее с GotoBLAS.
Как это вообще возможно? Не удалось ли в make-конфигурации пакета GotoBLAS использовать переключатель оптимизации с gfortran?