稀疏的BLAS不包括在BLAS中吗?

Is sparse BLAS not included in BLAS?

我有一个有效的 LAPACK 实现,据我所知,它包含 BLAS。

我想使用 SPARSE BLAS,据我了解this website,SPARSE BLAS 是 BLAS 的一部分。

但是当我尝试使用

运行稀疏 blas 手册中的以下代码时

g++ -o sparse.x sparse_blas_example.c -L/usr/local/lib -lblas && ./sparse_ex.x

编译器(或链接器?)要求 blas_sparse.h。当我将该文件放入工作目录时,我得到:

ludi@ludi-M17xR4:~/Desktop/tests$ g++  -o sparse.x sparse_blas_example.c -L/usr/local/lib -lblas && ./sparse_ex.x
In file included from sparse_blas_example.c:3:0:
blas_sparse.h:4:23: fatal error: blas_enum.h: No such file or directory
 #include "blas_enum.h"

我必须做什么才能将 SPARSE BLAS 与 LAPACK 一起使用? 我可以开始将大量头文件移动到工作目录,但我收集到我已经将它们与 lapack 一起使用了!

/* C example: sparse matrix/vector multiplication */

#include "blas_sparse.h"
int main()
{
const int n = 4;
const int nz = 6;
double val[] = { 1.1, 2.2, 2.4, 3.3, 4.1, 4.4 };
int indx[] = { 0, 1, 1, 2, 3, 3};
int jndx[] = { 0, 1, 4, 2, 0, 3};
double x[] = { 1.0, 1.0, 1.0, 1.0 };
double y[] = { 0.0, 0.0, 0.0, 0.0 };
blas_sparse_matrix A;
double alpha = 1.0;
int i;

/*------------------------------------*/
/* Step 1: Create Sparse BLAS Handle */
/*------------------------------------*/

A = BLAS_duscr_begin( n, n );

/*------------------------------------*/
/* Step 2: insert entries one-by-one */
/*------------------------------------*/

for (i=0; i< nz; i++)
{
BLAS_duscr_insert_entry(A, val[i], indx[i], jndx[i]);
}

/*-------------------------------------------------*/
/* Step 3: Complete construction of sparse matrix */
/*-------------------------------------------------*/
BLAS_uscr_end(A);

/*------------------------------------------------*/
/* Step 4: Compute Matrix vector product y = A*x */
/*------------------------------------------------*/

BLAS_dusmv( blas_no_trans, alpha, A, x, 1, y, 1 );

/*---------------------------------*/
/* Step 5: Release Matrix Handle */
/*---------------------------------*/

BLAS_usds(A);

/*---------------------------*/
/* Step 6: Output Solution */
/*---------------------------*/

for (i=0; i<n; i++) printf("%12.4g ",y[i]);
printf("\n");
return 0;
}

g++好像没有找到需要的头文件。所以你需要添加

-I path_to_header_files/ 

命令行参数。即,您将 blas_sparse.h 复制到工作目录的目录。

您引用的是 Blas 技术标准,而不是 LAPACK 参考。 LAPACK 不包含稀疏矩阵的例程,除了处理遵循技术标准并实现稀疏 BLAS 的 some banded matrices. There are other implementations such as spblas and sparse。通常,稀疏操作不被视为 BLAS 的一部分,而是一种扩展。

我建议使用更高级别的库,例如 eigen because it will save you a significant amount of development time, with usually small performance costs. There is also ublas which is part of boost, so if you are using boost as part of your project, you could give it a try, though it's not really optimised for performance. You can find a comprehensive list here(再次注意,LAPACK 未列为支持稀疏操作)。

正如 Paul 所提到的,标准 BLAS 中不包含稀疏求解器。然而,Netlib 有不同的计算例程,称为 sparseblas here.

我会推荐两个著名的稀疏矩阵直接求解器,它们是:SuperLU here and MUMPS here

您可以在这篇论文“Analysis and Comparison of Two General Sparse Solvers for Distributed Memory Computers

我们在我们的代码和 superLu 之间做了一个小规模的基准测试,结果如图所示。