5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

[x86]CPUアーキテクチャについて語れ![RISC]

1 :Socket774:04/04/19 15:59 ID:xbBch3+r
お前らいい加減、無能なAMD房・Intel房に振りまわされず、
エンコ時間がどうとかPIがどうとかじゃなく、
CPUコアのアーキテクチャについて語りましょう。

x86/RISC/CISC/スーパースカラ/VLIW/MIMD/SIMD
等について語ってもよし、

フリップフラップ回路が小さいPentium Mマンセー、
CISCなのに内部はRISCなPentium 4マンセー、
x86なのに32/64bitコンパチなOpteronマンセー、
昔々8086の時代は(以下略・・・等もよし。

さあ、不毛な争いを止めてCPUアーキテクチャについて語ろう!

952 :Socket774:04/11/19 22:36:07 ID:uAkH3Uug
>>950
 >>948では無いけど、制限があることで逆に使用パターンとか
クセとかが固定されて使いやすい&読みやすいと感じることはある。
PPCのアセンブラは知らないけど68kではレジスタをどう使おうかと
結構悩んだ。

953 :Socket774:04/11/19 23:38:39 ID:Ptm3WVGK
>>952
管理教育の弊害がこんなところに。

954 :Socket774:04/11/19 23:42:49 ID:tcssRwU5
>>952
68kはアドレスレジスタとデータレジスタがあるから使いづらい。
そしてアドレスレジスタは余り、データレジスタは足りなくなる。

955 :Socket774:04/11/20 00:26:31 ID:Hu8K097i
x86は不思議な良さがある気がするんだが。慣れてるだけかね
プロテクトモードのアフォみたいな複雑さにはひたすら閉口するのみだが。

956 :Socket774:04/11/20 00:50:16 ID:vuXZ6tIE
日本人って限定された環境で力を発揮するのが得意じゃん。
ヘタに自由度が高いとどうしていいのか分からなくなる人が
多いんじゃないかとオモタ。

957 :Socket774:04/11/20 00:58:31 ID:T38GWFtB
俳句みたいなもん?

958 :952:04/11/20 01:19:27 ID:b2SsY6rH
>>954
あ、やっぱり?そして効率的な使用法でまた悩むことに。

>>956
俺まさにそのタイプだな。

959 :Socket774:04/11/20 02:03:37 ID:7Uz6mvgw
128個〜512個のレジスタを効率的にスケジューリングして
必要最小限のロードストアになるコードはどれほど大変なことやら。
r317とr28の和をr34に入れてr17と差分を取り....

960 :MACオタ>958 さん:04/11/20 09:11:09 ID:hOmEPib6
>>959
  ----------------------
  128個〜512個のレジスタを効率的にスケジューリングして
  ----------------------
私の知る限り、主要なRISC ISAのレジスタ数わ、こんなもんす。脳内プログラマの方すか?
 ・PowerPC, Alpha, MIPS, PA-RISC: 32(int)/32(fp)
 ・SPARC: 136(int, ただし、一つのプロセスから見えるのわ32)/32(fp)

961 :Socket774:04/11/20 11:54:57 ID:urZvIgER
959は多分物理レジスタのスケジューリングまで考えているのだろう。

あとSPARCは1プロセス32じゃ無いよ。
それとレジスタウインドウの事を考えて132と言っているのだろうけど、
実装によって異なる。

962 :Socket774:04/11/20 12:06:15 ID:pLn1v+1N
512個もレジスタを扱えるようにしたら、命令コードのうち9bitx3=27bitも
オペランドに食われちゃうわけで。32bit命令長だと相当きついと思うがな。
というか無謀。

しかし64bit命令長というのもそれはそれで、コードデンシティが相当低く
なりそうだ。
#まぁあるけどな。64bit命令長のプロセッサ。

963 :Socket774:04/11/20 12:56:40 ID:/hwWxTx8
32bit命令長ってなに?

964 :Socket774:04/11/20 13:09:34 ID:AR/o9K8R
>>963
恐らく1命令が32bit単位のコード体系の事だろうかと邪推してみる。

965 :Socket774:04/11/20 22:16:01 ID:KlQLVi+D
素人考えだけど、そんなレジスタ増やすと、コンテクスト切り替えのときに
保存・復元しなくちゃならない情報が多くなって遅くならない?

966 :Socket774:04/11/20 22:46:27 ID:Sh0QTF+h
MACオタも脳内プログラマにしか見えん。
自ら使った生の感想プリーズ。

967 :Socket774:04/11/20 22:55:57 ID:s63qmXGr
>>965
レジスタが多いISAだとコンテクスト切り替えのときに
バストラフィックが増大してスケーラビリティが低下します

968 :Socket774:04/11/21 00:36:04 ID:b3bD2HfK
レジスタリネームは?

969 :Socket774:04/11/21 00:39:07 ID:z+YuR4Tk
クロックがGHzの時代でも秒60回程度のタスク切り替えのコストが響きますか?

970 :Socket774:04/11/21 01:33:12 ID:uCh8ERjI
おまいら、レジスタ数が増えて問題になるのはコンテキストスイッチだけじゃなく、
むしろ通常のコードだぞ。インライン展開されない限り全ての関数呼出しで
レジスタの待避、復帰が行われることになる。

現実的にはgcc程度にまともなコンパイラを使うことを前提とすると、プログ
ラムから見える論理レジスタ数は16個から32個の間程度で十分。それ以
上はどうせ使われない。

971 :Socket774:04/11/21 02:36:37 ID:1Suksgpd
そこでレジスタウィンドウですよ

972 :Socket774:04/11/21 03:58:11 ID:uCh8ERjI
>>971
SPARCみたいなレジスタウィンドウは結局企画倒れじゃね?
物理レジスタ数を越える境界では復帰、待避が必要になるし。
それが、プログラムから見えなくても有り難みはなさげ。
マイクロアーキテクチャレベルのレジスタリネーミングなんかとも
相性悪そうだし。

973 :MACオタ>670 さん:04/11/21 04:53:37 ID:UivSGDNJ
>>970
  ---------------------------
  インライン展開されない限り全ての関数呼出しで
  レジスタの待避、復帰が行われることになる。
  ---------------------------
自分でコンパイラの出力を眺めてみれば判ると思うすけど、今時のOSで実際に関数呼び出し時に退避する
レジスタわ全体の極一部す。残りわ必要に応じて呼ばれた側で退避、復帰を行うす。

974 :Socket774:04/11/21 05:38:06 ID:uCh8ERjI
>>973
もう少し考えてみ。呼ぶ側で待避、復帰するのと呼ばれた側で
待避、復帰するってのは本質的にトレードオフなので大差ない。
どちらにせよ、calleeで使われない、もしくは、callerで使われて
いないということを知らない限り、自分で必要な分だけにせよ、
盲目的に待避、復帰することになる。これを避けるためには、
極力使うレジスタの数を減らす方向で最適化することになる。
この場合、ISAで馬鹿みたいに論理レジスタの数を増やすこと
は、何の助けにもならないばかりか、>>962が書いているよう
に命令のデコーディングにも悪影響を与えることになる。

975 :Socket774:04/11/21 05:38:18 ID:6OkCsAGH
>>969
それは昔のBSDの話かな?

Windowsなんて、ものすごい数のスレッドが蠢いているから、かなりの回数だよ。
パフォーマンスモニタでSystemのContext Switches/secを見てくださいな。

976 :975:04/11/21 05:40:28 ID:6OkCsAGH
ちなみに、自分のマシンを見たら、だいたい毎秒5000〜10000回ですね。

977 :Socket774:04/11/21 06:08:35 ID:uCh8ERjI
>>974
間違えた。デコーディングじゃなくてエンコーディングな。

978 :MACオタ>674 さん:04/11/21 06:18:25 ID:UivSGDNJ
>>974
OSごとに規定があるすけど、callerが退避するレジスタわ決まっているすよ。
その範囲でcalleeわ退避無しで自由にレジスタを使えるすけど、その範囲を越えてレジスタを使用する場合わ
自前で退避を行うす。
もちろんcalleeわ自分が使用するレジスタの範囲わ理解しているす。

更に最適化の具合によってわ、コンパイラで退避するレジスタを削ってる模様す。
一例としてPPC Linuxの話す。 http://www.denx.de/twiki/bin/view/DULG/LinuxKernelRegisterUsage
32個の整数レジスタのうち、GPR13-31がcalleeが退避の有無を選択できるレジスタに相当するす。

979 :Socket774:04/11/21 07:55:09 ID:uCh8ERjI
>>978
一般に関数呼び出しってのは連鎖するんだぞ。つまりcallerであり、
同時にcalleeでもある。caller saveと規定されたレジスタはその関数
内で閉じている限り待避なしで使えるが、更に別の関数を呼び出す
場合には、必要であるかぎり必ず盲目的に待避する必要がある。
同じ構造はcallee saveのレジスタにも存在する。

コンパイラの最適化の方針の一つとして、レジスタの待避、復帰を
避けるようにレジスタ割りつけを行うことは当然可能だが、それ自体
は本質的に使用レジスタ数を削減するという方針であり、命令スケ
ジューリングなどとしばしば矛盾する。もっとも、Out of Order実行を
するスーパスカラな最近のマイクロアーキテクチャを相手にする場合
は、レジスタプレッシャを下げることをメインに命令スケジューリング
したほうが高性能が期待できるという話もある。

いずれにせよISA的なレジスタ数が増えても旨味はないという話題な
のだが?

980 :MACオタ>879 さん:04/11/21 08:03:16 ID:UivSGDNJ
>>979
Caller - Calleeの連鎖の中で、各段階ごとに
 ・上書きが行われるレジスタ (OS規定の暗黙のセットを含む) -> 退避
 ・上書きされないレジスタ -> 放置
ってだけなんすけどね。まあ、騙されたと思ってあなたのコードでコンパイラの出力結果を眺めてみると
良いと思うす。まさかx86の環境しかなくて語ってるんじゃないすよね?

981 :素人965:04/11/21 12:27:33 ID:2HUks886
>>975
それに、ハードウェア割り込みの応答速度を考えると、必要以上に大量のデータを
退避・復帰されるのって意味無いですよね。
昔Fast interruptと通常のinterruptで保存レジスタが違うMPUがありましたけど、今はそういう
仕組み持ってるプロセッサってないのかな?

>>980
それは理解してるんだけど、多くのプログラムの関数呼び出しの頻度を考えると、
退避されないレジスタが大量にあっても、使い道がある場面って限られそうに思います。

退避されるレジスタ(ある関数内の状態情報)と、退避されないレジスタ(スクラッチパッド)と、
どれくらいあるのが適当なのか、なんか論文とかあったら示してもらえませんか?

982 :Socket774:04/11/21 12:49:22 ID:z+YuR4Tk
必ず退避するってのはローカルスコープを支えるフレームポインタ一個で
それ以外は使用する分だけ退避するでしょ。
関数の返り値の分は宣言見れば分かるから呼び出し側、
それ以外は全部呼ばれた側。

983 :Socket774:04/11/21 13:24:39 ID:ROtKKL/v
次スレまだ〜〜〜?

984 :Socket774:04/11/21 14:50:15 ID:4/4rCCqw
とりあえず…
関数コールでのレジスタの退避ポリシーをOSごとの規定ってのはちょっと抵抗があるな。
それ以外はまあまともな事を書いているか。

985 :Socket774:04/11/21 14:57:01 ID:yn5tgO7z
>>976
その数値はSleep中のも入っていて実際のスイッチは秒1000回くらいでは?
昔Windows2000でチェックしたときは秒800回くらい処理が途中で切られてた

986 :MACオタ>984 さん:04/11/21 15:06:55 ID:UivSGDNJ
>>984
そういう時には正しい表現を書かないと只の煽りさんにしか見えないかと思うす。
確かにPEFやらELFやらMach-Oやらのアプリのランタイム・アーキテクチャごとの規定というのが正しいすね。

987 :MACオタ:04/11/21 15:16:53 ID:UivSGDNJ
ちょっと元の話に戻すと、レジスタのサイズが大きいSIMD命令セットにおいてわ、流石に割り込み時のレジスタ
の退避にわ多少の対策が考えられているす。

Apple/IBM/MotorolaのAltiVec搭載プロセッサにわ、VRSAVEレジスタってのがあって使用中のレジスタを登録
しておくようになっているす。割り込み時にわ、このレジスタの中身を見て退避と復帰を行うす。
IntelのMMXわレジスタ退避のコストを避けてFPレジスタを使用するようになっているす。

988 :Socket774:04/11/21 16:03:07 ID:vK8Jl+jP
>>981
ARMが高速割り込みもってますな。
保存じゃなくてレジスタバンクの切替えだったような気がしますが。


989 :976:04/11/21 16:09:49 ID:h0APC+0k
>>985
Sleep中のも入っている、というのはどういうことですか?

このマシンはCPU中心ではなくI/O中心の処理をしているし、
WindowsはOS自体がマルチスレッドで書かれているので、
APIを呼んで戻ってくるまでにコンテキストスイッチがバンバン発生しますよ。

990 :Socket774:04/11/21 17:00:36 ID:nkhAKqXY
Ahlon64にはコンテクスト・スイッチングを高速化するための独自の拡張があったような……。

991 :Socket774:04/11/21 17:56:15 ID:U7SPZ3SV
そもそも>>960にあるようなRISCプロセッサの汎用レジスタ数32個って
どんな事情から出てきたものなんだろ。なんか理論的(統計的なものでも
いいけど)な根拠があるのかな?

>>986
そういう話はABIと一言でいえばいい話と違いますか?
ELFやMach-Oなどのバイナリフォーマットの話は関係ないでしょ。
http://www.caldera.com/developers/devspecs/abi386-4.pdf
http://www.caldera.com/developers/devspecs/mipsabi.pdf

992 :MACオタ>991 さん:04/11/21 18:32:51 ID:UivSGDNJ
>>991
  --------------------------
  そういう話はABIと一言でいえばいい話と違いますか?
  --------------------------
サブルーチンの呼び出し方をABIとわ言わないす(笑)

993 :Socket774:04/11/21 18:36:39 ID:U7SPZ3SV
>>992
>サブルーチンの呼び出し方をABIとわ言わないす(笑)

へぇーそうなんだ。なるほど。
じゃあELFやMach-Oは何が言いたくて出てきた話なのかな?
これらのドキュメントのどこに「サブルーチンの呼び出し方」が
載ってるのかな?

994 :MACオタ>993 さん:04/11/21 18:44:00 ID:UivSGDNJ
>>993
資料を探したければ"runtime architecture"で探すと良い筈す。>>986に挙げたのわ、一般的なPowerPCの
runtime architectureす。

995 :Socket774:04/11/21 20:03:55 ID:1Suksgpd
レジスタが少ないとき:
レジスタに収まりきらない変数はスタックに退避
レジスタが多いとき:
コンテキストスイッチの時にはレジスタの中身をスタックに退避

多くて特に損することは無い気がするんですが・・・

次スレ案
【SIMD】CPUアーキテクチャについて語れ!第2世代【VLIW】

996 :MACオタ>995 さん:04/11/21 20:22:22 ID:UivSGDNJ
>>995
  ---------------------------
  コンテキストスイッチの時にはレジスタの中身をスタックに退避
  ---------------------------
このコストがレジスタが多くてレジスタの幅が広い場合にはバカにならないすよ。

997 :Socket774:04/11/21 20:30:31 ID:1Suksgpd
>>996
馬鹿にはならないけどレジスタ少ないよりは多いほうがいいということ。

簡単のため16個の変数を使うプログラムがあるとして、
レジスタが8本しかなければ、
 普段から8個はスタックに退避
 スイッチの際にレジスタ中の8個も退避
レジスタが16本あると
 普段はレジスタ中で全部処理できる
 スイッチの際は16個ともスタックに退避

使い切れないぐらいレジスタがあって、しかも使ってないレジスタも
機械的に退避させるような状況では確かに不幸なことが起こりますね。

998 :Socket774:04/11/21 20:45:56 ID:8zNQDovo
>>991
レジスタ数の根拠はヘネパタ当たりにも書いてあるんじゃないかなあ。
ヘネパタ本は、定量評価と言う所がミソだしね。

>>992
サブルーチンの呼び方はABIとは言いませんが、ABIにサブルーチンの
呼び方は含まれていますがねえ。
(わざと話を逸している?)

>>995
レジスタを使い切っていない時もOSはそれを判断できませんので、
全てのレジスタを退避します。使っていないレジスタの退避分が
無駄になります。
SPARCのレジスタウィンドウも似た意味で無駄があります。


999 :Socket774:04/11/21 20:55:45 ID:rIT4W/vH
.

1000 :Socket774:04/11/21 20:57:18 ID:vO47Ay3x
1000


1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

322 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)