問題タブ [memory-bandwidth]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
5 に答える
1068 参照

optimization - ストリーミングにメモリ帯域幅を効率的に使用

250 MB のデータをストリーミングするアプリケーションがあり、データ チャンク (それぞれ 2 つの 32 ビット ワード) にシンプルで高速なニューラル ネットしきい値関数を適用します。(非常に単純な) 計算の結果に基づいて、チャンクは予想外に 64 個のビンの 1 つにプッシュされます。つまり、1 つの大きなストリームが入って、64 の短い (可変長) ストリームが出てきます。

これは、さまざまな検出関数で何度も繰り返されます。

コンピューティングは、メモリ帯域幅が制限されています。これは、はるかに計算量の多い判別関数を使用しても速度の変化がないためです。

メモリ帯域幅を最適化するために新しいストリームの書き込みを構造化する最良の方法は何ですか? 特に、キャッシュの使用とキャッシュ ラインのサイズを理解することが、これに大きな役割を果たしているのではないかと考えています。64 個の出力ストリームがあり、運が悪かったために多くが同じキャッシュ ラインにマップされたという最悪のケースを想像してみてください。次に、次の 64 ビットのデータをストリームに書き込むときに、CPU は古いキャッシュ ラインをメイン メモリにフラッシュし、適切なキャッシュ ラインにロードする必要があります。これらはそれぞれ 64 バイトの帯域幅を使用します... したがって、帯域幅が制限されたアプリケーションは、メモリ帯域幅の 95% を浪費している可能性があります (ただし、この仮想的な最悪のケースでは)。

効果を測定しようとすることさえ難しいため、それを回避する方法を設計することはさらにあいまいです. それとも、ハードウェアが私よりもうまく最適化するゴーストボトルネックを追いかけているのでしょうか?

違いがある場合は、Core II x86 プロセッサを使用しています。

編集:これはいくつかのサンプルコードです。配列を介してストリーミングし、その要素を疑似ランダムに選択されたさまざまな出力配列にコピーします。同じプログラムを異なる数のデスティネーション ビンで実行すると、同じ量の計算とメモリの読み取りと書き込みが行われたとしても、異なるランタイムが得られます。

2 出力ストリーム: 13 秒
8 出力ストリーム: 13 秒
32 出力ストリーム: 19 秒
128 出力ストリーム: 29 秒
512 出力ストリーム: 47 秒

512 を使用する場合と 2 つの出力ストリームを使用する場合の違いは 4 倍です (おそらく??) は、キャッシュ ラインの削除のオーバーヘッドが原因です。

0 投票する
1 に答える
1379 参照

performance - シングルコアでCPUのメモリIO帯域幅を飽和させることはできますか?

理想的な状況を想定すると、何もページアウトされない、すべてのコードが非常によく記述されてキャッシュに収まる、スケジューラーが中断することはありませんなど:マルチコアCPUのシングルコアは、IOバスを飽和させるのに十分な書き込みトラフィックを生成できますDIMM?

より具体的な形式:1つのスレッドで16GBを実行するプログラムを起動した場合memset、重複しない8GBのペアよりも実行速度が遅くなりmemsetますか?(サイズは、定常状態に達するのに十分な大きさになるように選択されます。)

0 投票する
8 に答える
41178 参照

c - memcpyのパフォーマンスを向上させる方法

概要:

memcpyは、実際のアプリケーションまたはテストアプリケーションのシステムで2GB/秒を超えて転送できないようです。メモリ間のコピーを高速化するにはどうすればよいですか?

全詳細:

データキャプチャアプリケーションの一部として(いくつかの特殊なハードウェアを使用)、一時バッファからメインメモリに約3GB/秒をコピーする必要があります。データを取得するために、ハードウェアドライバーに一連のバッファー(各2MB)を提供します。ハードウェアはデータを各バッファにDMAし、各バッファがいっぱいになるとプログラムに通知します。私のプログラムはバッファを空にし(memcpyを別のより大きなRAMブロックに)、処理されたバッファをカードに再ポストして再度埋めます。memcpyがデータを十分に速く移動することに問題があります。メモリからメモリへのコピーは、実行しているハードウェアで3GB/秒をサポートするのに十分な速度である必要があるようです。Lavalys EVERESTは、9337MB /秒のメモリコピーベンチマーク結果を提供しますが、単純なテストプログラムであっても、memcpyではこれらの速度に近づくことはできません。

