A10-7850KでのPMD_MT高速化版

この前公開したPMD_MT高速化版が、実はAMDではそんなに高速じゃない、という話。

速度を測ってみて、なんで速くないかを考えてみる。ただ今回はぐだぐだ予想とかを書くだけ…

i7 4770KとA10-7850Kを同じクロックにして比較した。メモリ速度もだいたい互角。

環境1
Core i7 4770K (4C/8T, Core 4.4GHz @ 1.325V / Uncore 4.2GHz)
DDR3-2600, 2ch, 16GB, 10-12-12-31-2
Asrock Z87 Extreme4

環境2
A10-7850K (2M/4T, Core 4.4GHz @ 1.41~1.47V)
DDR3-2496, 2ch, 16GB, 11-13-13-31-2
Asrock FM2A88ITX-X+

Win7 x64
Aviutl 1.00

対象: 1280x720p, 2048フレーム

以下、1フレームあたりのPMD_MT単体の処理速度(2048フレームの平均)

PMD_MTは「修正PMD」「useExp」の2つのオプションがあるので、2x2=4通りあるのだけど、ここでは修正PMDはオンとして、useExpを「オフ」でのかかった時間を測った。

結果
pmd_mt_i7_4770K_A10_7850K

useExpを「オフ」にするモードでは、重み計算 & ノイズ除去 (weight & nr)を浮動小数点演算のゴリ押しによって求めている。このため、SIMD演算の弱いBulldozer系には苦手な計算になっている。

特に、

1. 4770Kのほうが圧倒的に速い。

2. 4770KはSIMD化によって高い効果が得られるものの(x2.7倍速)、7850Kのほうはいまいち(x1.5倍速)。

3. 7850Kで、originalのgaussianH(垂直方向のガウシアンぼかし)、遅すぎ? (3.9msかかってる…)

4. 7850Kで、SSE4.1版のほうがAVX版より速い…。

ことがわかる…。



1と2はもう単に7850KがSIMD演算が苦手、というだけの話。同じ物理4コアとはいえ、7850KはSIMD演算器を2コアで共有しているうえに、256bit演算に対応しているものの、実際には256bitの演算器を持たず、256bit演算を実行する際には128bit演算器を2回まわしているとされている。ということは、Haswellは1コアが256bitのSIMD演算器を2個持っているのに対し、Streamrollerは2コアが128bit演算器が2個を共有している、という状態になっていて、SIMD演算に限れば圧倒的な差があることになる。これでは遅いのはもう仕方ない…

3のoriginalのgaussianHが遅いのは…なんでなのん? 謎。

4はなんでだろう、と最初は思っていたのだけど、結局7850Kが256bit演算器を持たないことが原因かもしれない。

重み計算 & ノイズ除去 (weight & nr)は整数で計算するところと浮動小数点で計算するところがある。これをAVX/FMA3を使って計算する場合、浮動小数点部分は256bitで計算可能だが、整数演算部分は128bitでしか計算できない(256bitの整数演算はAVX2が必要)。そのため、下の図のように整数部分を128bitで計算しておいて、浮動小数点演算部分になったら128bit×2を256bitに結合してから256bitで計算し、再び整数演算部に戻るときには256bitを128bit×2に分離してから計算している。IntelなCPUでは浮動小数点部を256bitで計算することで大幅に高速化できるため、結合や分離をしてでも浮動小数点部は256bitで計算したほうが速い。

pmd_mt_avx_sse41_compare_haswell
↑AVXを使用し、重い浮動小数点演算部を256bit単位で計算することで浮動小数点演算回数を減らし、高速化できる



しかし、7850Kは256bit命令に対応しているだけで実際には256bit演算器を持たないため、256bit演算を行ったつもりでも実際には下の図のように128bitの計算が2回行われるだけで、256bit演算を行うメリットはあまりない事になってしまう。

pmd_mt_avx_sse41_compare_steamroller
↑256bitで計算しようとしても内部では結局128bit×2…

