2017-12-14 21 views
1

현재있다 : blas 함께 제공된Blas 및 Lapack 라이브러리 용 네이티브 C++ (C가 아님) 인터페이스가 있습니까?

  • cblas, lapack 함께 제공되는
  • lapacke,

하지만, 이들은 C 인터페이스이다.

분명히 C++ 코드에서 사용할 수 있지만 이러한 인터페이스가 C++ 용으로 설계된 경우 얻을 수있는 모든 이점을 얻지 못합니다. 그래서 내 질문은 : 같은 인터페이스를 네이티브 C++ 존재합니까?

답변

2

는 최근이 두 인터페이스, 테네시 대학에서 발표되었습니다 이러한 네이티브 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 
} 
  • 는 위의 예는하지만, 더욱 재미있는 랩 서브 루틴의 수백이있다 LAPACK입니다, BLAS을 사용했다.
+1

누군가가이 질문에 1 분 전에 큰 질문을 썼다는 것을 알았을 때 심장 마비가있었습니다. – Yashas

+0

@ Yashas 필자는 여기에 자신을 위해 몇 가지 노트를 씁니다. 그러나 다른 사람들에게 유용 할 수 있습니다. –

1

그것은 당신이 추구하지만, 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++ 소스 코드

위키 BLASLAPACK 목록을 보유 지원되는 기능.

본인이 직접 사용하지는 않았지만 benchmarks 쇼는이 라이브러리의 성능이 뛰어납니다. 개발 공동체는 매우 우호적이며 토론의 기회가 열려 있습니다.

+0

예, 저는 Blaze, Eigen, Armadillo, ... libraries를 알고 있습니다.그러나 때로는 [Expression Template Mechanism] (http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=06266939)없이 플랫 인터페이스를 선호합니다. 이유 : 코드가 간단하고 컴파일 시간이 단축되었습니다. :) 어쨌든 내 대답을 완료 주셔서 감사합니다 :) –