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版はすでにめちゃくちゃ速いです。