• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ハイパースレディングのレジスタについて)

ハイパースレディングのレジスタについて

このQ&Aのポイント
  • ハイパースレッデイングのCPUで2つのスレッドA、Bを動かすとする。このときAの実行状態を示す汎用レジスタやプログラムカウンタとBの実行状態を示す汎用レジスタやプログラムカウンタの扱いはどうなのでしょうか。
  • ハイパースレッデイングのCPUでのAとBのスレッドの実行方法には2つの方法が考えられます。1つはレジスタのロード、実行、レジスタのセーブを繰り返す方法であり、もう1つはA用のレジスタとB用のレジスタを2組用意して相互に切り替えながら実行する方法です。
  • ハイパースレッデイングにおいて、1度に実行する機械語命令の個数はいくつなのかについては明確な回答がないようです。スレッドAの機械語命令を実行してから切り替えてBの機械語命令を実行する場合、1命令毎に切り替えるのか、それともAの複数の命令を実行してからBの複数の命令を実行するのかは実装に依存するようです。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

答えは(2)ですが、実際にはもうちょっと複雑であり、ある意味もっと簡単です。 最近のCPUでは、「レジスタリネーミング」といって、並列実行しやすいように、 アーキテクチャ的にプログラム側から見えるレジスタは少ないままですが、 CPU内部では、もっと数多くのレジスタを内蔵しています。 (内部的なレジスタと、プログラム側から見えるレジスタの、対応表を持っている) ハイパースレッディングでは、この「プログラム側から見えるレジスタ」の数が2倍になるだけです。 命令の実行頻度については、基本的に1命令ごとです。 ですが「実行しようとする」のが1命令ごとなのであり、実際に1命令ごとに実行するとはかぎりません。 (ていうか、必ず交互に実行するとしたら、ハイパースレッディングの意味はありません。 片側の仮想CPUがメモリ読み込み待ちなどで実行できなくなっている時でも、もう片方の仮想CPUは動き続けることで、トータルでの稼働率が上がることになります)

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 演算装置とフラグレジスタの関係

    条件分岐などで、ジャンプ命令するかどうかは、CPUがフラグ・レジスタの値を参照し判断するのにも関わらず、比較のための命令が実行されると、CPUの演算装置は、内部で減算をおこない、この結果をフラグレジスタに記録されるのは何故ですか?CPUで値を出せるのならわざわざフラグレジスタの値を参照する必要が無いと思うのですが・・・

  • 命令レジスタとデコーダ

    翻訳の勉強をしていて、プログラムについては門外漢です。 「命令レジスタには機械語命令が格納される」「命令レジスタに格納された命令をデコーダが解読する」とテキストに書かれているのを読みました。 機械語は既に0か1であると思うので、それをどう解読するのか、「解読」の意味が分かりません。 詳しい方、できれば簡潔に解説をお願いします。

  • 汎用レジスタの値をトレースする?

    プログラムを実行したときの汎用レジスタの値をトレースする

  • CPUの回路について教えてほしいです!

    ・5ビットCPU:CPUが5ビットずつ読み出し専用メモリからデータを取り込む。 ・レジスタ:2ビットを記憶できるレジスタを1つ持っている。 ・アドレス空間:CPUは2ビットの異なるアドレスを参照できる。 ・メモリ:読み出し専用メモリと書き込み専用メモリを持っている。読み出し専用は5ビット、4ワード。書き込み専用は2ビット、1ワード ・機械語:5ビット中、上位3ビットがOPコード、下位2ビットがオペランドとなる。 ・命令:CPUの命令は以下の5種類。 ・加算命令:レジスタの値とオペランドの値を加算し、その値をレジスタにセット。 ・減算命令:レジスタの値からオペランドの値を減算し、その値をレジスタにセット。 ・ロード命令:オペランドの値をレジスタにセット。 ・ストア命令:書き込み専用メモリにレジスタの数値を書き込む。下位2ビットは無視される。 ・ジャンプ命令:オペランドの値が示す読み出し専用メモリのアドレスに書かれた命令を次に実行する命令とする。 このような仕様にに基づくUPUの回路図を教えてください。 また減算命令、ジャンプ命令、メモリへの書き込みをするような回路について文章でよいので説明していただけるとありがたいです。

  • 非常に限定された条件での8バイト加算

    アセンブリプログラム上で16ビット同士を加算したいと考えています。 ただ、非常に条件が限定されていて、 【簡単な構成について】 ・レジスタは8ビットAレジスタ一つのみ ・8ビット演算器(ALU)は一つのみ ・条件コードはZフラグのみ(ただし、書き換わるのは命令7.、8.でのみ) 【使える命令】 1.Aレジスタに即値をロード 2.Aレジスタに指定アドレスのデータをロード 3.Aレジスタから指定アドレスにストア 4.無条件分岐 5.Aレジスタand即値=0ならば分岐 6.Aレジスタor即値=0ならば分岐 7.Aレジスタと即値のandをとって書き戻し 8.Aレジスタと即値のorをとって書き戻し 9.Aレジスタと即値を加算して書き戻し a.Aレジスタと指定アドレスのEORをとって書き戻し b.Aレジスタと指定アドレスのデータを加算して書き戻し c.間接アドレスのデータをAレジスタにロード d.Aレジスタの内容を間接アドレスにストア e.Aレジスタから即値を減算して書き戻し f.Aレジスタから指定アドレスデータを減算して書き戻し 普通に考えるならば、下位8ビット同士の加算、上位8ビット同士と下位8ビットのキャリーを加算すれば出来ます。 しかしながら、この限定された条件に於いてはなんらかの自由に使えるフラグ、もう少し汎用的に使える分岐命令が無ければ無理だと個人的には考えています。 出来るか、出来ないか、だけでも結構ですので、ご教授お願いします。

  • 汎用レジスタのワーキングビットテスト

    アセンブラ初心者です。 汎用レジスタR0からR15をワーキングビットテストするアセンブラソースを書いているのですが実行すると暴走します。 汎用レジスタR0からR15をワーキングビットテストする場合、レジスタデータを一旦どこかに保存してから行うものなのでしょうか? また、R0がインデックスレジスタ(意味が良く分かってません)、R15がスタックポインタが格納されていますがこれらのレジスタも値を一旦どこかに退避しておけばテストを行ってもよいものなのでしょうか?

  • アドレスレジスタは物理的に存在しますか?

    情報系の勉強している、初心者です。 アドレス修飾というところを今勉強中です。 命令が読み出しから実行終了までのステップを    段階      関係するレジスタ等 1. 命令の取り出し:命令アドレスレジスタ,命令レジスタ 2. 命令の解読:デコーダ,演算装置(演算命令の場合) 3. 有効アドレス計算:アドレスレジスタ,主記憶装置 4. データの取り出し5. 命令の実行:演算装置(演算命令の場合) 6. 演算結果格納:主記憶装置 ・・と説明しています。(一部省略している部分があります。)  そこで、この流れが意味することがいまいちつかめないし、覚えられないので パソコンの中をみて確かめようと思いました。 使っているノートパソコンのメモリーは取り出せました。が、一番知りたかったCPUはどこにあるのか分からなかったので、インターネットでアドレスレジスタや命令レジスタを視覚的にとらえられないかといろいろ調べましたが・・イメージ図は出てくるのですが写真は見つけられませんでした。 アドレスレジスタ・デコーダ等が実際に存在するのか、アドバイスお願いします。

  • レジスタが変化しない アセンブリ

    アセンブリ言語の勉強を始めた者なのですが レジスタの値が普通のMOV命令で変化しません。 何か初歩的なミスを犯しているのでしょうか、どなたかご教示願います。 環境はXPSP3,Core2DuoE8500に、コマンドプロンプトからDEBUGコマンドを使って学習しています。 0100:MOV ax,FF 0103:(空白) -G 100 103 として実行してみるのですがAXレジスタ内の値が0000のまま変化しないのです。 昨日やったときは普通に出来たような気がしたのですが、、 命令を MOV ax,0222 MOV bx,0222 としたときのスクリーンショットを撮ってみましたので付けておきました。 何かきっと初歩的なミスだと思うのですが、どなたかお願いいたします・・。

  • アドレス指定方式での、命令語が参照する番地

    16進数で”C13B0206”という32ビットの命令語があります。 <命令語の仕様> 0~7ビット:命令指示部 8~10ビット:レジスタ 11~15ビット:アドレス修飾部 16~31ビット:番地 <アドレス修飾と参照番地の関係> 00 0固定 直接アドレス (11,12の値が00、13~15の値が0固定のとき、直接アドレス。) 01 0固定 間接アドレス 10 インデックスレジスタ インデックスレジスタ+番地の値 11 インデックスレジスタ インデックスレジスタ+番地が示す内容の値 <主記憶、レジスタの状態> ●主記憶に格納されている値(16進数) 番地(16進数)が  202,203,204,205,206,208,209,20A...の順に、それぞれの格納値は、 203,204,205,206,208,209,20A,20B...。 ●インデックスレジスタに格納されている値(16進数) インデックスレジスタ番号(16進数)が1,2,3,4,5… の順に、それぞれの格納値は、 0,1,2,3,4…。 (1) アドレス修飾部のインデックスレジスタ番号。 命令語の”C13B0206”で、アドレス修飾部にあたるのが”3B”。00111011(2進数)。8~10ビットの001がレジスタになるから、3。 (2)命令の番地部の番地の値(16進数) 命令の番地部の番地の値。命令部では、”0206”。ちょうど16進数なので、206。 (3) 命令が最終的に参照する番地。 上の、<主記憶、レジスタの状態>より、11~15ビットが”1011”。 インデックス番号が11(2進数)なので、3(16進数)。インデックスレジスタ番号が3のとき、格納されているのは2。番地の値である206と3を合わせ、209。 最終的に参照される番地は209。 (1)(2)(3)、自分の解き方が正しいのかどうか自信がありません。どなたか補足、訂正などありましたら、よろしくお願いいたします。

  • 複数バイト命令実行のタイミング

    1バイト単位でメモリの各アドレスにデータが保存されているコンピューターにおいて、複数のバイトで表される命令がどのように実行されるのか教えて下さい。 メモリには一つのアドレスごとに8ビット(1バイト)のデータが入っており、CPUはプログラムカウンタで示されたメモリ上のアドレスにあるデータや命令を一つずつ順番に読み込んで、それをデコーダーが解釈し各回路への指令に変換することでプログラムを実行していくということは理解しています。 しかし現在の32ビットコンピューターなどにおいてアセンブリの命令、例えば「MOV A,B」(Bレジスタの内容をAレジスタにコピーする)といった命令は、「B90001」などの3バイトのマシン語で表されるとすると、メモリ上では アドレス  内容 0000  0xB9 0001  0x00 0002  0x01 のように3つの連続するアドレスにまたがってデータが存在し、CPUが「MOV A,B」を読み込み、それを順次デコーダーに送るまでには「MOV」、「A」、「B」の3クロックを要すると思います。 その際、デコーダーが命令を解釈し各回路に指令の信号を送るタイミングというのは、最後の「B」のデータを読み込んだ時点になるのでしょうか?もしそうならば、3クロック目に最後の「B」のデータがデコーダーに到着するまでの間、「MOV」と「A」のデータというのはCPUにメモリから読み込まれた後はどのように扱われるのでしょうか? 少し質問が分かりにくく恐縮ですが、情報工学を独学で勉強しており、プログラムが実際の回路でどのように実行されるのか理解したいと思っています。 どうぞご回答よろしくお願い致します。

このQ&Aのポイント
  • Wi-Fiセキュリティの無期限版を購入したのに、カード会社の請求書に別の名前が記載されているという状況にお困りですか?対応方法をご案内します。
  • 最近になって気付いたのですが、Wi-Fiセキュリティの無期限版を購入したのに、AFG*HOTSPOT SHIELD-JPYという名前で請求されています。この問題について解決策をご説明します。
  • Wi-Fiセキュリティの無期限版を購入したはずなのに、カード会社の請求書に別の名前が記載されていると困っている方はいますか?対処方法をご紹介します。
回答を見る