Производительность GotoBLAS2 - PullRequest
2 голосов
/ 31 декабря 2011

У меня есть код, который выполняет инвертирование и умножение упакованных симметричных матриц с использованием подпрограмм 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?

...