質問者
Windows8.1 64Bit のシステム要件にある PrefetchW に付いて

質問
-
Windows 8.1 64Bit/Windows 2012R2 のシステム要件では、CPUが下記の拡張命令に対応している事を必須にしていると思います。
CMPXCHG16b、PrefetchW、LAHF/SAHF
この3要件のうち PrefetchW は AMDの3DNow!系命令セットの様で、IntelのCPUですと2013年のAtom(Silvermont)/Avotonや2014年の Haswellが “最初に実装されたCPU” の様で、それ以前にIntelから発売されたCPUはCPUIDで対応フラグを立てている場合であっても NOP(つまり何も行わない)命令に置き換えているだけで実際には機能していない様です。
AMD製であればSocket F以降のOpteronは3要件を全て実装している様です。
Intel製のCPUは2015年1月現在、一部の最新CPU以外は全てNOP又は未実装の様です。
PrefetchW を NOP実装している(機能しない)XEONでもWindows 8.1/Windows 2012R2は正常に動作しますか?また、3Dnow!系のIntel CPUとは互換性が低く実際には何もしていない PrefetchW をシステム要件にした理由は何でしょうか?
すべての返信
-
チャブーンです。
この質問の本意ですが、「仕様確認」なのでしょうか?であればですが、ご要望の答えは有償サービスでないと得られない内容ですので、ここで答えを得るのはムリだと思います。ちなみに、実装の採用理由については一般的に非公開の内容(仮にMSサポートに聞いてもわからない)だという認識です。
一般ユーザーが対応可能な方法があるとすれば、したのページで「動作保証されたコンピュータ(サーバ)」一覧をチェックし、そのサーバに搭載されたCPU仕様を確認することで「動作に問題がないことを推測する」レベルだと思います。
-
チャプーンさんがおっしゃられているのは下記の内容かと思います。システム要件についての確認だと思われますが、この内容に正確に答えるには MS のサポートへ投げるのが適切だと私も思います。また、PrefetchW をシステム要件の理由とした背景も、MS に問い合わせするのが正しいかと思います。(我々で答えられものではないかと)
PrefetchW を NOP実装している(機能しない)XEONでもWindows 8.1/Windows 2012R2は正常に動作しますか?また、3Dnow!系のIntel CPUとは互換性が低く実際には何もしていない PrefetchW をシステム要件にした理由は何でしょうか?
補足です。ご存知かもしれませんが、こちらの条件は Windows 8.1 であれば 64bit バージョンのみの要件となります。
- 編集済み Hotaka 2015年1月22日 10:08
-
何も確認してませんが、この PREFETCHW 対策をやめたんじゃないでしょうか。
... Intel hardware was released that supported x64. Of course, that hardware did not support the PREFETCHW instruction. Given this and the fact that the instruction does not modify data, registers, or flags, the Windows team added support to handle the illegal instruction -- i.e. the offending 0f 0d modrm PREFETCHW encoding is modified, likely becoming 0f 1f modrm which is a multi-byte NOP...
-
なるほど、対策を辞めたからCPU側でちゃんと実装してくれって事で、2013年頃からIntelもPrefetchWを実装する様に変更し始めたって事でしょうかね・・・
LGA2011のCore iやXEONは今年(2015年)以降に発売されるBroadwell-E/Broadwell-EPからの対応ですから、現行のXEONでWindows 8.1を使うのはあきらめた方が良さそうですね。
たぶん、とりあえずは動作するのでしょうけど、仕事中に突然BSODはWin98の再来みたいなもので、もう経験したくありません。
- 編集済み DualSocket 2015年1月23日 3:52
-
えーと、Windows がやっていた対策というのが「PREFETCHW を NOP で上書きするだけ」なので、
Windows 8.1 がそれをやめた(ntoskrnl.exe を少し眺めた限りでは Windows 7 でやっていた上記対策をやめてるように見えます)として、CPU に求められるのは、
ちゃんとした実装ではなく、PREFETCHW で例外を起こさない実装だけ(NOPでよい<ちゃんとした実装だろうがNOPだろうがパフォーマンス以外に影響ないから)だと思うのですが。
- 編集済み HomeCloset 2015年1月23日 4:12
-
なるほど、そういう事ですか・・・
つまり、PrefetchWは、キャッシュライン或いはパイプラインにプリフェッチするだけ?の命令だからNOPでも機能上は問題なし・・・って事でしょうか?
- 編集済み DualSocket 2015年1月23日 4:35
-
3DNow! のことは何も知りませんが、最初の引用で Visual Studio Support Team が「どうせ何もしない命令だから、動いたらもうけもの、動かなくてエラーになったら Windows に NOP で上書きしてもらっている」(意訳)と言っているので、そうなのでしょう。
- 編集済み HomeCloset 2015年1月23日 4:37
-
貴重な情報を提供して頂いた事に非常に感謝しております。
しかし、3DNow!で導入されたPrefetchWに付いて熟知していないと、この件(つまりWin8.1 64Bitのシステム要件)を正確には把握出来ないと思いますが、Visual Studio Support Teamは「どうせ何もしない」ではなく「データ、レジスタ、フラグは変更していない」と書いていると思います。もちろん両者は同義というか「表面上は何もしていない」といったニュアンスを伝えようとして書いたのであろうと思いますが、データ、レジスタ、フラグを変更する以外に何かあるのでは?という点が気になっています。
PrefetchWがシステム要件として掲載されているのですから CPU に求められるのはPrefetchWを表面上であれエミュレートしなければならず、CPUID命令の戻り値で対応フラグが立った状態を常に返す(しかしフラグを変更している訳ではない、なぜなら定数だから)などの本来のPrefetchWと見かけ上は等価な状態を演出しなければいけないと思うのです。それがNOPだけで良いのであれば、Intelは何故にWin8.1の発表に合わせるかの様にNOPではなく、ちゃんとした実装を取り入れ始めたのか?それが少々気掛かりな点でもあります。
Coreinfo(MicrosoftがWindows Sysinternalsで公開しているツール)を使うとCPUがPrefetchWに対応しているか判断出来ますが、他のCPUIDから得られる情報とは一行空けて別枠っぽく表示しているのでもしかしたらCPUIDではない方法で対応/非対応をチェックしているのかもしれません。このツールはNOP実装のXEONでも対応しているように表示しています。
とは言え、私が知りたいのは内部動作ではなく、“PrefetchWがNOP実装のXEONでもWindows8.1 64Bit版のシステム要件に適合していますか?”という、ただ1点のみです。大丈夫かもしれない?で導入してみたらやっぱり正常には動作しなかったので元に戻すというのは非常に労力を使うので避けたいのです。
この1点に付いてMicrosoftの“ご購入のご相談”というフリーダイヤルのWindows8.1購入相談窓口へ電話したところ「32Bit版のWindows8.1でしたら大丈夫です」という回答を頂いています。
Adobe Premiere Pro CS5.5 のシステム要件は64BitのOSが必須ですから、やはり Windows7 64Bit を使い続けようと思います。
- 編集済み DualSocket 2015年1月23日 20:16
-
> Visual Studio Support Teamは「どうせ何もしない」ではなく「データ、レジスタ、フラグは変更していない」と書いていると思います。
だからわざわざ「(意訳)」と付けました。
> データ、レジスタ、フラグを変更する以外に何かあるのでは?
When the original port of our compiler to target x64 was done, only AMD hardware existed. And, at that time, the PREFETCHW instruction was deemed beneficial, so we emitted it.
とも VS の人たちが言ってるんだから、ちゃんと実装されていたらパフォーマンスは上がるのでしょう。
そもそも OS が illegal opcode の例外を拾って NOP でパッチしてという手間が省けるだけで、パフォーマンスが上がるでしょう。
> やはり Windows7 64Bit を使い続けようと思います。
どうぞ。
-
度々貴重な情報を有難うございます。
残念ながら私にはMicrosoft Connectへのアクセス許可が得られないため、提示して頂きましたリンク先を直接見る事が出来ないのですが、こうして内容をコピペして頂いた事で、私がアクセスする事の出来ない情報に触れる事が出来ました。
つまり、Visual Studio で x64 バイナリを生成するコンパイラを作成した当初はAMDのCPUしかなかったのでPrefetchW命令を生成する様な実装になっているという事ですね。
その為、結果的に Visual Studio でコンパイルしたバイナリはPrefetchWを含んでいると・・・
> データ、レジスタ、フラグを変更する以外に何かあるのでは?
具体例として前回のコメントでCPUIDを挙げてみましたが、それ以外にはNOP実装と比較し表面上なにも違いが無く、影響は純粋にパフォーマンスだけという事なのでしょうかね?
> そもそも OS が illegal opcode の例外を拾って NOP でパッチしてという手間が省けるだけで、パフォーマンスが上がるでしょう。
たぶん、Dempsey以降のXEONはNOP実装しているので illegal opcode exception が発生しませんから例外を拾うアクションも起きないと思いますので、パッチの手間を省いてもパフォーマンスは上がらないと思います。逆に exception が発生するCPUでは、パッチしない訳ですからパフォーマンスの改善ではなく、異常終了するのではないかと思います。といいますか、インストール出来ないのでしたね。
恐らく、セキュリティ強化の為に例外を拾って継続実行させる事を辞めたのではないかと想像しています。
しかし私が知りたいのは内部的な仕様というより、Microsoftの公式見解としてNOP実装でもシステム要件に適合しているといった趣旨のシステム要件に関するコメントなり公式文書なりが有ると、私も安心してWin8.1 64Bitを利用出来るのですけれども・・・
言い換えれば、システム要件に掲げられているPrefetchWは、NOP実装を含むのか含まないのか?を知りたいです。
Yes か No か、含むのか?含まないか?現状では、私が友人などからWin8.1 64Bitの導入アドバイスを求められた際には、XEONに関してはグレーだとしか回答出来ません。
- 編集済み DualSocket 2015年1月24日 9:28
-
最初からご自分で答えだしてると思うのですが。
> といいますか、インストール出来ないのでしたね。
http://www.microsoft.com/Language/en-US/Search.aspx?sString=prefetchw&langID=ja-jp
-
> 最初からご自分で答えだしてると思うのですが。
> > といいますか、インストール出来ないのでしたね。
いえ、これは PrefetchW を NOP実装さえしてない(例外が起きる)XEONの事、具体的には Irwindale と Paxville の事に付いて書きました。
私は PrefetchW を NOP実装している(機能しない)XEONに付いて質問しています。具体的には Dempsey から Haswell までのLGA(Land Grid Array)形状のXEONに付いてです。
- 編集済み DualSocket 2015年1月25日 19:23