4

仮説的に言えば、私の科学的研究が (デスクトップ上での) 関数/モジュール/サブルーチンの開発につながるとしたら、それをスーパーコンピューター (分子をシミュレートする可能性がある) 上で実行される大規模なシミュレーションに組み込むには、何を知る必要がありますか? 、流体、反応など)?

私の印象では、可能な場合は特定のライブラリ (BLAS、LAPLACK など) を利用し、アルゴリズムを修正し (反復を減らし)、プロファイリングし、並列化し、メモリ、ハードディスク、プロセッサの使用/アクセスを考慮する必要があります。 「コードを最適化したいのならやらないでください」という格言を知っていますが、効率的なコードを書くことについて学ぶことに興味があるなら、どのような参考文献が利用できるでしょうか?

この質問は言語にとらわれないと思いますが、生体分子シミュレーションや気候モデリングなどの多くの計算パッケージが Fortran のあるバージョンで書かれているため、おそらくこの言語が私の関心の対象になるでしょう (そして、私は Fortran でかなり広範囲にプログラミングしました)。 77)。

4

4 に答える 4

5

プロファイリングは、あらゆるレベルの機械で必須です。一般的な使用法では、ますます大きなグリッドにスケーリングするには、グリッドソフトウェアとグリッドのトポロジをよりよく理解する必要があることがわかりました。その意味で、1台のマシンの最適化について学んだことはすべて適用できますが、グリッドソフトウェアを理解すると、さらに多くのマイレージが得られます。Hadoopは最も人気があり普及しているグリッドシステムの1つであるため、スケジューラオプション、インターフェイス(APIおよびWebインターフェイス)、およびその他の使用法について学ぶことが役立ちます。特定のスーパーコンピューターにHadoopを使用することはできませんが、分散コンピューティングについて学ぶためのそれほど苦痛のない方法の1つです。並列コンピューティングの場合、MPIやその他のシステムを追求できます。

さらに、複数のコアまたはプロセッサにわたって、単一のマシンでコードを並列化することを学ぶことは、デスクトップマシンで学び始めることができるものです。

推奨事項:

  1. 単一のマシンでコードを最適化する方法を学びます。
    • プロファイリングを学ぶ
    • 最適化されたライブラリの使用方法を学ぶ(プロファイリング後:スピードアップを確認できるように)
    • アルゴリズムとデータ構造をよく知っていることを確認してください(*
  2. 複数のコアマシンで驚異的並列プログラミングを行う方法を学びます。
    • 後で:マルチスレッドプログラミングを検討してください。それはより難しく、あなたの問題に対して報われないかもしれません。
  3. 分散処理のための基本的なグリッドソフトウェアについて学ぶ
  4. グリッド上での並列処理のためのツールについて学ぶ
  5. GPU、さまざまな特殊なコンピューティングシステムなどの代替ハードウェアのプログラミングを学びます。

これは言語に依存しません。複数の言語と複数のHPCシステムで同じシーケンスを学習する必要がありました。各ステップで、より簡単なルートを使用して、インフラストラクチャとツールのいくつかを学習します。たとえば、マルチスレッドの前にマルチコアを学習し、並列の前に分散して、ハードウェアと問題に適合するものとそうでないものを確認できるようにします。

一部の手順は、ローカルコンピューティングの慣行、確立されたコードベース、およびメンターに応じて並べ替えられる場合があります。大規模なGPUまたはMPIライブラリを配置している場合は、Hadoopを共同作業者に押し付けるのではなく、必ずそれを学んでください。

*)アルゴリズムをよく知っている理由は、コードがグリッド上で実行されるとすぐに、他の人がそれを見るようになるからです。それがシステムを占有しているとき、彼らはあなたが何をしているのか知りたがるでしょう。多項式で一定でなければならないプロセスを実行している場合は、自分が嘲笑されていることに気付くかもしれません。より多くのドメインの専門知識を持つ他の人は、NP困難な問題の適切な近似を見つけるのに役立つかもしれませんが、その概念が存在することを知っておく必要があります。

于 2011-08-13T23:17:04.560 に答える
5

並列化が鍵になります。

あなたが挙げた問題 (CFD、マルチフィジックス、物質移動など) は一般に大規模な線形代数問題として表現されるため、適切に並列化できる行列ルーチンが必要です。MPI は、この種の問題の標準です。

物理学も影響します。たとえば、明示的なダイナミクスと人工質量および減衰行列を使用して、一部の楕円問題を効率的に解くことができます。

