(57)【要約】  複数のスレッドを同時に処理する演算装置であって、ハードウェアエラーが発生した場合であっても、全体としての処理能力の低下を最小限に抑えて処理を継続することができる演算装置を提供するために、演算装置１００に、複数のスレッドの命令列を実行するモードと単一のスレッドの命令列を実行するモードとを選択的に実行可能な命令実行回路１０１と、命令実行回路１０１に対してスレッドモードの切り替えを指示する切り替え指示回路１０２と、を備える。
2008155797.tif 000002
【特許請求の範囲】
【請求項１】
複数のスレッドの命令列を並列的に実行するマルチスレッドモードと、単一のスレッドの命令列を実行するシングルスレッドモードと、を選択的に実行可能にし、マルチスレッドモードとシングルスレッドモードとを選択的に実施する場合にハードウェア資源の再割り当てを行なう回路であって、前記スレッドの命令列を実行中に発生するハードウェアエラーを検出すると該ハードウェアエラーが発生したエラースレッドをオフライン状態に遷移する命令実行回路と、
前記スレッド毎に、該スレッドのアクティブ状態を記憶するアクティブ状態記憶手段を有し、前記オフライン状態となったスレッドはアクティブ状態にないものとして前記アクティブ状態記憶手段に記憶し、アクティブ状態にあるスレッドの数の変化に応じて、前記マルチスレッドモードと前記シングルスレッドモードとを切り替える指示を命令実行回路に対して行なう切り替え指示回路と、
を備える演算装置。
【請求項２】
前記切り替え指示回路は、
前記スレッド毎に、該スレッドのオフライン状態を制御する回路であって、前記命令実行回路からハードウェアエラーを検出した旨のエラー通知を受けると、該エラースレッドをオフライン状態に遷移するように前記命令実行回路に指示するオフライン制御回路と、
該オフライン制御回路から前記エラースレッドがオフライン状態に遷移した旨のオフライン通知を受けると、該オフライン状態となったスレッドをアクティブ状態にないものとして前記アクティブ状態記憶手段に記憶し、アクティブ状態にあるスレッドの数が２以上から１以下に変化すると、命令実行回路に対して、前記マルチスレッドモードから前記シングルスレッドモードに切り替える指示を行なうスレッドモード制御回路と、
を備える請求項１に記載の演算装置。
【請求項３】
前記スレッド毎に、該スレッドのサスペンド状態を制御する回路であって、前記命令実行回路からサスペンド命令を実行した旨のサスペンド通知を受けると、該スレッドをサスペンド状態に遷移するように前記命令実行回路に指示するサスペンド制御回路、
をさらに備え、
前記スレッドモード制御回路は、前記サスペンド制御回路から前記スレッドがサスペンド状態に遷移した旨のサスペンド通知を受けると、該サスペンド状態となったスレッドをアクティブ状態にないものとして前記アクティブ状態記憶手段に記憶する、
ことを特徴とする請求項２に記載の演算装置。
【請求項４】
前記スレッド毎に、該スレッドのサスペンド状態を制御する回路であって、特定の割り込み通知を受けると、該割り込み通知に応じたスレッドのサスペンド状態を解除するように前記命令実行回路に指示するサスペンド制御回路、
をさらに備え、
前記スレッドモード制御回路は、前記サスペンド制御回路から前記スレッドのサスペンド状態が解除された旨の通知を受けると、該スレッドがアクティブ状態にあるものとして前記アクティブ状態記憶手段に記憶し、アクティブ状態にあるスレッドの数が１以下から２以上に変化すると、命令実行回路に対して、前記シングルスレッドモードから前記マルチスレッドモードに切り替える指示を行なう、
ことを特徴とする請求項２に記載の演算装置。
【請求項５】
前記スレッドモード制御回路は、前記シングルスレッドモード時に、前記サスペンド制御回路から前記スレッドがサスペンド状態に遷移した旨のサスペンド通知を受けても、該サスペンド状態となったスレッドをアクティブ状態にあるものとして前記アクティブ状態記憶手段に記憶する、
ことを特徴とする請求項３に記載の演算装置。
【請求項６】
前記スレッドモード制御回路は、シングルスレッドモード時において、前記サスペンド制御回路から前記スレッドのサスペンド状態が解除された旨の通知を受けた場合に、該スレッドがアクティブ状態にあるときは、前記命令実行回路に対するスレッドモードの切り替え指示を行なわない、
ことを特徴とする請求項４に記載の演算装置。
【請求項７】
前記スレッドモード制御回路は、シングルスレッドモード時において、前記サスペンド制御回路から前記スレッドのサスペンド状態が解除された旨の通知を受けた場合に、該スレッドがアクティブ状態にないときは、該スレッドをアクティブ状態に遷移させるとともに、他のアクティブ状態にあるスレッドを非アクティブ状態に遷移させ、前記命令実行回路に対するスレッドモードの切り替え指示を行なわない、
ことを特徴とする請求項４に記載の演算装置。
【請求項８】
前記スレッド毎に、該スレッドのスリープ状態を制御する回路であって、前記命令実行回路からスリープ命令を実行した旨のスリープ通知を受けると、該スレッドをスリープ状態に遷移するように前記命令実行回路に指示するスリープ制御回路、
をさらに備え、
前記スレッドモード制御回路は、前記スリープ制御回路から前記スレッドがスリープ状態に遷移した旨のスリープ通知を受けると、該スリープ状態となったスレッドをアクティブ状態にないものとして前記アクティブ状態記憶手段に記憶する、
ことを特徴とする請求項２に記載の演算装置。
【請求項９】
前記スレッド毎に、該スレッドのスリープ状態を制御する回路であって、特定の割り込み通知又はタイマ割り込み通知を受けると、該通知に応じたスレッドのスリープ状態を解除するように前記命令実行回路に指示するスリープ制御回路、
をさらに備え、
前記スレッドモード制御回路は、前記スリープ制御回路から前記スレッドのスリープ状態が解除された旨の通知を受けると、該スレッドがアクティブ状態にあるものとして前記アクティブ状態記憶手段に記憶し、アクティブ状態にあるスレッドの数が１以下から２以上に変化すると、命令実行回路に対して、前記シングルスレッドモードから前記マルチスレッドモードに切り替える指示を行なう、
ことを特徴とする請求項２に記載の演算装置。
【請求項１０】
前記スレッドモード制御回路は、前記シングルスレッドモード時に、前記スリープ制御回路から前記スレッドがスリープ状態に遷移した旨のスリープ通知を受けても、該スリープ状態となったスレッドをアクティブ状態にあるものとして前記アクティブ状態記憶手段に記憶する、
ことを特徴とする請求項８に記載の演算装置。
【請求項１１】
前記スレッドモード制御回路は、シングルスレッドモード時において、前記スリープ制御回路から前記スレッドのスリープ状態が解除された旨の通知を受けた場合に、該スレッドがアクティブ状態にあるときは、前記命令実行回路に対するスレッドモードの切り替え指示を行なわない、
ことを特徴とする請求項９に記載の演算装置。
【請求項１２】
前記スレッドモード制御回路は、シングルスレッドモード時において、前記スリープ制御回路から前記スレッドのスリープ状態が解除された旨の通知を受けた場合に、該スレッドがアクティブ状態にないときは、該スレッドをアクティブ状態に遷移させるとともに、他のアクティブ状態にあるスレッドを非アクティブ状態に遷移させ、前記命令実行回路に対するスレッドモードの切り替え指示を行なわない、
ことを特徴とする請求項９に記載の演算装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算処理装置、特に複数のスレッドを同時に処理する演算装置に関する。
【背景技術】
【０００２】
近年、複数のスレッドの命令列をハードウェアで同時に処理することで、命令処理効率向上を図るプロセサ（以下、「マルチスレッドプロセサ」という）が多数提案されている。【０００３】
このようなマルチスレッドプロセサは、スレッドの数だけアーキテクチャレジスタ（例えば、Ｐｒｏｇｒａｍ  ｃｏｕｎｔｅｒ、Ｇｅｎｅｒａｌ  ｐｕｒｐｏｓｅ  ｒｅｇｉｓｔｅｒなど）を内部に備える必要がある。その結果、単一スレッドの命令列を処理プロセサ（以下、「シングルスレッドプロセサ」という）よりハードウェア量が増大する。このようなハードウェア量の増大は、近年のテクノロジの微細化と相まって、ハードウェアエラーの発生率を増大させる原因となっている。【０００４】
そのため、ハードウェアエラーが発生した場合でも、プロセサとしての処理性能をできる限り低下させずに処理を継続することができるプロセサの要求が高まっている。
これに関連して、例えば、特許文献１には、命令列単位に必要とされる処理性能を動的に実現して全体の処理効率を向上させるマルチスレッドプロセサが開示されている。【０００５】
一方、マルチスレッドプロセサは、常に複数のスレッドの命令列が実行されているわけではなく、ソフトウェアの都合で単一スレッドの命令列だけを実行することもある。例えば、単純に単一スレッドの命令列しか処理する必要がない場合や、ロック開放待ちやスレッド間での同期待ちのように、ソフトウェアの都合上あるスレッドの処理が完了するまで他のスレッドの処理ができない場合などである。【０００６】
これに関連して、例えば、特許文献２には、スレッドモードを切り替えるための命令を実行することで、マルチスレッドモードとシングルスレッドモードを切り替えてハードウェア内部の制御を変更する方法が開示されている。【０００７】
また、特許文献３には、マルチスレッドモードとシングルスレッドモードのいずれのモードにおいても最適化を行なうＳＭＴ（同時マルチスレッド化）システムについて開示されている。【０００８】
ここで、スレッドの有効・無効を切り替えるスレッドモード切り替え命令をマルチスレッドプロセサがサポートする場合、シングルスレッドモードからマルチスレッドモードに変更することが可能であるが、新たに有効状態になったスレッドは特定のアドレス（例えば、Ｓｙｓｙｔｅｍ  Ｒｅｓｅｔ  Ｉｎｔｅｒｒｕｐｔ  Ｈａｎｄｌｅｒなど）から実行を開始することになる。したがって、短時間のロック開放待ちやスレッド間の同期待ちのように、スレッド処理を一時的に中断する用途には適さない。【０００９】
また、このようなスレッドモード切り替え命令を使用する場合、全スレッドを無効にするとソフトウェアからスレッドを有効にする手段が存在しなくなるため、ソフトウェアに何らかの例外が通知される。そのため、全スレッドを同時に無効にすることができず、ソフトウェアはスレッドモード切り替え命令を使うときには他スレッドの存在を強く意識する必要がある。【００１０】
これに関連して、例えば、特許文献４には、あるスレッドの処理を一定時間中断する命令を実行すると、当該スレッドに割り当てられていたスレッド分割可能資源の一部を放棄し、他のスレッドに割り当て直す制御方法が開示されている。【００１１】
しかし、この制御方法では、スレッド分割可能資源の割り当てを変更するだけであり、例えば、命令処理制御方法の変更などは行なえない。そのため、命令の処理効率は低下してしまう。
【特許文献１】特開平１０−１２４３１６号公報
【特許文献２】米国特許第７１５５６００号明細書
【特許文献３】特開２００４−３２６７５２号公報
【特許文献４】特表２００５−５１４６９８号公報
【発明の開示】
【００１２】
本発明は、上述した問題に鑑みてなされたものであり、その解決しようとする課題は、複数のスレッドを同時に処理可能な演算装置であって、ハードウェアエラーが発生した場合であっても、全体としての処理能力の低下を最小限に抑えて処理を継続することができる演算装置を提供することである。
【００１３】
上記課題を解決するために、本発明に係る演算装置は、複数のスレッドの命令列を並列的に実行するマルチスレッドモードと、単一のスレッドの命令列を実行するシングルスレッドモードと、を選択的に実行可能し、該選択的に実施する場合にハードウェア資源の再割り当てを行なう回路であって、前記スレッドの命令列を実行中に発生するハードウェアエラーを検出すると該ハードウェアエラーが発生したエラースレッドをオフライン状態に遷移する命令実行回路と、前記スレッド毎に、該スレッドのアクティブ状態を記憶するアクティブ状態記憶手段を有し、前記オフライン状態となったスレッドはアクティブ状態にないものとして前記アクティブ状態記憶手段に記憶し、アクティブ状態にあるスレッドの数の変化に応じて、前記マルチスレッドモードと前記シングルスレッドモードとを切り替える指示を命令実行回路に対して行なう切り替え指示回路と、を備える。
【００１４】
本発明によると、切り替え指示回路は、オフライン状態となったスレッドをアクティブ状態にないもの（非アクティブ状態）として記憶し、アクティブ状態にあるスレッドの数の変化に応じて、マルチスレッドモードとシングルスレッドモードとを切り替えるように命令実行回路に対して指示する。
【００１５】
すると、命令実行回路は、切り替え指示回路に応じてマルチスレッドモードとシングルスレッドモードとを切り替え、ハードウェア資源の再割当てを行なう。例えば、マルチスレッドモード時に分割して使用していたハードウェア資源を、シングルスレッドモード時には全ハードウェア資源を単一スレッドに割り当てる。
【００１６】
その結果、ハードウェアエラーが発生する等によりマルチスレッドモードからシングルスレッドモードに切り替えても、最大限にハードウェア資源を活用して処理能力を向上させつつ処理を継続することが可能となる。
【００１７】
したがって、本発明によると、複数のスレッドを同時に処理する演算装置であって、ハードウェアエラーが発生した場合であっても、全体としての処理能力の低下を最小限に抑えて処理を継続することができる演算装置を提供することができる。
【図面の簡単な説明】
【００１８】
【図１】本実施例に係る演算装置の動作について説明する図である。
【図２】本実施例に係る演算装置の全体構成の概要を示す図である。
【図３】本実施例に係るスレッド分割資源、スレッド共有資源及びスレッド固有資源の例を示す図である。
【図４】本実施例に係るアクティブ状態の遷移を説明する図である。
【図５】本実施例に係るスレッドモードの遷移を説明する図である。
【図６】本実施例に係るオフライン制御回路の具体的な構成例を示す図である。
【図７】本実施例に係るサスペンド制御回路の具体的な構成例を示す図である。
【図８】本実施例に係るスリープ制御回路の具体的な構成例を示す図である。
【図９】本実施例に係るスレッドモード制御回路の具体的な構成例を示す図である。
【図１０】本実施例に係る命令実行回路の構成例を示す図である。
【図１１】本実施例に係るハードウェアエラー検出時のスレッドモード切り替え処理を示すフローチャートである。
【図１２】本実施例に係るサスペンド命令又はスリープ命令の実行時のスレッドモード切り替え処理を示すフローチャートである。
【図１３】本実施例に係るサスペンド状態又はスリープ状態が解除された時のスレッドモード切り替え処理を示すフローチャートである。
【発明を実施するための最良の形態】
【００１９】
以下、本実施形態について、図１〜図１３に基づいて説明する。
図１は、本実施例に係る演算装置１００の動作について説明する図である。
図１に示す演算装置１００は、複数のスレッドの命令列を実行するモード（以下、「マルチスレッドモード」という）と単一のスレッドの命令列を実行するモード（以下、「シングルスレッドモード」という）とを選択的に実行可能な命令実行回路１０１と、命令実行回路１０１に対してスレッドモードの切り替えを指示する切り替え指示回路１０２と、を備える。【００２０】
命令実行回路１０１は、１以上の命令列からなる複数のスレッドを並列的に処理することができる回路である。例えば、各スレッドに対して、命令フェッチ、命令デコード、演算実行、命令完了、プログラマブル資源更新の指示、命令実行中のハードウェアエラーのチェック等を行なう。【００２１】
また、命令実行回路１０１は、各スレッドについて命令実行中にハードウェアエラーを検出すると、切り替え指示回路１０２に対して、ハードウェアエラーが発生した時に実行していたスレッド（以下、「エラースレッド」という）とともに、ハードウェアエラーが発生した旨を通知する。以下、この通知を「エラー通知」という。【００２２】
また、切り替え指示回路１０２からエラースレッドをオフライン状態に遷移する指示（以下、「オフライン指示」という）を受けると、エラースレッドをオフライン状態に遷移する。【００２３】
ここで、オフライン状態とは、当該スレッドについての命令処理を行わず、当該スレッドへの割り込み通知も受付けず、当該スレッドのハードウェア資源（例えば、スレッド固有資源）におけるハードウェアエラーの検出も行わない状態をいう。【００２４】
また、切り替え指示回路１０２からスレッドモード切り替え指示に応じて、複数のスレッドの命令列を並列的に実行する処理（マルチスレッドモード処理）と、単一のスレッドの命令列のみを実行する処理（シングルスレッドモード処理）と、を選択的に実行する。【００２５】
ここで、マルチスレッドモードからシングルスレッドモードに切り替わる時、命令実行回路１０１は、スレッド実行に必要なハードウェア資源（後述するスレッド分割資源、スレッド共有資源）をシングルスレッドモードに最適化する。【００２６】
例えば、マルチスレッドモード時に、各スレッドに分割して割り当てていた命令バッファを、シングルスレッドモードへの切り替え時に、単一のスレッドに命令バッファ全体を割当て直すなどの処理を行なう。【００２７】
なお、シングルスレッドモードからマルチスレッドモードに切り替わる時も、同様に最適化が行なわれる。
切り替え指示回路１０２は、命令実行回路１０１からエラー通知を受けると、命令実行回路１０１に対してオフライン指示を行なう。【００２８】
また、切り替え指示回路１０２は、各スレッドの実行状態を保持する。
ここで、実行状態とは、各スレッドのアクティブ状態、或いは、アクティブ状態にない状態（以下、「非アクティブ状態」という）をいう。【００２９】
なお、アクティブ状態とは、例えば、スレッドに対して既にハードウェア資源（例えば、スレッド分割資源、スレッド共有資源、スレッド固有資源）が割り当てられ、このハードウェア資源を用いて当該スレッドの命令列を実行可能な状態又は実行中の状態をいう。したがって、スレッドがオフライン状態やサスペンド状態、スリープ状態等の状態は、非アクティブ状態となる。【００３０】
また、サスペンド状態とは、例えば、サスペンド命令にしたがって所定の割り込み通知が入力されるまで命令実行処理を停止した状態をいい、スリープ状態とは、例えば、スリープ命令にしたがって一定時間経過するまで（タイマ割り込み通知が入力されるまで）命令実行処理を停止した状態をいう。【００３１】
そして、切り替え指示回路１０２は、アクティブ状態にあるスレッドの数が（０以上）１以下になると、命令実行回路１０１に対して、マルチスレッドモードからシングルスレッドモードへの切り替えを指示する。また、アクティブ状態にあるスレッドの数が２以上になると、命令実行回路１０１に対してシングルスレッドモードからマルチスレッドモードへの切り替えを指示する。【００３２】
図２は、本実施例に係る演算装置１００の全体構成の概要を示す図である。
図２に示すように演算装置１００は、マルチスレッドモードとシングルスレッドモードと、を選択的に実行可能な命令実行回路１０１と、命令実行回路１０１に対してスレッドモードの切り替え指示を行なう切り替え指示回路１０２と、を備える。【００３３】
さらに、切り替え指示回路１０２は、各スレッドのオフライン状態を制御するオフライン制御回路２０１と、各スレッドのサスペンド状態を制御するサスペンド制御回路２０２と、各スレッドのスリープ状態を制御するスリープ制御回路２０３と、各スレッドの状態に応じてスレッドモードの切り替え指示を行なうスレッドモード制御回路２０４と、を備える。【００３４】
命令実行回路１０１は、スレッドモードに応じて分割・結合して使用するスレッド分割資源１０１ａと、複数のスレッドが共有するスレッド共有資源１０１ｂと、スレッドモードによらず常に特定のスレッドだけが使用するスレッド固有資源１０１ｃと、を備える。【００３５】
ここで、図３にスレッド分割資源１０１ａ、スレッド共有資源１０１ｂ及びスレッド固有資源１０１ｃについての具体例を示す。
スレッド分割資源１０１ａは、ＣＳＥ（Ｃｏｍｍｉｔ  Ｓｔａｃｋ  Ｅｎｔｒｙ）、ＧＵＢ（ＧＰＲ  Ｕｐｄａｔｅ  Ｂｕｆｆｅｒ）、ＦＵＢ（ＦＰＲ  Ｕｐｄａｔｅ  Ｂｕｆｆｅｒ）、ＲＳＢＲ（Ｒｅｓｅｒｖａｔｉｏｎ  Ｓｔａｔｉｏｎ  ｆｏｒ  Ｂｒａｎｃｈ）、命令バッファなどである。【００３６】
スレッド共有資源１０１ｂは、ＲＳＥ（Ｒｅｓｅｒｖａｔｉｏｎ  Ｓｔａｔｉｏｎ  ｆｏｒ  Ｅｘｅｃｕｔｉｏｎ）、ＲＳＦ（Ｒｅｓｅｒｖａｔｉｏｎ  Ｓｔａｔｉｏｎ  ｆｏｒ  Ｆｌｏａｔｉｎｇ  ｐｏｉｎｔ）、ＲＳＡ（Ｒｅｓｅｒｖａｔｉｏｎ  Ｓｔａｔｉｏｎ  ｆｏｒ  Ａｄｄｒｅｓｓ  ｇｅｎｅｒａｔｉｏｎ）、ＢＲＨＩＳ（Ｂｒａｎｃｈ  Ｈｉｓｔｏｒｙ）、ＥＡＧ（Ｅｆｆｅｃｔｉｖｅ  Ａｄｄｒｅｓｓ  Ｇｅｎｅｒａｔｏｒ）、ＥＸＵ（Ｅｘｅｃｕｔｉｏｎ  Ｕｎｉｔ）、ＦＬＵ（Ｆｌｏａｔｉｎｇ  ｐｏｉｎｔ  Ｕｎｉｔ）、命令デコーダなどである。【００３７】
スレッド固有資源１０１ｃは、ＧＰＲ（Ｇｅｎｅｒａｌ  Ｐｕｒｐｏｓｅ  Ｒｅｇｉｓｔｅｒ）、ＦＰＲ（Ｆｌｏａｔｉｎｇ  Ｐｏｉｎｔ  Ｒｅｇｉｓｔｅｒ）、ＰＣ（Ｐｒｏｇｒａｍ  Ｃｏｕｎｔｅｒ）、ＰＳＴＡＴＥ（Ｐｒｏｃｅｓｓｏｒ  ＳＴＡＴＥ）などのプログラマブルレジスタである。【００３８】
命令実行回路１０１は、上述した各ハードウェア資源を使用することにより、各スレッドに対して、命令フェッチ、命令デコード、演算実行、命令完了、プログラマブル資源更新の指示、命令実行中のハードウェアエラーのチェック等を行なう。【００３９】
また、命令実行回路１０１は、命令実行中にハードウェアエラーを検出すると、オフライン制御回路２０１にエラー通知を行なう。
また、命令実行回路１０１は、サスペンド命令を実行すると、サスペンド制御回路２０２に対してサスペンド命令が実行されたことを通知する（以下、この通知を「サスペンド通知」という）。【００４０】
また、命令実行回路１０１は、スリープ命令を実行すると、スリープ制御回路２０３に対してスリープ命令が実行されたことを通知する（以下、この通知を「スリープ通知」という）。【００４１】
また、命令実行回路１０１は、オフライン制御回路２０１から該当するスレッドをオフライン状態に遷移するように指示を受けると（以下、この指示を「オフライン指示」という）、該当するスレッドをオフライン状態に遷移する。【００４２】
また、命令実行回路１０１は、サスペンド制御回路２０２から該当するスレッドをサスペンド状態に遷移するように指示を受けると（以下、この指示を「サスペンド指示」という）、該当するスレッドをサスペンド状態に遷移する。【００４３】
また、命令実行回路１０１は、スリープ制御回路２０３から該当するスレッドをスリープ状態に遷移するように指示を受けると（以下、この指示を「スリープ指示」という）、該当するスレッドをスリープ状態に遷移する。【００４４】
命令実行回路１０１は、サスペンド指示、或いは、スリープ指示が解除された場合、即座に該当するスレッドについて実行を再開する。
また、命令実行回路１０１は、スレッドモード制御回路２０４からの指示に応じて、マルチスレッドモード処理と、シングルスレッドモード処理と、を選択的に切り替えて実行する（以下、この時の指示を「スレッドモード切り替え指示」という）。【００４５】
オフライン制御回路２０１は、各スレッドのオフライン状態への遷移を制御する回路である。
オフライン制御回路２０１は、スレッド毎にオフラインフラグ（オフラインフラグ０〜ｎ：ｎは自然数、以下同じ）を備え、命令実行回路１０１からエラー通知を受けると、該当するオフラインフラグを「１」に設定する。【００４６】
また、演算装置１００に備わる図示しないＪＴＡＧ回路によってオフライン状態の解除の指示を受けると（以下、この指示を「オフライン解除指示」という）、該当するオフラインフラグを「０」に設定する。【００４７】
各オフラインフラグの値は、命令実行回路１０１に出力される。この出力がオフライン指示となる。すなわち、命令実行回路１０１は、オフラインフラグの値が「１」に設定されると、該当するスレッドをオフライン状態に遷移する。【００４８】
また、各オフラインフラグの値は、スレッドモード制御回路２０４へも出力される。以下、この出力を「オフライン状態通知」という。
サスペンド制御回路２０２は、各スレッドのサスペンド状態への遷移を制御する回路である。【００４９】
サスペンド制御回路２０２は、スレッド毎にサスペンドフラグ（サスペンドフラグ０〜ｎ）を備え、命令実行回路１０１からサスペンド通知を受けると、該当するサスペンドフラグを「１」に設定する。【００５０】
また、演算装置１００に備わる図示しない割り込み回路から特定の割り込み通知（以下、単に「割り込み通知」という）を受けると、該当するサスペンドフラグを「０」に設定する。【００５１】
各サスペンドフラグの値は、命令実行回路１０１に出力される。この出力がサスペンド指示となる。すなわち、命令実行回路１０１は、サスペンドフラグの値が「１」に設定されると、該当するスレッドをサスペンド状態に遷移する。【００５２】
また、各サスペンドフラグの値は、スレッドモード制御回路２０４へも出力される。以下、この出力を「サスペンド状態通知」という。
スリープ制御回路２０３は、各スレッドのスリープ状態への遷移を制御する回路である。【００５３】
スリープ制御回路２０３は、スレッド毎にスリープフラグ（スリープフラグ０〜ｎ）を備え、命令実行回路１０１からスリープ通知を受けると、該当するスリープフラグを「１」に設定する。【００５４】
また、特定の割り込み通知、或いは、演算装置１００に備わる図示しないタイマ回路からの割り込み通知（以下、単に「タイマ割り込み通知」という）を受けると、該当するスリープフラグを「０」に設定する。【００５５】
各スリープフラグの値は、命令実行回路１０１に出力される。この出力がスリープ指示となる。すなわち、命令実行回路１０１は、スリープフラグの値が「１」に設定されると、該当するスレッドをスリープ状態に遷移する。【００５６】
また、各スリープフラグの値は、スレッドモード制御回路２０４へも出力される。以下、この出力を「スリープ状態通知」という。
本実施例では、サスペンド制御回路２０２及びスリープ制御回路２０３は、サスペンドフラグ或いはスリープフラグを「０」に設定する前に、図示しないがアクティブフラグを参照する。そしてアクティブフラグが「１」の場合にのみ、サスペンドフラグ或いはサスペンドフラグを「０」に設定する。アクティブフラグが「０」の場合には、スレッドモード制御回路２０４によってアクティブフラグに「１」が設定されるまで、サスペンドフラグ或いはスリープフラグの値は変更しない。【００５７】
アクティブフラグの変更を伴わずにサスペンドフラグ或いはスリープフラグが「０」に設定されるとき、スレッドモード制御回路２０４による全スレッドに対する実行キャンセル、スレッドモード変更、キャンセル解除の一連の処理を行なわないので、サスペンド状態（スリープ状態）からの処理の再開までのオーバヘッドを抑えることができる。【００５８】
なお、本実施例に係るサスペンド制御回路２０２及びスリープ制御回路２０３は、演算装置１００にとって必須の構成要素ではない。
スレッドモード制御回路２０４は、各スレッドのアクティブ状態を管理するアクティブフラグ０〜ｎと、スレッドモードを制御するスレッドモードフラグ（マルチスレッドモードフラグ、シングルスレッドモードフラグ）を備える。【００５９】
スレッドモード制御回路２０４は、オフライン制御回路２０１からオフライン状態通知を受けると、当該オフライン状態となったスレッドを管理するアクティブフラグを「０」に設定する。【００６０】
また、スレッドモード制御回路２０４は、サスペンド制御回路２０２からサスペンド状態通知を受けると、当該サスペンド状態となったスレッドを管理するアクティブフラグを「０」に設定する。【００６１】
また、スレッドモード制御回路２０４は、スリープ制御回路２０３からスリープ状態通知を受けると、当該スリープ状態となったスレッドを管理するアクティブフラグを「０」に設定する。【００６２】
また、スレッドモード制御回路２０４は、「１」に設定されているアクティブフラグの数が（０以上）１以下になると、シングルスレッドモードフラグを「１」に設定し（マルチスレッドモードフラグを「０」に設定する）、「１」に設定されているアクティブフラグの数が２以上になると、マルチスレッドモードフラグを「１」に設定する（シングルスレッドモードを「０」に設定する）。【００６３】
ここで、マルチスレッドモードフラグとシングルスレッドモードフラグの値は、命令実行回路１０１に出力され、マルチスレッドモードフラグが「１」（シングルスレッドモードフラグが「０」）に設定されると、命令実行回路１０１はマルチスレッドモードとして動作し、シングルスレッドモードフラグが「１」（マルチスレッドモードフラグが「０」）に設定されると、命令実行回路１０１はシングルスレッドモードとして動作する。【００６４】
図４は、本実施例に係るアクティブ状態の遷移を説明する図である。
オフライン制御回路２０１がオフラインフラグを「１」に設定し、サスペンド制御回路２０２がサスペンドフラグを「１」に設定し、或いは、スリープ制御回路２０３がスリープフラグを「１」に設定すると、スレッドモード制御回路２０４が該当するスレッドのアクティブフラグを「０」に設定する。【００６５】
したがって、スレッドがオフライン状態、サスペンド状態、或いは、スリープ状態に遷移すると、当該スレッドは、非アクティブ状態に遷移する。
一方、オフライン解除指示に応じてオフライン制御回路２０１がオフラインフラグを「０」に設定し、特定の割り込み通知に応じてサスペンド制御回路２０２がサスペンドフラグを「０」に設定し、或いは、タイマ割り込み通知に応じてスリープ制御回路２０３がスリープフラグを「０」に設定すると、スレッドモード制御回路２０４は、該当するスレッドのアクティブフラグを「１」に設定するので、当該スレッドはアクティブ状態に遷移する。【００６６】
図５は、本実施例に係るスレッドモードの遷移を説明する図である。なお、図５は、理解を容易にするためにスレッドの数ｎが２の場合におけるスレッドモードの遷移を示している。【００６７】
スレッド０がアクティブ状態（アクティブフラグ０が「１」）、かつ、スレッド１がアクティブ状態（アクティブフラグ１が「１」）の場合、アクティブ状態のスレッドが２以上なので、マルチスレッドモードフラグに「１」（シングルスレッドモードフラグに「０」）が設定され、命令実行回路１０１はマルチスレッドモードで動作する。【００６８】
スレッド０がアクティブ状態（アクティブフラグ０が「１」）、かつ、スレッド１が非アクティブ状態（アクティブフラグ１が「０」）の場合、アクティブ状態のスレッドが１以下なので、シングルスレッドモードフラグに「１」（マルチスレッドモードフラグに「０」）が設定され、命令実行回路１０１はシングルスレッドモードで動作する。【００６９】
スレッド０が非アクティブ状態（アクティブフラグ０が「０」）、かつ、スレッド１がアクティブ状態（アクティブフラグ１が「１」）の場合と、スレッド０が非アクティブ状態（アクティブフラグ０が「０」）、かつ、スレッド１が非アクティブ状態（アクティブフラグ１が「０」）の場合と、についても、アクティブ状態のスレッドが１以下なので、シングルスレッドモードフラグに「１」（マルチスレッドモードフラグに「０」）が設定され、命令実行回路１０１はシングルスレッドモードで動作する。【００７０】
図６は、本実施例に係るオフライン制御回路２０１の具体的な構成例を示す図である。
本実施例に係るオフライン制御回路２０１は、セット側に命令実行回路１０１からのエラー通知、リセット側にオフライン解除指示を入力とするレジスタ（例えば、ＲＳ−ＦＦ）６０１で構成される。このレジスタ６０１が保持する値は、命令実行回路１０１とスレッドモード制御回路２０４とに、それぞれオフライン指示、オフライン状態通知として出力される。【００７１】
図７は、本実施例に係るサスペンド制御回路２０２の具体的な構成例を示す図である。
本実施例に係るサスペンド制御回路２０２は、セット側に命令実行回路１０１からのサスペンド通知、リセット側に特定の割り込み通知を入力とするレジスタ（例えば、ＲＳ−ＦＦ）７０１で構成される。このレジスタ７０１が保持する値は、命令実行回路１０１とスレッドモード制御回路２０４とに、それぞれサスペンド指示、サスペンド状態通知として出力される。【００７２】
図８は、本実施例に係るスリープ制御回路２０３の具体的な構成例を示す図である。
本実施例に係るスリープ制御回路２０３は、タイマ割り込み通知と所定の割り込み通知（タイマ割り込み通知を除く）とを入力とする論理和回路８０１と、セット側に命令実行回路１０１からのスリープ通知、リセット側に論理和回路８０１の出力を入力とするレジスタ（例えば、ＲＳ−ＦＦ）８０２と、で構成される。このレジスタ８０２が保持する値は、命令実行回路１０１とスレッドモード制御回路２０４とに、それぞれスリープ指示、スリープ状態通知として出力される。【００７３】
図９は、本実施例に係るスレッドモード制御回路２０４の具体的な構成例を示す図である。なお、構成の理解を容易にするために、スレッドの数ｎが２の場合におけるスレッドモード制御回路２０４の構成例を示すが、これに限定する趣旨ではない。スレッドの数が３以上の場合には、図９に示す構成９０１〜９０７をスレッドの数だけ備えればよい。【００７４】
図９に示すスレッドモード制御回路２０４は、スレッド０のオフライン状態通知等を入力とする論理回路９０１〜９０６と、スレッド０のアクティブフラグであるレジスタ９０７と、スレッド１のオフライン状態通知等を入力とする論理回路９１１〜９１６と、スレッド１のアクティブフラグであるレジスタ９１７と、レジスタ９０７及び９１７の出力を入力とする論理積回路９０８と、論理積回路９０８の出力を入力とする否定回路９０９と、を備える。【００７５】
なお、図９に示す構成例では、レジスタ９０７及び９１７、論理積回路９０８及び否定回路９０９により、マルチスレッドモードフラグ及びシングルスレッドモードフラグを実現している。【００７６】
論理和回路９０１は、スレッド０を管理するオフライン制御回路２０１からのオフライン状態通知と、サスペンド制御回路２０２からのサスペンド状態通知と、スリープ制御回路２０３からのスリープ状態通知と、を入力とする。【００７７】
論理積回路９０２は、スレッド０を管理するオフライン制御回路２０１からのオフライン状態通知と、演算装置１００に備わる図示しないＪＴＡＧ回路を用いたオフライン解除指示と、を入力とする。【００７８】
論理積回路９０３は、スレッド０を管理するサスペンド制御回路２０２からのサスペンド状態通知と、演算装置１００に備わる図示しない割り込み回路を用いた割り込み通知と、を入力とする。【００７９】
論理積回路９０４は、スレッド０を管理するスリープ制御回路２０３からのスリープ状態通知と、割り込み通知と演算装置１００に備わる図示しないタイマ回路からのタイマ割り込み通知とを入力とする論理和回路９０６の出力と、を入力とする。【００８０】
論理和回路９０５は、論理積回路９０２〜９０４の出力を入力とする。
レジスタ９０７は、リセット側に論理和回路９０１の出力、セット側に論理和回路９０５の出力が入力される。【００８１】
オフライン状態通知、サスペンド状態通知又はスリープ状態通知が論理和回路９０１に入力されると、論理和回路９０１は、「１」を出力する。すると、レジスタ９０７はリセットされて「０」となる。すなわち、アクティブフラグが「０」となる。【００８２】
また、オフライン状態通知が「１」かつオフライン解除指示が「１」の場合、論理積回路９０２は「１」を出力し、サスペンド状態通知が「１」かつ割り込み通知が「１」の場合、論理積回路９０３は「１」を出力し、スリープ状態通知が「１」かつ割り込み通知若しくはタイマ割り込み通知が「１」の場合、論理積回路９０４は「１」を出力する。これらの場合、論理和回路９０５は「１」を出力する。すると、レジスタ９１７はセットされて「１」となる。【００８３】
したがって、オフライン制御回路２０１からのオフライン状態通知、サスペンド制御回路２０２からのサスペンド状態通知、或いは、スリープ制御回路２０３からのスリープ状態通知を受けると、スレッドモード制御回路２０４は、アクティブフラグ０を「１」にセットする。【００８４】
また、オフライン状態でオフライン解除指示、サスペンド状態で割り込み通知、或いは、スリープ状態で割り込み通知又はタイマ割り込み通知を受けると、スレッドモード制御回路２０４は、アクティブフラグ０を「０」にセットする。【００８５】
同様に、論理和回路９１１は、スレッド１を管理するオフライン制御回路２０１からのオフライン状態通知と、サスペンド制御回路２０２からのサスペンド状態通知と、スリープ制御回路２０３からのスリープ状態通知と、を入力とする。【００８６】
論理積回路９１２は、スレッド１を管理するオフライン制御回路２０１からのオフライン状態通知と、オフライン解除指示と、を入力とし、論理積回路９１３は、スレッド１を管理するサスペンド制御回路２０２からのサスペンド状態通知と、割り込み通知と、を入力とする。また、論理積回路９１４は、スレッド１を管理するスリープ制御回路２０３からのスリープ状態通知と、割り込み通知とタイマ割り込み通知とを入力とする論理和回路９１６の出力と、を入力とする。【００８７】
論理和回路９１５は、論理積回路９１２〜９１４の出力を入力とする。レジスタ９１７は、リセット側に論理和回路９１１の出力、セット側に論理和回路９１５の出力が入力される。【００８８】
なお、論理回路９１１〜９１７の動作は、論理回路９０１〜９０７と同様なので説明は省略する。
論理積回路９０８は、レジスタ９０７が「１」かつレジスタ９１７が「１」の場合に「１」を命令実行回路１０１に出力する。同時に、否定回路９０９から命令実行回路１０１に「０」を出力する。この時の出力が、マルチスレッドモードへの切り替え指示となる。【００８９】
また、論理積回路９０８は、レジスタ９０７が「１」かつレジスタ９１７が「１」以外の場合は、「０」を命令実行回路１０１に出力する。同時に、否定回路９０９は、命令実行回路１０１に「１」を出力する。この時の出力が、シングルスレッドモードへの切り替え指示となる。【００９０】
図１０は、本実施例に係る命令実行回路１０１の構成例を示す図である。
図１０に示す命令実行回路１０１は、命令フェッチ制御回路１００１と、命令バッファ１００２と、命令デコーダ１００３と、ＲＳＢＲ１００４と、ＢＲＨＩＳ１００５と、ＲＳＡ１００６と、ＥＡＧ１００７と、ＲＳＥ１００８と、ＥＸＵ１００９と、ＧＵＢ１０１０と、ＲＳＦ１０１１と、ＦＬＵ１０１２と、ＦＵＢ１０１３と、ＣＳＥ１０１４と、プログラマブルレジスタ１０１５と、を備える。【００９１】
命令フェッチ制御回路１００１は、Ｌ１命令キャッシュ１０１６に対してスレッド毎の命令列の取り出しを指示する。取り出された命令列は、命令バッファ１００２に格納される。【００９２】
また、スレッドモード制御回路２０４からシングルスレッドモードへの切り替え指示を受けると、Ｌ１命令キャッシュ１０１６に対して単一スレッドの命令列の取り込みを指示し、マルチスレッドモードへの切り替え指示を受けると、Ｌ１命令キャッシュ１０１６に対して複数のスレッドの命令列の取り込みを指示する。【００９３】
また、命令フェッチ制御回路１００１は、オフライン制御回路２０１からのオフライン指示に応じて該当するスレッドをオフライン状態に遷移し、サスペンド制御回路２０２からのサスペンド指示に応じて該当するスレッドをサスペンド状態に遷移し、スリープ制御回路２０３からのスリープ指示に応じて該当するスレッドをスリープ状態に遷移する。【００９４】
命令デコーダ１００３は、命令バッファ１００２から取り出されたスレッド毎の命令列をデコードし、デコード結果に応じて、ＲＳＢＲ１００４、ＲＳＡ１００６、ＲＳＥ１００８、ＲＳＦ１０１１、ＣＳＥ１０１４、などに命令を発行する。【００９５】
ＲＳＢＲ１００４は、複数のスレッドの分岐命令について分岐アドレス計算完了・分岐方向確定などを待ち、ＢＲＨＩＳ１００５に更新を指示し、分岐命令処理完了をＣＳＥ１０１４に通知する。【００９６】
ＢＲＨＩＳ１００５は、過去に実行された命令の分岐方向・分岐先アドレスなどを登録し、命令フェッチ時に検索する。そして、ＢＲＨＩＳ１００５は、将来実行される命令列の命令アドレスを予測し、命令フェッチ制御回路に通知する。【００９７】
ＲＳＡ１００６は、アドレス計算が必要な命令やアドレス計算に必要なデータが揃うのを待ち合わせてから、当該命令・データをＥＡＧ１００７に投入する。
ＥＡＧ１００７は、命令処理に必要なアドレス計算を行って、算出したアドレスに基づいてＬ１データキャッシュ１０１７からデータをフェッチし、或いは、データをストアする。【００９８】
Ｌ１命令キャッシュ１０１６及びＬ１データキャッシュ１０１７は、要求された命令・データがない時はＬ２キャッシュ１０１８に命令・データを要求する。
ＲＳＥ１００８は、整数系演算が必要な命令の演算に必要なデータが揃うのを待ち合わせてから、当該命令・データをＥＸＵ１００９に投入する。【００９９】
ＥＸＵ１００９は、整数系演算処理を行い、演算結果をＧＵＢ１０１０に格納する。
ＲＳＦ１０１１は、浮動小数点演算が必要な命令の演算に必要なデータが揃うのを待ち合わせ、当該命令・データをＦＬＵ１０１２に投入する。【０１００】
ＦＬＵ１０１２は、浮動小数点演算を行い、演算結果をＦＵＢ１０１３に格納する。
ＣＳＥ１０１４は、命令処理に必要な全ての処理の完了を監視し、命令列順序に従って命令を完了させ、プログラマブル資源１０１５の更新を指示する。また、サスペンド命令が実行された場合、サスペンド制御回路２０２に対してサスペンド通知を行ない、スリープ命令が実行された場合、スリープ制御回路２０３に対してスリープ通知を行なう。【０１０１】
以上に説明した命令実行回路１０１内の各回路には、図示しないハードウェアエラーを検出するエラー検出回路が備わっている。そして、命令実行中にハードウェアエラーを検出すると、エラー検出回路は、オフライン制御回路２０１に対してエラー通知を行なう。【０１０２】
命令バッファ１００２、ＲＳＢＲ１００４、ＧＵＢ１０１０、ＦＵＢ１０１３、ＣＳＥ１０１４等のスレッド分割資源は、スレッドモード制御回路２０４からのスレッドモード切り替え指示に応じて資源の最適化を行なう。【０１０３】
例えば、命令バッファ１００２、ＲＳＢＲ１００４、ＧＵＢ１０１０、ＦＵＢ１０１３、ＣＳＥ１０１４等のスレッド分割資源は、マルチスレッドモードでは、スレッド毎に資源を分割して割り当てられているが、シングルスレッドモードへの切り替え指示を受けると、単一スレッドが全資源を占有するように資源の割り当てを行なう。【０１０４】
より具体的には、例えば、ＣＳＥ１０１４が最大６４個のＣＳＥで構成されている場合、マルチスレッドモード（例えば、スレッド数が２の場合）では、各スレッドに対して３２個のＣＳＥが割り当てられ、シングルスレッドモードでは、６４個のＣＳＥ全てが単一スレッドに割り当てられる。【０１０５】
以上のように、本実施例に係る演算装置１００は、スレッドモードに応じてハードウェア資源（スレッド分割資源）の再割り当てを行なって最適化を行なうので、有効にハードウェア資源を使用して演算処理を実行することが可能となる。【０１０６】
その結果、ハードウェアエラーによってマルチスレッドモードからシングルスレッドモードに切り替わった場合であっても、全体としての処理能力の低下を最小限に抑えながら処理を継続することが可能となる。【０１０７】
図１１は、本実施例に係るハードウェアエラー検出時のスレッドモード切り替え処理を示すフローチャートである。
ステップＳ１１０１において、命令実行回路１０１は、命令実行中にハードウェアエラーを検出すると、オフライン制御回路２０１に対してエラー通知を行なう。そして、命令実行回路１０１は、処理をステップＳ１１０２に移行する。【０１０８】
ステップＳ１１０２において、命令実行回路１０１は、全スレッドを停止状態に遷移する。ここで、停止状態とは、オフライン状態やサスペンド状態、スリープ状態とは異なるハードウェア状態であり、スレッドの命令列の実行を停止した状態をいう。【０１０９】
ステップＳ１１０３において、命令実行回路１０１は、キャッシュフラッシュ処理を行なう。この処理によって、スレッド分割資源とスレッド共有資源が全てクリアされる。
ステップＳ１１０４において、オフライン制御回路２０１は、ステップＳ１１０１のエラー通知を受けると、該当するスレッドのオフラインフラグを「１」に設定する。そして、オフライン制御回路２０１は、命令実行回路１０１に対してオフライン指示を行なうとともに、スレッドモード制御回路２０４に対してオフライン状態通知を行なう。【０１１０】
ステップＳ１１０５において、スレッドモード制御回路２０４は、オフライン制御回路２０１からオフライン状態通知を受けると、該当するスレッドのアクティブフラグを「０」に設定する。【０１１１】
ステップＳ１１０６において、スレッドモード制御回路２０４は、アクティブフラグに「１」が設定されているスレッド（以下、「アクティブスレッド」という）の数が１より大きいか否かを判断する。そして、アクティブスレッドの数が１以下の場合、スレッドモード制御回路２０４は、処理をステップＳ１１０７に移行する。【０１１２】
ステップＳ１１０７において、スレッドモード制御回路２０４は、シングルスレッドモードフラグを「１」に設定し（マルチスレッドモードフラグを「０」に設定し）、命令実行回路１０１に対してシングルスレッドモードへの切り替え指示を行なう。【０１１３】
この時、命令実行回路１０１は、資源の最適化を行なう。すなわち、オフライン状態でないスレッド（以下、「非オフラインスレッド」という）に対してスレッド分割資源とスレッド共有資源を占有させるように資源の再割り当てを行なう。【０１１４】
また、ステップＳ１１０６において、アクティブスレッドの数が２以上の場合、スレッドモード制御回路２０４は、処理をステップＳ１１０９に移行する。
ステップＳ１１０９において、スレッドモード制御回路２０４は、マルチスレッドモードフラグを「１」に設定し（シングルスレッドモードフラグを「０」に設定し）、命令実行回路１０１に対してマルチスレッドモードへの切り替え指示を行なう。【０１１５】
この時も、命令実行回路１０１は、資源の最適化を行なう。すなわち、非オフラインスレッド毎にスレッド分割資源とスレッド共有資源の再割り当てを行なう。
ステップＳ１１０８において、命令実行回路１０１は、非オフラインスレッドの実行を開始し、スレッドモード切り替え処理を終了する。【０１１６】
図１２は、本実施例に係るサスペンド命令又はスリープ命令の実行時のスレッドモード切り替え処理を示すフローチャートである。なお、サスペンド命令実行時とスリープ命令実行時とは、同様の処理なので、以下、主にサスペンド命令の実行時のスレッドモード切り替え処理について説明し、（）内にスリープ命令時に固有の処理を示す。【０１１７】
ステップＳ１１０１において、命令実行回路１０１は、サスペンド命令（スリープ命令）を実行すると、サスペンド制御回路２０２（スリープ制御回路２０３）に対してサスペンド通知（スリープ通知）を行なう。【０１１８】
ステップＳ１２０２において、サスペンド制御回路２０２（スリープ制御回路２０３）は、命令実行回路１０１からサスペンド通知（スリープ通知）を受けると、該当するスレッドのサスペンドフラグ（スリープフラグ）を「１」に設定する。そして、サスペンド制御回路２０２（スリープ制御回路２０３）は、命令実行回路１０１に対してサスペンド指示（スリープ指示）を行なうとともに、スレッドモード制御回路２０４に対してサスペンド状態通知（スリープ状態通知）を行なう。【０１１９】
ステップＳ１２０３において、命令実行回路１０１は、サスペンド指示（スリープ指示）を受けると、全スレッドの実行をキャンセル状態に遷移させて、スレッド分割資源とスレッド共有資源の内容をクリアする。【０１２０】
ステップＳ１２０４において、スレッドモード制御回路２０４は、現在シングルスレッドモードにあるか否かを判断する。すなわち、スレッドモード制御回路２０４は、シングルスレッドモードフラグを参照し、シングルスレッドモードフラグが「１」か否かを判断する。【０１２１】
シングルスレッドモードの場合、スレッドモード制御回路２０４は、該当するスレッドのアクティブフラグを「０」に設定せずに、処理をステップＳ１２０８に移行する。シングルスレッドモードでない場合、スレッドモード制御回路２０４は、処理をステップＳ１２０５に移行する。【０１２２】
なお、図９には図示していないが、例えば、論理積回路９０５の出力と否定回路９０９の出力との論理積をとった値をレジスタ９０７のセット側に入力し、論理積回路９１５の出力と否定回路９０９の出力との論理積をとった値をレジスタ９１７のセット側に入力すれば、本ステップの処理を実現することができる。【０１２３】
ステップＳ１２０５において、スレッドモード制御回路２０４は、ステップＳ１２０２のサスペンド状態通知（スリープ状態通知）に応じて、該当するスレッドのアクティブフラグに「０」を設定する。【０１２４】
ステップＳ１２０６において、スレッドモード制御回路２０４は、アクティブスレッドの数が１より大きいか否かを判断する。そして、アクティブスレッドの数が１以下の場合、スレッドモード制御回路２０４は、処理をステップＳ１２０７に移行する。【０１２５】
ステップＳ１２０７において、スレッドモード制御回路２０４は、シングルスレッドモードフラグを「１」に設定し（マルチスレッドモードフラグを「０」に設定し）、命令実行回路１０１に対してシングルスレッドモードへの切り替え指示を行なう。【０１２６】
この時、図１１のステップＳ１１０７と同様に、命令実行回路１０１は、資源の最適化を行なう。
また、ステップＳ１２０６において、アクティブスレッドの数が２以上の場合、スレッドモード制御回路２０４は、処理をステップＳ１２０９に移行する。【０１２７】
ステップＳ１２０８において、スレッドモード制御回路２０４は、マルチスレッドモードフラグを「１」に設定し（シングルスレッドモードフラグを「０」に設定し）、命令実行回路１０１に対してマルチスレッドモードへの切り替え指示を行なう。【０１２８】
この時、図１１のステップＳ１１０９と同様に、命令実行回路１０１は、資源の最適化を行なう。
ステップＳ１２０９において、命令実行回路１０１は、全スレッドの実行キャンセルを解除し、アクティブ状態であるスレッドの処理を再開する。スレッドモード切り替え処理が終了する。【０１２９】
図１３は、本実施例に係るサスペンド状態又はスリープ状態が解除された時のスレッドモード切り替え処理を示すフローチャートである。なお、図１２と同様に、サスペンド命令実行時とスリープ命令実行時とは、同様の処理なので、以下、主にサスペンド命令の実行時のスレッドモード切り替え処理について説明し、（）内にスリープ命令時に固有の処理を示す。【０１３０】
ステップＳ１３０１において、サスペンド制御回路２０２（スリープ制御回路２０３）は、割り込み通知（割り込み通知又はタイマ割り込み通知）を受けると、処理をステップＳ１３０２に移行する。【０１３１】
ステップＳ１３０２において、スレッドモード制御回路２０４は、該当するスレッドがアクティブ状態か否かを判断する。すなわち、スレッドモード制御回路２０４は、該当するスレッドのアクティブフラグが「１」か否かを判断する。【０１３２】
アクティブフラグが「０」の場合、スレッドモード制御回路２０４は、処理をステップＳ１３０３に移行する。
ステップＳ１３０３において、命令実行回路１０１は、全スレッドの実行をキャンセル状態に遷移させて、スレッド分割資源とスレッド共有資源の内容をクリアする。【０１３３】
ステップＳ１３０４において、スレッドモード制御回路２０４は、該当するスレッドのアクティブフラグを「１」に設定する。
ステップＳ１３０５において、スレッドモード制御回路２０４は、アクティブスレッドの数が１より大きいか否かを判断する。そして、アクティブスレッドの数が１以下の場合、スレッドモード制御回路２０４は、処理をステップＳ１３０６に移行する。【０１３４】
ステップＳ１３０６において、スレッドモード制御回路２０４は、シングルスレッドモードフラグを「１」に設定し（マルチスレッドモードフラグを「０」に設定し）、命令実行回路１０１に対してシングルスレッドモードへの切り替え指示を行なう。【０１３５】
この時、図１１のステップＳ１１０７と同様に、命令実行回路１０１は、資源の最適化を行なう。
また、ステップＳ１３０５において、アクティブスレッドの数が２以上の場合、スレッドモード制御回路２０４は、処理をステップＳ１３０７に移行する。【０１３６】
ステップＳ１３０７において、スレッドモード制御回路２０４は、マルチスレッドモードフラグを「１」に設定し（シングルスレッドモードフラグを「０」に設定し）、命令実行回路１０１に対してマルチスレッドモードへの切り替え指示を行なう。【０１３７】
この時、図１１のステップＳ１１０９と同様に、命令実行回路１０１は、資源の最適化を行なう。
ステップＳ１３０８において、サスペンド制御回路２０２（スリープ制御回路２０３）は、該当するスレッドのサスペンドフラグ（スリープフラグ）を「０」に設定する。【０１３８】
ステップＳ１３０９において、命令実行回路１０１は、全スレッドの実行キャンセルを解除し、アクティブ状態であるスレッドの処理を再開する。そして、スレッドモード切り替え処理が終了する。【０１３９】
また、ステップＳ１３０２において、アクティブフラグが「１」の場合、スレッドモード制御回路２０４は、処理をステップＳ１３１０に移行する。
ステップＳ１３１０において、サスペンド制御回路２０２（スリープ制御回路２０３）は、該当するスレッドのサスペンドフラグ（スリープフラグ）を「０」に設定する。【０１４０】
すなわち、アクティブフラグが「１」の場合、サスペンドフラグ（スリープフラグ）に「０」をセットするだけでスレッドモードの切り替えは行なわない。これは、図５に示したステップＳ１２０４及びＳ１２１０に示したように、シングルスレッドモード時にサスペンド状態（スリープ状態）となったスレッドはアクティブ状態を保持するからである。【０１４１】
したがって、サスペンド制御回路２０２（スリープ制御回路２０３）がサスペンドフラグ（スリープフラグ）を「０」に設定すると、該当するスレッドについて通常の命令処理が再開される。すなわち、割り込み通知によってサスペンド状態（スリープ状態）が解除された場合に、割り込みトラップ発生処理が行なわれ、タイマ割り込み通知によってスリープ状態が解除された場合には、スリープ命令に後続する命令から処理が開始される。【０１４２】
以上のように、シングルスレッドモード時にサスペンド状態（スリープ状態）に遷移する場合、当該スレッドをアクティブ状態のまま継続するので、割り込み通知等によってサスペンド状態（スリープ状態）が解除されると、当該スレッドを再度アクティブ状態に設定し（ステップＳ１３０３、Ｓ１３０４）、スレッドモードを変更する（ステップＳ１３０５〜Ｓ１３０７）等の処理を行なうことなく、即座に通常の処理を再開することができる。【０１４３】
以上に説明したように、本実施例に係る演算装置１００は、命令実行回路１０１がハードウェアエラーを検出すると、オフライン制御回路２０１は、エラースレッドについてオフライン指示を行なって、エラースレッドをオフライン状態に遷移する。【０１４４】
一方、スレッドモード制御回路２０４は、各スレッドについてアクティブ状態を監視し、オフライン制御回路２０１からオフライン状態通知を受けると該当するスレッドが非アクティブ状態に遷移したと判断する。そして、アクティブスレッドの数が２以上から１以下（かつ０以上）に変化すると、命令実行回路１０１に対してシングルスレッドモードへの切り替え指示を行なう。【０１４５】
命令実行回路１０１は、スレッドモード制御回路２０４からの指示に応じてマルチスレッドモードからシングルスレッドモードへの切り替え行なうとともに、シングルスレッドモードに最適化する。【０１４６】
すなわち、本実施例に係る演算装置１００は、ハードウェアエラーを検出すると、エラースレッドをオフライン状態にして、非オフラインスレッドの演算処理を継続する。さらに、アクティブ状態のスレッドが１以下の状態になると、自動的にシングルスレッドモードに遷移し、かつ、シングルスレッドモードに最適化してハードウェア資源を最大限に活用して演算処理を継続する。【０１４７】
その結果、ハードウェアエラーが発生した場合であっても、全体としての処理能力の低下を最小限に抑えて処理を継続することが可能となる。
また、シングルスレッドモード時にサスペンド命令を実行した場合、当該スレッドはアクティブ状態のままサスペンド状態に移行されるので（図１２に示したステップＳ１２０４におけるＹｅｓの処理）、特定の割り込み通知によってサスペンド状態が解除されると、即座に実行を再開することが可能となる（図１３に示したステップＳ１３０２におけるＹｅｓの処理）。【０１４８】
同様に、シングルスレッドモード時にスリープ命令を実行した場合、当該スレッドはアクティブ状態のままスリープ状態に移行されるので（図１２に示したステップＳ１２０４におけるＹｅｓの処理）、特定の割り込み通知やタイマ割り込み通知によってスリープ状態が解除されると、即座に実行を再開することが可能となる（図１３に示したステップＳ１３０２におけるＹｅｓの処理）。【０１４９】
その結果、ロック開放待ちやスレッド間の同期待ちといったスレッド処理を一時的にかつ短時間だけ中断するためにサスペンド命令やスリープ命令を適用した場合の、処理再開オーバヘッドを軽減することが可能となる。【０１５０】
また、サスペンド状態やスリープ状態が解除された場合、アクティブ状態のスレッドについての処理を優先して再開するので、サスペンド状態やスリープ状態を解除する時に他のスレッドを意識する必要がない。その結果、ソフトウェア（サスペンド命令やスリープ命令）によって全スレッドをサスペンド状態やスリープ状態に遷移させることが容易となる。
【図１】
2008155797.tif 000003
【図２】
2008155797.tif 000004
【図３】
2008155797.tif 000005
【図４】
2008155797.tif 000006
【図５】
2008155797.tif 000007
【図６】
2008155797.tif 000008
【図７】
2008155797.tif 000009
【図８】
2008155797.tif 000010
【図９】
2008155797.tif 000011
【図１０】
2008155797.tif 000012
【図１１】
2008155797.tif 000013
【図１２】
2008155797.tif 000014
【図１３】
2008155797.tif 000015
【手続補正書】
【提出日】平成21年8月5日(2009.8.5)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
複数のスレッドの命令列を並列的に実行するマルチスレッドモードと、単一のスレッドの命令列を実行するシングルスレッドモードと、を選択的に実行可能にし、マルチスレッドモードとシングルスレッドモードとを選択的に実施する場合にハードウェア資源の再割り当てを行なう回路であって、前記スレッドの命令列を実行中に発生するハードウェアエラーを検出すると該ハードウェアエラーが発生したエラースレッドをオフライン状態に遷移する命令実行回路と、
前記スレッド毎に、該スレッドのアクティブ状態を記憶するアクティブ状態記憶手段を有し、前記オフライン状態となったスレッドはアクティブ状態にないものとして前記アクティブ状態記憶手段に記憶し、アクティブ状態にあるスレッドの数の変化に応じて、前記マルチスレッドモードと前記シングルスレッドモードとを切り替える指示を命令実行回路に対して行なう切り替え指示回路と、
を備える演算装置。
【請求項２】
前記切り替え指示回路は、
前記スレッド毎に、該スレッドのオフライン状態を制御する回路であって、前記命令実行回路からハードウェアエラーを検出した旨のエラー通知を受けると、該エラースレッドをオフライン状態に遷移するように前記命令実行回路に指示するオフライン制御回路と、
該オフライン制御回路から前記エラースレッドがオフライン状態に遷移した旨のオフライン通知を受けると、該オフライン状態となったスレッドをアクティブ状態にないものとして前記アクティブ状態記憶手段に記憶し、アクティブ状態にあるスレッドの数が２以上から１以下に変化すると、命令実行回路に対して、前記マルチスレッドモードから前記シングルスレッドモードに切り替える指示を行なうスレッドモード制御回路と、
を備える請求項１に記載の演算装置。
【請求項３】
前記スレッド毎に、該スレッドのサスペンド状態を制御する回路であって、前記命令実行回路からサスペンド命令を実行した旨のサスペンド通知を受けると、該スレッドをサスペンド状態に遷移するように前記命令実行回路に指示するサスペンド制御回路、
をさらに備え、
前記スレッドモード制御回路は、前記サスペンド制御回路から前記スレッドがサスペンド状態に遷移した旨のサスペンド通知を受けると、該サスペンド状態となったスレッドをアクティブ状態にないものとして前記アクティブ状態記憶手段に記憶する、
ことを特徴とする請求項２に記載の演算装置。
【請求項４】
前記スレッド毎に、該スレッドのサスペンド状態を制御する回路であって、特定の割り込み通知を受けると、該割り込み通知に応じたスレッドのサスペンド状態を解除するように前記命令実行回路に指示するサスペンド制御回路、
をさらに備え、
前記スレッドモード制御回路は、前記サスペンド制御回路から前記スレッドのサスペンド状態が解除された旨の通知を受けると、該スレッドがアクティブ状態にあるものとして前記アクティブ状態記憶手段に記憶し、アクティブ状態にあるスレッドの数が１以下から２以上に変化すると、命令実行回路に対して、前記シングルスレッドモードから前記マルチスレッドモードに切り替える指示を行なう、
ことを特徴とする請求項２に記載の演算装置。
【請求項５】
前記スレッド毎に、該スレッドのスリープ状態を制御する回路であって、前記命令実行回路からスリープ命令を実行した旨のスリープ通知を受けると、該スレッドをスリープ状態に遷移するように前記命令実行回路に指示するスリープ制御回路、
をさらに備え、
前記スレッドモード制御回路は、前記スリープ制御回路から前記スレッドがスリープ状態に遷移した旨のスリープ通知を受けると、該スリープ状態となったスレッドをアクティブ状態にないものとして前記アクティブ状態記憶手段に記憶する、
ことを特徴とする請求項２に記載の演算装置。
【請求項６】
前記スレッド毎に、該スレッドのスリープ状態を制御する回路であって、特定の割り込み通知又はタイマ割り込み通知を受けると、該通知に応じたスレッドのスリープ状態を解除するように前記命令実行回路に指示するスリープ制御回路、
をさらに備え、
前記スレッドモード制御回路は、前記スリープ制御回路から前記スレッドのスリープ状態が解除された旨の通知を受けると、該スレッドがアクティブ状態にあるものとして前記アクティブ状態記憶手段に記憶し、アクティブ状態にあるスレッドの数が１以下から２以上に変化すると、命令実行回路に対して、前記シングルスレッドモードから前記マルチスレッドモードに切り替える指示を行なう、
ことを特徴とする請求項２に記載の演算装置。
【手続補正書】
【提出日】平成22年1月5日(2010.1.5)
【手続補正１】
【補正対象書類名】明細書
【補正対象項目名】００５６
【補正方法】変更
【補正の内容】
【００５６】
また、各スリープフラグの値は、スレッドモード制御回路２０４へも出力される。以下、この出力を「スリープ状態通知」という。
本実施例では、サスペンド制御回路２０２及びスリープ制御回路２０３は、サスペンドフラグ或いはスリープフラグを「０」に設定する前に、図示しないがアクティブフラグを参照する。そしてアクティブフラグが「１」の場合にのみ、サスペンドフラグ或いはスリープフラグを「０」に設定する。アクティブフラグが「０」の場合には、スレッドモード制御回路２０４によってアクティブフラグに「１」が設定されるまで、サスペンドフラグ或いはスリープフラグの値は変更しない。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】０１１７
【補正方法】変更
【補正の内容】
【０１１７】
ステップＳ１２０１において、命令実行回路１０１は、サスペンド命令(スリープ命令)を実行すると、サスペンド制御回路２０２(スリープ制御回路２０３)に対してサスペンド通知(スリープ通知)を行なう。
【手続補正３】
【補正対象書類名】図面
【補正対象項目名】図２
【補正方法】変更
【補正の内容】
【図２】
2008155797.tif 000016
【手続補正４】
【補正対象書類名】図面
【補正対象項目名】図９
【補正方法】変更
【補正の内容】
【図９】
2008155797.tif 000017
【国際調査報告】
2008155797.tif 000018
2008155797.tif 000019
2008155797.tif 000020