科学計算における最新のC ++ですか?


22

科学計算でのC ++の最新の機能(移動セマンティクス、STL、反復子、遅延評価など)の使用に特に対処する書籍、記事、またはブログ投稿、または一般に公開されている資料を探しています。何か提案できますか?

これらの新機能により効率的なコードを記述しやすくなると思いますが、実際の例は見当たりません。私が読んだほとんどの参考文献は、C ++の一般的な使用に関するものであり、科学計算の例は含まれていません。そこで、C ++の最新機能を使用した科学計算コードの例(たとえば、数値レシピのレベルで、量産コードの例でなく、単に教育的な例である必要があります)を探しています。

これらの機能を使用するライブラリについては質問していないことに注意してください。科学計算でこれらの機能をどのように活用できるかを説明する記事/本/などについて尋ねています。


2
最近(20年前)のベストプラクティスであると理解されているという意味での「モダン」、または特にC ++ 11/14の意味での「モダン」について質問していますか?
キリル

2
@Kirill両方だと思う。ほとんどがC ++ 11/14を使用するものですが、ベストプラクティスに従っています。
becko

回答:


11

最新のC ++コンストラクトを使用するライブラリの2つの例:

  • 固有ライブラリとアルマジロライブラリ(線形代数)は、いくつかの最新のC ++構造を使用します。たとえば、両方の式テンプレートを使用して算術式を簡素化し、一部の一時要素を削除できる場合があります。

http://eigen.tuxfamily.org

http://arma.sourceforge.net/

http://hpac.rwth-aachen.de/teaching/sem-accg-14/Armadillo.pdf(Armadilloの式テンプレートに関するプレゼンテーション)

  • CGALライブラリ(計算ジオメトリ)は、多くの最新のC ++機能を使用します(テンプレートと特殊化を頻繁に使用します)。

http://www.cgal.org

注意:

最新のC ++コンストラクトは非常にエレガントで、非常に楽しく使用できます。これは長所でもあり短所でもあります。それらを使用する場合、テンプレート/特殊化/ラムダの複数のレイヤーを追加することは非常に魅力的であるため、最終的にはプログラムの有効なコードよりも「管理」が多くなります(つまりあなたのプログラムは、解決策を説明するよりも、問題についてより多く「話します」。適切なバランスを見つけることは非常に微妙です。結論:以下を測定して、コードの「信号/ノイズ」比の変化を追跡する必要があります。

  • プログラム内のコードの行数は?
  • クラス/テンプレートの数は?
  • 実行時間 ?
  • メモリ消費量

最初の2つを増やすすべてがコストと見なされる可能性があり(プログラムの理解と保守が難しくなるため)、最後の2つを減らすすべてが利益です。

たとえば、抽象化(仮想クラスまたはテンプレート)を導入すると、コードをファクタリングし、プログラムを単純化(ゲイン)できますが、一度だけ派生/インスタンス化されない場合は、関連するゲインがないためコストが発生します(再び)利益はプログラムの将来の進化の後半に来る可能性があるため微妙なため、「黄金律」はありません)。

プログラマーの快適さも、コストとゲインのバランスを考慮する重要な要素です。テンプレートが多すぎると、コンパイル時間が大幅に増加し、エラーメッセージの解析が難しくなります。

こちらもご覧ください

C ++テンプレートを使用した汎用およびメタプログラミングは、計算科学でどの程度有用ですか?


2
アルマジロもエイゲンも同じですよね?
dr.blochwave

はい、あなたは正しいです(Armadilloのドキュメントで確認したばかりですが、あまり詳しくありません)。投稿を編集しています。
ブルーノレヴィ

1
長いコンパイル時間は、言及する価値のある別のコストです。
キリル

@キリル、はい良い点(それを言及するために投稿を編集した)、ありがとう。
ブルーノレヴィ

10

Deal.IIをご覧になることをお勧めします。STLを使用し、独自のイテレーター、共有ポインターなどです。