バッファ処理コード内のmemcpy呼び出しを追加/削除することで、パフォーマンスの問題を切り分けました。memcpyがなくても、約3GB/秒のフルデータレートで実行できます。memcpyを有効にすると、約550Mb /秒に制限されます(現在のコンパイラを使用)。

私のシステムでmemcpyのベンチマークを行うために、データのいくつかのブロックでmemcpyを呼び出すだけの別のテストプログラムを作成しました。(以下のコードを投稿しました)これは、使用しているコンパイラ/ IDE(National Instruments CVI)とVisual Studio2010の両方で実行しました。現在VisualStudioを使用していませんが、喜んで使用します。必要なパフォーマンスが得られる場合は、切り替えを行います。しかし、やみくもに移動する前に、それが私のmemcpyパフォーマンスの問題を解決することを確認したかったのです。

Visual C ++ 2010:1900MB/秒

NI CVI 2009:550MB/秒

CVIがVisualStudioよりも大幅に遅いことに驚いていませんが、memcpyのパフォーマンスがこれほど低いことに驚いています。これが直接比較できるかどうかはわかりませんが、これはEVERESTベンチマーク帯域幅よりもはるかに低くなっています。そのレベルのパフォーマンスは必要ありませんが、最低3GB/秒が必要です。確かに、標準ライブラリの実装は、エベレストが使用しているものよりもはるかに悪くなることはありません!

この状況でmemcpyを高速化するために、もしあれば、何ができますか?


ハードウェアの詳細:AMDMagnyCours-4xオクタルコア128GBDDR3 Windows Server 2003 Enterprise X64

テストプログラム:

編集:余分な5分があり、貢献したい場合は、上記のコードをマシンで実行して、コメントとして時間を投稿できますか?

0 投票する
2 に答える
2392 参照

python - python for-loop 各反復が遅い

私はいくつかのpythonコードを最適化しようとしています(いくつかの行列演算を高速化するため)、私のコードはこれに似ています(私の実際のデータセットも「gps」に似ています)、

私が理解したいのは、プログラムが最初の反復中に高速で実行され始め、さらに反復するにつれて速度が低下するのはなぜですか? 質問が少し素朴かもしれませんが、他のことを試みる前に、何が起こっているのかをより明確に把握したいと思っています. 私はすでに Fortran で関数を実装し (Fortran 領域内に for ループを残します)、f2py を使用して動的ライブラリを作成し、Python から関数を呼び出しました。これは Python の新しいコードになります。

残念ながら、(驚くべきことに) 私の fortran-python バージョンは最初のバージョンよりも 1.5​​ ~ 2 倍遅く実行されることがわかりました (Fortran 実装で MATMUL() を使用したことに言及することが重要です)。私はしばらくグーグルで調べてきましたが、この「スローダウン」は、大規模なデータセットを考えると、メモリ帯域幅、メモリ割り当て、またはキャッシュに関係していると思いますが、背後で実際に何が起こっているのか、どのように起こっているのかについてはよくわかりませんパフォーマンスを改善できますか。小さな intel atom 、2GB RAM、および 4 コア Intel xeon の両方でコードを実行しました。

なぜこの「減速」が起こるのかを理解する必要がありますか? 関数を C で実装すると、何か効果がありますか? またはGPUで実行するように実装しようとしますか? それを改善するための他のアイデアはありますか?前もって感謝します

0 投票する
1 に答える
4567 参照

cuda - CUDA: メモリ パフォーマンス、グローバル メモリ帯域幅とは

CUDA の最適化について学んでいます。このリンクでプレゼンテーションを見つけました: Paulius Micikevicius による CUDAの最適化。

このプレゼンテーションでは、

グローバルメモリ帯域幅を最大化

、彼らは、グローバルメモリの合体​​が帯域幅を改善すると言います。

私の質問は、グローバル メモリ帯域幅をどのように計算しますか。誰でも簡単なプログラムの例で説明できますか?

0 投票する
1 に答える
169 参照

scalability - 高いパフォーマンスと可用性を実現するために Web アプリをホストする場所と方法

