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

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

4
大量のデータを処理する方法は?
プラズマダイナミクスのシミュレーションでは、多くの場合、大量の情報が生成されます。シミュレーション中に、少なくとも10個のプロパティについて、(8192x1024x1024x1500)と同じ大きさのグリッド(x、y、z、t)にさまざまな物理的プロパティを記録します。この情報は、シミュレーションの完了後に処理されます。それで私たち プロパティのムービーを作成し、 フーリエ解析を実行し、 平均プロパティを計算します。 できるだけ多くの情報をこのように単純にダンプすることは、小規模なシステムを調査したときにうまく機能しました。これにより、結果とやり取りし、後でそれをどうするかを決定する柔軟性が得られました。また、単純にシミュレーションを実行するために計算リソース(CPU時間)を割り当てることもできました。 フーリエ解析をオンザフライで実行し、長さスケールの選択範囲のみをフィルタリングするプロセスを開始しました。数値的な理由から、実際に必要な長さよりも小さい長さスケールを解決する必要がある場合があります。そのような場合、このフィルターは非常に役立ちます。また、パラレルI / Oオプション、特にパラレルHDF5など、さまざまなパラレルIOライブラリも検討しています。 データ処理の効率を最大化するための戦略は何ですか? その場ですべての分析(映画やプロットなどの後処理を含まない)を実行することに利点はありますか? 私はこの問題が他の研究分野で起こることを想像できます。たとえば、長い間進化する必要がある分子動力学シミュレーションがあるかもしれませんが、興味深いことが起こっている短い瞬間に興味があります。またはCFDでは、初期の開発は遅いかもしれませんが、乱流が始まると、ダイナミクスを監視するためにより高い時間分解能が必要になる場合があります。 シミュレーションから洗練された結果収集の自由に利用可能な例はありますか?

3
Ubuntuからビルド済みパッケージをインストールするよりも、ソースからLAPACKをコンパイルする利点はありますか?
ATLASはコンパイル対象のマシンに合わせて最適化できることを知っているため、ソースからコンパイルすることで最大のメリットが得られます。ソースからLAPACKをコンパイルすることに利点はありますか?ビルド済みのパッケージをインストールする方がはるかに簡単です。

5
有限要素行列のスパース構造の計算
質問:有限要素行列のスパース構造を正確かつ効率的に計算するには、どのような方法が利用できますか? 情報:私はポアソン圧力方程式ソルバーに取り組んでおり、Cで記述された2次ラグランジュ基底を使用したGalerkinの方法を使用し、スパースマトリックスストレージとKSPルーチンにPETScを使用しています。PETScを効率的に使用するには、グローバル剛性マトリックスにメモリを事前に割り当てる必要があります。 現在、私は次のように行ごとの非ゼロの数を推定するために模擬アセンブリを行っています(擬似コード) int nnz[global_dim] for E=1 to NUM_ELTS for i=1 to 6 gi = global index of i if node gi is free for j=1 to 6 gj = global index of j if node gj is free nnz[i]++ ただし、ノード間相互作用が複数の要素で発生する可能性があるため、これはnnzを過大評価しています。 どのi、jインタラクションが見つかったかを追跡しようと考えましたが、多くのメモリを使用せずにこれを行う方法はわかりません。ノードをループして、そのノードを中心とした基底関数のサポートを見つけることもできますが、各ノードのすべての要素を検索する必要があり、非効率的です。 私が見つかりました。これは特に書いたステファノM、から、いくつかの有用な情報が含まれて最近の質問を、 私のアドバイスは、それをpythonまたはCで実装し、いくつかのグラフ理論概念を適用することです。つまり、マトリックスの要素をグラフのエッジと見なし、隣接マトリックスのスパース構造を計算します。キーのリストまたは辞書のリストは一般的な選択肢です。 これに関する詳細とリソースを探しています。私は確かに多くのグラフ理論を知らず、役に立つかもしれないすべてのCSトリックに精通していません(数学的な側面からこれに近づいています)。 ありがとう!

