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

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

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

10
この統合コードを最適化して実行速度を上げることは可能ですか?
double trap(double func(double), double b, double a, double N) { double j; double s; double h = (b-a)/(N-1.0); //Width of trapezia double func1 = func(a); double func2; for (s=0,j=a;j<b;j+=h){ func2 = func(j+h); s = s + 0.5*(func1+func2)*h; func1 = func2; } return s; } 上記は、拡張された台形規則を使用して、台形を使用しfunc()制限間の1D数値積分の私のC ++コードです。[a,b][a,b][a,b]N−1N−1N-1 私は実際に3D統合を行っています。このコードは再帰的に呼び出されます。私は作業して、適切な結果を出しています。N=50N=50N = 50 さらに減らす以外に、上記のコードを最適化してより速く実行する方法を提案できる人はいますか?または、より速い統合方法を提案できますか?NNN

2
共有メモリのGPUで小さな非対称行列の固有ペアを見つける最速の方法
小さな(通常は60x60よりも小さい)非対称行列のすべての正(固有値は正)の固有ペアを見つける必要があるという問題があります。固有値が特定のしきい値より小さい場合、計算を停止できます。私は固有値が実在することを知っています。最高のパフォーマンスを絞り出すために使用できるアルゴリズムに関する提案はありますか?私はこれらの分解を数千回行わなければならないので、速度が重要です。 前もって感謝します。 編集:これをGPUの共有メモリで行う必要があります。行列も必ずしも同じサイズではありません。現在、これを行うライブラリーについては知りません。問題に適しているアルゴリズムの提案をいただければ幸いです。

2
Androidではどのスパースマトリックスソルバーライブラリを実行できますか?
タイトルはそれのほとんどを言います。 Android(NDK)プロジェクトに使用できる軽量で使いやすいライブラリを探しています。 密度の高いものについては、Eigenを使用するのが好きですが、プロジェクトで「正常に動作する」スパースなもののための包括的な(そして文書化された)ライブラリは多くありません。 PETScはこれらすべてのMPIのことで少し重いようですが、それは私の第一印象にすぎません。助言がありますか?

2
OSの選択は、科学計算コードのパフォーマンスにとってどれほど重要ですか?
Linuxの方が高速であると言うのはよくあることですが、それには正当な理由があります。しかし、タイトルで述べたように、OSの選択は科学計算コードのパフォーマンスにとってどれほど重要ですか?オペレーティングシステムがより直接的に関与しているもの(ゲームのプレイやビデオレンダリングなど)の場合、違いがある可能性があります。しかし、MATLABでコードを実行したり、JuliaでPDEを解いたり、CUDAを使用してGPUで線形代数を実行したりする場合、実際にはWindows、MacOS、Linuxの間に測定可能なパフォーマンスの違いがあるのでしょうか。 そのような違いが存在するかどうかを確認するために誰かがベンチマークを実行したかどうか疑問に思っています。使用するコンパイラーが異なるため、MATLABなどの一部のソフトウェアを使用するときに違いがあるのでしょうか。または、CUDAドライバーは、あるOSの方が他のOSよりもかなり高速ですか?または、OSがWDDM CUDAの問題のように干渉することはありますか? 注:この質問の範囲を超えるオペレーティングシステムを選択する理由は他にもあります。特にパフォーマンスについて疑問に思っています。

1
次の式を計算する改良された方法はありますか?
対称行列と任意の行列X \ in \ mathbb {R} ^ {n \ times n}、およびベクトルv \ in \ mathbb {R } ^ {n \ times 1}、O(n ^ 2)時間で次の式を計算することは可能ですか?Y∈Rn×nY∈Rn×nY \in \mathbb{R}^{n \times n}X∈Rn×nX∈Rn×nX \in \mathbb{R}^{n \times n}v∈Rn×1v∈Rn×1v \in \mathbb{R}^{n \times 1}O(n2)O(n2)O(n^2) diag(XTYX)⋅vdiag(XTYX)⋅vdiag(X^TYX) \cdot v ここで、diag(X)diag(X)diag(X)は、主な対角要素がXの要素に等しく、非対角要素が0に等しいn×nn×nn \times n行列を返します。X^ TはXの転置行列です。XXXXTXTX^TXXX

1
WELL疑似乱数生成
私はMT19937テストハーネスで使用して、一様に(符号なし)32ビット[0、2322322^{32}-1]値は、元の作者のmt19937.c実装に基づいており、統計的にランダムなビットオクテットストリームの(本質的に無尽蔵)供給を生成します。これは、これらの特定のテストに必要ではないCSPRNGの代わりです。しかし、私は最近WELLPRNGを検討しています-統計的性質自体(どちらも私のニーズに十分すぎるように思われる)のためではありませんが、より効率的な実装を提案しているようです。 私は学術論文の数学的背景が足りませんが、少なくとも前者の「ねじれ」行列と焼戻し変換に従うことができました。ただし、WELL-n関数の作成者が提供するコードの多くは、いくつかの魔法の浮動小数点定数(例:)を使用して、浮動小数点生成に焦点を当てているようです2.32830643653869628906e-10。WELLコードからステップを省略して、32ビットの均一な配布を提供できますか?または、アルゴリズムは特に浮動小数点分布用に設計/バイアスされていますか? またはWELL、要件を満たしながら、「バルク」uint32ベクトル生成のパフォーマンス向上をもたらすと考えるのは間違っていますか?

2
VolkovとDemmelは、GPUのレイテンシ、ラインサイズ、ページサイズを実験的にどのように決定していますか?
では、「GPUのベクトル機能を使用してLU、QRやコレスキー因数分解」、ワシーリーボルコフとジェームス・デメルにより、レイテンシ、ラインサイズ、およびこのようなグラフからキャッシュのページサイズを解釈する興味深い方法があります: どうやら、ラインサイズはキャッシュがプラトーになり始めるところです(この例では約32バイト)。それはどこから来ましたか? そして、ページサイズが2番目のプラトーがグローバルメモリの開始点であることをどのようにして知るのでしょうか。 さらに、レイテンシが最終的に十分なストライド長で低下するのはなぜですか?彼らは増え続けるべきではないのですか? これが実際に機能し、そのように思われる場合、GPUのキャッシュに関する多くの文書化されていないデータを取得できるため、それは素晴らしいことです。

1
疎な複雑な行列をコードからPETScに効率的に取得する方法
FortranコードからPETScに複雑なスパース行列を取得する最も効率的な方法は何ですか?これは問題に依存することを理解しているので、以下に関連する詳細をできるだけ多く記載するようにしました。 私は一緒に遊んでてきたFEAST固有値ソルバー[1]タイプの問題のためのの次元は行列AとBがあるN、およびほとんどすべての時間が解決費やされているN × N複素線形をM0右側のシステム。Nは大きく(3DでのFE基底関数の数)、M0は小さい(私の場合はM0〜20に興味がある)。行列AとBは実対称でスパースであり、解を必要とする複雑な問題はz A − Bであり、ここでzA X = λ B Xあバツ=λBバツA x = \lambda B xああABBBNNNN× NN×NN \times NああABBBzA − Bzあ−BzA-Bzzzは複素数です。FEASTの作成者は、この正確な固有値と固有ベクトルを取得するために、この線形システムの解の精度をそれほど高くする必要がないことを示唆しているようです。そのため、いくつかの高速反復ソルバーは、これに対する優れたソリューションとなる可能性があります。 これまでのところ、複雑なシステムにLapackを使用してきましたが、これは私のコンピューターでにうまく機能します。Nが大きい場合、最適なソルバーがまだわからないので、PETScを使用して、そこで反復ソルバーを試してみたかったのです。N&lt; 1500N&lt;1500N < 1500NNN 私は単純なCドライバーを作成し、それをFortranから呼び出しました。すべてのコードについては[2]を参照してください。問題はこの部分にあります(更新:マトリックスを作成するためにすべての行をここに配置しました。これが関連していること): ierr = MatCreate(PETSC_COMM_WORLD,&amp;A);CHKERRQ(ierr); ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,n,n);CHKERRQ(ierr); ierr = MatSetFromOptions(A);CHKERRQ(ierr); ierr = MatSetOption(A,MAT_IGNORE_ZERO_ENTRIES,PETSC_TRUE);CHKERRQ(ierr); ierr = MatSetUp(A);CHKERRQ(ierr); for (i=0; i&lt;n; i++) col[i] = i; ierr …

