ERI Developer's BBS
  新規投稿 ┃ ツリー表示 ┃ 一覧表示 ┃ トピック表示 ┃ 検索 ┃ 設定 ┃ ホーム  
28 / 57 ツリー ←次へ | 前へ→

CPUID L.Entis 02/7/9(火) 23:56
┗ Re:CPUID /|/ |/ 02/7/10(水) 2:09
 ┗ Re:CPUID /|/ |/ 02/7/10(水) 2:11
  ┗ Re:CPUID L.Entis 02/7/11(木) 22:24 [添付]
   ┗ Re:CPUID /|/ |/ 02/7/13(土) 1:05
    ┗ Re:CPUID L.Entis 02/7/13(土) 21:10

CPUID
 L.Entis  - 02/7/9(火) 23:56 -

引用なし
パスワード
   私が作っているライブラリ、ERINA-Librayr 等では、CPUID 命令で MMX や SSE の対応を判定していますが、判定の手順としてはじめにベンダーIDを見るという処理があります。
そこで、インテル純正CPUかどうかを判定してるわけですが、これは必ず行ったほうがよいものなのでしょうか?
…と言うのも、これを行ったときの問題点、及び疑問を列挙すると

(1) AMD などの互換CPUで MMX や SSE を使えない
(2) AMD 等の互換CPUでは FEATURE フラグも互換性があり、いきなり MMX や SSE の判定を行っても問題なさそうである
(3) そもそも、インテルに追従する互換 CPU では、こういった互換性を持たせることへ期待が持てる(もちろんこれは正しい処理ではないが)
(4) インテルも将来的に互換性を持たせることに期待が持てる
(5) そもそも互換性がなくなった時点で、それはサポート外なのでは?
(6) そうした場合には、別途そのような処理を行ったほうがよい気も…

ご意見お待ちしております。
<Mozilla/4.75 [ja] (Windows NT 5.0; U)@tokyo-fa2-116.kcom.ne.jp>

Re:CPUID
 /|/ |/  - 02/7/10(水) 2:09 -

引用なし
パスワード
   私は、Featureフラグだけで十分かと思います。
Entisさんも仰ってるように、互換CPUはそのあたりも含めて互換にして
作っていますので、今のところ。
もしそのあたりの互換性のないCPUが出たら、
その時点で変更すればよいような気もします。
<Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Q312461)@i037070.ap.plala.or.jp>

Re:CPUID
 /|/ |/  - 02/7/10(水) 2:11 -

引用なし
パスワード
   追加です。
Featureフラグが立っていても、OSがサポートしてないとか
BIOSの問題で動かないとかありうるので、
Win環境では
__try __exceptブロックで囲んで試しに何かの命令を発行してみて、
実際に使えるかどうかの確認は怠らない方が良いと思います。
<Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Q312461)@i037070.ap.plala.or.jp>

Re:CPUID
 L.Entis  - 02/7/11(木) 22:24 -

引用なし
パスワード

[添付] 〜添付ファイル〜
・名前 : cpuid.txt
・サイズ : 3.1KB
   ▼/|/ |/さん:
>Featureフラグが立っていても、OSがサポートしてないとか
>BIOSの問題で動かないとかありうるので、
>Win環境では
>__try __exceptブロックで囲んで試しに何かの命令を発行してみて、
>実際に使えるかどうかの確認は怠らない方が良いと思います。

とりあえず、Intel と AMD のベンダーIDを判定するようにして、それ以外の場合には、実際に命令が走るかどうかで判定するように、ERINA-Libraryの判定関数をコーディングし直してみました(添付ファイル)。
SSE は OS が対応していることが必須だと思いますが、同時に他に SSE を利用するアプリケーションが無い限り普通に動作すると思いますので、こんなんで行こうかと…。
<Mozilla/4.75 [ja] (Windows NT 5.0; U)@tokyo-fa2-224.kcom.ne.jp>

Re:CPUID
 /|/ |/  - 02/7/13(土) 1:05 -

