計算科学

科学的問題を解決するためにコンピュータを使用する科学者のためのQ&A

10
使用可能な高速C ++マトリックスライブラリの推奨事項
使用可能な高速C ++マトリックスライブラリに関する推奨事項はありますか? 使用可能とは、次のことを意味します。 マトリックスオブジェクトには直感的なインターフェイスがあります(例:インデックス作成中に行と列を使用できます) LAPACKおよびBLASで実行できるマトリックスクラスで何でもできます。 簡単に習得して使用できるAPI Linuxにインストールするのは比較的簡単です(現在Ubuntu 11.04を使用しています) 私にとっては、早すぎる最適化を避けるために、現在、速度やメモリ使用よりもユーザビリティが重要です。コードを書く際、私は常に1-D配列(またはSTLベクトル)と適切なインデックスまたはポインター演算を使用して行列をエミュレートできましたが、バグを避けるためにしたくないです。また、行列をエミュレートするために使用した小さなプログラミングトリックのすべてを思い出すために私の限られた注意の一部を使用するのではなく、解決しようとしている実際の問題と問題領域にプログラムしようとする精神的な努力に焦点を当てたい、LAPACKコマンドなどを覚えておいてください。さらに、記述しなければならないコードが少なくなり、コードが標準化されるほど、より良い結果が得られます。 密か疎かはまだ関係ありません。私が扱っているマトリックスの一部はスパースになりますが、すべてではありません。ただし、特定のパッケージが密行列または疎行列を適切に処理する場合は、言及する価値があります。 テンプレートを作成することも重要ではありません。標準の数値型を使用し、double、float、int以外を保存する必要がないからです。いいですが、私がやりたいことには必要ありません。

14
科学研究コードの単体テストを書くことは価値がありますか?
自動化された一連の回帰テストを含む、完全なプログラムを検証するテスト(収束テストなど)を使用することの価値を強く確信しています。プログラミングの本を読んだ後、ユニットテスト(つまり、単一の関数の正確性を検証し、問題を解決するためにコード全体を実行するテストではない)を作成する必要があるというしつこい気持ちになりました。。ただし、単体テストは常に科学的コードに適合しているとは限らず、結果的に人為的または時間の無駄に感じます。 研究コードの単体テストを作成する必要がありますか?

10
GPUコンピューティングにはどのような問題が役立ちますか?
だから、私が取り組んでいる問題がシリアルで最良のものであり、それを並行して管理できるものについて、まともな頭を持っています。しかし、現時点では、CPUベースの計算によって何が最適に処理され、GPUに何をオフロードする必要があるのか​​についてはあまり知りません。 私はその基本的な質問を知っていますが、私の検索の多くは、なぜ、またはやや漠然とした経験則を正当化することなく、どちらか一方を明確に主張する人々に巻き込まれます。ここでより有用な応答を探しています。
84 gpu 

17
Python用の高品質な非線形プログラミングソルバーはありますか?
解決すべきいくつかの挑戦的な非凸のグローバル最適化問題があります。現在、MATLABのOptimization Toolbox(特にfmincon()algorithm ='sqp'を使用)を使用していますが、これは非常に効果的です。ただし、私のコードのほとんどはPythonで作成されているため、Pythonでも最適化を行いたいと考えています。競合できるPythonバインディングを備えたNLPソルバーはありfmincon()ますか?ちがいない 非線形等式および不等式の制約を処理できる ユーザーがヤコビアンを提供する必要はありません。 グローバルな最適化を保証していなくても構いません(保証fmincon()しません)。私は、困難な問題や、それよりもわずかに遅い場合でも、ローカル最適にロバストに収束するものを探していfmincon()ます。 OpenOptで利用できるソルバーをいくつか試しましたが、MATLABのソルバーより劣っていfmincon/sqpます。 強調するために、私はすでに扱いやすい定式化と優れたソルバーを持っています。私の目標は、ワークフローをより合理化するために、単に言語を変更することです。 Geoffは、問題のいくつかの特性が関連している可能性があると指摘しています。彼らです: 10-400の決定変数 4〜100の多項式等式制約(1〜8の範囲の多項式次数) 決定変数の数の約2倍に等しい合理的な不等式制約の数 目的関数は決定変数の1つです 不等式制約のヤコビアンと同様に、等式制約のヤコビアンは密です。

