タグ付けされた質問 「efficiency」

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つです 不等式制約のヤコビアンと同様に、等式制約のヤコビアンは密です。

3
標準ライブラリのの計算コストはいくらですか?
分子シミュレーションで対処しなければならない主要な問題の1つは、距離に依存する力の計算です。我々は、分離距離の偶数乗持っている力と距離の機能を制限することができた場合は、そして私たちは、距離の二乗を計算することができ心配する必要はありません。ただし、奇数のべき乗がある場合は、を処理する必要があります。rrrr2=r⋅rr2=r⋅rr^2 = {\bf r \cdot r}rrrr=r2−−√r=r2r = \sqrt{r^2} 私の質問は、共通言語(C / C ++、Fortran、Python)などのライブラリに実装されている計算はどれくらい高価ですか?特定のアーキテクチャ向けにコードを手動で調整することで、本当に多くのパフォーマンスの改善が必要ですか?x−−√x\sqrt{x}
26 efficiency 

3
粒子分解およびドメイン分解の並列化アルゴリズムの長所と短所は何ですか?
GromacsやDL_POLYなどのいくつかのソフトウェアパッケージを使用して、分子動力学(MD)シミュレーションを実行しています。 Gromacsは、粒子分解アルゴリズムとドメイン分解アルゴリズムの両方をサポートするようになりました。デフォルトでは、Gromacsシミュレーションはドメイン分解を使用しますが、長年、最近まで、粒子分解はGromacsで実装された唯一の方法でした。Gromacsの論文の1つ(DOI 10.1002 / jcc.20291)で、著者は粒子分解の最初の選択の理由を示しています。 「初期の設計決定は、プロセッサに作業を分散するためにドメイン分解ではなく粒子分解を使用する選択でした。後者の場合、空間ドメインはプロセッサに割り当てられます。ドメイン分解は、線形システムのサイズが相互作用の範囲を大幅に超える場合にのみ適切な選択です(分子動力学ではほとんどありません)。粒子分解では、各プロセッサが力と座標/速度の更新を計算しますプロセッサに均等に分散された事前計算されたネイバーリストを使用して、割り当てられたパーティクルの一部に対して。F私はjF私jF_{ij}粒子 と間のペア相互作用から生じるは、粒子と 両方の速度更新に必要です。私私ijjj私私ijjj、一度だけ計算され、他のプロセッサに伝達されます。すべてのプロセッサは、ストレージを必要な座標に制限するのではなく、システムの完全な座標セットをローカルメモリに保持します。これはより単純で通信のオーバーヘッドを節約しますが、メモリクレームは通常、何百万ものパーティクルであっても制限要因ではありません。一方、近隣リストは、最大1000倍の数のパーティクルを含むことができ、プロセッサに分散されます。通信は本質的に、座標の送信とプロセッサリングの周りのタイムステップごとに1回の強制に制限されます。これらの選択肢は、長期にわたって堅牢であり、最新のプロセッサクラスタに簡単に適用できることが実証されています。」 「ドメイン分解は、線形システムのサイズが相互作用の範囲を大幅に超える場合にのみより良い選択です。これは分子動力学ではめったにありません」という文の「線形システムのサイズ」とはどういう意味ですか?上記の段落から、粒子の分解には、ドメインの境界を越えて移動する粒子を処理する必要がないという利点があります。むしろ、システム構成全体を保存するのに十分なメモリが各プロセッサに必要です。したがって、ドメイン分解は非常に好ましくないように見えますが、粒子分解は非常に好ましいように見えます。 これは非常に複雑な質問(そしておそらく多くの本の主題)であると確信していますが、基本的に、粒子の分解が非常に好ましいと思われる場合、ドメイン分解を使用する必要があるのはなぜですか? システムのサイズが非常に大きい場合(各プロセッサに構成全体を保存するのが困難または不可能になる場合)、ドメインの分解は適切ですか?上記の引用された段落に基づいて、ドメイン分解が最近、Gromacsのデフォルトの並列化アルゴリズムである理由がわかりません。 DL_POLY(バージョン4)もドメイン分解を使用しているようです。バージョン4のマニュアルから: 「この方法での構成データの分割は、シミュレーションセル内の原子の位置に基づいています。このようなシステムデータの幾何学的割り当ては、DDアルゴリズムの特徴です。この戦略が効率的に機能するために、システムは合理的に均一な密度を持たなければならないので、各プロセッサには原子データのほぼ等しい部分が割り当てられます(可能な限り)。この方法は概念的には簡単ですが、プログラミングは難しく、効率が最も高い大規模なシミュレーションに特に適しています。 ... DD戦略の場合、SHAKE(RATTLE)アルゴリズムはDL_POLY ClassicのReplicated Dataメソッドよりも単純です。この場合、原子位置のグローバルな更新(マージとスプライシング)が必要です。 これにより、実装が困難になる可能性がありますが、より効率的になる可能性があるため、ドメイン分解が良好であるかのように聞こえます。 一方、以前のバージョン(DL_POLY Classic)は複製されたデータの並列化を使用していました。これは、パーティクル分解の別名と思われます。そのバージョンのマニュアルから: レプリケートデータ(RD)戦略は、MDで並列化を実現するいくつかの方法の1つです。その名前は、並列コンピューターの各ノード上の構成データの複製に由来します(すなわち、原子座標、速度 定義する配列、およびを強制しますすべてr私r私\textbf{r}_iv私v私\textbf{v}_if私f私\textbf{f}_iNNNシミュレートされたシステム内の原子は、すべての処理ノードで再現されます)。この戦略では、力の計算と運動方程式の統合のほとんどは、ノード間で簡単かつ均等に共有でき、大部分は各ノードで独立して処理できます。この方法は、プログラムが比較的簡単であり、かなり効率的です。さらに、単一のプロセッサで非常に簡単に実行できるように「折りたたみ」できます。ただし、この戦略はメモリを大量に消費し、通信のオーバーヘッドが高くなる可能性がありますが、全体的に見て、幅広いアプリケーションで成功することが実証されています。 この段落は一般に、この質問の最初の段落と一致しているように見えますが、複製されたデータ/粒子の分解には「高い通信オーバーヘッド」があると書かれています。Gromacsの論文のパラグラフは、その逆を言っているようです。つまり、粒子分解は、ドメイン分解よりも通信のオーバーヘッドが少ないため、好ましいと言えます。 何か考えはありますか?

