2017-02-23 4 views
7

データがキャッシュされていないと、メインメモリへのアクセスに高いレイテンシがあることは知っています。この質問は約スループットです。メインメモリにバインドされていない関数の複雑さはどれくらいですか?

通常のデスクトップPCでメインメモリに決して縛られない機能はどれくらい複雑ですか?

私は25-30GB/s(DDR3 RAM、デュアルチャネルモード)の帯域幅を持つ最新のRAMについて読んでいます。私が知る限り、現代のIntelプロセッサの単一のコアは、最新のSIMD命令セットを使用して命令当たり最大32バイトを格納できます。最大4 * 10^9命令で実行できます。そのため、約120GB/sの出力が可能です。 8スレッドのプロセッサを仮定すると、最大出力量は最悪の場合の推定値として約960GB /秒になります。

プロセッサは、RAMに書き込むことができるデータの〜36倍を出すことができます。 SIMDストアまたはロードごとに36サイクル以上(または通常の8バイトストアまたはロード当たり9サイクル以上)の非ロード/ストア操作を実行する関数は、メインメモリに決してバインドされないと想定するのは安全でしょうか?この見積もりを大幅に下げることができますか、何らかの理由で低すぎますか?それは(より悪いかではない)方が良いとき

X = (x_1, x_2, ..., x_n) // dataset, large enough to make good use of caches 
a(x), b(x), c(x, y), d(x) := c(a(x), b(x)) // functions that operate on elements 
A(x) := (a(x_1), a(x_2), ..., a(x_n)) // functions that operate on data sets 

私はことを考えると

C(A(X), B(X)) 

として

D(X) 

を実装するためのガイドラインを探しています:私がしていることを考えると

最初の実装ではキャッシュとレジスタへの負荷が大きくなり、2番目の実装ではより多くのロード/ストア操作が行われます。

(もちろん、ベンチマークのことを教えてもらえますが、それは問題ありませんが、後で問題やボトルネックになったときに、

+0

@RossRidge用語に関して知っておくと良いです。この質問を編集して、操作をロード/ストア操作と呼んでいます。しかし、質問のポイントはまだ有効ですか? –

+0

まあ、私は答えはそれが依存していると思います。予測できない分岐を持つコードを実行すると効果的なCPU速度が劇的に低下しますが、ランダムなアクセスが少ない場合でも有効なDRAM速度も劇的に低下します。 –

+1

私は公式がまだ同じであると信じています:帯域幅/負荷のサイズ= 1秒あたりの負荷の数。そこから:(キャッシュされた)負荷/ CPUの頻度=負荷あたりの秒数。 (1秒あたり1秒)/ 1秒当たりの負荷=負荷間の廃棄時間。 *浪費する時間=負荷の間に無駄になる周期。偽パケットの計算の私の背中が正しい場合(私は疑う)。 –

答えて

1

私は、CPUが次のデータ項目をキャッシュにプリフェッチできるような方法でコードを書いているかどうかにかかっていると思います。誤ったデータを先読みすると、現在のデータを処理するのに費やされた時間に関係なく、メモリにバインドされます。

複数のスレッドが同じアドレスに書き込んでいる(データが異なるキャッシュ行にある)場合、正しくプリフェッチされていても、別のスレッドがそのアドレスに書き込んだ場合は、ダンプしてからメインメモリから再度読み込みます。

要約すると、私は、このレベルではこれらの種類のことについて理由を付けることは不可能だと思っています。あなたが持っている正確なシナリオに依存します。

関連する問題