c++ - 从 C++ 调用 ScaLAPACK

标签 c++ gcc openmpi scalapack

您好,谁能给我提供一个从 C++ 调用 ScaLAPACK 的 Makefile 示例,我遇到了困难。

我已经正确编译了最新版本并通过了所有测试。我在 Fedora 上用 GCC 和 OpenMPI 编译了它,我也尝试过使用存储库中预构建的二进制文件,但没有成功。

最佳答案

我对 ScaLAPACK 过程使用了以下声明:

extern "C" void pdgesvd_(char *jobu, char *jobvt, int *M, int *N, double *A, int *ia, int *ja, int *desca, double *s, double *u, int *iu, int *ju,
            int *descu, double *vt, int *ivt, int *jvt, int *descvt, double *work, int *lwork, int *info);

extern "C" void pdgemv_(char *t, int *M, int *N, double *alpha, double *A, int *ia, int *ja, int *desca, double *X, int *ix, int *jx,int *descx,
            int *incx, double *beta, double *Y, int *iy, int *jy, int *descy, int *incy);


extern "C" void pdgemm_(char *transa, char *transb, int *M, int *N, int *K, double *alpha, double *A, int *ia, int *ja, int *desca, double *B,
            int *ib, int *jb, int *descb, double *beta, double *C, int *ic, int *jc, int *descc);

BLACS 过程以相同的方式声明:

extern "C" void blacs_get_(/*in*/int *icontxt, /*in*/int *what, /*out*/int *val); 

我将“_”字符附加到过程名称,因为 BLAS 和 ScaLAPACK 是使用 -DAdd_ 编译器选项构建的。这可能与您的系统不同。如果是这样,请在 libscalapack.a 和其他静态库文件上尝试 objdump -t 以确定实际的过程名称。

您的带有 ScaLAPACK 调用的程序可能会像这样编译:

mpicxx -o your_binary_name -O2 your_source.cpp -lscalapack -lblacs -lcblacs -lblacs -llapack -lblas -lgfortran

请注意,g++ 调用行 (-lblacs -lcblacs -lblacs -llapack -lblas -lgfortran) 中静态库的顺序很重要!还要检查库目录中是否存在所有这些静态库文件(libblas.alibcblacs.a 等)。不要忘记 Fortran 包(用于 -lgfortran)。

关于c++ - 从 C++ 调用 ScaLAPACK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10237124/

相关文章:

c++ - 具有 sudo 权限的 OpenMPI/mpirun 或 mpiexec

c++ - 为什么使用 MPI_File_open 而不是 fopen?

c++ - 使用 mpicxx 时由于 _noalias 导致 OpenMPI 构建失败

c++ - 用项目 C++ 填充 QTreeview

c++ - 基于最大四边形轮廓OpenCV裁剪图像

c++ - '\0' 和 NULL 可以互换使用吗?

c++ - 用于检索 C++ 代码库中函数和方法列表的工具

c - 为什么编译器不提示变量被重新定义?

c - _builtin_prefetch()中第二个参数的作用是什么?

c - 为什么 scanf 对大 float 输入错误?