こんにちは、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_コンパイラオプションを使用して構築されているため、プロシージャ名に「_」文字を追加します。これは、システムによって異なる場合があります。その場合は、他の静的ライブラリファイルを試し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パッケージ(for)を忘れないでください-lgfortran
。