OSX 中 MKL BLAS 和 Accelerate Framework BLAS 之间 DSCAL 的不一致

Posted

技术标签:

【中文标题】OSX 中 MKL BLAS 和 Accelerate Framework BLAS 之间 DSCAL 的不一致【英文标题】:Incoherence in DSCAL between MKL BLAS and Accelerate Framework BLAS in OSX 【发布时间】:2018-07-12 06:54:06 【问题描述】:

在带有 OSX BLAS(加速框架)的 OSX 下。下面的程序

  real*8 :: x(2)
  real*8 :: zero=0.0d0
  x(1)=1.0d0
  x(2)=1/zero
  print*, x(2)*0.0d0
  call dscal(2,0.d0,x,1)
  print*, x
  end

给我以下输出

                   NaN
0.0000000000000000        0.0000000000000000

以及 OSX+MKL BLAS 上的以下输出

                   NaN
0.0000000000000000                            NaN

即似乎 OSX BLAS DSCAL 在乘以 0 时发生短路(我们得到 X(2)=0 尽管应该得到 0*Inf=NaN)

这是一个已知的错误/功能吗?

【问题讨论】:

【参考方案1】:

这既不是错误也不是功能。 0*NaN 0*Inf 的结果是由实现者自行决定的。无论如何,以上的目的是什么?

【讨论】:

Scilab 软件 (www.scilab.org) 在 Windows 平台上安装期间将参考 BLAS 替换为 MKL BLAS。在 Linux 下使用参考 BLAS,在 OSX 下使用 Accelerate Framework BLAS。因此,在这些极限情况下,我们在不同平台上获得了不同的结果。这是个问题。是否存在提供 BLAS 供应商的 BLAS 功能? 那种。您可以使用 CMake 的 FindBLAS.cmakeFindLapack.cmake 等基础架构来了解您正在处理的实现,同时构建自己的代码。我在某种程度上是这样做的:github.com/kvahed/codeare。还有一些单独的命令只能在单独的实现中找到,你可以测试一下。所以你只会在使用 MKL 等编译时找到mkl_malloc。但是没有version 命令左右会告诉你所有的。

以上是关于OSX 中 MKL BLAS 和 Accelerate Framework BLAS 之间 DSCAL 的不一致的主要内容,如果未能解决你的问题,请参考以下文章

OSX 上的稀疏 BLAS

Intel MKL(Math Kernel Library)

BLAS+多精度+MPI

优化矩阵旋转 - 关于矩阵中心的任意角度

BLAS Level 2 带矩阵向量乘积多个向量

Caffe学习和总结1