6
Fortranコンパイラは実際にどれほど優れていますか?
この質問は、「C ++ vs Fortran for HPC」への回答で最近出された2つの議論の延長です。そして、それは質問よりも少し挑戦です... Fortranを支持する最もよく耳にする引数の1つは、コンパイラーが優れていることです。ほとんどのC / Fortranコンパイラは同じバックエンドを共有するため、両方の言語で意味的に同等のプログラム用に生成されたコードは同一である必要があります。ただし、コンパイラが最適化するのはC / Fortranの方が多かれ少なかれ簡単だと主張することができます。 そこで、簡単なテストを試すことにしました。daxpy.fとdaxpy.cのコピーを入手し、gfortran / gccでコンパイルしました。 daxpy.cはdaxpy.fのf2c変換(自動生成コード、見苦しい)なので、そのコードを取り、それを少しクリーンアップしました(daxpy_cに会います)。 for ( i = 0 ; i < n ; i++ ) dy[i] += da * dx[i]; 最後に、gccのベクトル構文を使用して書き直しました(daxpy_cvecと入力します)。 #define vector(elcount, type) __attribute__((vector_size((elcount)*sizeof(type)))) type vector(2,double) va = { da , da }, *vx, *vy; vx = ...
74 fortran  c  blas  benchmarking 

10
コードのシリアルパフォーマンスを改善するための優れた戦略は何ですか?
私は計算科学に携わっており、その結果、多くのコードの科学的スループットを向上させ、これらのコードの効率を理解しようとするのに、かなりの時間を費やしています。 私が取り組んでいるソフトウェアのパフォーマンス対可読性/再利用性/保守性のトレードオフを評価したと仮定しましょう、そして私はパフォーマンスのために行く時だと決めました。また、(フロップ/秒とメモリ帯域幅に関して)私の問題に対してより良いアルゴリズムがないことを知っていると仮定しましょう。私のコードベースは、C、C ++、Fortranなどの低レベル言語であると仮定することもできます。最後に、コードに並列性がないこと、または単一コアでのパフォーマンスのみに関心があると仮定します。 最初に試すべき最も重要なことは何ですか?どれだけのパフォーマンスが得られるかを知るにはどうすればよいですか?

12
HPC用のC ++とFortran
私の計算科学のPhDプログラムでは、ほぼすべてC ++とFortranで作業しています。一部の教授は他の教授よりも一方を好むようです。特定の状況において、どちらが「優れている」のか、一方が他方より優れているのか疑問に思っています。
56 hpc  fortran  c++  languages 

5
不等間隔のデータのFFTを取得するにはどうすればよいですか?
高速フーリエ変換アルゴリズムは、その入力ポイントが時間領域等間隔であるという仮定の下でフーリエ分解を計算します。そうでない場合はどうなりますか?効果的な可変サンプリングレートを説明するために、使用できる別のアルゴリズム、または何らかの方法でFFTを変更できるアルゴリズムはありますか?tk= k Ttk=kTt_k = kT サンプルの配布方法にソリューションが依存する場合、私が最も関心を持っている状況は2つあります。 ジッタの一定のサンプリングレート:ここで、δ のT kはランダムに分布変数です。と言っても安全だとしましょう| δ T K | &lt; T / 2。tk= k T+ δtktk=kT+δtkt_k = kT + \delta t_kδtkδtk\delta t_k| δtk| &lt;T/ 2|δtk|&lt;T/2|\delta t_k| < T/2 :特に一定のサンプリングレートからサンプルを落としn個のk ∈ Z ≥ Ktk= nkTtk=nkTt_k = n_k Tnk∈ Z ≥のKnk∈Z≥kn_k \in\mathbb{Z}\ge k 動機:まず第一に、これは、このサイトの提案に関する高い投票の質問の1つでした。しかし、さらに、少し前に、不均一にサンプリングされたポイントを持ついくつかの入力データが出てくるFFTの使用(Stack Overflowの質問でプロンプトが出されます)に関する議論に参加しました。データのタイムスタンプが間違っていることが判明しましたが、この問題にどのように取り組むことができるかを考えさせられました。

