Direct3D DXGI とマルチ GPU (アダプタ)

PC を入れ替えて複数のビデオカードを同時に使えるようになりました。
対応マザーとそれなりの電源が必要です。
いろいろ試しています。

マルチ GPU といっても SLI や CrossFire のことではなく、
それぞれ独立した GPU として使います。

例えば GeForce と RADEON の 2枚差しで、それぞれにモニタをつないで
マルチモニタのように使用することができます。

・GeForce GTX260 → モニタ1
・RADEON HD4670 → モニタ2

GeForce は モニタ1 の描画を行い、RADEON は モニタ2 へ出力を行っています。
Windows から使っている分には 1枚のビデオカードに複数モニタをつないだ状態と
何も変わりません。
広いデスクトップとして使用可能で双方にまたがったウィンドウも配置できます。

ここまでは理解できますが Direct3D を使った場合はどうなるでしょうか。
D3D10CreateDevice / D3D11CreateDevice 時に PC につながっている任意のアダプタ
(GPU)を与えることが可能です。
どちらの GPU でも同じように使えるし、どちらのモニタにも描画することができました。
行き来もできるし中間に配置しても動いています。

このあたりをコントロールするのが DXGI で、非常に柔軟な使い方が可能となっています。

・IDXGIAdapter = GPU
・IDXGIOutput = モニタ

現在利用可能なアダプタとモニタは

IDXGIFactory::EnumAdapters()
IDXGIAdapter::EnumOutputs()

で列挙可能です。モニタに接続されていないアダプタも描画に使うことができます。
DXGI1.1 ではこれにさらに Command Remoting が加わります。
リモートデスクトップでアクセスしている場合に、ホストとクライアントどちらの
アダプタでレンダリングするか選択できるわけです。

●サンプルで確認

DirectX SDK 付属の Direct3D 11 のサンプルプログラムを起動するとウィンドウに
アダプタ名 (GPU名) が表示されています。
モニタ間 (アダプタ間) を行き来するとアダプタ名が切り替わるので違いがよくわかります。
プログラム的にはわざわざアダプタを切り替える必要は無いのですが、
DXUT では敢えてこのような仕様になっているようです。(理由は後述)

●プログラムで確認

実際にプログラムを書いて任意のアダプタで動かしてみました。

・RADEON HD4850 → モニタ1
・RADEON HD4670 → モニタ2

IDXGIFactory::EnumAdapters() でアダプタを列挙して、任意のアダプタを使って
デバイスを作成します。

// 列挙
IDXGIAdapter1*	iAdapter= NULL;
IDXGIFactory1*	iFactory= NULL;
CreateDXGIFactory1( __uuidof(IDXGIFactory1), reinterpret_cast( &iFactory ) );
for( unsigned int index= 0 ;; index++ ){
	HRESULT	ret= iFactory->EnumAdapters1( index, &iAdapter );
	if( ret == DXGI_ERROR_NOT_FOUND ){
		break;
	}
	// ~ アダプタの選択
	// iAdapter->Release();
}
iFactory->Release();


// 作成
HRESULT	hr= D3D11CreateDeviceAndSwapChain(
		iAdapter,
		iAdapter ? D3D_DRIVER_TYPE_UNKNOWN : DriverType,
		NULL,	// software
		D3D11_CREATE_DEVICE_DEBUG,// flags
		NULL,	// featurelevels
		0,	// featurelevels
		D3D11_SDK_VERSION,
		&SwapChainDesc,
		&iSwapChain,
		&iDevice,
		&FeatureLevel,
		&iContext
	);

アダプタは IDXGIFactory::EnumAdapters() で列挙したハードウエアアダプタ、
もしくは IDXGIFactory::CreateSoftwareAdapter() で作成したソフトウエアアダプタです。
すでに TYPE を特定できるので、DriverType には D3D_DRIVER_TYPE_UNKNOWN を
与えなければなりません。(最初ここではまりました)

結果

RADEON HD4850 → モニタ1  : 257fps
RADEON HD4850 → モニタ2  : 205fps

RADEON HD4670 → モニタ1  : 140fps
RADEON HD4670 → モニタ2  : 164fps

HD4850 ではモニタ1 の方が高速、HD4670 ではモニタ2 の方が高速です。
アダプタから直接出力した方が速く、予想通りの結果といえます。
同時にたとえ直結されていなくても、モニタ2 の描画も HD4850 が行った方が速いこともわかります。

