BLAS、LAPACK、およびATLASがどのように関連しているか、そしてそれらを一緒に使用する方法がわかりません。私は彼らのすべてのマニュアルに目を通し、BLASとLAPACKの一般的なアイデアと、ごく少数の例でそれらを使用する方法を知っていますが、ATLASを使用して実際の例を確認することはできません。この二つ。
マトリックスで低レベルの作業をしようとしています。私の主要言語はCです。最初にGSLを使用したかったのですが、最高のパフォーマンスが必要な場合はBLASとATLASを使用する必要があります。これらを(Cで)一緒に使用する方法の素敵な例を示した良いWebページはありますか?言い換えれば、これら3つ(またはそれらのサブセット)の使用に関するチュートリアルを探しています。要するに、私は混乱しています!
BLASは、低レベルの行列とベクトル算術演算のコレクションです(「ベクトルにスカラーを乗算する」、「2つの行列を乗算し、3番目の行列に追加する」など)。
LAPACKは、高レベルの線形代数演算のコレクションです。 「マトリックスの固有値を見つける」、「マトリックスの特異値を見つける」、または「線形システムを解く」などのことを行うために使用されるマトリックス分解(LU、LLt、QR、SVD、Schurなど) 」。 LAPACKはBLASの上に構築されています。 LAPACKの多くのユーザーのみ LAPACKインターフェイスを使用し、BLASを認識する必要はまったくありません。 LAPACKは通常BLASとは別にコンパイルされ、利用可能な高度に最適化されたBLAS実装を使用できます。
ATLASは、BLASインターフェースの移植性が比較的良好な実装であり、最も一般的に使用されるいくつかのLAPACK操作も実装します。
「使用すべき」とは、何をしようとしているか、使用しているプラットフォームの詳細に多少依存します。ただし、「ATLAS + LAPACKを使用する」をあまり間違ってはいません。
以前、私がC
で線形代数をやり始めたとき、BLAS
、LAPACK
、および他の基本的なAPI
sのチュートリアルが他の多くのライブラリの基礎であるという事実にもかかわらず、非常に少数のチュートリアルがあることに驚きました。そのため、インターネット上でBLAS
、CBLAS
、LAPACK
、CLAPACK
、LAPACKE
、ATLAS
、OpenBLAS
...のすべての例/チュートリアルを収集し始めました このGithubリポジトリ 。
機械エンジニアとして、このようなgitリポジトリまたはGitHubを管理した経験がほとんどないことを警告する必要があります。それは、皆さんにとって最初は完全な混乱のように見えます。しかし、もしあなたが厄介な構造を乗り越えることができたなら、あなたは助けになるかもしれないあらゆる種類の例と指示を見つけるでしょう。コンパイルを確実にするために、それらのほとんどを試しました。そして、私が言及したコンパイルしないもの。それらの多くをGNU compilers
(gcc
、g++
およびgfortran
)でコンパイルできるように変更しました。 MakeFile
またはFortran/FORTRAN
プログラムで個々のC++
ルーチンを呼び出す方法を学ぶために読むことができるC
sを作成しました。また、MacとLinuxのインストール手順も記載しています(Windowsの皆さん、ごめんなさい!)。これらのライブラリの一部を自動コンパイルするために、いくつかのbash
.sh
ファイルも作成しました。
しかし、他の質問に行きます:BLAS
とLAPACK
は、特定のAPI
sではなく、むしろSDK
sです。これらは、実装またはライブラリではなく、仕様または言語拡張の単なるリストです。そうは言っても、FORTRAN 77
には Netlib によるオリジナルの実装があります。ほとんどの人は、BLAS
とLAPACK
について話すときに(紛らわしいことに)参照します。これらのAPI
sを使用するときに奇妙なことがたくさんあるのは、FORTRAN
ライブラリおよび関数ではなく、C
ルーチンをC
で実際に呼び出していたためです。 ATLAS
とOpenBLAS
は、私が知る限り、BLAS
とLACPACK
の最良の実装です。私の知る限り、最初から_C/C++
に実装されていますが、元のAPI
に準拠しています(確かではありません!)。 API
を使用したOpenCL
sのGPGPU実装があります: CLBlast 、 clBLAS 、 clMAGMA 、 ArrayFire および ViennaCL いくつか言及します。特定のハードウェアまたはプラットフォーム向けに最適化されたベンダー固有の実装もあります。それらを使用することを強くお勧めします。
BLAS
でLAPACK
およびC
を使用して学習したい人への私の推奨事項は、最初にFORTRAN-C
混合プログラミングを学習することです。言及されたレポの最初の章はこの問題に専念しており、そこで多くの異なる例を集めました。
P.S。私は リポジトリのdevブランチ に取り組んでいます。少し面倒ではないようです!
ATLASは今ではかなり時代遅れです。さまざまなプラットフォーム向けにBLASを最適化することは人間の能力を超えていると考えられていたときに開発されたため、自動生成と自動調整が進むべき方法でした。
2000年代初頭には、後藤和重氏が登場し、非常に効率的な実装を手作業でコーディングできることを示しました。 New York Timesの興味深い記事をお楽しみください: https://www.nytimes.com/2005/11/28/technology/writing-the-fastest-code-by-hand-for-fun- a-human-computer-keeps.html 。
Kazushige氏は、一方では行列-行列乗算の高性能な実装の背後にある理論に対するより良い洞察を持ち、他方ではこれらをより良く設計しました。現在のCPUでは通常最高のパフォーマンスを発揮する彼のアプローチは、ATLASが自動調整する検索スペースにはありません。したがって、ATLASは本質的に劣っています。一重のBLASの実装は、GotoBLASとして知られるようになりました。彼が業界に参加したとき、OpenBLASとして分岐しました。
GotoBLASの背後にあるアイデアは、BLASのようなライブラリインスタンス化ソフトウェア(BLIS)フレームワーク( https://github.com/flame/blis )という新しい実装にリファクタリングされました。ただし、新しいアーキテクチャ用にカスタム実装する必要が少なくなるようにコードを構造化します。 BLISはCでコーディングされています。
この議論が示しているのは、BLASの実装がたくさんあるということです。 BLAS自体は、インターフェースの事実上の標準です。 ATLASはかつて最先端でした。もうありません。
私の知る限り、ATLASリポジトリを調べた後、CでのBLASの再実装が含まれているようです。それ以上のことがありますが、質問に答えることを望みます。