さまざまな線形ソルバーは、その設計方法により、さまざまな行列を使用できます。移動セマンティクスの使用に遭遇したことはありませんが、だからと言って、それらが存在しないというわけではありません。こちらがリンクです。


また、OpenFOAM-テンプレートのかなり広範な使用。
tpg2114

1
deal.IIは移動セマンティクスを使用しません(C ++ 11言語機能の使用を控えているためです-しかし、古いコンパイラーのBOOSTで置き換えられているC ++ 11ライブラリー機能を使用します)。ただし、元の質問で尋ねられたすべての機能を含め、他のほとんどすべてのC ++言語機能を使用します。
ヴォルフガングバンガース

大きなライブラリを詳細に見るのは簡単ではないようです。
マイケル

7

HPXのライブラリはCの範囲を頻繁に使用する++ 11は、移動コンストラクタなどの機能もの完全な実装であることを目指しているN4409(並列処理のためのC ++の拡張のためのワーキングドラフト、技術仕様書)。

彼らのサイトには出版物のリストがあり、ライブラリを使用して科学計算を高速化する多くの例を含んでいます。ライブラリに関する非常に興味深い議論もあり、このCppCastエピソードでは最新のC ++を使用しています。


scicomp.seへようこそ!リンクを追加するか、科学計算のためにこのライブラリについて説明している記事/書籍/ブログ投稿を引用する場合、私は喜んであなたの答えを支持します!
ハードマス

5

科学とエンジニアリングC ++:BartonとNackmannによる高度なテクニックと例の紹介をご覧になることをお勧めします。

この本が1994年に出版されたという事実は、「現代の技術」の基準に違反しているように思われます。ただし、バートンとナックマンは当時のC ++テンプレートで可能なことの最先端にあり、優れたパフォーマンスを達成するために考案した革新的な手法は、最新のC ++クラスライブラリで使用されています。


4

deal.ii(ここで既に提案されている)の他に、テンプレートメタプログラミング、イテレータ範囲、スマートポインターなどの高度なC ++機能を幅広く利用するDuneライブラリも見ることができます。JoachimSchöberlによる最近のプレプリントもあります。これは、NGSolveでの有限要素法の実装を簡素化するための、たとえばラムダ関数などのC ++ 11機能の使用に関するコメントです。ブーストまた、uBLAS、Graphなどの科学プログラミングに関連するライブラリもあります。これらのライブラリのほとんどで、最新のC ++の使用例が見つかると思います。ただし、アドバンスト/モダンC ++を使用する悪い例にも遭遇する可能性があることに注意してください。場合によっては、コード/ドキュメントを読んでいるときに、TMPのような高度なスキルを披露するために、物事が非常に一般化されすぎていると感じることがありました。ジョブ。


3

Pitt-Francis&Whiteleyによる「C ++でのScientific Computingのガイド」という本は、Amazonから、または出版社からの電子書籍として入手できるこの種(STL、反復子などの使用)に正確に答えるために書かれました

開示-私は著者と同じ研究グループで働いていますが、それでも非常に良いリソースだと思います!


1

この本は、私にとってもそうだったように、あなたにとって完璧だと思います。PeterGottschlingによる現代C ++の発見:科学者、エンジニア、プログラマーのための集中コース(C ++の詳細)。 C ++ 2nd Edition Bjarne Stroustrup。C ++の発明者自身。両方とも、しっかりとした基盤を提供する必要があります。


0

線形代数用のBlazeライブラリは、推定および後続の戻り値型の形式でC ++ 14を多用します。使用中のその他の最新のC ++機能にはconstexpr、エイリアステンプレート、および式SFINAEを使用したテンプレートメタプログラミングが多数あります。

ベクトルや行列の初期化リストを使用することもできます。例えば

blaze::DynamicVector<int> x{ 4, -1, 3 };

詳細については、開始ページをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.