大家可以为我提供一个示例makefile,用于从c ++调用scalapck,我遇到了困难,我已经通过所有测试正确编译了最新版本。我有它 在Fedora上使用gcc和openmpi编译,我也尝试使用存储库中的预构建二进制文件,但没有运气
答案 0 :(得分:1)
我对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_编译器选项构建的。这可能与您的系统不同。如果是这样,请尝试objdump -t
上的libscalapack.a
和其他静态库文件来确定实际的过程名称。
使用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.a
,libcblacs.a
等)的存在。不要忘记Fortran包(适用于-lgfortran
)。