Codeigniter フレームワークで PHP と MySql を使用してアプリケーションを作成しています。完成し、オンラインになる前にテストしています。今後数か月以内に約 100 人のユーザーが利用できると予想しています。このアプリケーションを日常的に使用するユーザーが増えることを期待しています。私の問題は、高可用性、高速サービス、およびデータベース サイズです。

誰かが次のような質問への回答を得ることができるリンクを提供してくれませんか:

何人のユーザーを使用すると、アプリケーションは重くなりますか? 通常の Web ホスティング プランと専用サーバーのどちらを購入する必要がありますか? サーバーと接続の構成はどうすればよいですか? クラウドホスティングはとにかく良くなりますか? データベースのサイズを大きくするのはどうですか?

敬具

0 投票する
2 に答える
3013 参照

c++ - OpenMP とコア/スレッド

私のCPUは2コア4スレッドのCore i3 330Mです。端末でコマンド cat を実行すると、/proc/cpuinfo4 つの CPU があるように見えます。OpenMP 関数を使用すると、get_omp_num_procs()4 も取得されます。

これで、標準の C++ ベクトル クラスができました。これは、式テンプレートを使用しない固定サイズの double 配列クラスを意味します。クラスのすべてのメソッドを慎重に並列化したところ、「期待される」スピードアップが得られました。

問題は、このような単純なケースで期待されるスピードアップを推測できるかどうかです。たとえば、並列化された for ループを使用せずに 2 つのベクトルを追加すると、(シェルの time コマンドを使用して) ある程度の時間が得られます。OpenMP を使用する場合、コア/スレッドの数に応じて、時間を 2 または 4 で割った値を取得する必要がありますか? データに相互依存性がなく、すべてが線形 (ベクトル加算) である、この特定の単純な問題のみを求めていることを強調します。

ここにいくつかのコードがあります:

私はすでにこの投稿を読みました: OpenMP thread mapping to physical cores .

この単純なケースで OpenMP がどのように機能するかについて、誰かが詳しく教えてくれることを願っています。私は並列計算の初心者です。

ありがとう!

0 投票する
2 に答える
586 参照

multithreading - プログラムがメモリに制約されている場合、並列化はパフォーマンスにどの程度役立ちますか?

Java プログラムを並列化しました。4 コアの Mac では、スレッド数が異なる場合の時間は次のとおりです。

ソケットが 2 つあり、それぞれに 4 つのコアがある Linux サーバーで測定された時間は次のとおりです。

ご覧のとおり、高速化は線形の高速化からはほど遠いものです。この場合、同期や I/O 依存などの並列化のオーバーヘッドはほとんどありません。

2 つの質問があります。

  1. これらのデータは、この Java プログラムがメモリにバインドされていることを意味しますか?
  2. もしそうなら、ハードウェアを変更せずにパフォーマンスをさらに改善する方法はありますか?
0 投票する
3 に答える
39192 参照

gpu - メモリクロック/メモリ速度からメモリ帯​​域幅を取得する方法

参考までに、これが私がNvidiaから入手した仕様です

http://www.geforce.com/hardware/desktop-gpus/geforce-gtx-680/specifications

http://www.geforce.com/hardware/desktop-gpus/geforce-gtx-titan/specifications

メモリ速度/メモリクロックは彼らのウェブサイトで同じものであり、両方ともGbpsで測定されることに注意してください。

ありがとう!

0 投票する
1 に答える
530 参照

c++ - OpenMPとメモリ帯域幅の制限

編集:私の最初のコードサンプルは間違っていました。よりシンプルに修正されました。

大きなベクトルと行列の間の代数演算用にC++ライブラリを実装します。x86-x64 CPUで、OpenMP並列ベクトルの追加、ドット積などがシングルスレッドよりも高速ではないことがわかりました。並列操作は、シングルスレッドよりも-1%〜6%高速です。これは、メモリ帯域幅の制限が原因で発生します(私は思います)。

したがって、問題は、次のようなコードに実際のパフォーマンス上の利点があるかどうかです。

このサンプルでは、​​OpenMPを使用することによる重大な欠点はありません。しかし、スパースベクトルとスパース行列を使用してOpenMPで作業している場合、たとえば* .push_back()を使用することはできません。その場合、質問は深刻になります。(スパースベクトルの要素はデンスベクトルのように連続的ではないため、並列プログラミングには欠点があります。これは、結果要素がいつでも到着する可能性があるためです。インデックスが低いものから高いものへの変換ではありません)