2016-10-27 8 views
0

私は驚いたことに、ウェブ上でBLASの実装をcilkplusの配列表記法に基づいて追跡することはできません。 cilkplusは、今日のマルチコア・ワークステーションCPUで、BLASアルゴリズムの非常に表現力豊かでコンパクトな表現と相まって、(それ以上の)パフォーマンスを保証する必要があるため、奇妙です。 BLAS/LAPACKが密度の高い行列計算のための事実上の標準であることを考えると(少なくとも仕様として)、さらに奇妙です。cilkplus配列表記法を使用しているblas実装はありますか?

私はblas/lapackを改善/拡張しようとする最近の別のライブラリがあることを理解しています。たとえば、固有ベクトルとフレンズを見てきましたが、依然としてcilkplusバージョンの"標準的な" blas実装。

これは、非常に限られたクロストークの広がりによって決まりますか?

答えて

0

http://parallelbook.com/downloadsには、Cholesky分解例のいくつかのBLAS操作(gemm、portrf、syrk、およびtrsm)のCilk Plusコード(「BOOKからのコード例」を参照)があります。ルーチンはテンプレートなので、どのような精度でも動作します。

プラス側では、Cilk Plusのバージョンは良好な合成プロパティを提供します。つまり、スポーンツリーの別々の部分で心配なく使用できます。 Cilk Plusのアルゴリズムはキャッシュを知らない傾向がありますが、高度にチューニングされたライブラリはキャッシュ認識を利用することができるため、きれいなコンポジションを必要としない場合は、高度に調整された並列BLASライブラリと競合するのは難しいです。例えば、キャッシュアウェアアルゴリズムは、同じコア上の複数のスレッドを注意深くスケジューリングして、同じブロック上で動作させることができ、メモリフェッチオーバーヘッドを節約することができる。各マシンのキャッシュ認識権を取得するのはたくさんの作業ですが、BLASの作成者はこの作業を実行する意思があります。

キャッシュの認識(「私はマシン全体を所有しています」というプログラミング)がクリーンな構成を妨害するので、両方を持つことはできません。

一部のBLAS操作では、Cilk Plusのfork-join構造も、あまり構造化されていない並列処理に比べてパフォーマンスが制限されているようです。いくつかの例については、http://www.netlib.org/utk/people/JackDongarra/WEB-PAGES/cscads-libtune-09/talk17-knobe.pdfのスライド2を参照してください。

0

例としてgemmを実行すると、最後に並列ルーチンはblas(sgemm、dgemmなど)ルーチンを呼び出すだけです。これはnetlibリファレンス、atlas、openblas、またはmklかもしれませんが、これは推奨された引用文では不透明です。私は、参照ルーチンのcilkplus実装の存在を求めていました。何かのように

void dgemm(MATRIX & A, MATRIX & B, MATRIX & C) {  
    #pragma cilk grainsize = 64 
    cilk_for(int i = 1; i <= A.rows; i++) { 
     double *x = &A(i, 1); 
     for (int j = 1; j <= A.cols; j++, x += A.colstride) 
      ROW(C, i) += (*x) * ROW(B, j); 
    } 
} 
関連する問題