軽量/インストールなしのCまたはC ++ベースの密線形代数ソルバーの推奨事項


9

私のプログラミングのほとんどは、私自身が使用するためのCの1回限りの研究コードです。協力者以外にコードを配布したことがありません。私は科学ジャーナルで公開しているアルゴリズムを開発しました。記事のオンラインサプリメントでソースコードとおそらく実行可能コードを提供したいと思います。同僚から、C ++(ack!)で記述する必要があり、小さな密な線形システムを解く必要があるアルゴリズムを一般化するように依頼されました。アルゴリズムのユーザーベースを取得することに成功した場合、その原因の1つは、それを使用するためのエントリバーが低い(床の上など)ためです。潜在的なユーザーは、コードを使用するためにライブラリなどをインストールしません。コードを完全に独立させ、ライセンスの影響を受けないようにしたい。Golubとvan Loanから何かを取り出して独自のソルバーを作成するだけかもしれませんが、誰かがすでに書いたバニラソルバーを使用したい場合は、そこに使用します。提案を歓迎します。ありがとう!



親愛なるジェップ、フォーラムへようこそ。あなたの質問はここに1と非常によく似ていますscicomp.stackexchange.com/questions/351/...
GertVdE

ライブラリソルバーは、堅牢性、効率、および一般性のために、複雑で大きくなる傾向があります。あなたの問題が非常に小さく、条件が整っている場合は、独自のミニ実装を作成することをお勧めします。
ステファノM

@GertVdE、この質問に対する迅速な回答に感謝します。「推奨事項...」の質問へのリンクは不快です。このような状況では、質問とトップアンサーの両方が一般的すぎて、ヘルプを提供できないためです。これについてさらに説明したい場合は、scicompチャットルームに移動することをお勧めします
Aron Ahmadia 2012年

@AronAhmadia:これらの議論のいくつかを解決し始める唯一の方法は、言語とライブラリの両方に依存する計算科学プログラミングのクレストマシーの実装を開始することだと思います。コードが明確で、構成の問題に対処できる場合(シェルスクリプト、Chef、またはPuppetを使用)、コードを実行してタイミングを調整するだけで、パフォーマンスに関する議論に対処(または具体化)できます。参照マシン。明快さに関する議論は、コードを見ることで解決できます(少なくとも、より具体的になります)。それ以外の場合は、同じ引数を持ち続けます。
Geoff Oxberry、2012年

回答:


7

Lapackインターフェースを必要な機能に正確に複製することをお勧めしますdgesv。おそらく、必要な機能だけです。そうすれば、Lapackがインストールされている人は、それにリンクするだけで機能します。Lapackをインストールしていない人のために、この関数の独自の簡単な実装を提供するか、他の人が提案するように、EigenまたはFLENSを使用して実装する可能性があります。

Fortranの土地では、Lapackライブラリは非常に標準的であり、ほとんどの人は独自の実装を提供する代わりに、それを使用するだけです。


+1ほとんどのLinuxディストリビューション(少なくともDebianベース)にはリポジトリにバイナリパッケージがあり、ベンダーが提供するすべての数学ライブラリ(MKL、SunPerf、ACML、ESSLなど)がそれを運ぶという事実に加えてください。できる限り常に標準ライブラリを使用する必要がありますが、Windows / Macを使用している場合は、Cベースのものを使用する方がよいでしょう。無料のFortranコンパイラ(gfortran)をインストールするのは、ある程度の作業であると聞いています。
stali

私は何度もラパックを使用しましたが、現在はフォートランランドにいません。ユーザーベースのプラットフォームの統計的分布は、主にWindows、Macのパーセンテージ、* nixのパーセンテージが小さいという意味で、世界の統計分布に似ていると思います。私のWindowsの使用経験は最小限であり、そのままにしておくことを好みます。これが、スタンドアロンのC ++コードが必要な理由です。一部のユーザーにコードをコンパイルして実行するための支援を提供する必要があると思います。そのために必要な作業を最小限に抑える必要があります。
2009年

ユーザーベースがWindows / Macの場合は、単純なCベースの(おそらく独自の)実装のほうが適しています。インストールが困難なパッケージや他の5つのライブラリに依存しているパッケージ、特に利用可能なファーストクラスのバイナリパッケージリポジトリ(Debianなど)がない場合は、ユーザーを長期間無効にします。ほとんどのWindows / Macユーザーはワンクリックインストールに慣れていることを覚えておいてください。使いやすさは他のすべてを打ち負かします。
stali

5

科学計算を始めるときに多くの人が犯すごく初期の間違いは、すべてのコードを同じ言語で書く必要があると想定していることです。これは、同じコンパイラの異なるバージョン間でコンパイル済みプログラムを互いに通信させる方法が明確でなかった歴史的な理由が主な原因であると思います。とはいえ、この場合、とにかくC ++を使用する場合、ニーズに合う可能性のある非常に優れたC ++ヘッダーのみのテンプレートライブラリがいくつかあります。