2
コードに関するプロファイリング/タイミング情報を報告するにはどうすればよいですか?
Computational Physicsジャーナルの多くの出版物がコードのパフォーマンスにさまざまなメトリックを使用しているのを見てきました。特にGPGPUコードの場合、ユーザーが公開するタイミング結果には非常に多くの種類があるようです。特に、私は見ました: timeGPUとCPUのバージョンで(基本的に)実行し、平均を報告することの比較 呼び出された各GPU / CPU関数のプロファイリングデータの比較(そのため、実行されたmainすべての関数のタイミングを調整しますが、ドライバーの初期化時間は無視します) メモリ転送(この場合はPCI-Eバスを介して)、ディスクへのI / O、あるフォーマットから別のフォーマットへのデータ変換などを無視した、いくつかの関連機能のデータのプロファイリングの比較 1つの関数のみのプロファイリングデータの比較(たとえば、CPUとGPU量子モンテカルロでスピン更新を実行する時間のみを比較)、メモリ転送時間、ディスクへのI / O、ハミルトニアンの設定/対角化などを無視、など 2番目と3番目のメリットも確認​​できますが、最初のオプションは4つの中で最も「正直」です。言語間またはInfinibandとGigabit間のI / O実装の違いが4.99秒だった場合、5秒のランタイムの違いを報告するのは少しばかげています。最後のオプションは、この関数がプログラム全体の問題点でない限り、それについての情報を報告することは、私の結果を複製している誰かが見るパフォーマンスを反映しないだけなので、私には少し「不器用」に思えます。これらのアプローチのどれがより正直ですか?理想的には、紙にはこれらすべてが含まれますが、図/長さに制限がある場合、これは最も価値があり、正直で、提供に関連性がありますか?

