我是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) 我正在使用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) 我正在开发一个包,它需要来自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源代码的示例.这可能吗?
我有一个用C#编写的项目,我需要对矩阵进行各种线性代数运算(如LU分解).
由于该程序主要是为确认理论而创建的原型,因此C#实现就足够了(与可能更快的C++实现相比),但我仍然希望有一个好的BLAS或LAPACK库来节省一些编码.
长话短说,任何人都可以推荐免费/开源BLAS或LAPACK库与.net一起使用吗?
最好的问候Egil.
更新:今天发现Math.NET Numerics,看起来很有趣,有没有人有这方面的经验?
LAPACK中是否有一个函数,它会给我一个特定子矩阵的元素?如果是这样,C++中的语法是什么?
或者我需要编码吗?
第一个问题,如果我将在接下来的3年中开发代码,那么开始使用c ++ 11是一件好事吗?
如果是的话,如果我想将它与Lapack一起使用,那么实现矩阵的"最佳"方法是什么?我的意思是,做std::vector<std::vector< Type > > Matrix不容易与Lapack兼容.
到目前为止,我存储了我的矩阵Type* Matrix(new Type[N])(指针形式带有new并且 delete很重要,因为数组的大小不是像5那样的数字,而是作为变量).
但是使用C++ 11可以使用std :: array.根据这个网站,这个容器似乎是最好的解决方案......你怎么看?
我正在尝试编译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) 我正在尝试使用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) 如果我有一个1000×1,000的方阵,那么Lapack可以计算出这个矩阵的特征向量和特征值吗?如果可以花多长时间?那么10000×10,000矩阵甚至1,000,000乘1,000,000矩阵呢?
请注意,这些将是主要由0填充的稀疏矩阵(矩阵将是代表社交网络的图形).Lapack中是否有处理稀疏矩阵的特殊程序?我看到了Arpack的建议.但是这可以计算非常大的矩阵吗?
我正在开发一个需要进行重线性代数计算的程序.
现在我正在使用LAPACK/BLAS例程,但我需要利用我的机器(24核Xeon X5690).
我发现像pblas和scalapack这样的项目,但它们似乎都专注于分布式计算和使用MPI.
我没有可用的集群,所有计算都将在一台服务器上完成,并且使用MPI看起来像是一种过度杀伤力.
有人对此有任何建议吗?