4
「ジュリア」科学計算言語プロジェクトはどれくらい成熟していますか?
現在使用しているC ++およびPythonの(部分的な)代替として、数値/シミュレーションモデリングプロジェクトに使用する新しい言語の学習を検討しています。ジュリアに出会いました。それが主張するすべてを行うと、高レベルの科学計算ライブラリコード(PyPlotを含む)にアクセスでき、Cと同様の速度でforループを実行できるため、すべてのプロジェクトでC ++ と Pythonの両方を置き換えることができます。また、他の言語のいずれにも存在しない適切なコルーチンのようなものからも恩恵を受けるでしょう。 しかし、それは比較的新しいプロジェクトであり、現在バージョン0.xであり、日々使用する準備が整っていないというさまざまな警告(過去のさまざまな日付に投稿されています)が見つかりました。したがって、この段階でこの言語を学ぶために時間をかけることを個人的に検討する必要があるかどうかを評価するために、プロジェクトのステータスに関する情報(2014年2月、または回答が投稿されるたび)が欲しいです。 Juliaプロジェクトに関する特定の関連する事実に焦点を当てた回答をいただければ幸いです。他のプロジェクトでの経験に基づく意見にはあまり興味がありません。 特に、Geoff Oxberryのコメントは、Julia APIがまだ流動的であり、コードが変更されたときに更新する必要があることを示唆しています。APIのどの領域が安定しており、どの領域が変更される可能性があるのか​​、これがどの程度であるかを知りたいと思います。 私は通常、線形代数(固有問題の解決など)、多くの変数を含むODEの数値積分、PyPlotおよび/またはOpenGLを使用したプロット、および低レベルCスタイルの数値計算(たとえば、モンテカルロシミュレーション) )。ジュリアのライブラリシステムは、これらの分野で完全に開発されていますか?特に、APIはこれらのタイプのアクティビティに対して多かれ少なかれ安定していますか、それともJuliaの新しいバージョンにアップグレードした後、私の古いコードが壊れる傾向があると思いますか? 最後に、現在ジュリアを深刻な仕事に使用するかどうかを決定する際に検討する価値がある他の問題はありますか?

17
標準の数値アルゴリズムにライブラリを使用しないのは一般的ですか?
GSLのような科学計算ライブラリでは、多くの数値アルゴリズム(積分、微分、補間、特殊関数など)を利用できます。しかし、これらの関数の「手巻き」実装を使用したコードをよく目にします。必ずしも一般に配布することを目的としない小さなプログラムの場合、計算科学者の間では、必要なときに数値アルゴリズム(Webサイト、数値レシピなどからコピーまたは転記すること)を自分で実装するのが一般的ですか?もしそうなら、GSLのようなものへのリンクを避ける特別な理由がありますか、それとも他のものよりも単なる「伝統」ですか? 私はコードの再利用が大好きなので、可能な場合は既存の実装を使用することをお勧めします。しかし、科学的な計算では一般的なプログラミングよりも原理の価値が低いという理由があるのではないかと思っています。 言及するのを忘れました:ライブラリの使用に明確な利点(実行速度)があるPythonのような言語とは対照的に、CとC ++について具体的に尋ねています。
54 libraries  c 

7
すべての計算科学者が持つべき中核スキルは何ですか?[閉まっている]
すべての科学者は、統計について少し知っておく必要があります。相関の意味、信頼区間とは何かなどです。同様に、すべての科学者はコンピューティングについて少し知っておくべきです。問題は何ですか?すべての作業科学者がソフトウェアの構築と使用について知っていると期待するのは合理的ですか?コアスキルのリスト --- 名前に「クラウド」または「ペタ」を使用して何かに取り組む前に、人々が知っておくべきこと--- 基本的なプログラミング(ループ、条件、リスト、関数、およびファイルI / O) シェル/基本シェルスクリプト バージョン管理 プログラムをどれだけテストするか 基本的なSQL このリストにはないものがたくさんあります:マトリックスプログラミング(MATLAB、NumPyなど)、使い慣れたスプレッドシート、ほとんどのプログラミング言語と同じくらい強力です)、Makeなどのタスク自動化ツールなど。 だから、あなたのリストには何がありますか?すべての科学者が最近知っていることを期待することは公平だと思いますか?そして、それのためのスペースを作るために上のリストから何を取りますか?すべてを学ぶのに十分な時間はありません。
52 education 