むしろ、結合やら分離やらに無駄に手間をかけただけに終わり、遅くなってしまっているんだろうな…と予想できる。

というわけで、そのうちこの予想を検証してなんとか7850Kでももう少し速くしてみる…(続くと思う…)

とりあえず寝る…
スポンサーサイト



コメントの投稿

非公開コメント

プロフィール

rigaya

Author:rigaya
アニメとか見たり、エンコードしたり。
連絡先: rigaya34589@live.jp
github twitter

最新記事
最新コメント
カテゴリ
月別アーカイブ
カウンター
検索フォーム
いろいろ
公開中のAviutlプラグインとかのダウンロード

○Aviutl 出力プラグイン
x264guiEx 3.xx
- x264を使用したH264出力
- x264guiExの導入紹介動画>
- x264guiExの導入
- x264guiExのエラーと対処方法>
- x264.exeはこちら>

x265guiEx
- x265を使用したH.265/HEVC出力
- x265guiExの導入>
- x265.exeはこちら>

QSVEnc + QSVEncC
- QuickSyncVideoによるHWエンコード
- QSVEnc 導入/使用方法>
- QSVEncCオプション一覧>

NVEnc + NVEncC
- NVIDIAのNVEncによるHWエンコード
- NVEnc 導入/使用方法>
- NVEncCオプション一覧>

VCEEnc + VCEEncC
- AMDのVCE/VCNによるHWエンコード
- VCEEnc 導入/使用方法>
- VCEEncCオプション一覧>

svtAV1guiEx
- SVT-AV1によるAV1出力
- svtAV1guiExの導入>
- SVT-AV1単体はこちら>

VVenCguiEx
- VVenCによるVVC出力
- VVenCguiExの導入>

ffmpegOut
- ffmpegを使用した出力
- ffmpegOutの導入>


○Aviutl フィルタプラグイン
自動フィールドシフト (ミラー)
- SSE2~AVX512による高速化版
- オリジナル: aji様

clfilters 
- OpenCLベースの複数のGPUフィルタ集
- 対応フィルタの一覧等はこちら

エッジレベル調整MT (ミラー)
- エッジレベル調整の並列化/高速化
- SSE2~AVX512対応
- オリジナル: まじぽか太郎様

バンディング低減MT (ミラー)
- SSE2~AVX512による高速化版
- オリジナル: まじぽか太郎様

PMD_MT
- SSE2~AVX512による高速化版
- オリジナル: スレ48≫989氏

透過性ロゴ (ミラー)
- SSE2~FMA3によるSIMD版
- オリジナル: MakKi氏

AviutlColor (ミラー)
- BT.2020nc向け色変換プラグイン
- BT.709/BT.601向けも同梱

○その他
Amatsukaze改造版
- AmatsukazeのAV1対応版

x264afs (ミラー)
- x264のafs対応版

aui_indexer (ミラー使い方>)
- lsmashinput.aui/m2v.auiの
 インデックス事前・一括生成

auc_export (ミラー使い方>)
- Aviutl Controlの
 エクスポートプラグイン版
 エクスポートをコマンドから

aup_reseter (ミラー)
- aupプロジェクトファイルの
 終了フラグを一括リセット

CheckBitrate (ミラー, 使い方, ソース)
- ビットレート分布の分析(HEVC対応)

チャプター変換 (使い方>)
- nero/appleチャプター形式変換

エッジレベル調整 (avisynth)
- Avisynth用エッジレベル調整

メモリ・キャッシュ速度測定
- スレッド数を変えて測定
- これまでの測定結果はこちら

○ビルドしたものとか
L-SMASH (ミラー)
x264 (ミラー)
x265 (ミラー)
SVT-AV1 (ミラー)

○その他
サンプル動画
その他

○読みもの (ミラー)
Aviutl/x264guiExの色変換
動画関連ダウンロードリンク集
簡易インストーラの概要

○更新停止・公開終了
改造版x264gui
x264guiEx 0.xx
RSSリンクの表示
リンク
QRコード
QR