3
大規模なデータセットを使用した計算問題のI / O戦略
私の研究グループは、分子動力学に焦点を当てています。分子動力学は、明らかに分析しなければならない単一の軌跡の一部としてギガバイトのデータを生成する可能性があります。 私たちが懸念している問題のいくつかは、データセットの相関関係に関係しています。つまり、より逐次的なアプローチを使用するのではなく、メモリ内の大量のデータを追跡して分析する必要があります。 私が知りたいのは、大規模なデータセットのI / Oをスクリプトに処理するための最も効率的な戦略です。通常、Pythonベースのスクリプトを使用するのは、ファイルI / OのコーディングがCやFortranよりもはるかに簡単になるためですが、処理する必要のある行が数千または数億ある場合、最適なアプローチが明確ではありません。Cでコードのファイル入力部分を実行することを検討する必要がありますか、または別の戦略がより便利ですか?(単に配列全体をメモリにプリロードする方が、一連の「チャンク」(メガバイトのオーダー)の順次読み取りよりも優れているでしょうか? いくつかの追加のメモ: 私たちは、「オンライン」ツールではなく、後処理用のスクリプトツールを主に探しています。そのため、Pythonを使用しています。 上記のように、MDシミュレーションを行っています。関心のあるトピックの1つは拡散計算です。そのためには、アインシュタイン拡散係数を取得する必要があります これは、計算を開始する前にすべてのデータをメモリにロードする必要があることを意味します。すべてのデータの塊(個々の時間の記録)は互いに相互作用します。D = 16リムΔ T → ∞⟨ (X(T + Δ T )- X(T))2⟩D=16リム△t→∞⟨(バツ(t+△t)−バツ(t))2⟩D = \frac{1}{6} \lim_{\Delta t \rightarrow \infty} \left< \left( {\bf x}(t + \Delta t) - {\bf x}(t) \right)^2 \right>
15 python  c  efficiency 

2
Matlabで「for」ループを記述する最も効率的な方法は何ですか?
たとえば、forマトリックスのインデックスを実行するダブルループがある場合、外側のループにインデックスを実行する列を配置する方が効率的であることを読みました。例えば: a=zeros(1000); for j=1:1000 for i=1:1000 a(i,j)=1; end end 3つ以上のforループがある場合、それをコーディングする最も効率的な方法は何ですか? 例えば: a=zeros(100,100,100); for j=1:100 for i=1:100 for k=1:100 a(i,j,k)=1; end end end

1
ルックアップと計算のコスト
距離基準が満たされているかどうかを確認する計算をセットアップすることに興味があります。つまり、ベクトルとanベクトルx jの間の距離は、ある値r m a xよりも小さくなければなりません。データは、座標の直交グリッドに従って分割されています。私のカットオフは最近接座標の端点間の距離よりも小さいため、「オクタント」変数を追加して、正しくセットアップされているかどうかを確認します。xixi{\bf x}_ixjxj{\bf x}_jrmaxrmaxr_{\rm max} if octant[j] in allowed_list continue 「短絡」として if dist(x[i], x[j]) &lt; r_max 私の質問は、浮動小数点演算に対するブール検索と比較の計算効率はどれくらいですか?これは現代のアーキテクチャで行う価値がありますか?
12 efficiency 

2
自動分化はいつ安いのですか?
自動微分により、特定の入力でプログラムの導関数を数値的に評価できます。この計算は、元のプログラムを実行するコストの5倍未満のコストで実行できるという定理があります。この係数5は上限です。 どのような状況でこのコストをさらに削減できますか?多くの現場での派生コードは、元のプログラムの速度に近い速度で実行されます。この高速化を実現するために何が行われますか? 計算を高速化するために利用できる元のプログラムの特徴は何ですか? 計算を高速化するためにどのようなソフトウェアエンジニアリングトリックを使用できますか?

3
と間には複雑性がありますか?[終了]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、計算科学スタック交換のトピックになるようにします。 5年前休業。 より大きくより小さい複雑度はありか?O (n log n )O(n)O(n)O(n)O(nlogn)O(nlog⁡n)O(n \log n)

4
不完全でガンマ関数の高速かつ正確な倍精度実装
倍精度特殊関数を実装する最新の方法は何ですか?:私は、次の積分必要 ため、M=0、1、2、。。。そして、t&gt;0で、これは下側の不完全ガンマ関数で書くことができます。これが私のFortranとCの実装です。Fm(t)=∫10u2me−tu2du=γ(m+12,t)2 トンm + 12Fメートル(t)=∫01あなた2メートルe−tあなた2dあなた=γ(メートル+12、t)2tメートル+12 F_m(t) = \int_0^1 u^{2m} e^{-tu^2} d u = {\gamma(m+{1\over 2}, t)\over 2 t^{m+{1\over 2}}} M = 0 、1 、2 、。。。メートル=0、1、2、。。。m=0, 1, 2, ...t &gt; 0t&gt;0t>0 https://gist.github.com/3764427 これは級数展開を使用し、指定された精度になるまで項を合計し、再帰関係を使用してより低い値を効率的に取得します。私はそれをうまくテストし、必要なすべてのパラメーター値に対して1e-15の精度を取得しました。詳細については、Fortranバージョンのコメントを参照してください。メートルメートルm それを実装するより良い方法はありますか?以下は、gfortranでのガンマ関数の実装です。 https://github.com/mirrors/gcc/blob/master/libgfortran/intrinsics/c99_functions.c#L1781 私がしている無限級数を合計する代わりに、有理関数近似を使用しています。均一な精度を得る必要があるので、これはより良いアプローチだと思います。これらのものにアプローチするためのいくつかの標準的な方法はありますか、または各特別な関数の特別なアルゴリズムを理解する必要がありますか? アップデート1: コメントに基づいて、SLATECを使用した実装を次に示します。 https://gist.github.com/3767621 おおよそ1e-15の精度で、私自身の関数の値を再現します。ただし、t = 1e-6およびm = 50の場合、項は1e-303に等しくなり、より高い "m"の場合は、誤った答えを出し始めます。Fmに直接級数展開/再帰関係を使用するため、関数にこの問題はありません。正しい値の例を次に示します。tm + 12tメートル+12t^{m+{1\over2}}FメートルFメートルF_m 、F100F100F_{100}(1e-6)=4.97511945200351715E-003 しかし、分母が爆発するため、SLATECを使用してこれを取得することはできません。ご覧のとおり、実際の値は小さく、小さくなっています。FメートルFメートルF_m アップデート2: 上記の問題を回避するために、1機能を使用することができますdgamit(Tricomiの不完全ガンマ関数)を、そしてF(m, ...

3
GPGPUアクセラレーション用のNvidia K20XとGeForce Titan
アカデミックコンピューティング、特にDGEMMコンポーネント用のこれら2つのグラフィックカードの違いを理解しようとしています。 生の統計を見ると、どちらも同じGK110チップを備えており、事実上すべてのカテゴリで同等の統計があり、コアアーキテクチャも同じだと思います。割引前のK20Xは、タイタンの約4倍のコストです。効率の観点からは、K20XよりもTitanを使用する方が理にかなっているようです。 ここで違いを理解するのに苦労しています、誰かが状況を解明できますか? メモとして、私はこれらのカードをラックサーバー用に購入し、基本的にカードが死ぬまで完全に傾けて実行することを検討しています。ただし、1つのジョブで複数のGPUを使用する効率が特に重要だとは思いません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.