以下、マルチスレッドプロセッサ等の実施形態について図面を参照して説明する。なお、実施の形態において同じ符号を付した構成要素は同様の動作を行うので、再度の説明を省略する場合がある。
(実施の形態1)
本実施の形態において、命令実行制御により命令実行効率を向上させるマルチスレッドプロセッサ、命令数の制限、制限する命令数のレジスタによる指定、制限する命令数の命令による指定、実行サイクル数間隔の指定、実行サイクル数間隔のレジスタによる指定、実行サイクル数間隔の命令による指定、資源制約のある命令の発行間隔の抑制について説明する。
図1は、本実施の形態におけるマルチスレッドプロセッサの構成を示すブロック図である。なお、本実施の形態では3つのスレッドを並列実行可能なマルチスレッドプロセッサを想定する。
マルチスレッドプロセッサ1は、命令メモリ101、第1命令デコーダ102、第2命令デコーダ103、第3命令デコーダ104、第1命令数指定部105、第2命令数指定部106、第3命令数指定部107、第1命令グループ化部108、第2命令グループ化部109、第3命令グループ化部110、第1レジスタ111、第2レジスタ112、第3レジスタ113、スレッド選択部114、命令発行制御部115、スレッドセレクタ116、スレッド用レジスタセレクタ117〜118、及び演算器群119を備える。
命令メモリ101は、マルチスレッドプロセッサ1において実行される命令を保持するメモリであり、3本の独立に実行されるスレッドの命令流を保持している。
第1命令デコーダ102、第2命令デコーダ103及び第3命令デコーダ104は、命令メモリ101から、それぞれ異なるスレッドの命令を読み出し、読み出した命令をデコードする処理部である。
第1命令数指定部105、第2命令数指定部106及び第3命令数指定部107は、それぞれ第1命令デコーダ102、第2命令デコーダ103及び第3命令デコーダ104でデコードされた命令を、同時実行可能な命令グループにグループ化する際の、同時実行可能な命令数を指定する処理部である。本実施の形態では、命令数の上限を3として説明する。命令数を指定する方法は、命令数を指定するための専用命令を各スレッドの命令流に含め、当該専用命令の実行により命令数を指定するようにしても良い。または、命令数を設定する専用レジスタを設け、各スレッドの命令流で専用レジスタの値を変更し命令数を指定するようにしても良い。
専用命令の実行により命令数を指定する場合には、アドレス設定やレジスタアクセスによるオーバーヘッドロスがない。このため、高速に命令数の変更が可能となる。また、スレッドの複数の箇所に、上記専用命令を挿入しておくことにより、スレッド内の複数の命令範囲において、異なる命令数を指定することが可能である。専用レジスタに命令数を設定する場合には、命令セットの体系を維持したまま、同時実行される命令数を制御することができる。
命令数の指定を、演算器資源の数や同時実行可能なスレッド数のバランスに合わせて変更することにより、命令実行効率を高められる。たとえば、演算器が4つあり、同時実行可能なスレッド数が2つある場合、命令数の上限を2としておくと、2つのスレッドが演算器を2つずつ使用することとなる。しかし、命令数の上限を3としておくと、各スレッドについて、最大3つの命令が1つの命令グループにグループ化される。このため、例えば、2つのスレッドのうち、一方のスレッドの命令グループに含まれる命令数が3であり、他方のスレッドの命令グループに含まれる命令数が2であった場合には、どちらか一方のスレッドのみしか実行することができず、未使用の演算器が生じるため、スレッドの実行効率が低下してしまう。
第1命令グループ化部108、第2命令グループ化部109及び第3命令グループ化部110は、第1命令デコーダ102、第2命令デコーダ103及び第3命令デコーダ104でそれぞれデコードされた命令を、同時実行可能な命令グループにグループ化する処理部である。なお、グループ化の際には、第1命令数指定部105、第2命令数指定部106及び第3命令数指定部107で設定された命令数を超えないように、命令のグループ化が行なわれる。
第1レジスタ111、第2レジスタ112及び第3レジスタ113は、各スレッドの命令による演算時に使用されるレジスタファイルである。
スレッド選択部114は、スレッド優先度に関する設定情報を保持し、スレッドの実行状況によって、実行するスレッドを選択する処理部である。スレッド優先度は、予め定められているものとする。
命令発行制御部115は、スレッド選択部114により選択されたスレッドを演算器群119に発行するために、スレッドセレクタ116、スレッド用レジスタセレクタ117及び118を制御する処理部である。また、命令発行制御部115は、演算器群119に発行したスレッドに関する発行命令情報をスレッド選択部114へ通知する。なお、本実施の形態では、同時実行可能なスレッド数は2とする。
スレッドセレクタ116は、命令発行制御部115の指示通りに実行スレッド(演算器群119で命令が実行されるスレッド)を選択するセレクタである。
スレッド用レジスタセレクタ117〜118は、スレッドセレクタ116と同様に、命令発行制御部115の指示通りに実行スレッドとセットとなるレジスタを選択するセレクタである。
演算器群119は、加算器や乗算器等の複数の演算器を含む処理部である。本実施の形態では、同時実行可能な演算器数は4とする。
図2は、図1に示したスレッド選択部114の詳細な構成を示すブロック図である。
スレッド選択部114は、第1発行間隔抑制部201、第2発行間隔抑制部202、第3発行間隔抑制部203、第1実行間隔指定部204、第2実行間隔指定部205、及び第3実行間隔指定部206を備える。
第1発行間隔抑制部201、第2発行間隔抑制部202及び第3発行間隔抑制部203の各々は、演算器群119の演算器数制限等により同時実行できない命令が、割り当てられたスレッドから発行された場合に、そのスレッドに対しその後一定期間だけ、その命令を発行させないよう抑制する処理部である。
第1実行間隔指定部204、第2実行間隔指定部205及び第3実行間隔指定部206の各々は、割り当てられたスレッドを一定間隔で実行するように、スレッドの実行間隔を指定する処理部である。実行間隔を指定する方法は、実行間隔を指定するための専用命令を各スレッドの命令流に含め、当該専用命令の実行により実行間隔を指定するようにしても良い。または、実行間隔を設定する専用レジスタを設け、各スレッドの命令流で専用レジスタの値を変更し実行間隔を指定するようにしても良い。実行間隔を指定することにより、優先度の高いスレッドが長時間資源を占有することを抑止でき、低優先度のスレッドの実行が局所的に停止してしまうことを防止できる。専用命令の実行により実行間隔を指定する場合には、アドレス設定やレジスタアクセスによるオーバーヘッドロスがない。また、スレッドの複数の箇所に、上記専用命令を挿入しておくことにより、スレッド内の複数の命令範囲において、異なる実行間隔を指定することが可能である。専用レジスタに実行間隔を設定する場合には、命令セットの体系を維持したまま、実行間隔を制御することができる。
なお、本実施の形態では、第1発行間隔抑制部201、第2発行間隔抑制部202、第3発行間隔抑制部203、第1実行間隔指定部204、第2実行間隔指定部205及び第3実行間隔指定部206は、それぞれ、実行サイクルが経過するごとに、値を1つデクリメントするダウンカウンタを含むものとする。
以降では、便宜上3つのスレッドをスレッドA、スレッドB、スレッドCと呼称することとする。スレッドAは、第1命令デコーダ102、第1命令数指定部105、第1命令グループ化部108、第1レジスタ111、第1発行間隔抑制部201及び第1実行間隔指定部204を利用して実行される。スレッドBは、第2命令デコーダ103、第2命令数指定部106、第2命令グループ化部109、第2レジスタ112、第2発行間隔抑制部202及び第2実行間隔指定部205を利用して実行される。スレッドCは、第3命令デコーダ104、第3命令数指定部107、第3命令グループ化部110、第3レジスタ113、第3発行間隔抑制部203及び第3実行間隔指定部206を利用して実行される。
次に、マルチスレッドプロセッサ1の動作について説明する。
図3は、マルチスレッドプロセッサ1の動作を示すフローチャートである。
第1命令デコーダ102、第2命令デコーダ103及び第3命令デコーダ104は、命令メモリ101に記憶されているスレッドA、B及びCの命令流を、それぞれデコードする(ステップS001)。
第1命令グループ化部108は、第1命令数指定部105で指定されている命令数を上限として、第1命令デコーダ102において認識されたスレッドAの命令流を、演算器群119で同時実行可能な命令からなる命令グループにグループ化する。同様に、第2命令グループ化部109は、第2命令数指定部106で指定されている命令数を上限として、第2命令デコーダ103において認識されたスレッドBの命令流を、演算器群119で同時実行可能な命令からなる命令グループにグループ化する。また、第3命令グループ化部110は、第3命令数指定部107で指定されている命令数を上限として、第3命令デコーダ104において認識されたスレッドCの命令流を、演算器群119で同時実行可能な命令からなる命令グループにグループ化する(ステップS002)。
命令発行制御部115は、スレッド選択部114が保持するスレッド優先度に関する設定情報と、ステップS002の処理によりグループ化された命令の情報とに基づいて、実行可能なスレッドを2つ決定する(ステップS003)。ここでは、スレッドA及びCが、実行可能なスレッドとして決定されたものとして以降説明する。
スレッドセレクタ116は、スレッドA及びCを、実行スレッドとして選択する。また、スレッド用レジスタセレクタ117は、スレッドA及びCに対応する第1レジスタ111及び第3レジスタ113を選択する。演算器群119は、スレッドセレクタ116で選択されたスレッド(スレッドA及びC)の演算を、スレッド用レジスタセレクタ117で選択されたレジスタ(第1レジスタ111及び第3レジスタ113)に記憶されているデータを用いて実行する(ステップS004)。
スレッド用レジスタセレクタ118は、スレッド用レジスタセレクタ117が選択したのと同じレジスタ(第1レジスタ111及び第3レジスタ113)を選択する。演算器群119は、スレッド(スレッドA及びC)の演算結果を、スレッド用レジスタセレクタ118が選択したレジスタ(第1レジスタ111及び第3レジスタ113)に書込む(ステップS005)。
次に、スレッド選択部114及び命令発行制御部115によるスレッド選択処理について、図4のフローチャートを用いて説明する。
なお本説明では、第1発行間隔抑制部201は、スレッドAより後述する発行間隔抑制命令が発行された場合には、その後、その発行間隔抑制命令を2マシンサイクルの間、発行するのを抑制する(禁止する)。ここで、発行間隔抑制命令とは、複数のスレッド間で演算器の競合を起こす命令のことである。同様に、第2発行間隔抑制部202は、スレッドBより発行間隔抑制命令が発行された場合には、その後、その発行間隔抑制命令を2マシンサイクルの間、発行するのを抑制する(禁止する)。また、第3発行間隔抑制部203は、スレッドCより発行間隔抑制命令が発行された場合には、その後、その発行間隔抑制命令を2マシンサイクルの間、発行するのを抑制する(禁止する)。このように、必要最小限の命令に対してのみ抑制をかけることができる。このため、実行効率を低下させること無く、他のスレッドへ資源を効率的に明け渡すことができる。
また、第1実行間隔指定部204は、演算器群119でスレッドAの命令が2マシンサイクルに1回実行できるように実行サイクル間隔を指定しているものとする。同様に、第2実行間隔指定部205は、演算器群119でスレッドBの命令が2マシンサイクルに1回実行できるように実行サイクル間隔を指定しているものとする。また、第3実行間隔指定部206は、演算器群119でスレッドCの命令が2マシンサイクルに1回実行できるように実行サイクル間隔を指定しているものとする。
また、スレッドの優先度は、スレッドAが一番高く、次にスレッドBが高く、スレッドCが一番優先度が低いものとする。
以下では、着目しているマシンサイクルの1つ前のマシンサイクルにおいて、スレッドA及びCが実行され、スレッドAにより発行間隔抑制命令が発行されたものとして、着目するマシンサイクルの動作について説明する。なお、説明する動作が1順目の動作であり、後述する2順目の動作と区別するために、各ステップのステップ番号に1順目であることを示すため“−1”を付与する。1順目の開始時には、第1発行間隔抑制部201、第2発行間隔抑制部202及び第3発行間隔抑制部203のダウンカウンタには0が設定されているものとする。また、第1実行間隔指定部204、第2実行間隔指定部205及び第3実行間隔指定部206のダウンカウンタには0が設定されているものとする。
スレッド選択部114は、命令発行制御部115から、前マシンサイクルにおいて実行されたスレッドA及びCの実行状況を取得する(ステップS101−1)。つまり、スレッドA及びCの実行された(発行された)命令が、発行間隔抑制命令であるか否かを示す情報を取得する。ここで、スレッド選択部114は、スレッドAの実行された命令が、発行間隔抑制命令であることを示す情報を取得したものとする。
スレッドAの発行間隔抑制命令が実行されたので、第1発行間隔抑制部201は、その発行間隔抑制命令を発行するのを抑制するサイクル数として、第1発行間隔抑制部201のダウンカウンタに2を設定する(ステップS102−1)。また、スレッドA及びCが実行されたので、第1実行間隔指定部204及び第3実行間隔指定部206は、それらのダウンカウンタの値に1を設定する。
スレッド選択部114は、第1実行間隔指定部204及び第3実行間隔指定部206のダウンカウンタの値が1であり0ではないため、スレッドA及びCを実行することができないと判断する。また、スレッド選択部114は、第2実行間隔指定部205のダウンカウンタの値が0であるため、スレッドBを実行することができると判断する。このため、スレッド選択部114は、スレッドBのみを実行対象スレッドとして選択し、命令発行制御部115へ通知する。また、スレッド選択部114は、選択したスレッドBが最も優先度が高いことを合わせて通知する(ステップS103−1)。
命令発行制御部115は、スレッド選択部114から受けたスレッドBの優先度情報と、第2命令グループ化部109によるスレッドBの命令のグループ化の結果を示す情報とからスレッドBを実行スレッドに決定する(ステップS104−1)。
命令発行制御部115は、スレッドセレクタ116、並びにスレッド用レジスタセレクタ117及び118を操作することにより、スレッドBの命令を第2命令グループ化部109から演算器群119に送り、演算器群119がスレッドBの命令を実行する(ステップS105−1)。
第1発行間隔抑制部201、第2発行間隔抑制部202、第3発行間隔抑制部203、第1実行間隔指定部204、第2実行間隔指定部205及び第3実行間隔指定部206の各々は、ダウンカウンタの値をそれぞれ1つデクリメントする(ステップS106−1)。このとき、ダウンカウンタの値が0の場合には、デクリメントは行なわずに、0が設定されたままとする。
以上のステップS101〜S106の処理を毎マシンサイクル実施する。上記説明の次のマシンサイクルについて引き続きステップを追って説明する。なお各ステップのステップ番号に2順目であることを示すため“−2”を付与する。なお、スレッドAは再度、発行間隔抑制命令を実行しようとしているものとして説明する。
スレッド選択部114は、命令発行制御部115から、前マシンサイクルにおいて実行されたスレッドBの実行状況を取得する(ステップS101−2)。つまり、スレッドBの実行された命令には、発行間隔抑制命令は含まれていないことを示す情報を取得したものとする。
スレッドBが実行されたので、第2実行間隔指定部205は、ダウンカウンタに1を設定する(ステップS102−2)。
スレッド選択部114は、第2実行間隔指定部205のダウンカウンタの値が1であり0ではないため、スレッドBを実行することができないと判断する。また、スレッド選択部114は、第1実行間隔指定部204及び第3実行間隔指定部206のダウンカウンタの値が0であるため、スレッドA及びCを実行することができると判断する。このため、スレッド選択部114は、スレッドA及びCを実行対象スレッドとして選択し、命令発行制御部115に通知する。また、スレッド選択部114は、命令発行制御部115に、スレッドAの優先度の方がスレッドBの優先度よりも高いことをあわせて通知する。また、第1発行間隔抑制部201のダウンカウンタの値が1である。このため、スレッドAの発行間隔抑制命令が発行されないようにするため、スレッド選択部114は、優先度情報に加えて、スレッドAが発行間隔抑制命令の実行権がない事を命令発行制御部115へ通知する(ステップS103−2)。
命令発行制御部115は、スレッド選択部114から受けたスレッドA及びCの優先度情報および発行間隔抑制命令の情報と、第1命令グループ化部108及び第3命令グループ化部110によるスレッドA及びCの命令のグループ化の結果を示す情報とから、スレッドAは発行間隔抑制命令の制限によって実行できないスレッドと判断し、スレッドCを実行スレッドに決定する(ステップS104−2)。
命令発行制御部115は、スレッドセレクタ116、並びにスレッド用レジスタセレクタ117及び118を操作することにより、スレッドCの命令を第3命令グループ化部110から演算器群119に送り、演算器群119がスレッドCの命令を実行する(ステップS105−2)。
第1発行間隔抑制部201、第2発行間隔抑制部202、第3発行間隔抑制部203、第1実行間隔指定部204、第2実行間隔指定部205及び第3実行間隔指定部206の各々は、ダウンカウンタの値をそれぞれ1つデクリメントする(ステップS106−2)。このとき、ダウンカウンタの値が0の場合には、デクリメントは行なわずに、0が設定されたままとする。
なお、図4のフローチャートにおいて、マルチスレッドプロセッサ1の電源オフやリセットにより処理が終了する。
以上説明したように、実施の形態1に係るマルチスレッドプロセッサ1によると、スレッド間で演算資源が競合した場合でも、ユーザ指定やプロセッサ実装上のスレッド間の優先度において劣勢となるスレッドの実行効率が局所的に著しく落ちることを防ぐ事ができる。また、各スレッドの命令数と演算器資源数のバランスをとり、演算器資源を効率よく使用することができる。
なお、本実施の形態によれば、スレッド数を3としたがこの値に限定されることはなく、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
また、本実施の形態によれば、同時命令発行数上限を3としたがこの値に限定されることはなく、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
また、本実施の形態によれば、同時実行可能なスレッド数の上限を2としたがこの値に限定されることはなく、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
また、本実施の形態によれば、同時実行可能な演算器数の上限を4としたがこの値に限定されることはなく、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
(実施の形態2)
以下、図面を参照しながら本発明の実施の形態2に係るコンパイラおよびオペレーティングシステムについて説明する。
図5は、本発明の実施の形態2に係るコンパイラ3の構成を示すブロック図である。
コンパイラ3は、プログラマがC言語で記述したソースプログラム301を入力として受け、内部的な中間表現(中間コード)に変換して最適化や資源の割付を実施した後、ターゲットプロセッサ向けの実行形式コード302を生成する。コンパイラ3がターゲットとするプロセッサは実施の形態1にて説明したマルチスレッドプロセッサ1である。
以下で本発明に係るコンパイラ3の各構成要素の詳細な構成とその動作について説明していく。なお、コンパイラ3は、プログラムであり、プロセッサとメモリとを備えるコンピュータ上で、コンパイラ3の各構成要素を実現するためのプログラムを実行することにより、その機能を果たす。
コンパイラ3は、パーサ部31と、最適化部32と、コード生成部33とを備える。
パーサ部31は、コンパイラ3に入力されたソースプログラム301に対して、予約語(キーワード)等を抽出して字句解析および構文解析を行い、各ステートメントを一定規則に基づいて中間コードに変換する処理部である。
最適化部32は、入力された中間コードに対して、冗長性の除去や命令スケジューリングやレジスタ割り付けといった最適化処理を実施する。
コード生成部33は、最適化部32から出力された中間コードに対して、内部に保持する変換テーブル等を参照することにより、全てのコードを機械語コードに置き換える。これにより、実行形式コード302を生成する。
最適化部32は、マルチスレッド実行制御指示解釈部321と、命令スケジューリング部322と、実行状態検出コード生成部323と、実行制御コード生成部324とを備える。命令スケジューリング部322は、応答性確保スケジューリング部3221を備える。
マルチスレッド実行制御指示解釈部321は、プログラマによるマルチスレッド実行を制御するための指示を、コンパイルオプション、プラグマ指令(#pragma)、又は組み込み関数として受理する。マルチスレッド実行制御指示解釈部321は、受理した指示を、中間コードに格納して後段の命令スケジューリング部322等に引き渡す。
図6は、マルチスレッド実行制御指示解釈部321が受理するマルチスレッド実行制御のための指示の一覧を示す図である。以下、図6に示す各指示について、当該指示を用いたソースプログラム301の例を参照しながら説明する。
図7を参照して、「注力区間指示」とは、他のスレッドと比べて注力すべきソースプログラム301中の区間を“#pragma _focus begin”と“#pragma _focus end”とで囲むことにより指定する指示である。この指示に基づいて、コンパイラ3は、この区間にプロセッササイクルや演算資源を重点的に割くよう制御する。
図8を参照して、「非注力区間指示」とは、他のスレッドと比べてそれほど注力する必要のないソースプログラム301中の区間を、“#pragma _unfocus begin”と“#pragma _unfocus end”とで囲むことにより指定する指示である。この指示に基づいて、コンパイラ3は、この区間にはプロセッササイクルや演算資源をそれほど割かないように制御する。
図9を参照して、「命令並列度指示」とは、ソースプログラム301中の“#pragma ILP=‘num’ begin”と“#pragma ILP end”とで囲んだ区間の命令並列度を指定するための指示である。‘num’の部分には1〜3のいずれかの数字が指定され、コンパイラ3は、指定された動作モードを設定するコードを生成するとともに、指定された命令並列度を想定した命令スケジューリングを実施する。図9には、‘num’として「3」を指定した命令並列度指示が示されている。つまり、“#pragma ILP=3 begin”と“#pragma ILP end”とで囲んだ区間の命令並列度として「3」が指定されている。
図10を参照して、「マルチスレッド実行モード指示」とは、ソースプログラム301中の“#pragma _single_thread begin”と“#pragma _single_thread end”とで囲んだ区間を自スレッドのみのシングルスレッドモードで動作させるための指示である。この指示に基づき、コンパイラ3は、動作モードを設定するコード、つまり上記区間においてスレッドの実行数を1つとするコードを生成する。
図11を参照して、「応答性確保区間指示」とは、ソースプログラム301中の“#pragma _response=‘num’ begin”と“#pragma _response end”とで囲んだ区間について、他方のスレッドが最低限応答可能とする頻度を指定するための指示である。‘num’の部分には、最低限何サイクルに1回は他方のスレッドが実行できるようにすべきかの数値が指定され、コンパイラ3は指定条件を満たすよう自スレッドの生成コードを調整する。図11には、‘num’として「10」を指定した応答性確保区間指示が示されている。つまり、“#pragma _response=10 begin”と“#pragma _response end”とで囲んだ区間においては、10サイクルに1サイクルは、他方のスレッドが実行されるようにするための指示であり、この指示を満たすようにコードが生成される。例えば、一定頻度でストールサイクルが挿入されるコードや、一定頻度で演算器資源を解放するコードが生成される。
図12を参照して、「ストール挿入頻度指示」とは、ソースプログラム301中の“#pragma _stall_freq=‘num’ begin”と“#pragma
_stall_freq end”とで囲んだ区間について、最低限1つのストールサイクルが発生する頻度を指定するための指示である。‘num’の部分には最低限何サイクルに1回はストールが発生するようにすべきかの数値が指定され、コンパイラ3は、指定条件を満たすように適宜ストールサイクルを挿入する。図12には、‘num’として「10」を指定したストール挿入頻度指示が示されている。つまり、“#pragma _stall_freq=10 begin”と“#pragma _stall_freq end”とで囲んだ区間においては、10サイクルに1サイクルはストールサイクルが発生するようにコード生成される。
図13を参照して、「演算器開放頻度指示」とは、ソースプログラム301中の“#pragma _release_freq=‘res’:‘num’ begin”と“#pragma _release_freq end”とで囲んだ区間について、指定された演算器について最低限1回は未使用のサイクルが発生する頻度を指定するための指示である。‘res’の部分には演算器の種類として‘mul’もしくは‘mem’が指定でき、‘mul’は乗算器を、“mem”はメモリアクセス装置をそれぞれ示している。‘num’の部分には最低限、何サイクルに1回は指定された演算器の未使用サイクルが発生するようにすべきかの数値が指定され、コンパイラ3は指定条件を満たすように生成コードを調整する。図13には、‘res’として「mul」を指定し、‘num’として「10」を指定した演算器開放頻度指示が示されている。つまり、“#pragma
_release_freq=mul:10 begin”と“#pragma _release_freq end”とで囲んだ区間においては、10サイクルに1サイクルは指定された演算器である乗算器が使用されないサイクルが発生するようにコード生成される。
図14を参照して、「逼迫度検出指示」とは、期待される実行サイクル数に対してどの程度逼迫しているかを検出するための組み込み関数のセットである。関数_get_tightness_start()にてソースプログラム301中のサイクル数計測区間の起点を指定する。関数_get_tightness(num)にて逼迫度を得ることができる。引数の“num”には起点からの実行サイクル数の期待値もしくは保証すべき値が指定され、本関数は指定された数値に対する実際の実行サイクル数の比を返す。図14には、‘num’として「1000」を指定した逼迫度検出指示が示されている。これにより、実際の実行サイクル数がnであれば、関数_get_tightness(1000)は、n/1000を返すことになる。
また、この関数によりプログラマは処理の逼迫度を得ることができ、逼迫度に応じた制御をプログラムすることが可能である。例えば、逼迫度が1よりも大きい場合には、演算器資源を減少させたり、命令並列度を減少させたりするコードを生成してもよい。また、逼迫度が1よりも小さい場合には、演算器資源を増加させたり、命令並列度を増加させたりするコードを生成してもよい。
図15を参照して、「実行サイクル期待値指示」とは、期待される実行サイクル数を指示するための組み込み関数のセットである。関数_expected_cycle_start()にてソースプログラム301中のサイクル計測区間の起点を指定する。関数_expected_cycle(num)にて実行サイクル数の期待値を指定する。引数の“num”には起点からの実行サイクル数の期待値もしくは保証すべき値が指定さる。この関数によりプログラマが指定した期待値から、コンパイラ3もしくはオペレーティングシステム4が実際の処理の逼迫度を導出し、自動的に適切な実行サイクル数の制御を実施することが可能である。
「自動制御指示」とは、自動的なマルチスレッド実行制御を実施することを指示するコンパイルオプションである。−auto−MT−control=OSオプションにてオペレーティングシステム4による自動制御を指示し、−auto−MT−control=COMPILERオプションにてコンパイラ3による自動制御を指示する。
再度、図5を参照して、命令スケジューリング部322は、入力された命令群の間の依存関係を保ちつつ適宜命令の並び替えを行うことにより、実行効率を向上させる最適化を実施する。なお、命令の並べ替えにあたっては、命令レベルの並列度を想定して並べ替えを実施する。前述の指示の中で、「注力区間指示」のされている区間については並列度3を想定し、「非注力区間指示」のされている区間については並列度1を想定し、「命令並列度指示」のされている区間については指示に従った並列度を想定する。デフォルトでは並列度3を想定する。
また「マルチスレッド実行モード指示」のされている区間については、他方のスレッドが存在せず自スレッドのみがプロセッサ上で動作していることを想定して命令スケジューリングを実施する。
命令スケジューリング部322は、応答性確保スケジューリング部3221を備える。
応答性確保スケジューリング部3221は、前述の「応答性確保区間指示」もしくは「ストール挿入頻度指示」のされている区間について、先頭から順にサイクルを探索していき、指定された数値のサイクル数分ストールが発生しないサイクルが連続した場合には、ストールを発生させる“nop”命令を挿入し、また次の命令から探索を継続する。これによって、他方のスレッドが指定されたサイクルにつき1サイクルは確実に命令実行できることになる。
また、前述の「演算器開放頻度指示」のされている区間については、命令スケジューリングの際に、指定された演算器を使用するサイクルをカウントしていき、指定された数値にカウンタが達した場合には、次のサイクルでは当該演算器は使用できないものとしてスケジューリングを行う。当該演算器が使用されないサイクルが発生すればカウントをリセットする。これによって、他方のスレッドは指定されたサイクルにつき1サイクルは当該演算器を使用することができることになる。
実行状態検出コード生成部323は、前述の指示に対応して実行状態を検出するためのコードを挿入する。
具体的には、前述の「逼迫度検出指示」に対応して、関数_get_tightness_start()が記述された部分に、プロセッサのサイクルカウントを開始するためのシステムコールを挿入する。そして、関数_get_tightness(num)が記述された部分でプロセッサのサイクルカウントを読み出すシステムコールと、読み出したカウント値をnumとして与えられた期待値で除算した値を逼迫度として返すコードとを挿入する。この返り値によってプログラマが処理の逼迫度を知ることができる。
また、前述の「実行サイクル期待値指示」に対応して、関数_expected_cycle_start()が記述された部分に、プロセッサのサイクルカウントを開始するためのシステムコールを挿入する。それぞれの指示に対応して独立にサイクルカウントすることができる。
そして、自動制御指示のコンパイルオプション−auto−MT−controlとしてOSが指定されている場合には、関数_expexted_cycle(num)が記述された部分に、numで指示された実行サイクル数の期待値をオペレーティングシステム4に伝達して実行制御を促すためのシステムコールを挿入する。これに応じてオペレーティングシステム4にて実行制御を実施することができる。
また自動制御指示のコンパイルオプション−auto−MT−controlとしてCOMPILERが指定されている場合には、関数_expexted_cycle(num)が記述された部分に、プロセッサのサイクルカウントを読み出すシステムコールを挿入し、読み出したカウント値をnumとして与えられた期待値で除算して逼迫度を算出し、逼迫度が0.8以上の場合には後述の「注力区間」に対応した制御を、逼迫度が0.8未満の場合には後述の「非注力区間」に対応した制御を行うコードを挿入する。これによって、逼迫度に応じたマルチスレッド実行制御を実施するコードをコンパイラにて自動生成することができる。
実行制御コード生成部324は、前述の指示に対応して実行を制御するためのコードを挿入する。
具体的には、「注力区間指示」に対応して、区間のbeginの部分に命令並列度を3に設定するシステムコールを挿入し、区間のendの部分に元の設定に戻すシステムコールを挿入する。
また「非注力区間指示」に対応して、区間のbeginの部分に命令並列度を1に設定するシステムコールと他方のスレッドのサイクルが割り込まない実行モードに設定するコードを挿入し、区間のendの部分に元の設定に戻すシステムコールを挿入する。
さらに「命令並列度指示」に対応して、区間のbeginの部分に命令並列度を指定された値に設定するシステムコールを挿入し、区間のendの部分に元の設定に戻すシステムコールを挿入する。
また「マルチスレッド実行モード指示命令並列度指示」に対応して、区間のbeginの部分に単一スレッドモードに移行するためのシステムコールを挿入し、区間のendの部分に元の設定に戻すシステムコールを挿入する。
そして「実行サイクル期待値指示」および「自動制御指示」に対応して、前述のように検出した逼迫度に応じて「非注力区間」もしくは「注力区間」と同様の制御を行うコードを挿入する。
以上のようなコンパイラ3の構成をとることにより、マルチスレッドプロセッサ1において、自スレッドの実行モードおよびプロセッサ資源の使用状況を制御できるようになり、必要に応じて自スレッドの処理に注力したり、他方のスレッドにプロセッサ資源を分け与えることができるようになる。また、自スレッドの処理に注力している場合でも、他方のスレッドにて所定の応答性を保証することが可能となる。また、実行時の実行サイクル数の情報を獲得して、それに基づいて逼迫度に応じて上記制御を行うことができ、きめ細かい性能チューニングおよびプロセッサ利用効率向上を図ることが可能となる。
図16は、本発明の実施の形態2に係るオペレーティングシステム4の構成を示すブロック図である。
オペレーティングシステム4は、システムコール処理部41と、プロセス管理部42と、メモリ管理部43と、ハードウェア制御部44とを備える。なお、オペレーティングシステム4は、プログラムであり、プロセッサとメモリとを備えるコンピュータ上で、オペレーティングシステム4の各構成要素を実現するためのプログラムを実行することにより、その機能を果たす。なお、オペレーティングシステム4が動作するプロセッサは、実施の形態1に示したマルチスレッドプロセッサ1である。
プロセス管理部42は、オペレーティングシステム4上で動作する複数のプロセスについて優先度を与え、それに基づいて各プロセスに配分する時間を決定し、プロセスの切り替え等を制御する。
メモリ管理部43は、メモリの利用可能な部分の管理、メモリの割り当ておよび開放、主記憶と二次記憶との間でのスワップ等の制御を実施する。
システムコール処理部41は、アプリケーションプログラムへのカーネルのサービスであるシステムコールに対応した処理を提供する。
システムコール処理部41は、マルチスレッド実行制御システムコール処理部411と逼迫度検出システムコール処理部412を備える。
マルチスレッド実行制御システムコール処理部411は、プロセッサのマルチスレッド動作を制御するためのシステムコールを処理する。
具体的には、前述のコンパイラ3の実行制御コード生成部324の命令並列度を設定するシステムコールを受理して、プロセッサの動作命令並列度を設定するとともに元の命令並列度を保存しておく。そして、元の命令並列度に戻すシステムコールを受理して、保存しておいた元の命令並列度にプロセッサを設定する。さらに、単一スレッドモードに移行するシステムコールを受理して、プロセッサの動作モードを単一スレッドモードに設定するとともに元のスレッドモードを保存しておく。そして、元のスレッドモードに戻すシステムコールを受理して、保存しておいた元のスレッドモードにプロセッサを設定する。
逼迫度検出システムコール処理部412は、処理の逼迫度を検出して対応するためのシステムコールを処理する。
具体的には、前述のコンパイラ3の実行状態検出コード生成部323のプロセッサのサイクルカウントを開始するためのシステムコールを受理して、プロセッサのカウンタを獲得してカウントを開始する設定をする。また、現在のサイクルカウントを読み出すシステムコールを受理して、プロセッサの該当するカウンタの現在のカウント値を読み出し、その値を返す。さらに、実行サイクル数の期待値を伝達して実行制御を促すシステムコールを受理して、プロセッサの該当するカウンタの現在のカウント値を読み出し、その値と伝達された実行サイクル数の期待値から逼迫度を導出し、逼迫度に応じた実行制御を実施する。逼迫度が高い場合には当該プロセスの優先度を上げ、前述の「注力区間」に対応する制御を実施する。一方、逼迫度が低い場合には当該プロセスの優先度を下げ、前述の「非注力区間」に対応する制御を実施する。
ハードウェア制御部44は、システムコール処理部41等で必要とされるハードウェアの制御のためのレジスタ設定および読み出しを実施する。
具体的には、前述の命令並列度の設定および復帰、マルチスレッド動作モードの設定および復帰、サイクルカウンタの初期化、サイクルカウンタの読み出しに対応したハードウェアのレジスタ設定および読み出しを実施する。
以上のようなオペレーティングシステム4の構成をとることにより、プログラムからのマルチスレッドプロセッサの動作制御が可能となり、各プログラムにプロセッサ資源を適切に配分することが可能となる。また、入力されたプログラマの想定する実行サイクル数の期待値とハードウェアから読み出した実際の実行サイクルの情報から逼迫度を検出して適切な制御を自動的に実施することも可能であり、プログラマのチューニング負担を軽減することができる。
本発明は、以上の実施の形態に限定されることなく、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。例えば、以下のような変形が考えられる。
(1)上記実施の形態2のコンパイラでは、C言語向けのコンパイラシステムを想定していたが、本発明はC言語のみに限定されるものではない。他のプログラミング言語を採用した場合でも本発明の有意性は保たれる。
(2)上記実施の形態2のコンパイラでは、高級言語向けのコンパイラシステムを想定していたが、本発明はこれに限定されるものではない。例えば、アセンブラプログラムを入力とするアセンブラにも本発明を同様に適用することができる。
(3)上記実施の形態2では、ターゲットプロセッサとして1サイクルに3命令発行可能で、同時に3スレッドを並行動作可能なプロセッサを想定していたが、本発明はこの同時発行命令数、スレッド数に限定されるものではない。
(4)上記実施の形態2では、ターゲットプロセッサとしてスーパースカラプロセッサを想定していたが、本発明はこれに限定されるものではない。VLIW(Very Long Instruction Word)プロセッサに対しても本発明を適用することができる。
(5)上記実施の形態2では、マルチスレッド実行制御指示解釈部への指示の方法としてプラグマ指令、組み込み関数、コンパイルオプションをそれぞれ規定していたが、本発明はこの規定に限定されるものではない。プラグマ指令としているものを組み込み関数で実現してもよいし、その逆も可能である。またアセンブラプログラムの場合には疑似命令として指示することも可能である。
(6)上記実施の形態2では、マルチスレッド実行制御指示解釈部へ与える命令並列度指示として、プロセッサとして最小の1や最大の3を想定していたが、本発明はこの指定に限定されるものではない。プロセッサの能力の中間にあたる2などの並列度を指定してもよい。
(7)上記実施の形態2では、マルチスレッド実行制御指示解釈部へ与える応答確保区間指示、ストール挿入頻度指示および演算器開放指示として、サイクル数としての頻度を与えていたが、本発明はこの指定に限定されるものではない。ミリ秒等の時間で指定してもよいし、高・中・低のように程度で指定するようにしてもよい。
(8)上記実施の形態2では、マルチスレッド実行制御指示解釈部へ与える演算器開放頻度指示の演算器として乗算器およびメモリアクセスを想定していたが、本発明はこの指定に限定されるものではない。他の演算器を指定してもよいし、ロードとストアを分けるなどのようにより細かい単位で指定するようにしてもよい。
(9)上記実施の形態2では、マルチスレッド実行制御指示解釈部へ与える逼迫度検出指示および実行サイクル期待値指示では、期待値をサイクル数で与えていたが、本発明はこの指定に限定されるものではない。ミリ秒等の時間で指定してもよいし、大・中・小のように程度で指定するようにしてもよい。
(10)上記実施の形態2のオペレーティングシステムでは、プロセス管理およびメモリ管理を伴う汎用オペレーティングシステムを想定していたが、機能を絞り込んだデバイスドライバのようなものでもよい。このような形態であってもAPIを通してハードウェアの適切な制御を行うことが可能である。
さらに、上記実施の形態及び上記変形例をそれぞれ組み合わせるとしても良い。
今回開示された実施の形態はすべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は上記した説明ではなくて特許請求の範囲によって示され、特許請求の範囲と均等の意味及び範囲内でのすべての変更が含まれることが意図される。