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

アルゴリズム、データ構造、言語、ライブラリの実行速度とメモリ使用量に関する質問。

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

7
フロップカウントによるアルゴリズム分析は時代遅れですか?
私の数値解析コースでは、問題のサイズに対して、必要な浮動小数点演算(フロップ)の数を数えることにより、アルゴリズムの効率を分析することを学びました。たとえば、数値線形代数に関するTrefethen&Bauのテキストには、フロップカウントの3Dに見える写真さえあります。 キャッシュにないものをフェッチするためのメモリレイテンシは、フロップのコストよりもはるかに大きいため、「フロップは無料」と言うのが流行しています。しかし、少なくとも数値解析コースでは、フロップを数えることを生徒に教えています。代わりに、メモリアクセスをカウントするように教える必要がありますか?新しい教科書を書く必要がありますか?または、メモリアクセスがマシン固有であり、時間を費やすことができませんか?フロップまたはメモリアクセスがボトルネックであるかどうかに関して、長期的な傾向はどうなりますか? 注:以下の回答のいくつかは、「実装を強烈に書き換えて、数フロップを節約するか、キャッシュのパフォーマンスを向上させるべきですか?」しかし、私が求めているのは、「算術演算またはメモリアクセスの観点からアルゴリズムの複雑さを推定する方が便利ですか?」という行に沿ったものです。

4
Fortranを高速化するものは何ですか?
Fortranは数値プログラミングにおいて特別な場所です。確かに他の言語で優れた高速のソフトウェアを作成できますが、Fortranはその時代にもかかわらず非常に優れたパフォーマンスを維持します。さらに、Fortranで高速プログラムを作成するのが簡単です。私はC ++で高速プログラムを作成しましたが、ポインターエイリアシングのようなことに注意する必要があります。したがって、これには理由があり、非常に技術的な理由が必要です。コンパイラがさらに最適化できるからでしょうか?技術的な詳細を知りたいので、別の言語を使用する場合はこれらのことを考慮に入れることができます。 たとえば、私は知っている-またはそのように考えている-1つのことは、標準ではポインターが常にメモリ内で連続していることを指定しているため、メモリアクセスが高速になることを意味します。コンパイラにフラグを付けることで、C ++でこれを行うことができると思います。このように、Fortranが優れていることを知るのに役立ちます。したがって、別の言語を使用している場合、これを模倣できます。

4
MATLABバックスラッシュ演算子は、正方行列の
いくつかのコードを「ストック」MATLABコードと比較していました。その結果には驚きました。 サンプルコードを実行しました(スパースマトリックス) n = 5000; a = diag(rand(n,1)); b = rand(n,1); disp('For a\b'); tic;a\b;toc; disp('For LU'); tic;LULU;toc; disp('For Conj Grad'); tic;conjgrad(a,b,1e-8);toc; disp('Inv(A)*B'); tic;inv(a)*b;toc; 結果 : For a\b Elapsed time is 0.052838 seconds. For LU Elapsed time is 7.441331 seconds. For Conj Grad Elapsed time is 3.819182 seconds. Inv(A)*B Elapsed time …

5
ATLASとMKLのパフォーマンスの違いは?
ATLASは無料のBLAS / LAPACKの代替品であり、コンパイル時にマシンに合わせて調整されます。MKLは、Intelが出荷する商用ライブラリです。パフォーマンスに関しては、これら2つのライブラリは同等ですか、それともMKLが一部のタスクで優位を占めていますか?もしそうなら、どれ?

4
Pythonで記述されたコードを高速化するために使用できるツールまたはアプローチは何ですか?
背景: Krylov部分空間法を使用して行列指数ベクトル積を計算するコードをMATLABからPythonに移植したいと思うかもしれません。(具体的には、この論文で説明されているアルゴリズムを使用するJitse Niesenのexpmvp関数。)ただし、コンパイル済みライブラリから派生したモジュールの関数を頻繁に使用しない限り(つまり、多くの組み込みのPython関数で)、それは非常に遅い可能性があります。 質問:パフォーマンスのためにPythonで記述したコードを高速化するのに役立つツールまたはアプローチはありますか?特に、プロセスを可能な限り自動化するツールに興味がありますが、一般的なアプローチも歓迎します。 注: Jitseのアルゴリズムの古いバージョンを使用していますが、しばらく使用していません。このコードを高速にするのは非常に簡単かもしれませんが、良い具体的な例になりそうで、自分の研究に関連しています。この特定のアルゴリズムをPythonで実装するための私のアプローチについては、まったく別の質問です。