学術的な理由でコードを配布しており、密な線形代数ソルバーをコードに埋め込みたいので、Eigenを検討することを強くお勧めします。EigenはMozilla Public Licenseの下でライセンスされており、ヘッダーのみのライブラリです。つまり、Eigenをコードとともにソース形式で配布でき(これにより、コードにライセンス制限が課されることはありません)、非常に効率的な密な線形ソルバーを含むその一般的な機能にアクセスできるようになります。GertVdEが言及するように、他にもいくつかのオプションがあります


私は単一のファイルを望んでいました。私はかなり長い間、科学的プログラミングを行ってきました。Cとfortranのような混合言語をかなり使用していますが、このプロジェクトでは、すべてのソースコードを含む1つのファイルが本当に必要です。たいしたことではないC ++コードにCソルバーを配置できると思います。主に、コードをできるだけ単純にしたいと考えています。ピボット付きのLUで十分です。アイゲンを見ます。ありがとう!
2009年

@jep、パフォーマンスにまったく関心がない場合は、CLAPACKから必要なルーチンを選択することもできます。
Aron Ahmadia 2012年

すべての依存コードを同じ言語で作成することには十分な理由があります。特に、HPC環境では、奇妙なコンパイラ/リンクの問題と32/64ビットインターフェイスの問題があります。たとえば、組み込みライブラリの整数の幅を知るにはどうすればよいですか?組み込みライブラリにどのコンパイラが使用されているかを確実に知るにはどうすればよいですか。また、他のコンパイラとリンクさせることはできますか?すべてを1つの言語で使用すると、これらの問題の多くが単純化されます。そして、はい、クラスターのメンテナーによって提供されるドキュメントがあるはずですが、ほとんどの場合はありません。
Victor Liu、

@VictorLiu-あなたが言及している問題は、言語よりも実装に密接に結びついています。コメントスペースは真剣なディスカッションを始めるには不十分な場所ですが、これについて私の考えを広げてもらいたい場合は、チャットまたは他の場所であなたに参加させていただきます。
Aron Ahmadia 2012年

4

線形方程式のシステムに信頼できるソルバーが必要な場合は、FLENSをお勧めします。LAPACKの正確な再実装が含まれています(シングルスレッドのBLAS実装が使用されている場合、LAPACKと同じ丸め誤差も再現されます)。これはすべてのFLENS-LAPACK関数に当てはまります(ユーティリティ関数とともに約100のルーチン)。

FLENSはBSDライセンスの下にあるため、独自の製品に組み込むことができます。

FLENSはヘッダーのみであり、FLENSのサブセットのみが必要な場合は、必要な機能のみを含む簡略版を提供できます。FLENSには独自のリファレンスBLAS実装が付属しています。ただし、オプションで、ユーザーはATLAS、OpenBLAS、GotoBALSなどの最適化されたBLASライブラリに対してリンクできます。大きな行列の場合、これはEigenと比較して約40%のパフォーマンス向上をもたらします。

そして、はい、EigenはLAPACKテストスイートを使用して結果をチェックします。これらは、3つの関数(Lu、コレスキー、および対称行列の固有値/ベクトル)に対してこれを行います。ただし、非対称行列の固有値/ベクトルの計算では、LAPACKテストスイートは失敗します。

免責事項:はい、FLENSは私の赤ちゃんです!それは私がそれの約95%をコード化したことを意味し、コードのすべての行はそれの価値がありました。


1
マイケル- アフィリエーションの開示に関するよくある質問のルールに従う必要があるという、この友好的な警告と考えてください。
Aron Ahmadia 2012年

もちろん、投稿を「Eigenを検討することを強くお勧めします」から「たとえばEigenがある」などのように言い換えることもできます。この場合、これを含めて、Eigenに関する私の発言(すべて真実であることが証明されていますが)を削除します。
Michael Lehn

1
アイゲンについてのあなたの発言はここでは問題になりません(私にはトピックから外れているように見えますが)。あなたはFLENSの主要な開発者です。ここで回答を推奨する場合は、プロジェクトの開発者としての所属を開示する必要があります。
Aron Ahmadia

あ、じゃあ。私は暗黙のうちに「...私はあなたに与えることができます...」によって明確であると思いました。この形式での開示は大丈夫ですか?
Michael Lehn

2
これをしてくれてありがとう。Lapackの大部分をC ++で再実装する同様の計画がありました。ただし、ほとんどの高度な(固有値)ルーチンでは、Lapackへの呼び出しを単に延期しているようです。そのため、全体を再実装するとは少し虚偽の宣伝になります。一方、一部の部分はまだ自動変換による1ベースのインデックス付けになっていますが、実際にはZGEEVソースをRNPの C ++に移植しています。
Victor Liu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.