3D マルチフィジックスとは、時間スケールが変化する結合微分方程式を意味します。空間と時間の両方で詳細を解決するには細かいメッシュが必要になるため、自由度の数は急速に増加します。タイム ステップは、問題の安定性要件によって決まります。

線形代数を map-reduce 問題として実行する方法を誰かが理解した場合、彼らはそれをノックアウトするでしょう。

于 2011-08-13T23:12:34.247 に答える
5

仮説的に言えば、私の科学的研究が (デスクトップ上での) 関数/モジュール/サブルーチンの開発につながるとしたら、それをスーパーコンピューター (分子をシミュレートする可能性がある) 上で実行される大規模なシミュレーションに組み込むには、何を知る必要があるでしょうか? 、流体、反応など)?

まず、問題を理解する必要があります。すべての問題を並行して解決できるわけではありません (また、並行という用語を可能な限り広い意味で使用しいます)。それで、問題がどのように解決されたかを見てください。他の方法でより迅速に解決できますか。独立した部分に分割できますか...など...

Fortran は科学計算に特化した言語であり、近年、新しい言語機能の開発とともに、この「市場」を狙った機能に関しても非常に興味深い開発が行われています。「共同配列」という用語は、興味深い読み物になる可能性があります。

しかし今のところ、最初にUsing OpenMP - OpenMP はより単純なモデルですが、本 (内部の fortran の例) のような本を読むことをお勧めします。メッセージ解析インターフェース (友人向け、MPI :) はより大きなモデルであり、頻繁に使用されるモデルの 1 つです。OpenMP からの次のステップは、おそらくこの方向に進むはずです。MPI プログラミングに関する書籍は珍しくありません。

ライブラリについても言及しました-はい、言及したもののいくつかは広く使用されています。その他もご用意しております。パフォーマンスの問題がどこにあるかを正確に知らない人は、ライブラリルーチンを書き直そうとするタスクを決して引き受けようとしないでください。

また、並列アルゴリズムに関する本もあります。チェックアウトすることをお勧めします。

この質問は言語にとらわれないと思いますが、生体分子シミュレーションや気候モデリングなどの多くの計算パッケージが Fortran のあるバージョンで書かれているため、おそらくこの言語が私の関心の対象になるでしょう (そして、私は Fortran でかなり広範囲にプログラミングしました)。 77)。

要するに、問題を理解し、パフォーマンスの問題がどこにあるかを学び、別のアプローチで問題全体を再度解決し、数回繰り返します。あなたが立ち往生している場所。

于 2011-08-14T00:34:26.550 に答える
3

私たちはあなたと同じような立場にいます。私は@Iteratorの答えに最も同意していますが、もっと言いたいことがあると思います。

まず、ランダムポーズ方式による「プロファイリング」を信じています。なぜなら、私は物事を測定することにあまり興味がないので(それを行うのは簡単です)、時間の浪費を引き起こしているコードを特定することに興味があるので、それを修正できます。それは、投光照明とレーザーの違いのようなものです。

一例として、LAPACKとBLASを使用します。さて、スタックサンプルを取得する際に、多くのサンプルが文字を比較するルーチンにあることがわかりました。これは、行列を乗算およ​​びスケーリングする一般的なルーチンから呼び出され、コードから呼び出されました。行列操作ルーチンには、柔軟性を持たせるために、行列が下三角行列であるかどうかなどを示す文字引数があります。実際、行列がそれほど大きくない場合、ルーチンは問題を分類するだけで時間の50%以上を費やす可能性があります。もちろん、次に同じ場所から呼び出されたときは、同じことを繰り返します。そのような場合は、特別なルーチンを作成する必要があります。コンパイラーによって最適化されると、合理的に可能な限り高速になり、分類時間を節約できます。

別の例として、さまざまなODEソルバーを使用します。もちろん、これらはn次に最適化されています。これらは、ユーザー提供のルーチンを呼び出して、導関数と、場合によってはジャコビアン行列を計算することによって機能します。これらのユーザー提供のルーチンが実際にはあまり機能しない場合、サンプルは実際にODEソルバー自体のプログラムカウンターを表示します。ただし、ユーザー提供のルーチンがはるかに多くのことを実行する場合、サンプルは、ODEコードがほぼ同じ時間かかるのに対し、それらのルーチンは時間がかかるため、ほとんどの場合、それらのルーチンのスタックの下端を見つけます。したがって、最適化は、ODEコードではなく、ユーザーが提供するルーチンに集中する必要があります。

スタックサンプリングによって特定されるいくつかの種類の最適化を実行すると、1〜2桁高速化できます。問題が許せば、必ず並列処理、MPIなどを活用してください。

于 2011-08-14T17:47:50.623 に答える