4
計算科学でC ++式テンプレートを使用する必要があるのはいつですか。また、使用しない*場合はありますか?
私がC ++で科学的なコードに取り組んでいるとします。同僚との最近の議論では、式テンプレートは本当に悪いことであり、gccの特定のバージョンでのみソフトウェアをコンパイルできる可能性があると主張されました。おそらく、この問題は、このDownfallのパロディの字幕で言及されているように、いくつかの科学的コードに影響を与えています。(これらは私が知っている唯一の例なので、リンクです。) ただし、SIAM Journal of Scientific Computingのこのペーパーのように、一時変数への中間結果の保存を回避することにより、パフォーマンスの向上をもたらすことができるため、式テンプレートが有用であると主張する人もいます。 C ++でのテンプレートメタプログラミングについてはあまり知りませんが、それが自動微分および区間演算で使用される1つのアプローチであることは知っています。それが式テンプレートについての議論になりました。パフォーマンスの潜在的な利点とメンテナンスの潜在的な欠点の両方(それが正しい言葉である場合)を考えると、計算科学でC ++式テンプレートをいつ使用し、いつ避けるべきですか?

1
多次元データを補間するための好ましい効率的なアプローチは何ですか?
多次元データを補間するための好ましい効率的なアプローチは何ですか? 私が心配していること: 構築のためのパフォーマンスとメモリ、シングル/バッチ評価 1から6の寸法を処理する 線形または高次 勾配を取得する機能(線形でない場合) 通常のグリッドと散布グリッド 補間関数として使用、たとえば根を見つけたり最小化する 外挿機能 これの効率的なオープンソース実装はありますか? 私はscipy.interpolateとscikit-learnからのクリギングで部分的な運がありました。 スプライン、チェビシェフ多項式などは試しませんでした。 これは、このトピックでこれまでに見つけたものです。 長方形グリッド上のPython 4D線形補間 x、y、zの異なる間隔で定期的にサンプリングされた3Dデータの高速補間 通常のグリッドデータの高速補間 多変量散乱補間のどの方法が実用に最適ですか?

3
インテルFortranコンパイラー:コンパイル時の最適化のヒント
私の研究室での個人的な経験から始めます。ifort 9と10日に戻って、-O3とプロセッサ固有のフラグ(たとえば、-xW -xSSE4.2)を使用してコンパイルする最適化に非常に積極的でした。しかし、ifort 11から始めて、次のことに気付き始めました 。1.結果にいくつかの矛盾があります(セマンティクスが保持されなかったため) 2. -O2に比べて小さいゲイン。 そのため、現在は、通常-O2と-xhostを使用してコンパイルするだけです。ifort 11でより良い提案がありますか?ifort 12に移行すると、これは再び変わりますか?前もって感謝します。

1
Python / Numpy配列操作のパフォーマンスは、配列の次元の増加に伴ってどのようにスケーリングしますか?
Python / Numpy配列は配列の次元の増加に伴ってどのようにスケーリングしますか? これは、この質問に対するPythonコードのベンチマークテスト中に気づいたいくつかの動作に基づいています:numpyスライスを使用してこの複雑な式を表現する方法 この問題のほとんどは、配列を作成するためのインデックス付けに関係していました。Pythonループ上で(あまり良くない)CythonとNumpyバージョンを使用する利点は、関係する配列のサイズによって異なることがわかりました。NumpyとCythonの両方は、ある時点まで(Cythonの場合は、Numpyの場合はN = 2000程度)のパフォーマンス上の利点が増加し、その後利点は低下しました(Cython機能は最速のままでした)。N= 500N=500N=500N= 2000N=2000N=2000 このハードウェアは定義されていますか?大規模な配列で作業するという点で、パフォーマンスが高く評価されているコードについて従うべきベストプラクティスは何ですか? この質問(なぜMatrix-Vector Multiplication Scalingではないのですか?)は関連している可能性がありますが、Pythonで配列を処理するさまざまな方法が相互にどのようにスケーリングするかについてもっと知りたいと思っています。