DirectX SDK 付属サンプルの DXUT がウィンドウの位置を監視して、モニタに応じて
デバイスを作り直しているのは少しでも高速に動作するためだと考えられます。

昔はビデオカードを何度も何度も差し直して開発していました。
GeForce と RADEON の挙動を同時に確認できるなんて、大変便利になったものです。
上のテストの最中、途中で GeForce GTX260(192sp) から HD4850 に差し直したのは
本日非常に暑かったからです。

関連エントリ
Windows7 リモートデスクトップと Direct3D

Windows SDK for Windows7 RC と Multitouch / Direct3D 11

Windows7 RC と同時に WindowsSDK の RC 版も出ています。

Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1: RC
Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1: RC (ISO)

BETA 時点からタッチ周りの API など変更されているところがあるので要注意です。
たとえば WM_TOUCHDOWN, WM_TOUCHUP, WM_TOUCHMOVE 等は無くなり
WM_TOUCH に統一されているようです。

マニュアルも更新されています。
以前 User Interface の下にあった Touch 関連が Windows Touch
という新項目にまとめられています。このあたり力が入ってます。

MSDN Windows Touch

Direct3D11 関連も DirectX SDK March 2009 より新しいものが含まれていました。
ただし d3d11.lib などの lib 名に _beta がついていないので include の順番に
注意した方が良さそうです。
Vista で使う場合は DXSDK の方を。

関連エントリ
Windows7 Multitouch API その(2) WM_GESTURE 系
Windows7 Multitouch API
DirectX SDK March 2009

VAIO type P + Windows7 RC で Direct3D 11

Windows7 RC を入れた type P はAero がそれなりに動いているので印象が変わりました。
現在透明感 off で使用しています。

・個人設定→ウィンドウの色→「透明感を有効にする」のチェックを外す

半透明ではないもののウィンドウの重なりがハードウエア描画なので速いです。
たとえばウィンドウ移動とか最小化のアニメーションとかそこそこスムーズに
できますし(たまにかくつくけど)、タスクバーにマウスカーソルを乗せると
ウィンドウの縮小イメージもポップアップで出ます。
ウィンドウの中の描画速度は変わらないけど、操作の印象は良くなりました。

たまに背景の描画が追いつかないのか真っ黒に崩れることがあります。
フレームバッファが消えてしまった状態ですが、以前から同じ症状があった気がするので
また違う問題かもしれません。

Aero が動くということは D3D も動くようになったということ。
GMA500 がどの Feature Level まで対応しているのか Direct3D11 で試してみました。
結果は残念ながら FEATURE_LEVEL_9_1 ~ 3 も未対応。
ハードウエアでは動作しませんでした。

Direct3D11 サンプルや一部のアプリケーションが動くのは、ソフトウエアレンダラ
WARP Device を呼び出しているからです。
D3D11CreateDevice~() の D3D_DRIVER_TYPE_HARDWARE でエラーが出た場合、
D3D_DRIVER_TYPE_WARP できちんと作り直しているアプリは動きます。
D3D11 サンプルが動いて D3D10 が動かないのはおそらくアプリが WARP に対応していないから。
D3D10 LEVEL_9_1 ~ に対応していないということは Direct2D を使う場合もおそらく
CPU レンダラになります。
ハードウエア対応は今後に期待。現状未対応でもとりあえず動くのは WARP のおかげです。

●結論
GPU は Direct3D 9 3.0 まで対応しているものの、
現状では Direct3D10/11 の下位モードの Level9 でも動作せず。
WARP なら動く。

関連エントリ
VAIO Type P の Windows7 RC は Aero が有効

Atom vs Core i7

コンパイル時間

(1) Atom Z540    11分44秒 (704秒)
(2) Core i7 920      37秒

(1) 詳細
Atom Z540 1.86GHz 1core 2threads
RAM 2GB, SSD 64GB (VAIO type P), AC電源
Windows7 RC x86, Aero ON
VC2008 cl /MP4 (4thread指定)

(2) 詳細
Core i7 920 2.66GHz 4core 8threads
RAM 6GB, HDD 1TB
Windows7 RC x64
VC2008 cl /MP10 (10thread指定)

