私のC++コードでlapackとblasを使う必要があります.MKL、ACML、またはデフォルトのlapackとblasをLinuxシステムにリンクしたいと思っています。残念なことに、彼らはcで異なる慣習を持っています。例えば、MKL(mkl_blas.h)でZDOTCはlapackとblasをC++で呼び出す
zdotc(&result, &n, x, &incx, y, &incy);
と、デフォルトのLAPACKおよびBLAS(FORTRANバージョン)からZDOTC呼び出しがあるさ:
result = zdotc_(&n, x, &incx, y, &incy);
私は私のコードはMKLのいずれかを使用したい場合は、 ACML、またはデフォルトのlapack blas。私はこのためにラップを書く必要があります:
#ifdef FORTRAN_NO_UNDERSCORE
#define F77NAME(x) x
#else
#define F77NAME(x) x##_
#endif
complex<double> zdotc_wrap(int n, const complex<double>*x, int incx, const complex<double>*y, int incy)
{
#if defined(USE_MKL)
complex<double> result;
zdotc(&result, &n, x, &incx, y, &incy)
return result;
#elif defined(USE_LAPACK_BLAS)
return F77NAME(zdotc)(&n, x, &incx, y, &incy);
#elif defined(USE_ACML)
...
#endif
}
非常に多くの機能がありますが、それぞれにラップを書き込む時間がかかります。私は彼らの独特の慣例が一つあることを願っています。コードでlapackとblasを使用している場合、どのようにこの問題を解決しますか?あなたはすべての機能のラップを持っていますか?ラップがあれば、それを私と分かち合うことができれば素晴らしいだろう。
更新:
私はこの問題を解決する1つの方法を見つける:
complex<double> result;
#ifndef FORTRAN_COMPLEX_FUNCTIONS_RETURN_VOID
result = zdotc(
#else
zdotc(&result,
#endif
&n, x, &incx, y, &incy);
任意の提案を:
#ifndef FORTRAN_COMPLEX_FUNCTIONS_RETURN_VOID
extern complex<double> zdotc(
#else
extern void zdotc(complex<double>* retval,
#endif
const int *n,
const complex<double> *zx,
const int *incx,
const complex<double> *zy,
const int *incy
);
それから私がすることで、この関数を呼び出すことができますか?より良いソリューション?ご協力ありがとうございました。
ありがとうございます。これは非常に便利です。 '-ff2c'でBLASとLAPACKをコンパイルすることで、問題を解決できます。私は図書館を書いている間、他の人々が私の図書館を柔軟に利用できるように願っています。 BLASを再コンパイルし、LAPACKはビットを間接的に点灯します。私は定義を追加することによってこの問題を解決しようとしています、それは私の質問で更新されます。何か提案はありますか? –
私の答えを更新しました。 –
ありがとう、これは私が元々やっていることです。今はもっと良い方法はないと思う。 –