问题标签 [lapacke]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
29 浏览

c++ - LAPACKE_dsyevd 返回错误的特征向量

我离成为一名优秀的程序员还很遥远,我正在尝试使用 LAPACKE_dsyevd。我编写了以下代码,旨在找出对角线由 0 组成且非对角线元素等于 1 的 2x2 对称矩阵的特征值和特征向量。特征值是好的,但只有一个返回特征向量是好的. 我尝试了几种参数组合但均未成功...有人可以告诉我出了什么问题吗?

0 投票
0 回答
57 浏览

matrix - CLAPACK f2c vs MKL:矩阵乘法性能问题

我正在寻找一种解决方案,通过大量矩阵乘法来加速我的程序的性能。所以我用 MKL 替换了 CLAPACK f2c 库。不幸的是,演出的结果不是预期的。

经过调查,我遇到了一个块三角矩阵,当我尝试将它与其转置相乘时,它主要表现不佳。

为了简化问题,我用 5000 个元素的单位矩阵进行了测试(我发现了相同的结果)

姓名 矩阵 [尺寸,尺寸] CLAPACK f2c(第二) MKL_GNU_THREAD(第二个)
单位矩阵本身的乘法 5000 0.076536 1.090167
密集矩阵乘以其转置 5000*5000 93.71569 1.113872
  • 我们可以看到单位矩阵的 CLAPACK f2c 乘法比 MKL 更快 (x14)。
  • 我们可以注意到 MKL 和 CLAPACK f2c 密集矩阵乘法之间的加速度乘以 84。

此外,dense*denseT 和单位矩阵的乘法过程中的时间消耗差异非常小。

所以我试图在 CLAPACK f2c DGEMM 中找到解析矩阵乘法的优化,我发现了一个空值条件。

当我删除这个条件时,我得到了这样的结果:

姓名 矩阵 [尺寸,尺寸] CLAPACK f2c(第二) MKL_GNU_THREAD(第二个)
单位矩阵本身的乘法 5000 93.210873 1.090167
密集矩阵乘以其转置 5000*5000 93.71569 1.113872
  • 在这里,我们注意到稠密和恒等式的乘法在性能方面是非常子句,现在 MKL 表现出最好的性能。
  • MKL 乘法似乎比 CLAPACK f2c 更快,但只有相同数量的非空元素。

我对这个结果有两个想法:

  1. MKL中默认不激活0优化

  2. MKL 看不到我的稀疏矩阵中的 0 (double) 值。

你能告诉我为什么 MKL 显示性能问题吗?您有什么技巧可以绕过 dgemm 对空元素的乘法吗?

我在 CSR 中做了一个保护,它显示出更好的性能,但在这种情况下为什么 lapacke_dgemm 比 f2c_dgemmm 最差。

谢谢您的帮助 :)

MKL_VERBOSE Intel(R) MKL 2021.0 Update 1 Product build 20201104 for Intel(R) 64 架构 Intel(R) Advanced Vector Extensions 2 (Intel(R) AVX2) 启用处理器,Lnx 3.50GHz lp64 gnu_thread

0 投票
1 回答
59 浏览

python - LAPACK 的 zgesvd 结果与 scipy.linalg 的 SVD 不同

所以我正在尝试计算NxN矩阵的 SVD。奇怪的是,对于2x2矩阵的所有情况,来自 lapack 和 scipy 的 SVD 都匹配,但是当我选择 a3x34x4矩阵时它们会有所不同。

产量

scipy.linalg.SVD产量

到目前为止,一切都很好。现在当我尝试输入一个3x3NxN矩阵时,结果就像

产量

现在,我知道 Scipy 计算的结果是完美的,因为我使用 SVD 的目的是完美的并给出完美的结果,而我的目标是生成像 scipy 这样的结果。现在我知道 Scipy 也使用 LAPACK 的驱动程序,但为什么会有不同呢?我在哪里搞砸了。

0 投票
0 回答
77 浏览

c - 链接 llapacke 时遇到问题

我正在学习在 C 上使用 BLAS 和 LAPACK,但第一步我遇到了麻烦:导入和链接库。

我的设备是 mac,显然 Xcode 和编译器都找不到 cblas.h、lapack.h 或 lapacke.h,而这三个肯定都在 /usr/local/opt/openblas/include 中。我最终在标题中写了完整路径,例如

有了这个(丑陋的)解决方案,xcode 和编译器现在可以找到函数,但是在-llapacke制作可执行文件时链接存在问题。-lapack链接和没有问题-lblas,但是当我尝试时-llapacke,我收到以下错误

我检查了,所有三个 .h 文件都在/usr/local/opt/openblas/include/.

我很感激在解决这个问题方面的一些帮助。

到目前为止我已经尝试过: 我重新安装(使用自制软件)cblas 和 lapack,它没有修复它。我还尝试通过这样做(在回答这个问题之后)将库与完整路径链接起来:

我还尝试在此页面上的答案之后添加到搜索路径,但它不起作用:

++ 我的操作系统是 Catalina 10.15.6,我的 Xcode 是 12.4。

++++我还用一个非常相似的标题检查了这个问题,它没有帮助(问题完全不同,只是标题相似)。

0 投票
1 回答
175 浏览

c++ - LAPACKE C++ 链接错误。找不到功能

