BLAS函数在Fortran90中返回零

BLAS函数在Fortran90中返回零,fortran,fortran90,blas,openblas,Fortran,Fortran90,Blas,Openblas,我正在学习在Fortran90中使用BLAS,并使用子程序和函数编写了一个简单的程序。程序通过从另一个向量中减去一个向量,然后取结果的欧几里德范数来计算两点之间的距离 根据对类似问题的回答,我将SNRM2的返回值指定为external。 我的全部计划: program test implicit none real :: dist real, dimension(3) :: a, b real, external :: SNRM2 a = (/ 3.0, 0.0, 0.0 /) b = (/

我正在学习在Fortran90中使用BLAS,并使用子程序和函数编写了一个简单的程序。程序通过从另一个向量中减去一个向量,然后取结果的欧几里德范数来计算两点之间的距离

根据对类似问题的回答,我将SNRM2的返回值指定为
external
。 我的全部计划:

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,并用自制软件安装了所有东西

我正在使用启用了许多标志的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
我试着看了看,但没有发现任何潜在的问题

我还尝试使用
real(4)
real(selected\u real\u kind(6))
声明变量,但行为没有改变

谢谢

根据这一点,苹果加速框架附带的BLAS中的单精度例程似乎存在一些问题。 在我的Mac(OSX10.11)上,gfortran-8.1(通过自制程序安装)+默认BLAS(在系统中)给出了错误的结果:

$ gfortran-8 test.f90 -lblas
or
$ gfortran-8 test.f90 -L/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Versions/Current/ -lBLAS
$ ./a.out
 difference vector:   -3.00000000       4.00000000       0.00000000    
 length of diff vector:    0.00000000  
当与OpenBLAS(通过自制程序安装)明确链接时,会得到正确的结果:

$ gfortran-8 test.f90 -L/usr/local/Cellar/openblas/0.2.20_2/lib -lblas
$ ./a.out
 difference vector:   -3.00000000       4.00000000       0.00000000    
 length of diff vector:    5.00000000 
$ gfortran-8 -ff2c test.f90 -lblas
$ ./a.out
 difference vector:   -3.00000000       4.00000000       0.00000000    
 length of diff vector:    5.00000000  
上面的页面表明,当以与旧的77国集团风格不兼容的方式与系统BLAS链接时,会出现问题。实际上,附加
-ff2c
选项可以得到正确的结果:

$ gfortran-8 test.f90 -L/usr/local/Cellar/openblas/0.2.20_2/lib -lblas
$ ./a.out
 difference vector:   -3.00000000       4.00000000       0.00000000    
 length of diff vector:    5.00000000 
$ gfortran-8 -ff2c test.f90 -lblas
$ ./a.out
 difference vector:   -3.00000000       4.00000000       0.00000000    
 length of diff vector:    5.00000000  
但是我想使用最新的OpenBLAS(比使用
-ff2c
选项)可能更好


下面是C中的一个单独测试(检查问题是否特定于gfortran)

//test.c
#包括
浮点数snrm2_(int*,float*,int*);
int main()
{
浮点数b[3]={-3.0f,4.0f,0.0f};
int n=3,inc=1;
浮动区=snrm2(n&n,b&inc);
printf(“b=%10.7f%10.7f%10.7f\n”,b[0],b[1],b[2]);
printf(“dist=%10.7f\n”,dist);
返回0;
}
$gcc-8测试c-lblas
美元/年
b=-3.00000004.0000000.0000000
dist=0.0000000
$gcc-8 test.c-lblas-L/usr/local/ceral/openblas/0.2.20_2/lib
美元/年
b=-3.00000004.0000000.0000000
dist=5.0000000

就我所尝试的而言,双精度版本(DNRM2)甚至可以与系统BLAS一起工作,因此问题似乎只存在于单精度版本(如上页所述)。

Mhm,在我的机器上使用最新的OpenBLAS。也许你的安装有问题…谢谢你的尝试!我在macos 10.13上使用自制软件安装了所有软件。我运行了
brew医生
brew更新
很好。。。我的电脑是由我的研究所提供的,预装了一些软件。BLAS的多个实例会是一个问题吗?如果是这样,我将如何在我的系统中查找或更改它们?TIO给出dist=5,但OSX10.11上的gfortran-8.1(通过自制在我的mac上安装)给出dist=0.0…因为您“拥有”了snrm2.f的代码,只需将其临时添加到您的项目中,使用不同的名称,看看会发生什么。你也可以用saxpy做同样的事情。你也可以在那一刻禁用优化等。