4
DAXPY、DCOPY、DSCALはやりすぎですか?
インテルMKLにリンクすることにより、CGをFORTRANに実装しました。 次のようなステートメントがある場合:(Wikipediaを参照) p=r; x=x+alpha*p r=r-alpha*Ap; またはQMRの類似のもの(はるかに多い) v_tld = r; y = v_tld; rho = norm( y ); w_tld = r; z = w_tld; xi = norm( z ); (and more) DAXPY、DCOPY、DSCALなどのBLASレベル1実装を使用することには意味がありますか? 私の質問の動機は: アルゴリズムの実装は2つあります。NormsとMatVecsのみをMKLにリンクしたもの。コピー、スケーリング、追加は、Fortranの組み込み関数と、可能なすべてのサブルーチンがBLASによって実行される別の関数によって行われます。 私は、BLASより速くなることはできないという考えでした。しかし、Fortranの組み込み関数を使用する私のコードは、BLASレベル1サブルーチンを使用するコードよりも100%高速であることがわかりました(FWIW、これは小さな問題ではありませんでした。 GB RAM)。私は2スレッドで(2コアマシンで)両方を実行ifort QMR.f90 -mklしていましたMKL_DYNAMIC=TRUE 私がいたSOの質問を BLASの拡張に関するけど、私は自分のコードにBLASレベル1が含まれるようにしようとしたとして、私のコードは遅く、遅くなって続けました。 私は何か間違ったことをしていますか、これは予想されますか? また、BLASを拡張してy = 2.89*xbyのような自明ではない操作を行うことは理にかなっていDCOPY(n,2.89*x,1,y,1) or even DSCAL then DCOPYますか? また興味深いのは、パフォーマンスDDOTをDNRM2向上させることです。彼らは倍精度の乗算を実行するため、並列に配置すると役立つ可能性があるという事実に起因しました。 …

2
シーケンシャルコードが使用できない場合、単一のプロセッサで実行される並列コードの並列オーバーヘッドをどのように計算しますか?
PETScの線形ソルバーのパフォーマンスをプロファイルしています。私が理解しているように、 スピードアップ= シーケンシャルタイム並列時間。スピードアップ=順次時間並列時間。\text{speedup}=\frac{\text{Sequential Time}}{\text{Parallel Time}}. 1つのプロセッサで並列コードを実行すると、シーケンシャルパフォーマンスのプロキシとして使用できることを知っています。ただし、並列オーバーヘッドが発生するため、これは同等の順次コードの適切な尺度ではないと思います。多くの場合、シーケンシャルコードのパフォーマンスは、シングルプロセッサのパラレルパフォーマンスよりも高速です。同じソルバーを実装する数値ライブラリを検索できると思いますが、アルゴリズムが実際に同等である保証はありません。 私が理解しているように、 1つのプロセッサーでの並列パフォーマンス= 順次時間+ 並列オーバーヘッド1つのプロセッサーでの並列パフォーマンス=順次時間+パラレルオーバーヘッド\text{Parallel performance on one processor} = \text{Sequential Time} + \text{Parallel Overhead} したがって、並列オーバーヘッドを定量化する方法がある場合は、1つのプロセッサーの並列時間からそれを差し引いて、順次時間のより良い測定値を取得できます。 したがって、私の質問は次のようになります。 シーケンシャルコードが利用できない場合に、単一のプロセッサで実行される並列コードの並列オーバーヘッドを計算する方法はありますか? 本当に必要ですか?一般に、1つのプロセッサでの並列パフォーマンスは、順次パフォーマンスを概算するのに十分ですか?

