Я учусь использовать BLAS в Fortran90 и написал простую программу с использованием подпрограммы SAXPY и функции SNRM2 . Программа вычисляет расстояние между двумя точками, вычитая один вектор из другого, затем принимая евклидову норму результата.
Я указываю возвращаемое значение SNRM2 как external
в соответствии с ответом на аналогичный вопрос, "Вызов функций BLAS" .
Моя полная программа:
program test
implicit none
real :: dist
real, dimension(3) :: a, b
real, external :: SNRM2
a = (/ 3.0, 0.0, 0.0 /)
b = (/ 0.0, 4.0, 0.0 /)
call SAXPY(3, -1.0, a,1, b,1)
print *, 'difference vector: ', b
dist = 6.66 !to show that SNRM2 is doing something
dist = SNRM2(3, b, 1)
print *, 'length of diff vector: ', dist
end program test
Результат программы:
difference vector: -3.00000000 4.00000000 0.00000000
length of diff vector: 0.00000000
Разностный вектор верен, но длина должна быть 5. Так почему же SNRM2 возвращает нулевое значение?
Я знаю, что переменная dist
изменена SNRM2, поэтому я не подозреваю, что моя установка openBLAS нарушена. Я использую macos10.13 и установил все вместе с homebrew.
Я компилирую с помощью gfortran со многими включенными флагами и не получаю предупреждений:
gfortran test.f90 -lblas -g -fimplicit-none -fcheck=all -fwhole-file -fcheck=all -fbacktrace -Wall -Wextra -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wconversion -Wno-unused-parameter -pedantic -o test
Я пытался посмотреть код для snrm2.f , но я не вижу никаких потенциальных проблем.
Я также попытался объявить мои переменные с real(4)
или real(selected_real_kind(6))
без изменений в поведении.
Спасибо!