标签: lapack

用一个简单的例子来理解C++中的LAPACK调用

我是LAPACK和C++/Fortran接口的初学者.我需要在Mac OS-X Lion上使用LAPACK/BLAS解决线性方程和特征值问题.OS-X Lion提供优化的BLAS和LAPACK库(在/ usr/lib中),我链接这些库而不是从netlib下载它们.

我的程序(下面转载)正在编译并运行正常,但它给了我错误的答案.我已经在Web和Stackoverflow上进行了研究,这个问题可能要处理C++和Fortran如何以不同的格式存储数组(行主要与列主要).但是,正如您将在我的示例中看到的那样,我的示例的简单数组在C++和fortran中应该看起来相同.无论如何这里去了.

让我们说我们要解决以下线性系统:

x + y = 2

x - y = 0

解是(x,y)=(1,1).现在我尝试使用Lapack解决这个问题,如下所示

// LAPACK test code

#include<iostream>
#include<vector>

using namespace std;
extern "C" void dgetrs(char *TRANS, int *N, int *NRHS, double *A, 
                      int *LDA, int *IPIV, double *B, int *LDB, int *INFO );

int main()
{
    char trans = 'N';
    int dim = 2;    
    int nrhs = 1;
    int LDA = dim;
    int LDB = dim;
    int info;

    vector<double> a, b;

    a.push_back(1);
    a.push_back(1);
    a.push_back(1); …
Run Code Online (Sandbox Code Playgroud)

c++ fortran lapack

18
推荐指数
2
解决办法
2万
查看次数

valgrind"未初始化的值"警告ATLAS多线程BLAS例程中的误报吗?

我正在使用ATLAS进行LAPACK和多线程BLAS例程,并且注意到当我的矩阵足够大以致ATLAS使用BLAS的多线程版本时,我从Valgrind得到初始化错误.这是我的代码中的一个最小示例:

#include <stdio.h>
#include <stdlib.h>

extern void dgetrf_(int *, int *, double *, int *, int *, int *);
extern void dgetri_(int *, double *, int *, int *, double *, int *, int *);
extern void dgemm_(char *, char *, int *, int *, int *, double *, double *, int *, double *, int *, double *, double *, int *);

int main(void)
{
    double *m1,*m2,*work,*temp;
    int dim = 576;
    int i,j,info;
    int lwork = dim * dim; …
Run Code Online (Sandbox Code Playgroud)

c multithreading valgrind lapack atlas

17
推荐指数
1
解决办法
618
查看次数

是否可以使用F2PY从共享库中包装函数?

我正在开发一个包,它需要来自LAPACK Fortran库的dgtsv子例程的 Python绑定.目前,我正在分发Fortran源文件,dgtsv.f以及我的Python代码,并使用numpy.distutils它自动包装并将其编译成_gtsv.so可从Python调用的共享库.

这是我的setup.py文件目前的样子:

from numpy.distutils.core import setup, Extension, build_ext
import os


fortran_sources = ["dgtsv.f"]
gtsv = Extension(
    name="pyfnnd._gtsv",
    sources=[os.path.join("pyfnnd", "LAPACK", ff) for ff in fortran_sources],
    extra_link_args=['-llapack']
)

setup(
    name='pyfnnd',
    py_modules=['_fnndeconv', 'demo', '_tridiag_solvers'],
    cmdclass={'build_ext': build_ext.build_ext},
    ext_modules=[gtsv],
)
Run Code Online (Sandbox Code Playgroud)

请注意,为了实际使用_gtsv.so,我仍然需要链接到预先存在的LAPACK共享库(extra_link_args=['-llapack']).由于这个库应该已经包含dgtsv子例程,在我看来,将函数包装在现有的共享库中更简洁,而不必分发实际的Fortran源.

但是,我从未遇到任何使用F2PY来包装作为共享库的一部分的函数而不仅仅是原始Fortran源代码的示例.这可能吗?

python distutils numpy lapack f2py

16
推荐指数
1
解决办法
536
查看次数

什么是.net(C#)的免费(开源)BLAS/LAPACK库?

我有一个用C#编写的项目,我需要对矩阵进行各种线性代数运算(如LU分解).

由于该程序主要是为确认理论而创建的原型,因此C#实现就足够了(与可能更快的C++实现相比),但我仍然希望有一个好的BLAS或LAPACK库来节省一些编码.

长话短说,任何人都可以推荐免费/开源BLAS或LAPACK库与.net一起使用吗?

最好的问候Egil.

更新:今天发现Math.NET Numerics,看起来很有趣,有没有人有这方面的经验?

.net matrix scientific-computing blas lapack

15
推荐指数
3
解决办法
1万
查看次数

使用LAPACK访问子矩阵

LAPACK中是否有一个函数,它会给我一个特定子矩阵的元素?如果是这样,C++中的语法是什么?

或者我需要编码吗?

c++ matrix lapack

15
推荐指数
1
解决办法
2746
查看次数

c ++ 11 std :: array vs static array vs std :: vector

第一个问题,如果我将在接下来的3年中开发代码,那么开始使用c ++ 11是一件好事吗?

如果是的话,如果我想将它与Lapack一起使用,那么实现矩阵的"最佳"方法是什么?我的意思是,做std::vector<std::vector< Type > > Matrix不容易与Lapack兼容.

到目前为止,我存储了我的矩阵Type* Matrix(new Type[N])(指针形式带有new并且 delete很重要,因为数组的大小不是像5那样的数字,而是作为变量).

但是使用C++ 11可以使用std :: array.根据这个网站,这个容器似乎是最好的解决方案......你怎么看?

c++ arrays matrix lapack c++11

15
推荐指数
2
解决办法
2万
查看次数

使用ATLAS / LAPACK支持构建numpy

我正在尝试编译numpyv1.12,以获得对ATLAS / LAPACK例程的支持。

问题

我用于编译的设置似乎无法将ATLAS / LAPACK库引入numpy

设置

我正在使用的主机(计算群集)没有管理员特权。

但是,节点可以通过GNU模块访问gcc4.7.2和glibc5.3.0、2.17和2.22以及ATLAS / LAPACK库和标头v3.10.2。

出于兼容性原因,我正在使用包含Python 2.7.16的虚拟环境。同样,numpy出于同样的原因,我正在安装旧版本的。如果一切正常,我可以探索的较新版本,numpy但目前,这就是我正在使用的版本。

我的源目录numpy有一个名为的配置文件site.cfg,其中包含以下指令:

[ALL]
library_dirs = /usr/local/lib:/net/module/sw/glibc/2.22/lib64:/net/module/sw/atlas-lapack/3.10.2/lib
include_dirs = /usr/local/include:/net/module/sw/glibc/2.22/include:/net/module/sw/atlas-lapack/3.10.2/include

[atlas]
libraries = lapack,f77blas,cblas,atlas
library_dirs = /net/module/sw/atlas-lapack/3.10.2/lib
include_dirs = /net/module/sw/atlas-lapack/3.10.2/include
Run Code Online (Sandbox Code Playgroud)

numpy通过以下命令进行编译:

$ CFLAGS="${CFLAGS} -std=c99 -fPIC" LDFLAGS="-L/home/areynolds/.conda/envs/genotyping_environment/lib -Wl,-rpath=/home/areynolds/.conda/envs/genotyping_environment/lib -Wl,--no-as-needed -Wl,--sysroot=/,-L/net/module/sw/glibc/2.22/lib64" python setup.py build --fcompiler=gnu95
Run Code Online (Sandbox Code Playgroud)

我正在使用--fcompiler=gnu95ATLAS / LAPACK库,是使用GNU Fortran编译的。我重写CFLAGS,并LDFLAGS以变量的GCC工具包可以编译和链接正确。

问题

编译之后,我测试该numpy库以查看通过一种方法安装了什么:

$ python
... …
Run Code Online (Sandbox Code Playgroud)

python numpy lapack atlas python-2.7

15
推荐指数
1
解决办法
285
查看次数

使用具有128位精度的Lapack

我正在尝试使用Lapack进行矩阵奇异值分解(SVD)的128位精度计算,我发现有一些黑色编译器魔术可以实现这一点.英特尔Fortran编译器(ifort)支持-r16指示编译器将所有变量声明为DOUBLE PRECISION128位实数的选项.所以我使用以下方法编译了Lapack和BLAS:

ifort -O3 -r16 -c isamax.f -o isamax.o
ifort -O3 -r16 -c sasum.f -o sasum.o
...
Run Code Online (Sandbox Code Playgroud)

要将其合并到我的程序(也就是C++)中,我可以使用英特尔C++编译器(icc)和-Qoption,cpp,--extended_float_type创建数据类型_Quad为128位浮点变量的选项.我的SVD示例如下所示:

#include "stdio.h"
#include "iostream"
#include "vector"

using namespace std;
typedef _Quad scalar;

//FORTRAN BINDING
extern "C" void dgesvd_(char *JOBU, char *JOBVT, int *M, int *N,
    scalar *A, int *LDA,
    scalar *S,
    scalar *U, int *LDU,
    scalar *VT, int *LDVT,
    scalar *WORK, int *LWORK, int *INFO);

int main() {
    cout << …
Run Code Online (Sandbox Code Playgroud)

c++ fortran lapack 128-bit

12
推荐指数
1
解决办法
1400
查看次数

我可以使用Lapack计算大稀疏矩阵的特征值和特征向量吗?

如果我有一个1000×1,000的方阵,那么Lapack可以计算出这个矩阵的特征向量和特征值吗?如果可以花多长时间?那么10000×10,000矩阵甚至1,000,000乘1,000,000矩阵呢?

请注意,这些将是主要由0填充的稀疏矩阵(矩阵将是代表社交网络的图形).Lapack中是否有处理稀疏矩阵的特殊程序?我看到了Arpack的建议.但是这可以计算非常大的矩阵吗?

eigenvector lapack

11
推荐指数
2
解决办法
8943
查看次数

多核系统的并行线性代数

我正在开发一个需要进行重线性代数计算的程序.

现在我正在使用LAPACK/BLAS例程,但我需要利用我的机器(24核Xeon X5690).

我发现像pblasscalapack这样的项目,但它们似乎都专注于分布式计算和使用MPI.

我没有可用的集群,所有计算都将在一台服务器上完成,并且使用MPI看起来像是一种过度杀伤力.

有人对此有任何建议吗?

parallel-processing linear-algebra lapack

10
推荐指数
2
解决办法
8515
查看次数