lapack 및 blas를 C++ 코드에 사용해야하므로 Linux 시스템에서 MKL, ACML 또는 기본 lapack 및 blas를 연결하려고합니다. 불행히도, 그들은 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를 사용하는 경우 어떻게이 문제를 해결할 수 있습니까? 당신은 모든 기능을 감싸고 있습니까? 랩이 있으면 나와 공유 할 수 있다면 좋을 것입니다.
업데이트 :
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
);
가 그럼 난으로이 함수를 호출 할 수 있습니다 :
내가이 문제를 해결하는 하나의 방법을 찾을? 더 나은 솔루션? 도와 줘서 고마워.
감사합니다. 이것은 매우 유용합니다. BLAS와 LAPACK을'-ff2c'로 컴파일하면 문제를 해결할 수 있습니다. 제가 도서관을 쓰는 동안 다른 사람들이 저의 도서관을 융통성있게 사용할 수 있기를 바랍니다. BLAS를 다시 컴파일하고 LAPACK은 간접 비트입니다. 정의를 추가하여이 문제를 해결하기 위해 노력하고 있습니다, 그것은 내 질문에 업데이트됩니다. 의견 있으십니까? –
내 대답이 업데이트되었습니다. –
고마워요. 제가 원래하고있는 일입니다. 나는 지금 더 좋은 방법이 없다고 생각합니다. –