実行したのはライブラリのコンパイルでコマンドラインから /MP スイッチ付き。
x86 debug, x86 release, x64 debug, x64 release の 4種を全部作成。
同じファイルを何度も読む+コンパイル自体数回実行したので
RAM が多ければソースはキャッシュに乗ってる状態です。
ただし同時に 8 file 未満のコンパイルが行われることもあるので CPU は 100% 埋まっていません。
スレッドがすべて埋まる条件なら core 数の多い Core i7 とはもっと速度差が開くと思います。
おそらくもっと速いでしょう。

仮に Atom が 4core で、ストレージとバスの影響を無視して 4倍速になると仮定しても 176 秒。
さらに Atom が同じ 2.66GHz で動いたとしても 123 秒。
多めに見積もってもまだ 3.3 倍開きがあります。

VAIO Type P の Windows7 RC は Aero が有効

超多忙が和らいだので VAIO type P に Windows7 RC を入れてみました。
BETA と同様クリーンインストールです。ドライバはほぼ自動で入ります。
一つだけ不明なデバイスがありましたが、おそらく Fn キー周りと思われます。

(1) 準備
 Windows7 RC x86 DVD
 USB 接続の DVD ドライブ
 VAIO typeP のプリインストール Vista から取り出しておいたドライバフォルダ
   C:\Windows\drivers の下

(2) インストール
 外付けドライブから起動したあと 64GB SSD を全部消してクリーンインストールです。

(3) ネットワーク設定を行い自動更新します
 推奨にもチェック。ドライバが入ります。

(4) 不明なドライバを入れます
 デバイスマネージャーを開いて不明なデバイスのドライバを検索
 (1) で保存しておいたフォルダを指定すれば勝手に入ります。

(5) Wireless LAN ドライバの入れ替え
 そのままでも無線 LAN ドライバが入りますが 150Mbps 接続だったので入れ替えました。
 300Mbps 接続になりました。
 デバイスマネージャーからネットワークアダプター
  → Atheros~ の上で右ボタンからドライバーソフトウエアの更新
  → コンピュータを参照して~を選択
  → 自動検索だとすでに最新といわれるので、下の
    「コンピューター上のデバイスドライバーの一覧から選択します」を選ぶ
  → ディスクの使用ボタン → 参照
  → (1) で保存したフォルダから 「Wireless LAN Driver (Atheros)」を選択して OK
  → そのまま次へ、でドライバが入る

(6) エクスペリエンスインデックスの計測
 いろいろ設定する前に「コンピューター」のプロパティから
 Windows エクスペリエンスインデックスの評価を実行しておきます。
 少々時間がかかりましたが、評価が終わったら Aero Glass が有効になっていました。

プロセッサ          1.2  (Z540)
メモリ               4.1
グラフィックス(Aero) 2.9
グラフィックス(Game) 2.4
ハードディスク       5.9  (SSD 64GB)

(7) 画面の輝度調整

 BETA 同様下記ソフトで代用。ボリューム調整は何もしなくてもできます。
backlightwin 1.00

● Windows7 RC 描画

ドライバの不具合が無くなったのか DWM も動いており、起動時のエラーダイアログも無くなっています。
これで動作確認のために Vista を残しておかなくてもよくなりそうです。
Aero Glass も動くようになりました。Vista 上で使うより多少ましに見えます。
透明感の設定を外すと少々軽くなります。

Direct3D11 サンプルもいつもの MultithreadRendering11 は一応動きました。
動作は 0.14fps、リファレンスと間違えるほど重いです。
Feature Level が 10.1 なので調べるとソフトウエアレンダラの WARP Device が使われていました。
Direct3D9 はきちんと GPU で動いています。
この辺はあとでもう少し詳しく調べてみます。

● Windows7 RC 全般

スタートメニューの個人用フォルダーが Vista 同様の個人フォルダに戻りました。
ライブラリはメニューとして分離しています。個人的にはこれが一番うれしい変更です。
BETA ではタスクバーに desktop のツールバーを置いて代用してました。

その代わり多用していた新規作成のショートカットが W から X に変更されてしまいました。
これ今までも何度も変更されているのであきらめています。

マイコンピュータのプロパティ(システム) にこんな表示が
「Pen and Touch: No Pen or Touch Input is available for this Display」

関連エントリ
VAIO type P Windows7 beta とバックライト調整など
Windows ノート PC の backlight の明るさ変更方法