18

PowerPC での優れたメモリ戦略を求めて、いくつかのコピー関数を作成しました。Altivec または fp レジスタをキャッシュ ヒント (dcb*) と共に使用すると、大きなデータの単純なバイト コピー ループよりもパフォーマンスが 2 倍になります。最初はそれに満足していたので、通常の memcpy を投入して比較してみました...私のベストよりも 10 倍高速です! memcpy を書き直すつもりはありませんが、memcpy から学び、ほとんどの時間をメモリとの間でピクセルを移動するのに費やすいくつかの単純な画像フィルタを高速化したいと考えています。

サメの分析では、内部ループが dcbt を使用してプリフェッチし、4 つのベクトル読み取りと 4 つのベクトル書き込みを行っていることが明らかになりました。反復ごとに 64 バイトを運ぶように私の最高の関数を微調整した後でも、memcpy のパフォーマンス上の利点は依然として恥ずかしいものです。私は dcbz を使用して帯域幅を解放しています。Apple は何も使用していませんが、どちらのコードもストアで躊躇する傾向があります。

プリフェッチ
  dcbt 未来
  dcbt 遠い未来
ものをロードする
  Lvx イメージ
  Lvx画像+16
  Lvx画像+32
  Lvx画像+48
  画像 += 64
収納準備
  dcbz フィルター処理済み
  dcbz フィルタリング + 32
物を保管する
  stvxl フィルター処理済み
  stvxl フィルター + 16
  stvxl フィルター + 32
  stvxl フィルタリング + 48
  フィルタリングされた += 64
繰り返す

非常によく似たコードに劇的なパフォーマンスのギャップがある理由について、誰か考えがありますか? memcpy が使用している秘密のソースに実画像フィルターをマリネしたいです!

追加情報: すべてのデータはベクトルで整列されています。元の画像を置き換えるのではなく、画像のフィルター処理されたコピーを作成しています。コードは PowerPC G4、G5、および Cell PPU で実行されます。Cell SPU版はすでにめちゃくちゃ速いです。

4

5 に答える 5

7

サメの分析では、内部ループが dcbt を使用してプリフェッチし、4 つのベクトル読み取りと 4 つのベクトル書き込みを行っていることが明らかになりました。私の最高の関数を微調整した後、反復ごとに64バイトも運搬します

私は明白なことを述べているかもしれませんが、あなたの質問では次のことについてまったく言及していないので、指摘する価値があるかもしれません:

Apple が 4 つのベクトル読み取りとそれに続く 4 つのベクトル書き込みを選択したことは、G5 のパイプラインと、「ディスパッチ グループ」での順不同の命令実行の管理と、魔法の 64 バイトのパーフェクトと同じくらい関係があるに違いありません。ラインサイズ。リンクされた Nick Bastin の bcopy.s で行がスキップされていることに気付きましたか? これらは、開発者が命令ストリームが G5 によってどのように消費されるかを考えたことを意味します。同じパフォーマンスを再現したい場合、一度に 64 バイトのデータを読み取るだけでは十分ではありません。最初の 4 つは非ジャンプ命令で、5 番目はジャンプのみが許可されています (詳細はより複雑です)。

編集:同じページの次の段落にも興味があるかもしれません:

dcbz 命令は、G4 および G3 と同様に、メモリの 32 バイト セグメントをゼロに揃えます。ただし、これは G5 の完全なキャッシュラインではないため、期待していたパフォーマンス上の利点は得られません。完全な 128 バイトのキャッシュラインをゼロにする G5 用に新しく導入された dcbzl 命令があります。

于 2010-01-02T02:49:33.360 に答える
2

あなたのコードが見えないので、あなたが何をしているのか正確にはわかりませんが、Apple の秘密のソースはここにあります。

于 2010-01-02T02:14:26.163 に答える
0

それでも答えはありませんが、memcpyが実際にデータを移動していることを確認しましたか?たぶん、それはコピーオンライトを再マッピングしただけなのかもしれません。最初と最後のページの一部が実際にコピーされているため、Sharkの内側のmemcpyループが引き続き表示されます。

于 2010-01-02T06:56:41.350 に答える
0

原因はCPUキャッシュのせいかもしれません。CacheGrindを実行してみてください:

Cachegrind はキャッシュ プロファイラーです。CPU の I1、D1、L2 キャッシュの詳細なシミュレーションを実行するため、コード内のキャッシュ ミスの原因を正確に特定できます。ソースコードの各行で実行されたキャッシュミス、メモリ参照、および命令の数を、関数ごと、モジュールごと、およびプログラム全体の要約で識別します。これは、任意の言語で作成されたプログラムで役立ちます。Cachegrind は通常より 20 ~ 100 倍遅くプログラムを実行します。

于 2010-01-02T02:08:18.187 に答える