3
ポインターで派生型の配列を使用する場合のfortranのメモリ使用量
このサンプルプログラムでは、2つの異なる方法で同じことを(少なくともそう思います)しています。Linux PCでこれを実行し、topでメモリ使用量を監視しています。gfortranを使用すると、最初の方法(「1」と「2」の間)で使用されるメモリは8.2GBであり、2番目の方法(「2」と「3」の間)でメモリ使用量は3.0GBです。Intelコンパイラーでは、違いはさらに大きくなります:10GB対3GB。これは、ポインターを使用することに対する過度のペナルティのようです。なぜこれが起こるのですか? program test implicit none type nodesType integer:: nnodes integer,dimension(:),pointer:: nodes end type nodesType type nodesType2 integer:: nnodes integer,dimension(4):: nodes end type nodesType2 type(nodesType),dimension(:),allocatable:: FaceList type(nodesType2),dimension(:),allocatable:: FaceList2 integer:: n,i n = 100000000 print *, '1' read(*,*) allocate(FaceList(n)) do i=1,n FaceList(i)%nnodes = 4 allocate(FaceList(i)%nodes(4)) FaceList(i)%nodes(1:4) = (/1,2,3,4/) end do print …

4
ライブラリ関数のFLOPカウント
単純な関数でFLOPの数を評価するとき、基本的な算術演算子を集計する式を単純にたどることができます。ただし、偶数除算を含む数学ステートメントの場合、これを行うことはできず、加算と乗算のみの関数からのFLOPカウントと比較できると期待されます。操作がライブラリに実装されると、状況はさらに悪化します。したがって、特別な機能のパフォーマンスについて合理的な考えを持つことが不可欠です。 特別な機能とは、次のようなものを意味します。 exp() sqrt() sin / cos / tan() 通常はシステムライブラリによって提供されます。 これらの複雑さの決定は、それらの多くが適応性があり、入力依存の複雑さを持っているという事実によってさらに混乱します。たとえば、exp()の数値的に安定した実装は、多くの場合、適応的に再スケーリングしてルックアップを使用します。ここでの私の最初の印象は、この場合にできる最善の方法は、関数の平均的な動作を確認することです。 この議論全体は、もちろん、アーキテクチャに大きく依存しています。この議論では、従来の汎用アーキテクチャに限定し、特別な機能ユニット(GPUなど)を持つアーキテクチャを除外できます。 システムとシステムの比較のために、特定のアーキテクチャ向けにこれらを標準化するかなり簡単な試みを見つけることができますが、メソッドとメソッドのパフォーマンスを重視する場合、これは受け入れられません。これらの関数のフロップの複雑さを決定するためのどの方法論が受け入れられると考えられますか?大きな落とし穴はありますか?

2
Pythonで非常に大きくて疎な隣接行列のすべての固有値を計算する最速の方法は何ですか?
scipy.sparse.linalg.eigshを使用するよりも非常に大きくて疎な隣接行列のすべての固有値と固有ベクトルを計算するより速い方法があるかどうかを把握しようとしていますマトリックスの対称属性。隣接行列もバイナリであるため、より高速な方法があると思います。 ランダムな1000x1000スパース隣接行列を作成し、x230 ubuntu 13.04ラップトップでいくつかの方法を比較しました。 scipy.sparse.linalg.eigs:0.65秒 scipy.sparse.linalg.eigsh:0.44秒 scipy.linalg.eig:6.09秒 scipy.linalg.eigh:1.60秒 スパースeigとeigshで、希望する固有値と固有ベクトルの数であるkを行列のランクに設定します。 問題は、より大きな行列から始まります-9000x9000行列では、scipy.sparse.linalg.eigshに45分かかりました!

2
オクターブ:ベクトルの2つの行列間の距離を計算します
N、M 2dベクトルをそれぞれ表す2つの行列Nx2、Mx2があるとします。各ベクトルペア(n、m)間の距離を計算する簡単で良い方法はありますか? もちろん、簡単ですが非効率な方法は次のとおりです。 d = zeros(N, M); for i = 1:N, for j = 1:M, d(i,j) = norm(n(i,:) - m(j,:)); endfor; endfor; 私が見つけた最も近い答えはbsxfun、次のように使用されています: bsxfun(inline("x-y"),[1,2,3,4],[3;4;5;6]) ans = -2 -1 0 1 -3 -2 -1 0 -4 -3 -2 -1 -5 -4 -3 -2