引用なし
パスワード
   >SSE は OS が対応していることが必須だと思いますが、同時に他に SSE を利用するアプリケーションが無い限り普通に動作すると思いますので、こんなんで行こうかと…。

というわけにもいかないのでわ?
Win95とかのSSE未対応OSで実行してみればわかりますが、
SSE命令を実行した瞬間に、
Illegal Instruction例外で強制終了させられたと思います、たしか。
OS側で、命令をフィルタリングしているのかな?

なので、ベンダに関わらず、SSE命令に関しては、
実際に命令が走るかどうかでの判定もあわせて行う必要があると思います。

どちらにしろ、ERINAライブラリはマルチスレッド対応だと思いますので、
1つのアプリでもSSEレジスタの退避をちゃんとやってもらえないと、
まずいことになるのではないかと。

あとわ、IntelとかAMDのサンプルを見てると、
SSE命令はxorps xmm0, xmm0 などxmmレジスタの浮動小数点演算を
実際に実行してみる必要があるみたい?
SSE整数命令だけではダメなのかもしれないです。

それから、SSEに関しては、bit24も見る必要があると思います。
FXSAVE/FXRSTORをサポートしていないと、
SSEの状態が退避できないので、実質使えないことになります?

あと、movhlpsとmovlhpsは、KatmaiのB-step以降でしか使えないそうなので、
もし使用しているなら、そのチェックも必要かと思います。

AMDだと、AMDの拡張フラグにもMMXに関してのフラグがなんかあるみたいなので、
そちらのチェックも必要な場合があるのかも?
<Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Q312461)@m115193.ap.plala.or.jp>

Re:CPUID
 L.Entis  - 02/7/13(土) 21:10 -

引用なし
パスワード
   ▼/|/ |/さん:
>Illegal Instruction例外で強制終了させられたと思います、たしか。
>OS側で、命令をフィルタリングしているのかな?

それはナゾな現象ですね。
私のほうでも環境を探して試してみます。
もしそうだとすると、しかしある意味納得のいく動作ではあります。
私の想像ですが、コントロールレジスタ(CR#)に XMM の実行許可フラグなどが追加されていて、FPU のための EM フラグのようなものがあるのかもしれませんね(私の持っているIntelのPDFには普通のFPUと同様のようなので、これのみでは、OSが FPU レジスタを退避する処理をインプリメントしていれば(インプリメントの方法にもよりますが)、(レジスタの内容が正しくないものの)おそらくは実行されてしまいそうな気もしますが…)

>あとわ、IntelとかAMDのサンプルを見てると、
>SSE命令はxorps xmm0, xmm0 などxmmレジスタの浮動小数点演算を
>実際に実行してみる必要があるみたい?
>SSE整数命令だけではダメなのかもしれないです。

これはやっておいて損は無いと思うので、コードを挿入することにします。

>それから、SSEに関しては、bit24も見る必要があると思います。
>FXSAVE/FXRSTORをサポートしていないと、
>SSEの状態が退避できないので、実質使えないことになります?

FXSAVE、FXSTOR命令は、高速にレジスタを保存するための命令なので、SSE に対応しているOSであれば、この命令をサポートしていれば高速なレジスタ退避を、そうでなければ普通のレジスタ退避をやるのではないでしょうか??

>あと、movhlpsとmovlhpsは、KatmaiのB-step以降でしか使えないそうなので、
>もし使用しているなら、そのチェックも必要かと思います。

今のところ使用していないのですが、今後使用する予定なのですが、SSE の中でもコードの切り分けをするのが面倒なので、SSE を検出したときに、この命令を実行してみるのが良いかもしれませんね(^^;
<Mozilla/4.75 [ja] (Windows NT 5.0; U)@tokyo-fa2-43.kcom.ne.jp>

  新規投稿 ┃ ツリー表示 ┃ 一覧表示 ┃ トピック表示 ┃ 検索 ┃ 設定 ┃ ホーム  
28 / 57 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
7920 C-BOARD v3.02 is not Free?