[英]Is sparse BLAS not included in BLAS?
我有一个有效的 LAPACK 实现,据我所知,它包含 BLAS。
我想使用 SPARSE BLAS,据我了解这个网站,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;
}
您引用的是 Blas 技术标准,而不是 LAPACK 参考。 除了处理一些带状矩阵之外,LAPACK 不包含用于稀疏矩阵的例程。 还有其他实现,例如spblas和sparse ,它们遵循技术标准并实现稀疏 BLAS。 通常,稀疏操作不被视为 BLAS 的一部分,而是一种扩展。
我建议使用更高级别的库,例如eigen,因为它可以为您节省大量的开发时间,而且性能成本通常很小。 还有ublas ,它是 boost 的一部分,因此如果您将 boost 作为项目的一部分,您可以尝试一下,尽管它并没有真正针对性能进行优化。 你可以在这里找到一个完整的列表(再次注意,LAPACK 没有被列为支持稀疏操作)。
似乎 g++ 没有找到所需的头文件。 所以你需要添加
-I path_to_header_files/
到命令行参数。 即,您将 blas_sparse.h 复制到工作目录的目录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.