我希望使用 LAPACKE 库对 LAPACK 库进行 C/C++ 调用。在多个设备上,我尝试编译一个简单的程序,但 LAPACKE 似乎没有正确链接。

这是我的代码,对此示例稍作修改:

我已经使用 apt 包管理器安装了 blas、lapack 和 lapacke:

我正在编译:

-据我所知,我不应该是必需的,但无论如何我都会把它放进去。我收到以下错误:

无论我是从源代码编译 lapacke、导入整个头文件、将函数本身声明为 extern,还是将函数的名称更改为以下任何一个,这个问题仍然存在:dgetrf()dgetrf_()LAPACK_dgetrf(),所有我见过的 LAPACK 样式调用的常用名称。

查看 Lapacke 标头,看起来 LAPACK_dgetrf() 转换为 lapack 函数调用 dgetrf_()。打开静态压缩包查找 dgetrf,我可以发现 liblapack.a 有一个函数对象 dgetrf.o,而 liblapacke.a 有一个函数 lapack_dgetrf.o。我在想问题的根源是LAPACK_dgetrf()基本上是dgetrf_(),而链接器找不到dgetrf_(),因为LAPACK有一个叫做dgetrf()的函数,而不是dgetrf_()。不过我很困惑,因为编译器没有抱怨任何链接库不存在,而且似乎没有其他人在他们的设备上遇到这个问题,而我现在已经在 3 个单独的设备上遇到了这个问题(所有 ubuntu基于)。

我需要做什么才能让 LAPACKE 编译,不仅仅是 C,而是 C++?

0 投票
1 回答
87 浏览

c++ - 通过 Lapack dpotrf 在 C++ 中的 Choleskey 分解给出了无效的结果

我正在尝试使用 Lapack 的 dpotrf 函数对一维双数组进行 choleskey 分解。它似乎适用于某些情况,但在其他情况下它有奇怪的行为。

这是我的代码:

并通过以下方式构建:

2x2 案例给出:

从技术上讲,这是不正确的,因为它不是下三角形,但下半部分是正确的

它正确地(可能是偶然的)识别出它不能对注释掉的 A3 矩阵进行操作。

它正确地表明它可以对有效的 A3 进行操作,但结果值为:

有效的 Cholesky 分解是(根据 Matlab):

我怀疑该功能没有损坏,但我没有正确的论据。
我怀疑它可能是 LDA 变量,因为我不知道这是什么,而其他 LAPACK 函数通常只是将它设置为相同的 N 值。

有谁知道可能导致此问题的原因?

0 投票
0 回答
44 浏览

c - LAPACKE_zstegr 段错误

我是 LAPACKE 的第一次用户习惯了这些约定,所以我的问题可能很容易解决。我正在尝试实现函数 LAPACKE_zhetrd 和 LAPACKE_zstegr 来查找复杂 Hermitian 矩阵的特征值。我对 zhetrd 的调用似乎工作正常,但是 zstegr 给出了一个段错误并且没有完成。

根据 zstegr 的文档,如果您搜索所有特征值而不是一些特征值和/或特征向量,则不会引用几个参数。

在下面的代码中,我为未引用且不是数组的参数插入了 0。对于未引用的数组,我只是传递了一个适当类型的虚拟指针。我想我不明白应该如何传递函数的某些参数。我希望有人指出我的错误。

0 投票
0 回答
51 浏览

lapack - LAPACK Windows 链接共享库失败

我目前正在尝试在 Windows 中安装 LAPACK。我在这里遵循了在 Windows 中安装 LAPACK 的指南:https ://icl.cs.utk.edu/lapack-for-windows/lapack/ 。我使用的指南来自Build Instructions to create LAPACK and LAPACKE 3.5.0 dlls for Windows with MinGW. 我坚持第 8 步。我在这Linking fortran shared library部分中遇到了以下错误。这是以下错误消息:

我试图搜索如何解决这个问题。我发现的所有来源都与此类似:https ://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=4&t=5315 。但是它对我不起作用。对于遇到类似问题并有解决方案的任何人,我想寻求帮助。

提前致谢!

0 投票
0 回答
50 浏览

openmp - Eigen + MKL 对复矩阵使用单核 (ZHEEV)

mkl 在我们的集群上有一个奇怪的行为。我将 Eigen::SelfAdjointEigenSolverEigen::MatrixXcd 称为复矩阵 (ZHEEV)。

当我计算大矩阵(dim >~ 100k)的特征向量时,它只使用一个核心。

奇怪的是,对于没有特征向量的较小的复杂矩阵、实矩阵和大型复杂矩阵(dim >~ 100k),它运行得非常好(多核)。

有没有人面临同样的问题或知道后台发生了什么?

我尝试了各种 mkl 版本。

0 投票
1 回答
27 浏览

lapack - OpenBLAS 中 LAPACKE_zgetrf() 和 zgetrf_() 之间的调用约定有什么区别?

我试图通过对 .so 使用 dlopen() 并在每个版本中打开函数来支持 Ubuntu 18.04 和 CentOS 7 中的 zgetrf() ,但调用约定不同。在 CentOS 中,它使用 LAPACKE_zgetrf() 工作,但在 Ubuntu 18.04 中,它们不会导出为 LAPACKE_zgetrf,唯一的选择是 zgetrf_:

我可以按如下方式进行 LAPACKE_zgetrf() 调用,这可行:

如何将其转换为 call zgetrf_(...)