4
スパース線形システムソルバーを選択する場合、どのガイドラインに従う必要がありますか?
スパース線形システムは、アプリケーションの頻度が高くなるにつれて現れます。これらのシステムを解決するために選択する多くのルーチンがあります。最高レベルでは、直接法(特殊な順序付けアルゴリズムを使用したスパースガウス消去法またはコレスキー分解法、マルチフロント法など)と反復法(GMRES、(双)共役勾配法)の間に分岐点があります。 直接法を使用するか反復法を使用するかをどのように決定しますか?その選択をした後、特定のアルゴリズムをどのように選ぶのでしょうか?対称性の活用についてはすでに知っています(たとえば、スパース対称正定値システムに共役勾配を使用します)が、メソッドを選択する際に考慮すべきこのような他の考慮事項はありますか?

3
有限要素法と有限体積法の概念的な違いは何ですか?
有限差分法と有限体積法の間には明らかな違いがあります(方程式の点定義からセル全体の積分平均に移行します)。しかし、FEMとFVMは非常によく似ています。両方とも積分形式と平均セルを使用します。 FVMではないことを行うFEMメソッドは何ですか?FEMの背景を少し読みましたが、方程式は弱い形式で書かれていることを理解しています。これにより、このメソッドはFVMとは少し異なる状態になります。しかし、違いが何であるかを概念レベルで理解していません。FEMは、セル内で未知のものがどのように変化するかに関して何らかの仮定をしますが、これもFVMで行うことはできませんか? 私は主に1Dの観点から来ているので、FEMには複数の次元で利点があるのでしょうか? このトピックに関する情報は、ネット上であまり見つけていません。ウィキペディアにはFEMと有限差分法との違いに関するセクションがありますが、それについてはhttp://en.wikipedia.org/wiki/Finite_element_method#Comparison_to_the_finite_difference_methodを参照してください。

5
有限差分と有限要素の間で選択する基準は何ですか
私は、非常に制約のあるグリッド上で、有限要素の特殊なケースとして有限差分を考えることに慣れています。では、数値法として有限差分法(FDM)と有限要素法(FEM)を選択する条件は何ですか? 有限差分法(FDM)の側面では、有限要素法(FEM)よりも概念的にシンプルで実装しやすいと考えるかもしれません。FEMには非常に柔軟性があるという利点があります。たとえば、グリッドは非常に不均一であり、ドメインは任意の形状を持つことがあります。 FDMがFEMよりも優れていることがわかっている唯一の例は 、ZarbaのBouloutasのCeliaにあります。ここでは、時間微分の異なる離散化を使用するFDメソッドによる利点がありますが、有限要素法に固定することもできます。

8
科学ソフトウェアを文書化する良い方法は何ですか?
多くの場合、他の人が書いた科学的コード(または、時には自分の研究でさえ)を継承または遭遇したときに、ドキュメントがまばらであるか存在しないことに気付きました。運が良ければ、有益なコメントが表示されます。運が良ければ、DoxygenのコメントとDoxyfileさえありますので、関数インターフェースといくつかのフォーマットされたHTMLを参照してください。私が非常に幸運なら、Doxygenとソースファイルのコメントに加えてPDFマニュアルと例があります。そして、私は非常に楽しかったです。 ソースコードの文書化に役立つ情報とツールは何ですか?さらに言えば、科学ソフトウェアの場合、そのソースコードに付随するデータと結果を文書化するのにどのような情報とツールが役立ちますか?

Licensed under cc by-sa 3.0 with attribution required.