2017-12-14 9 views
1

現在存在する:blasに同梱されているBlasおよびLapackライブラリのネイティブC++(C言語ではない)インターフェイスはありますか?

  • CBLAS
  • lapack
  • に同梱されているlapacke

しかしながら、これらは、Cインタフェースです。

もちろん、C++コードで使用することはできますが、これらのインターフェイスがC++用に設計されていれば、得られるメリットはありません。だから私の質問は: そのようなインターフェイスがネイティブC + +で存在するのですか?

答えて

2

は最近テネシー州の大学からのこれら2つのインターフェイスが、リリースされました:

これらのネイティブC++実装を使用していくつかの直接的なメリットがあります。

だが、基本的なジェネリックプログラミングの例を考えてみましょう:cblas_?scal機能にv = alpha*v感謝:

あなたは、ベクトルをスケーリングすることを想像してみてください。 CBLASで

あなたは(... floatdoublecomplex<float>complex<double>、)それはすべてのサポートされているスカラー型のために同じインタフェースを持っているという意味で、「一般的な」何かを望んでいた場合は、すべての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で、2つの関数は貴様があるということです:cblas_sscalcblas_dscal ...あなたは同じ名前を持つことができますC++では を年度と、これはその引数に応じて右の関数にディスパッチするコンパイラの仕事である、ここでfloatdouble ...

今の状況。上記のhttps://bitbucket.org/icl/blasppのC++ネイティブインタフェースでは、この定型文はすでにすべて一回書かれています。

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) { ... } 

も一般的な実装:あなたが持っているscal.hhヘッダファイルを見ればたとえば、このC++インタフェースで

したがって
template<typename T> 
void scal(int64_t n, T alpha, T *x, int64_t incx) { ... } 

を、/あなたのFAVORITベクトルのための汎用的なインタフェースを定義することは容易ですマトリックスタイプ。例として、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 
} 
  • 前の例は、BLASを使用し、しかし、それはさらに興味深い包まれたサブルーチンの数百を持っているLAPACKためです。
+1

1分前に質問された質問に誰かがこの大きな回答を書いたのを見たとき、私はミニハートアタックをしました。 – Yashas

+0

@Yashas私はここで自分のためにいくつかのノートを書いていますが、多分他の人には役に立つかもしれませんが、これはアイデアです:-)。 –

1

それはあなたが求める正確に何ではありませんが、Blaze C++ libraryを示唆している:

ブレイズは 密と疎の算術演算のためのオープンソースの高性能なC++数学ライブラリです。最新鋭のスマート表現 テンプレート実装Blazeは、ドメイン固有の言語である の優雅さと使いやすさをHPCグレードのパフォーマンスと組み合わせることで、最も直感的で最速のC++数学ライブラリの1つを としています。

ブレイズライブラリの提供...

  • ... 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、...ライブラリを認識しています。しかし、私は[Expression Template Mechanism](http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=06266939)がなくてもフラットなインターフェースを好むことがあります。理由:より簡単なコードとコンパイル時間の短縮:)とにかく私の答えを完了していただきありがとうございます:) –

関連する問題