QSVEncのお手軽CPU/GPU世代判別

QSVEnc 2.06では、IvyBridge系統のGPUではピラミッド参照をオフにする、という機能を追加した。

このためにはCPU(GPU)の世代判別を行わないといけないのだけど、その方法はわりとお手軽に行っている。

※2015.08.13 Skylakeの判別について追記。

QSVがサポートされるGPUの世代
Skylake世代
Broadwell世代
Haswell世代
IvyBridge世代
SandyBridge世代

これらを見分けたい。



IntelのGPUはCPUとセットなので、CPUの世代がわかればGPUの世代もわかる。

一番簡単には、例えばAVX2サポートならHaswell以降、などとする方法がある。ただ、これは残念ながら不確実で、HaswellなPentiumなどではAVX2はサポートされないし、ついでにBMI/BMI2/FMA3/AES/F16C命令もサポートされない。

他にはcpuidのモデルナンバーとかを見る方法がある。ただ、これはHaswellだけでいろいろなモデルナンバーがあるので、それをいちいちコードに列挙するのはめちゃくちゃめんどくさい。なのでやはり対応命令のチェックなどでなんとかしたい。

最近のIntel CPUは世代ごとに新たな命令が追加されていてAVX/AVX2以外にもいろいろな謎の命令が追加されている。

そこで、例えばこのあたりとにらめっこすると、いまのところ以下のように判定することができることがわかる。

判定スタート (対応していれば、右矢印へ)
 ↓
MPX命令 → Skylake
 ↓
RDSEED命令 → Broadwell
 ↓
MOVBE命令 + FSGSBASE命令 → Haswell
 ↓
QSVのICQモード → Airmont (Braswell) (= GPUはHaswell世代)
 ↓
FSGSBASE命令 → IvyBridge
 ↓
RDRAND命令 → Silvermont (= GPUはIvy世代)
 ↓
SandyBridge

まあ、何に使うのかよくわからん謎な命令たちだが、これらのサポートフラグをcpuidでチェックするだけで、お手軽に判定できることがわかる。



QSVEncでは、上の方法をそのままコードにしてある。

#include <intrin.h>

int getCPUGen() {
int CPUInfo[4];
__cpuid(CPUInfo, 0x01);
bool bMOVBE = !!(CPUInfo[2] & (1<<22));
bool bRDRand = !!(CPUInfo[2] & (1<<30));

__cpuid(CPUInfo, 0x07);
bool bMPX = !!(CPUInfo[1] & (1<<14));
bool bRDSeed = !!(CPUInfo[1] & (1<<17));
bool bFsgsbase = !!(CPUInfo[1] & (1));

if (bMPX) return CPU_GEN_SKYLAKE;
if (bRDSeed) return CPU_GEN_BROADWELL;
if (bMOVBE && bFsgsbase) return CPU_GEN_HASWELL;

//ICQのサポートをチェックする
bool bICQ = !!(CheckEncodeFeature(true, get_mfx_libhw_version(), MFX_RATECONTROL_ICQ, MFX_CODEC_AVC) & ENC_FEATURE_CURRENT_RC);

if (bICQ) return CPU_GEN_AIRMONT;
if (bFsgsbase) return CPU_GEN_IVYBRIDGE;
if (bRDRand) return CPU_GEN_SILVERMONT;
return CPU_GEN_SANDYBRIDGE;
}


きっとちゃんと判定できているはず。(Core2とかAMDとかでやるとどうなるの、とか細かいことは気にしない。なんせQSVがないので関係ない)

もっと簡単な方法あるかなあ…。


スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

Author:rigaya
アニメとか見たり、エンコードしたり。
連絡先(@を半角にしてください!)
rigaya34589@live.jp
github

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

○Aviutlプラグイン
x264guiEx 2.xx (ミラー)
- x264を使用したH264出力
- x264guiExの導入>
- x264.exeはこちら>

x265guiEx (ミラー)
- x265を使用したH.265/HEVC出力
- x265.exeはこちら>

QSVEnc + QSVEncC (ミラー)
- QuickSyncVideoによるH264出力
- QSVEncCはコマンドライン版
- QSVEncC 導入/使用方法>
- QSVEncCオプション一覧>

NVEnc + NVEncC (ミラー)
- NVIDIAのNVEncによるH264出力
- NVEncCオプション一覧>

VCEEnc + VCEEncC (ミラー)
- AMDのVCEによるH.264出力

ffmpegOut (ミラー)
- ffmpeg/avconvを使用した出力

自動フィールドシフト (ミラー)
- SSE2~AVX2による高速化版
- オリジナル: aji様

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

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

PMD_MT (ミラー)
- SSE2~FMA3による高速化版
- オリジナル: スレ48≫989氏

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

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

○その他
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 (ミラー)

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

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

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