Windows」カテゴリーアーカイブ

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 の明るさ変更方法

Windows7 Multitouch API その(2) WM_GESTURE 系

Windows7 のマルチタッチ系イベントには二通りあることを前回説明しました。
高度な方、WM_GESTURE 系についてもう少し詳しくさわってみます。

メッセージは WM_MOUSEMOVE のように座標の更新毎に多数送られてきます。
このとき一つの操作の組が GID_BEGIN と GID_END で囲まれます。
例えば PAN 操作の場合

GID_BEGIN
GID_PAN
GID_PAN
GID_PAN
GID_PAN
...
GID_END

といった感じに。
また別の操作が認識されれば、それらが GID_BEGIN~GID_END で囲まれます。
マウスでいえば LBUTTONDOWN / LBUTTONUP のようなもの。
タッチだと WM_TOUCHDOWN / WM_TOUCHUP でしょう。
開始と終了が明確にわかるようになっています。

ただ上の例だと最初と最後の GID_PAN 自身にも GF_BEGIN, GF_END フラグが
追加されているので、実は GID_BEGIN/GID_END を無視しても何も困りません。
フラグ値を追加して書き直してみます。

GID_BEGIN
GID_PAN  GF_BEGIN
GID_PAN
GID_PAN
...
GID_PAN
GID_PAN  GF_INERTIA
...
GID_PAN  GF_INERTIA
GID_PAN  GF_INERTIA|GF_END
GID_END

GF_INERTIA は PAN 操作のみ追加される慣性で、操作後もしばらくメッセージが
送られてきます。

前回も書きましたがマニュアルにはまだ間違いが含まれているので、仕様が確定
するまではヘッダファイルを見た方が確実です。ヘッダは WinUser.h です。

WM_GESTURE が送ってくる座標値はスクリーン座標です。
GESTUREINFO 構造体には対象となるウィンドウのハンドルが含まれていますが、
ウィンドウ内の座標系に変換する場合は自分で行う必要があります。

一本指のシングルタッチなどはマウスと同じ扱いなので、マウス系のメッセージを
処理する必要があります。よってフリック操作はマウス扱いです。

パンや回転、ズーム(2点間の距離)などの操作は結構誤動作というかノイズが入るようです。
極端に異なる値が来たときは無視するような処理が必要になるかもしれません。
また GID_ROTATE の最初のメッセージには回転値として不正な値が入っているようです。
GID_ROTATE かつ GF_BEGIN が立っている場合、ullArguments の下位 16bit を 0 と
見なした方がよいです。
回転しようとすると必ず反転してしまうおかしな症状に最初悩みました。

用途によるとは思いますが、やはり凝ったことを行いたい場合は WM_GESTURE ではなく
WM_TOUCH 系 (WM_TOUCHUP/WM_TOUCHDOWN/WM_TOUCHMOVE) を
使った方が良さそうです。
WM_GESTURE の場合操作判定が先に行われてしまうので、操作の位置を制限することが
難しくなります。
例えば特定のオブジェクトの上だけで回転やズームを行い、それ以外の座標では
常にパン操作と判定したい場合などあまりきれいに操作を区別することができません。

最初は簡単に見えたものの、実際にやってみるとまだまだ。
プログラムの方もいろいろと工夫が必要になりそうです。

関連エントリ
Windows7 Multitouch API

Windows7 Multitouch API

タッチ関連の API は 2種類あります。
WM_TOUCH 系と WM_GESTURE 系

WM_TOUCH 系の方が低レベルで、直接複数のタッチ座標を取り出すことが出来ます。
WM_GESTURE の方はいくつかの決まった操作を容易に受け取ることができます。

WM_TOUCH 系のメッセージを有効にするには RegisterTouchWindow() を呼び出します。
これを実行しておかないと WM_TOUCH~ が送られて来ません。

データを受け取るのは簡単です。

WM_TOUCHDOWN
WM_TOUCHUP
WM_TOUCHMOVE

などマウスとよく似ているメッセージが来るので、さらに
GetTouchInputInfo() を使って詳細な情報を読み取ります。

起動時の判定

// ハードがマルチタッチをサポートしているかどうか
int  value= ~GetSystemMetrics( SM_DIGITIZER );
if( !(value & 0xc0) ){
    RegisterTouchWindow( hwnd, 0 );
}

メッセージ

    case WM_TOUCHDOWN:
    case WM_TOUCHUP:
    case WM_TOUCHMOVE:
	WM_Touch( mes, wparam, lparam );
	return	FALSE;

読み出しの例

void WM_Touch( UINT mes, WPARAM wparam, LPARAM lparam )
{
    int	inputs= LOWORD( wparam );
    TOUCHINPUT	tbuf[TOUCHMAX];
    HANDLE	hinput= reinterpret_cast( lparam );
    if( GetTouchInputInfo( hinput, inputs, tbuf, sizeof(TOUCHINPUT) ) ){
	TOUCHINPUT*	tp= tbuf;
	for( int i= 0 ; i< inputs ; i++, tp++ ){
	    ...
	}
    }
    CloseTouchInputHandle( hinput );
}

座標値そのままなので、これを元にズームや回転などの操作を検出するには
さらに一手間いります。

WM_GESTURE 系はそのあたりを簡単にしてくれます。
下記の操作が定義されています。

GID_ZOOM
GID_PAN
GID_ROTATE
GID_TWOFINGERTAP
GID_ROLLOVER

これらのメッセージは RegisterTouchWindow() を実行すると来なくなるので
WM_GESTURE 系を使う場合は RegisterTouchWindow() を実行してはいけません。