3
対角線と固定対称線形システムは、事前計算後の2次時間で解くことができますか?
ある解決する方法、フォームのシステム線形(D_I + A)X_I = b_i Aが固定SPD行列でありD_Iは正の対角行列でありますか?O(n3+n2k)O(n3+n2k)O(n^3+n^2 k)kkk A D i(Di+A)xi=bi(Di+A)xi=bi(D_i + A) x_i = b_iAAADiDiD_i たとえば、各DiDiD_iがスカラーの場合、AのSVDを計算するだけで十分AAAです。ただし、これは、可換性の欠如により、一般DDDについて分類されます。 更新:これまでの答えは「いいえ」です。誰が理由について興味深い直感を持っていますか?回答がないということは、2人の非通勤オペレーター間で情報を圧縮する非自明な方法がないことを意味します。驚くほど驚くことではありませんが、それをよりよく理解することは素晴らしいことです。

6
C ++テンプレートを使用した汎用およびメタプログラミングは、計算科学でどの程度有用ですか?
C ++言語は、テンプレートを介して汎用プログラミングとメタプログラミングを提供します。これらの手法は、多くの大規模な科学計算パッケージ(MPQC、LAMMPS、CGAL、Trilinosなど)に組み込まれています。しかし、全体的な開発時間と同等または適切な効率のための使いやすさの点で、CやFortranのような非汎用、非メタ言語を超える価値で、科学計算に実際に貢献したものは何ですか? 科学的な計算タスクを考えると、C ++テンプレートを介した汎用およびメタプログラミングは、よく知られているベンチマーク(コード行、人の努力など)によって測定される生産性、表現力、または使いやすさの向上を実証しましたか?それに対応して、ジェネリックおよびメタプログラミング用のC ++テンプレートの使用にはどのようなリスクが伴いますか?

4
ポータブルマルチコア/ NUMAメモリ割り当て/初期化のベストプラクティス
メモリ帯域幅が制限された計算が共有メモリ環境(OpenMP、Pthreads、またはTBBを介したスレッドなど)で実行される場合、各スレッドがほとんどのメモリに物理的にアクセスするようにメモリを物理メモリに正しく分散させる方法のジレンマがあります「ローカル」メモリバス。インターフェイスは移植性がありませんが、ほとんどのオペレーティングシステムにはスレッドアフィニティを設定する方法があります(たとえばpthread_setaffinity_np()、多くのPOSIXシステム、sched_setaffinity()Linux、SetThreadAffinityMask()Windows)。メモリ階層を決定するためのhwlocなどのライブラリもありますが、残念ながら、ほとんどのオペレーティングシステムにはNUMAメモリポリシーを設定する方法がまだ用意されていません。Linuxは顕著な例外であり、libnumaがありますアプリケーションがページの粒度でメモリポリシーとページ移行を操作できるようにします(2004年以降メインラインにあるため、広く利用可能です)。他のオペレーティングシステムでは、ユーザーが暗黙の「ファーストタッチ」ポリシーに従うことを期待しています。 「ファーストタッチ」ポリシーを使用すると、呼び出し側は、新しく割り当てられたメモリに最初に書き込むときに使用する予定の親和性でスレッドを作成および配布する必要があります。(非常に少数のシステムがあるように構成されているmalloc()、それはちょうど彼らが実際に障害が発生しているときに別のスレッドによって、おそらく、それらを見つけることを約束、実際にページを検索します。)これは、使用してその割り当てを暗示しcalloc()たり、すぐに使用して割り当てが後にメモリを初期化するmemset()ことがフォルトする傾向があるので、有害です割り当てスレッドを実行しているコアのメモリバス上のすべてのメモリ。複数のスレッドからメモリにアクセスすると、最悪のメモリ帯域幅になります。同じことは、new多くの新しい割り当ての初期化を要求するC ++ 演算子にも当てはまります(例:std::complex)。この環境に関するいくつかの観察: 割り当ては「スレッド集合」にすることができますが、異なるスレッドモデルを使用してクライアントと対話しなければならないライブラリ(望ましくはそれぞれ独自のスレッドプール)には望ましくない割り当てがスレッドモデルに混在するようになりました。 RAIIは慣用的なC ++の重要な部分であると考えられていますが、NUMA環境でのメモリパフォーマンスには積極的に有害であるようです。配置newは、malloc()から割り当てられたメモリまたはからのルーチンで使用できますlibnumaが、これにより割り当てプロセスが変更されます(これは必要だと思います)。 編集:演算子に関する私の以前の声明newは間違っていた、それは複数の引数をサポートすることができます、チェタンの応答を参照してください。ライブラリーまたはSTLコンテナーが指定されたアフィニティーを使用することへの懸念がまだあると思います。複数のフィールドがパックされている場合があり、たとえば、std::vector正しいコンテキストマネージャをアクティブにして再割り当てすることを保証するのは不便です。 各スレッドは独自のプライベートメモリを割り当ててフォールトできますが、隣接する領域へのインデックス作成はより複雑になります。(スパース行列ベクトル積の検討行列とベクトルの行パーティションと、の所有されていない部分インデックス作成、xは、より複雑なデータ構造が必要Xは仮想メモリに連続していない)をy← A xy←Aバツy \gets A xバツバツxバツバツx NUMAの割り当て/初期化の解決策は慣用的と見なされますか?他の重要な落とし穴を省きましたか? (C ++の例がその言語に重点を置くことを意味するわけではありませんが、C ++ 言語は、Cのような言語にはないメモリ管理に関するいくつかの決定をエンコードします。物事が異なります。)

