2017-02-07 12 views
8

マルチスレッドメモリアクセスはシングルスレッドメモリアクセスより高速ですか?マルチスレッドメモリアクセスは、シングルスレッドメモリアクセスより高速ですか?

C言語であると仮定します。簡単な例は次のとおりです。私が巨大な配列Aを持っていて、Aと同じサイズの配列BAをコピーしたいのですが。マルチスレッドを使用して、単一のスレッドを使用するよりも高速にメモリコピーを実行していますか?この種のメモリ操作を実行するのに適したスレッドの数はいくつですか?

編集: 質問を絞り込んでください。まず第一に、我々はGPUのケースを考慮しない。メモリアクセスの最適化は、GPUプログラミングを行うときに非常に重要で効果的です。私の経験では、常にメモリ操作に注意する必要があります。一方、私たちがCPUで作業する場合は必ずしもそうではありません。さらに、avxやsseなどのSIMD命令については考慮しません。また、多くの計算操作ではなく、プログラムのメモリアクセス操作が多すぎると、メモリパフォーマンスの問題が発生します。私たちは、1〜2個のCPUを持つx86アーキテクチャを扱っているとします。各CPUには、複数のコアとクワッドチャネルメモリインタフェースがあります。メインメモリは今日のようにDDR4です。

私の配列は、CPUのL3キャッシュのサイズと似たサイズの倍精度浮動小数点数の配列です。これは約50MBです。さて、私は2つの場合があります:1)同じサイズの別の配列にこの配列をコピーするには、要素ごとのコピーを実行するか、またはmemcpyを使用します。 2)たくさんの小さな配列をこの巨大な配列に結合する。どちらもリアルタイム操作であり、できるだけ早く実行する必要があることを意味します。マルチスレッドは高速化またはドロップダウンを行いますか?この場合、メモリ操作のパフォーマンスに影響する要因は何ですか?

誰かが主にDMAの性能に依存すると言いました。私はmemcpyをするときだと思います。要素別のコピーを実行すると、まずCPUキャッシュを通過するのでしょうか?

+9

多くの要因によって異なります。 –

+2

なぜdownvotes? –

+5

あなた自身の測定を行います。非常に多くのパラメータが含まれています:キャッシュミス、データの長さ...私はCPU集中型操作ではないので、ボトルネックはメモリへのアクセス(ディスクアクセスのようなビット)になると言います。私は単一のスレッドに行くだろうが、私は確かにマルチスレッドと比較するだろう... –

答えて

3

長年にわたり、CPU性能は大幅に向上しました。 RAMのパフォーマンスが追いつくことができませんでした。それは実際にキャッシュをより重要にしました。特にセルラーンの後。

ですから、パフォーマンスで増減を持つことができます。

  • メモリフェッチおよびコア
  • あたりのメモリストアユニット
  • メモリ・コントローラ・モジュール
  • メモリモジュールのパイプラインの深さに大きく依存

    とメモリバンクの列挙

  • 各スレッドのメモリアクセスパターン(ソフトウェア)
  • データチャンク、命令ブロブの0
  • アラインメント
  • 共有と
  • オペレーティングシステムすべてのスレッドのためにあまりにも多くの先取りをしている共通のハードウェアリソースのデータパス

は単に、CPUの後、品質をキャッシュ用のコードを最適化パフォーマンスを決定します。


例:

FX8150がi7-4700よりも弱いコアを持っている:コアが1つだけのスレッドに余分なスレッドが、i7のトップにスケーリングしていることができ

  • FX(私はメモリ重い意味コードは
  • FXはもっとL3ですが遅いです
  • FXはより高い周波数のRAMで動作しますが、i7はより良いコア間データ帯域幅を持っています。 Notherのスレッド)
  • FXパイプラインは、Intelが単一スレッドに力を与えるんがAMDがスレッドに、よりきめ細かなパフォーマンスを共有できるように見える枝

後、回復には長すぎる長すぎます。 (評議会組合対君主制)GPUとHBMの方がAMDが優れている理由かもしれません。私は憶測を停止しなければならなかった場合は、RAMは、マザーボード上の多くの組み合わせを持つことができますが、それはCPUで変更可能ではないよう


、私はキャッシュの世話だろう。

8

多くの要因によって異なります。 1つの要因は、使用するハードウェアです。最新のPCハードウェアでは、CPU時間がコピー操作の制限要因ではないため、マルチスレッドはパフォーマンスの向上につながりません。制限要因はメモリインターフェイスです。 CPUはDMAコントローラーを使用してコピーを実行する可能性が最も高いため、データをコピーするときにCPUのビジー状態が悪化することはありません。

+2

興味深いことに、私の単純なテストでは、タスクは完全にスケーリングされ、100%のCPUバウンド(memcpyを本質的に呼び出している間)です。http://coliru.stacked-crooked.com/a/a61707960de650d9 – Lol4t0

+0

@ Anony-Mousseそれは本当のmemcpyを呼びます。あなたはそれを見上げることができます。 – Lol4t0

+0

CPUがDMAコントローラを使用することをどのように知っていますか?私は懐疑的ですが、心が開いています。源泉はありますか? –

0

AMD/Intel64アーキテクチャを前提としています。

1つのコアは、メモリ帯域幅を飽和させることができません。しかし、これは、マルチスレッド化が高速であるということではありません。そのためにはスレッドは別のコアになければなりません。物理コアと同じ数のスレッドを起動する必要があります。これは、OSがスレッドを異なるコアに割り当てる可能性が高いためですが、スレッドライブラリでスレッドにバインドする関数特定のコアに、これを使用するのがスピードに最適です。あなたがマルチソケットシステムを持っている場合、もう一つ考えるべきことはNUMAです。スピードを最大にするには、AVX命令の使用について考える必要があります。

関連する問題