WM_GESTURE が送られてきたらさらに追加情報を受け取ります。

    case WM_GESTURE:
	WM_Gesture( mes, wparam, lparam );
	return	FALSE;
void WM_Gesture( UINT mes, WPARAM wparam, LPARAM lparam )
{
    GESTUREINFO	ginfo;
    memset( &ginfo, 0, sizeof(GESTUREINFO) );
    ginfo.cbSize= sizeof(GESTUREINFO);
    HGESTUREINFO	hgesture= reinterpret_cast( lparam );

    if( GetGestureInfo( hgesture, &ginfo ) ){
        ...
    }
    CloseGestureInfoHandle( hgesture );
}

WM_GESTURE 系の仕様は若干変更があったようで、資料によっては記載内容が
異なっていることがあります。例えば今でも

MSDN WM_GESTURE Message

このページにある dwCommand は存在しておらず GESTUREINFO 構造体の
dwID のことだと思われます。
同じように dwArgument も 64bit の ullArguments に変更されているようです。

・dwCommand → GESTUREINFO dwID
・dwArgument → GESTUREINFO ullArguments
・lParam → GESTUREINFO ptsLocation

その他いくつか気が付いた点。

初期状態では GID_ROTATE などのメッセージが来ませんでした。
SetGestureConfig() を使って送って欲しいメッセージの登録が出来るようです。

const int	ConfigCount= 5;
GESTURECONFIG	config[ConfigCount];
memset( config, 0, sizeof(GESTURECONFIG) * ConfigCount );

config[0].dwID= GID_ZOOM;
config[0].dwWant= GC_ZOOM;

config[1].dwID= GID_PAN;
config[1].dwWant= GC_PAN_WITH_SINGLE_FINGER_VERTICALLY
	|GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY
	|GC_PAN_WITH_GUTTER
	|GC_PAN_WITH_INERTIA;

config[2].dwID= GID_ROTATE;
config[2].dwWant= GC_ROTATE;

config[3].dwID= GID_TWOFINGERTAP;
config[3].dwWant= GC_TWOFINGERTAP;

config[4].dwID= GID_ROLLOVER;
config[4].dwWant= GC_ROLLOVER;

SetGestureConfig( hwnd, 0, 5, config, sizeof(GESTURECONFIG) );

これで全部のメッセージとオプションが有効になるはずです。

座標は ptsLocation に、追加パラメータは ullArguments に入ります。
GID_PAN + GF_INERTIA フラグが ON の場合は、ullArguments の上位 32bit に
慣性のパラメータが格納されているようです。
GID_INERTIA というのは存在していません。

なお、これらの動作を確認するには

・Windows7 Beta
・Windows SDK for Windows 7 BETA
・MultiTouch 対応 PC

が必要です。Vista では起動時に DLL の互換性が無くエラーになります。
HP の TouchSmart PC IQ800 を使いました。

Windows7 SDK の設定には少々注意が必要です。
新しい DirectX SDK もリリースされているので、DirectX SDK March 2009 を
併用する場合は特に。基本的にあとからリリースされた方を上にします。

・DirectX SDK March 2009
・Windows SDK for Windows 7 BETA
・VisualStudio 2008

VisualStudio の Tools → Options → Projects and Solutions → VC++ DIrectories の設定

Include files

$(DXSDK_DIR)include
$(WindowsSdkDir)\include
$(VCInstallDir)include
~

Library files (x64)

$(DXSDK_DIR)lib\x64
$(WindowsSdkDir)lib\x64
$(VCInstallDir)lib\amd64
~

Library files (x86)

$(DXSDK_DIR)lib\x86
$(WindowsSdkDir)lib
$(VCInstallDir)lib
~

またあらかじめスタートメニュー Microsoft Windows SDK v7.0 から
Windows SDK Configuration Tool を起動して v7.0 を選択しておきます。

関連エントリ
DirectX SDK March 2009
Windows7 とマルチタッチ / HP TouchSmart PC IQ800
Direct2D と Direct3D10.1 の下位互換

SSD OCZ Vertex

先週末、運良く店頭で入手できたので OS を入れ替えて一週間ほど使いました。

・OCZSSD2-1VTX60G

60GB の 2.5inch SSD です。22800円
RAM 8GB + Win7 beta x64 なので、ページングファイル無しにして休止状態ファイル
クリーナーで消して OS のみ 10GB くらい。

特に速度を実感できるのはソフトウエアのインストールで、残り時間が正確に
表示されないくらい。Windows の起動や終了も速いし、重いアプリケーションの
立ち上げも違いが分かるほどに短縮しています。

プログラミング作業はどうかというと、元々そんなに編集もコンパイル時間も
困ってなかったのであんまり速い感じはしていません。
その代わり作業中、非常に静かなのが心地よいです。

ファンの一定の音はありますが不定期に鳴り出す音が消えました。
ファイルに書き込んでるな、とか裏で何か動き出したな、とか無いので結構違います。
HDD が寝ていて、いざアクセスしようとしたらスピンアップ待ちで起動まで待たされる
こともないわけです。動作中の配置換えなんかも気にせず出来そう。

プロセッサは年々速くなっていくのでストレージとの速度差は離れる一方でしたが
ここに来て急に差が縮まり出したようです。
OS やアプリケーションも HDD のシークが遅いという前提で作られていますが、
そのうち全く気にしなくても良くなるかもしれません。
ファイルアクセスを速くするためのいくつかの工夫も、きっと古い技術となって
忘れていくのでしょう。

机の奥から古いレシートが出てきました。
1999年7月9日に 13GB の HDD を 21480円で買ってました。