3
加法的な事前調整スキームは、どのような場合に乗法的なものより優れていますか?
ドメイン分解(DD)とマルチグリッド(MG)の両方の方法で、ブロック更新または粗補正のアプリケーションを加算または乗算のいずれかとして構成できます。点ごとのソルバーの場合、これはヤコビ反復とガウスザイデル反復の違いです。S (x o l d、b )= x n e wとして機能するの乗法スムーザーは、A x = bAバツ=bAx = bS(xO l d、b )= xN E WS(バツold、b)=バツnewS(x^{old}, b) = x^{new} バツi + 1= Sn(Sn − 1(。。。、S1(x私、b )。。。、b)、b )バツ私+1=Sn(Sn−1(。。。、S1(バツ私、b)。。。、b)、b) x_{i+1} = S_n(S_{n-1}( ..., S_1(x_i, b) ..., b), b) 加法平滑剤は次のように適用されます バツi + 1= x私+ ∑ℓ = 0nλℓ(Sℓ(x私、b )− …

2
科学的コードのパフォーマンスの基礎となる構造は何ですか?
ハードウェアとソフトウェアの構成が異なる2台のコンピューターを検討してください。各プラットフォームでまったく同じシリアルNavier-Stokesコードを実行する場合、コンピューター1と2に対してそれぞれ1回の反復を実行するのにx時間とy時間かかります。この場合、は、コンピューター1とコンピューター2の間の反復時間の差です。Δ = x − yΔ=x−y\Delta = x-y の大きさに影響を与えるものは何ですか?明らかな候補の1つはCPUです。私の主な質問は、CPU間のハードウェアの違いと同じ順序でΔに影響を与える可能性のある他の要因があるかどうかです。△Δ\Delta△Δ\Delta

1
HPCのローカルメモリ/計算、ネットワーク遅延、および帯域幅ジッターの統計モデル
並列計算は、確定的なローカル計算速度、レイテンシオーバーヘッド、およびネットワーク帯域幅を使用して頻繁にモデル化されます。実際には、これらは空間的に可変であり、非決定的です。Skinner and Kramer(2005)などの研究ではマルチモーダル分布が観察されていますが、パフォーマンス分析では常に決定論的分布またはガウス分布のいずれかが使用されているようです(不正確なだけでなく、負のレイテンシの正の確率により一貫性がありません)。 より忠実な統計モデルが開発されましたか?ローカルコンピューティング/メモリ、レイテンシ、および帯域幅の変動における相互相関の説明はありますか?

3
2つの粒子積分<ij | kl>に効率的なインデックス関数を実装する方法は?
これは単純な対称列挙問題です。ここで完全な背景を説明しますが、量子化学の知識は必要ありません。 2つの粒子の積分は次のとおりです。 そして、次の4つの対称性があります。 積分を計算して、次のようにインデックス付けされた1D配列に格納する関数があります。⟨ij|kl⟩⟨ij|kl⟩\langle ij|kl\rangle⟨ij|kl⟩=∫ψ∗i(x)ψ∗j(x′)ψk(x)ψl(x′)|x−x′|d3xd3x′⟨ij|kl⟩=∫ψi∗(x)ψj∗(x′)ψk(x)ψl(x′)|x−x′|d3xd3x′ \langle ij|kl\rangle = \int {\psi_i^*({\bf x})\psi_j^*({\bf x}')\psi_k({\bf x})\psi_l({\bf x}') \over | {\bf x} - {\bf x}' |}\, d^3 x \,d^3 x' ⟨ij|kl⟩=⟨ji|lk⟩=⟨kl|ij⟩=⟨lk|ji⟩⟨ij|kl⟩=⟨ji|lk⟩=⟨kl|ij⟩=⟨lk|ji⟩\langle ij|kl\rangle = \langle ji|lk\rangle = \langle kl|ij\rangle = \langle lk|ji\rangleint2 int2(ijkl2intindex2(i, j, k, l)) ijkl2intindex2上記の対称性を考慮して、関数は一意のインデックスを返します。唯一の要件は、i、j、k、lのすべての組み合わせ(それぞれ1からnまで)をループする場合、int2配列を連続して埋め、上記に関連するすべてのijklの組み合わせに同じインデックスを割り当てることです4つの対称性。 Fortranでの私の現在の実装はこちらです。とても遅いです。誰もこれを効果的に行う方法を知っていますか?(任意の言語で。) ヒント:軌道が実数である場合、上記の対称性に加えて、およびを交換できるため、合計8つの対称性が得られます: そして、インデックス付けのための非常に高速な関数を実装できます。こちらの実装を参照してください。軌道が実数でない場合の効率的な索引付けスキームを見つけたいと思います。ψi(x)ψi(x)\psi_i({\bf x})i↔ki↔ki\leftrightarrow kj↔lj↔lj\leftrightarrow l⟨ij|kl⟩=⟨ji|lk⟩=⟨kj|il⟩=⟨il|kj⟩=⟨ij|kl⟩=⟨ji|lk⟩=⟨kj|il⟩=⟨il|kj⟩=\langle ij|kl\rangle = …

1
科学計算のコンテキストでC ++ 11移動セマンティクスの影響は何ですか?
C ++ 11は移動セマンティクスを導入しています。たとえば、C ++ 03がコピー構築またはコピー割り当てを実行する必要がある状況でコードのパフォーマンスを向上させることができます。この記事では、C + 11でコンパイルすると、次のコードで5倍の速度が得られると報告しています。 vector&lt;vector&lt;int&gt; &gt; V; for(int k = 0; k &lt; 100000; ++k) { vector&lt;int&gt; x(1000); V.push_back(x); } 科学計算のコンテキストでC ++ 11移動セマンティクスの影響は何ですか? この質問は一般的な質問に興味がありますが、具体的には、Boostライブラリを使用して記述された有限要素コードの移動セマンティクスにも興味があります。ブーストバージョン1.47.0(ブーストリリースノートには移動のセマンティクスが1.48.0で導入されていると記載されているため)とブーストバージョン1.53.0 を使用して、独自のC ++ 03コードの一部をテストしましたが、あまり改善されていません。システムマトリックスの解決はワークロードの大部分を構成するため、boost::numeric::ublas::vector/のコピー構築を行わなくても済むことによる節約は目立たないmatrixと思いますboost::function。 編集:実際には、移動のセマンティクスが実装されているように見えますboost::function(バージョン1.52.0リリースノートを参照)。には移動のセマンティクスについての言及はありません。boost::numericソースを確認して確認し、右辺値の参照がないようです。

3
浮動小数点演算とデータ転送の現在および将来のエネルギーコストをモデル化するための参考資料
CPU、メモリ、ネットワーク、ストレージ全体にわたる浮動小数点演算とデータ転送の現在および将来のエネルギーコストをモデル化するための最も重要な文献とスライドのリファレンスを探しています。この質問をコミュニティウィキとしてマークしました。各回答を次の形式に制限することをお勧めします。 タイトル、著者、場所/会議/ジャーナル、年、DOI / URL、論文またはプレゼンテーションが私の要求に関連して提供する情報の要約。

3
スパース行列乗算のオーバーヘッドは何ですか
行列の乗算(Mat * MatとMat * Vecの両方)は、0以外の数、または行列のサイズでスケーリングされますか?または、2つの組み合わせ。 形状についてはどうでしょう。 たとえば、100個の値を含む100 x 100のマトリックス、または100個の値を含む1000 x 1000のマトリックスがあります。 これらの行列を2乗する(または、同様のスパース性を持つ同様の行列を掛ける)と、最初の(100x100)は2番目の(1000x1000)よりも速くなりますか?値がどこにあるかに依存しますか? 実装に依存している場合は、PETScの回答に興味があります。

3
MATLAB行列乗算(最高の計算アプローチ)
2つの参照系(軸)間で座標変換を行う必要があります。そのためには、いくつかの中間軸が使用されているため、3つの行列()を乗算する必要があります。これを解決する2つのアプローチについて考えました。3×33×33\times3 方法#1:乗算を直接行う、つまり、 vf=R1 R2 R3 vivf=R1 R2 R3 viv_f = R_1\ R_2\ R_3\ v_i 方法#2:ステップに分割: v3i=R3 viv3i=R3 viv_{3i} = R_3\ v_i v23=R2 v3iv23=R2 v3iv_{23} = R_2\ v_{3i} vf=R1 v23vf=R1 v23v_f = R_1\ v_{23} どこ: 、 R 2および R 3は 3 × 3行列ですR1R1R_1R2R2R_2R3R3R_33×33×33\times3 、 v i、 v 3 i、 v 23は …

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