2
関数への合理的な近似のオープンソース実装
関数への合理的な近似のオープンソース実装(Python、C、C ++、Fortranのいずれでも構いません)を探しています。記事に沿った何か[1]。私はそれに関数を与え、それは私に2つの多項式を返します。その比は与えられた間隔での近似であり、誤差は同じ振幅で振動し、最適な近似、またはそれに近いです。 ここに私が見つけたものがあります: chebfunでできるように見えますが、Matlab *にアクセスできません。 数値レシピ(NR)のセクション5-13「合理的なチェビシェフ近似」に簡単なプログラムがあります。 MathematicaにはEconomizedRationalApproximationとMiniMaxApproximationがあります 私は、NRコードよりも新しい(おそらくテスト済みの)ものがあるかどうか疑問に思いました。 私のアプリケーションは、特別な関数のセットを持っています。これは、超幾何級数として、または数値キャンセルを含む数式として与えられます。そして、堅牢で、高速で、正確な評価関数が必要です。 Hartree Fock計算で2つの粒子行列要素を計算する最も内側のループ。[2]に、自分に合った関数の簡単な例を示します。ご覧のとおり、SymPyを使用して計算したのは、直接式を使用するか、x = 0を中心とするシリーズのいずれかです。これは一種の働きをしますが、精度はそれほど高くありません。x= 1の場合、有効数字の約半分が失われます(ただし、x = 1e5と同様にx = 0.1の場合、ほぼすべての有効数字に対して正確です)。より良い近似値を探しています。 [1] Deun、J。、およびTrefethen、LN(2011)。合理的な近似のためのCarathéodory-Fejér法の堅牢な実装。BIT数値数学、51(4)、1039〜1050。doi:10.1007 / s10543-011-0331-7(2010年6月e-print) [2] https://gist.github.com/3831580 (*)chebfunウェブサイトにも404が表示されますが、Pedroはそれが私のプロバイダーの問題であるに違いないと示唆しました。

3
反復法の比較:反復回数とCPU時間
ランダム正方行列を反転させるための2つの反復法を比較しています。マトリックスはランダムであるため、すべてのテストケースは、異なる量の反復と異なる経過時間の両方を取ります。私の質問は、平均CPU時間に加えて、メソッドを比較するための有用な情報である両方のメソッドによって取得された反復の平均値です。

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