현재있다 : blas 함께 제공된Blas 및 Lapack 라이브러리 용 네이티브 C++ (C가 아님) 인터페이스가 있습니까?
- cblas, lapack 함께 제공되는
- lapacke,
하지만, 이들은 C 인터페이스이다.
분명히 C++ 코드에서 사용할 수 있지만 이러한 인터페이스가 C++ 용으로 설계된 경우 얻을 수있는 모든 이점을 얻지 못합니다. 그래서 내 질문은 : 같은 인터페이스를 네이티브 C++ 존재합니까?
현재있다 : blas 함께 제공된Blas 및 Lapack 라이브러리 용 네이티브 C++ (C가 아님) 인터페이스가 있습니까?
하지만, 이들은 C 인터페이스이다.
분명히 C++ 코드에서 사용할 수 있지만 이러한 인터페이스가 C++ 용으로 설계된 경우 얻을 수있는 모든 이점을 얻지 못합니다. 그래서 내 질문은 : 같은 인터페이스를 네이티브 C++ 존재합니까?
는 최근이 두 인터페이스, 테네시 대학에서 발표되었습니다 이러한 네이티브 C++ 구현을 사용하여 즉각적인 혜택이 있습니다
.
은의 기본적인 제네릭 프로그래밍의 예를 살펴 보자 다음 cblas_?scal 기능v = alpha*v
감사 :
당신이 벡터의 크기를 조절하려는 상상해보십시오. 당신이 (... float
, double
, complex<float>
, complex<double>
) 지원되는 모든 스칼라 유형에 대한 동일한 인터페이스를 가지고 있다는 의미에서 "일반"뭔가를 원한다면 cblas와
, 모든 C 함수로했다 래핑 :
void scal(cblas_int n,float alpha, float *x, cblas_int inc) {
...
cblas_sscal(n,alpha,x,inc); <- s for float
}
void scal(cblas_int n,double alpha, double *x, cblas_int inc) {
...
cblas_dscal(n,alpha,x,inc); <- d for double
}
// do the same for complex<float>, complex<double> ...
이유는 서로 다른 이름 경우 C에서,이 개 기능의 differents가 있다는 것입니다 : cblas_sscal
, cblas_dscal
... 같은 이름을 가질 수 ++ C에서 을 SCAL는 이것은 float
, double
...
상황 지금 여기 인수에 따라 적절한 기능에 파견 컴파일러 일이다. 언급 된 https://bitbucket.org/icl/blaspp C++ 기본 인터페이스로이 상용구 코드는 이미 한 번 작성되었습니다. 당신이 scal.hh 헤더 파일을 보면 예를 들어 당신이 :
void scal(int64_t n, float alpha, float *x, int64_t incx) { ... }
void scal(int64_t n, double alpha, double *x, int64_t incx) { ... }
void scal(int64_t n, std:complex<float> alpha, std:complex<float> *x, int64_t incx) { ... }
void scal(int64_t n, std:complex<double> alpha, std:complex<double> *x, int64_t incx) { ... }
심지어 일반적인 구현이 C++ 인터페이스를 따라서
template<typename T>
void scal(int64_t n, T alpha, T *x, int64_t incx) { ... }
를,이/당신의 즐겨 찾기 벡터에 대한 일반적인 인터페이스를 정의하기 쉽습니다 매트릭스 유형.예를 들어, std::vector<T>
와 함께, 당신은 단지 (독립적으로 실제 T 타입) 작성해야한다 :
template<typename T>
void scal(T alpha, std::vector<T>& v) {
scal(v.size(),alpha,v.data(),1);
}
더 이상 상용구 코드를!
이는 생각이다, 그러나 그주의 :
합니다.
template< typename TA, typename TX >
void trmm(
blas::Layout layout,
blas::Side side,
blas::Uplo uplo,
blas::Op trans,
blas::Diag diag,
int64_t m,
int64_t n,
typename blas::traits2<TA, TX>::scalar_t alpha,
TA const *A, int64_t lda,
TX *B, int64_t ldb)
{
throw std::exception(); // not yet implemented
}
그것은 당신이 추구하지만, Blaze C++ library을 제안 정확히되지 않습니다 :
블레이즈 밀도 및 스파 스 연산을위한 오픈 소스, 고성능 C++ 수학 라이브러리입니다. 최첨단 스마트 표현 템플릿 구현 Blaze는 의 도메인 고유 언어와 HPC 등급 성능의 우아함과 사용 편의성을 결합하여 가장 직관적이고 빠른 C++ 수학 라이브러리 중 하나 인 을 제공합니다.
불꽃 라이브러리 제공 ...
- ... BLAS 라이브러리의 통합을 통해 높은 성능과 수동으로 조정 HPC 수학 커널
- ... SSE, SSE2, SSE3, SSSE3에 의해 벡터화, SSE4, AVX, AVX2, AVX-512, FMA 및 SVML
- ... OpenMP, C++ 11 스레드 및 부스트 스레드에 의한 병렬 실행
- ... 특정 도메인의 직관적이고 사용하기 쉬운 API 언어
- ... unif 치밀하고 희소 행렬과 벡터
- ... 철저히 검사 행렬 및 벡터 산술 IED 산술
- ... 완전히 휴대용 고품질 C++ 소스 코드
위키 BLAS 및 LAPACK 목록을 보유 지원되는 기능.
본인이 직접 사용하지는 않았지만 benchmarks 쇼는이 라이브러리의 성능이 뛰어납니다. 개발 공동체는 매우 우호적이며 토론의 기회가 열려 있습니다.
예, 저는 Blaze, Eigen, Armadillo, ... libraries를 알고 있습니다.그러나 때로는 [Expression Template Mechanism] (http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=06266939)없이 플랫 인터페이스를 선호합니다. 이유 : 코드가 간단하고 컴파일 시간이 단축되었습니다. :) 어쨌든 내 대답을 완료 주셔서 감사합니다 :) –
누군가가이 질문에 1 분 전에 큰 질문을 썼다는 것을 알았을 때 심장 마비가있었습니다. – Yashas
@ Yashas 필자는 여기에 자신을 위해 몇 가지 노트를 씁니다. 그러나 다른 사람들에게 유용 할 수 있습니다. –