2016-05-31 6 views
2

行列乗算と分解(LU、SVDなど)に大きく依存する線形代数ツールをC++で開発しており、大きな行列に適用することを意図しています。 Intel MKLを使用してピーク性能を実現しましたが、インテルを搭載していない人やMKLをインストールしたくない人では動作しないと想定して、インテルMKL専用バージョンをリリースしたくありません。代わりに、私はインテル®MKL固有ではないより一般的なコードをリリースするべきですが、BLASとLAPACKのどちらの実装(例えばOpenBLASまたはATLAS)を使用するかを指定することができます。複数のBLAS/LAPACKライ​​ブラリの一般化

インテル®MKLに固有の機能(プロトタイプ)はいくつかありますが、いくつかの(ヘルパー?)機能とタイプがあります。たとえば、私が使用するMKL_INT型と、mkl_mallocがあります。このarticleは、マクロを使って型を再定義することを提案しています。これも私の最初の考えでした。私はまた、ヘッダーのマクロも持っていると思います。

BLAS/LAPACKの実装には無関係なコードを書くのが標準的だと思いますが、マクロに頼るよりも洗練された方法があるかどうかを知りたかったのです - 特に後者では再コンパイル切り替えるコードは、私が使用している他のツールのdoes not seem to be necessaryです。

答えて

1

BLAS/LAPACKコールに依存するほとんどの科学的コードは実装に依存しません。彼らは通常、ライブラリが適切なところにリンクされていることを要求します。

関数プロトタイプは実装全体で同じであるとコメントしました。これにより、一部のmyblas.hmylapack.hヘッダーのプロトタイプを作成し、使用したいライブラリをリンクすることができます。

MKLに利用している実装固有のものが主な懸念事項です。解決策は、このようなものを使わないことです。たとえば、MKL_INTのようなMKLタイプは特別ではありません。これらは、MKLが提供するLP32/LP64/ILP64ライブラリ間で一般化できるように定義されたCのデータ型です。 this tableを参照してください。

また、mkl_mallocのようなものは特別ではありません。これは、C標準がスレッドセーフで整列したallocを持つ前に導入されました。実際には、それはすべてmkl_mallocです。だからではなく、あなたが_mm_mallocmemalignなどを使用するC11にコミットしたくない場合は、単に一方...

aligned_alloc、またはを使用して、MKLはありませんBLAS/LAPACKにはいくつかの便利な拡張機能が提供されてい(例えば、転置のように)標準化されています。しかし、この種のものは通常、特別なケースのBLAS/LAPACKコールで実装するのが簡単で、自分で実装するのには簡単です。 MKLには、それを使用することを選択した場合には内部スレッドもありますが、多くのBLAS/LAPACKライ​​ブラリがこれを提供しています。

+0

これは素晴らしいです、ギャビンありがとうございます。 mkl.hやmkl_lapacke.hなど、MKLに固有のヘッダファイルはどうでしょうか? –

+0

ほとんどの人は、あらゆる実装から悩み、独自のコードベースを維持できる一般的なlapack.h/blas1.h/blas2.h/etcを持っています。コンパイル時に実装ヘッダーに指定する人もいます(つまり、 'gcc -I $(MY_LAPACK_HEADER_DIR)...')。私は通常前者を選ぶ...次に何かのためにmkl.hは必要ないはずだ –

+0

あなたの後者のオプションは私にはすぐには分かりません...あなたはディレクトリを渡していますが、ファイルの実際の名前はどこで指定しますか(mkl.h)?その場合にマクロを使用しますか? –