首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xxxxx_()、LAPACK_xxxxx()和LAPACKE_xxxxx()函数的区别

xxxxx_()、LAPACK_xxxxx()和LAPACKE_xxxxx()函数的区别
EN

Stack Overflow用户
提问于 2015-07-01 19:50:14
回答 1查看 416关注 0票数 2

假设我想用LAPACK来解C (GCC)中的线性方程组。我提出的问题如下:

代码语言:javascript
复制
/* Want to solve Ax=b */
int n = ...;      // size
double *A = ...;  // nxn matrix
double *b = ...;  // length-n vector
int m = 1;        // number of columns in b (needs to be in a variable)
double *pivot;    // records pivoting
int info;         // return value

现在看来,我可以使用三个函数之一来解决这个问题。第一个问题是:

代码语言:javascript
复制
dgesv_( &n, &m, A, &n, pivot, b, &n, &info );

我惊讶地发现,这不需要任何#include,这似乎.真奇怪。

第二个函数具有几乎相同的签名,除了前缀LAPACK_之外,我认为它会引起较少的歧义,并且可能不太容易出错:

代码语言:javascript
复制
#include <lapack/lapacke.h>
LAPACK_dgesv( &n, &m, A, &n, pivot, b, &n, &info );

请注意,这要求我包括lapacke.h

第三个函数通过返回info而不是将所有参数作为指针来更改签名:

代码语言:javascript
复制
#include <lapack/lapacke.h>
info = LAPACKE_dgesv( LAPACK_COL_MAJOR, n, m, A, n, pivot, b, n);

同样,这个函数需要lapacke.h。它还需要用-llapacke链接到一个额外的库。这三个函数都需要-llapack

我试图找出这些函数之间的区别。我在lapacke.h和相关的头文件中发现了以下宏:

代码语言:javascript
复制
#define LAPACK_GLOBAL(name,NAME) name##_
#define LAPACK_dgesv LAPACK_GLOBAL(dgesv,DGESV)

因此,LAPACK_dgesv()dgesv_()似乎是完全相同的函数的不同名称。然而,LAPACKE_dgesv()似乎有着不同的实现,特别是考虑到它需要一个额外的库。

所以我的问题是:这两种功能有什么区别?文档中说,LAPACKE是LAPACK的C接口,但是函数dgesv_()又如何呢?显然,我可以正常使用它,而不需要LAPACKE,也不需要在Fortran中编译任何东西,那么这有什么区别呢?

谢谢。

更新

奇怪的是,函数dgemm_() (矩阵乘法)没有任何LAPACK_dgemm()等价。到底怎么回事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-02 19:23:40

  • 注意,LAPACKE_dgesv()具有一个额外的标志,可以是LAPACK_COL_MAJOR (通常的fortran )或LAPACK_ROW_MAJOR (通常的c顺序)。对于LAPACK_COL_MAJOR,它只是直接调用LAPACK_dgesv()。在LAPACK_ROW_MAJOR的情况下,LAPACKE_dgesv()将在调用LAPACK_dgesv()之前转置矩阵。它不是dgesv_()的新实现。看看这个文件中的work.c,关于错误处理还有一些小的额外的变化。
  • LAPACK_dgesv()在标头lapacke.h中定义为LAPACK_GLOBAL(dgesv,DGESV)。宏LAPACK_GLOBAL是在lapacke_mangling.h中定义的:它只是包装dgesv_,并在使用其他约定时关心命名约定。

因此,基本上,函数LAPACK_dgesv()只需要lapacke的头。与dgesv_相比,可以避免与库中的命名约定相关的一些问题。但是LAPACK_dgesv()dgesv_()完全一样。函数LAPACKE_dgesv()扩大了LAPACK_dgesv()的作用范围,以处理通常的c- matrix.But,最后仍然调用dgesv_

函数dgemm()是BLAS库的一部分。包装c版本的cblas_dgemm()可以在CBLAS中找到。同样,还需要一个附加标志CBLAS_ORDER,可能的值为CblasRowMajorCblasColMajor

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31170413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档