2
データセットをフィルタリングして、ニューラルネットワークトレーニングのより均一な分布を取得する
スティッフODEの完全なシステムを解くのではなく、人工ニューラルネットワーク(ANN)を使用して流体の反応率を予測することを検討しています。私の研究室の何人かの人はすでにそれにいくつかの仕事をしていたので、私はゼロから始めませんが、私のアプリケーションに問題があります。そのうちの1つは、トレーニング用のデータセットの品質に関連していると思います。通常、1D / 2D / 3DのCFDシミュレーションからトレーニングデータを抽出します。とにかく、ニューラルネットワークに送るデータの多次元配列ができあがります。問題の大きさを理解するために、8つのネットをそれぞれ10の入力と1つの出力でトレーニングすることを検討しています。約100,000ポイントのトレーニングセットは妥当だと思いますが、問題は、これらの100,000ポイントが私の多次元空間の特定の領域をカバーする必要があることです。 スナップショットごとに、トレーニングが正確であることを確認するために高いサンプリングが必要な領域には、ポイントのごく一部しかありません スナップショットをまとめてコンパイルすると、多くのほぼ重複するポイントができます。これは、a)これらの領域に重点を置いてトレーニングにバイアスをかけることにより、b)不要なポイントを追加することにより、ANNトレーニングに悪影響を及ぼします。 そのため、トレーニングセットに含める前に、記録したポイントをフィルタリングしようとしています。私が見ると、新しいポイントがデータセットのすべてのポイントの特定のn次元の半径内にあるかどうかを確認する必要があります。このブルートフォースアプローチは、n ^ 2のようないくつかのトリックスケールを除外し、100,000から10,000ポイントを抽出するのにまあまあ機能します(30分かかります)が、スナップショットのサイズと数を増やすとうまくいきません...明らかに、これを行うためのより賢い方法があるはずですが、私はどちらの方向から探し始めるのかわかりません。私は最初にpythonを試してみましたが、FORTRANに移動してスピードを上げることができましたが、まずはより良い戦略を探すべきだと思います。私の唯一の希望はある種のkdツリーですか?私はそれらについてほとんどまたはまったく経験がなく、私が見る問題は、データセットを構築するとツリーが成長することであり、これは複雑さを増すだけです。Python kdツリーライブラリは私のニーズに合っていますか?問題の規模を考えると、FORTRANに移行する必要がありますか?何かアドバイスをいただければ幸いです、ありがとう!

4
(方法)メモリの断片化を考慮していますか?
私は有限要素理論の例を使用しますが、大規模なデータ構造を維持し、それを連続的に拡張する人なら誰でも同じようなものを見つけるでしょう。 ポイントと三角形の非構造化メッシュがあり、ポイントが座標(たとえばと)で与えられ、三角形がそれぞれ3つのポイントインデックス(たとえば、jとk)で構成されているとします。バツバツxyyy私私ijjjkkk FEMで一般的なように、メッシュは連続的に細分割されます。グローバルな通常の絞り込みに頼ると、三角形の数は、絞り込みが繰り返されるたびに4倍になります444。これがどのように行われるかに応じて、メモリレイアウトの開発方法は異なります。 メッシュが1〜300のメモリセルを占めているとします。 例1: 新しいメッシュのセル301から1501にスペースを割り当て、そこにリファインされたメッシュのデータを入力して、古いメッシュを忘れます。次のリファインされたメッシュはセル1501〜6300に配置され、次のメッシュは6301〜21500に配置されます。現在のメッシュの場所はメモリ内で「右」に移動しますが、巨大なパッチは使用されません。時期尚早にメモリ不足になる場合があります。 上記の例では、1つのリファインステップの妨げになるだけであることに気づくかもしれません。これは、断片化がなくても、後でリファインメントの合計メモリが不足するためです。頂点配列も考慮されるため、問題はさらに深刻になる可能性があります。 どうすればこれを回避できますか? 例2: 三角形の配列をセル1..1200に再割り当てします。セル1201から2400に新しいメッシュを作成します。その作業コピーの内容をセル1..1200にコピーし、作業コピーを忘れます。同様に繰り返します。 作業コピーが必要なため、まだメモリが不足しています。これはどう: 例3: 三角形の配列をセル1..1500に再割り当てします。古いメッシュを1201 .. 1500にコピーします。セル1..1200に新しいメッシュを作成します。次に、古いメッシュのコピーを忘れます。 これらのスケールではグローバルメッシュリファインメントを使用しないため、ここでのケースは人工的です。増加がはるかに小さい場合、断片化を回避するためにメモリの再調整が可能です。しかしながら、 質問: 実際の科学計算/高性能計算でメモリの断片化が重要になることはありますか? もしそうなら、どうやってそれを避けますか?たぶん私のマシンモデルは間違っているかもしれません、そしていくつかの重い魔法によるOSは暗黙のうちにメモリを再調整するか、ヒープ上の断片化されたブロックを管理します。 具体的には、グリッド管理にどのように影響しますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.