演算処理装置および演算処理方法
【課題】命令メモリへのアクセス回数を削減し、消費される電力を低減することができる演算処理装置および演算処理方法の提供を図る。
【解決手段】プロセッサと、予め複数の命令が格納されている命令メモリと、前記プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第1命令を読み取る命令展開装置6と、を有し、前記命令展開装置は、前記第1命令が展開可能な命令か否かを判断する展開判定部64と、前記第1命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて2語以上の第2命令に展開する命令展開部65と、を有し、2語以上の前記第2命令を1サイクルごとに前記プロセッサに出力する。
【解決手段】プロセッサと、予め複数の命令が格納されている命令メモリと、前記プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第1命令を読み取る命令展開装置6と、を有し、前記命令展開装置は、前記第1命令が展開可能な命令か否かを判断する展開判定部64と、前記第1命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて2語以上の第2命令に展開する命令展開部65と、を有し、2語以上の前記第2命令を1サイクルごとに前記プロセッサに出力する。
【発明の詳細な説明】
【技術分野】
【0001】
この出願で言及する実施例は、演算処理装置および演算処理方法に関する。
【背景技術】
【0002】
近年、情報技術の発展に伴って、処理すべき情報の量は、増加の一途を辿っている。一方、情報技術の進歩は、処理すべき情報の量の増加ではなく、処理内容そのものも、より高度化、および、より複雑化する変化が要求されている。
【0003】
このような情報技術の要求に応えるべく、プロセッサ・アーキテクチャが存在する。ところで、プロセッサは、多くの演算器を搭載することで大量の情報を処理することができ、また、プログラムの内容を変えることで、より複雑な内容の処理を行うことができる。
【0004】
プロセッサ・アーキテクチャは、様々なものが存在するが、例えば、大量の情報処理が必要とされるマルチメディアや通信、或いは、数値計算等の分野では、SIMD(Single Instruction Multiple Data)アーキテクチャが利用いられている。
【0005】
ところで、従来、演算処理装置としては、様々なものが提案されている。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】国際公開第97/043710号パンフレット
【特許文献2】特開2009−026106号公報
【特許文献3】特開平11−232096号公報
【特許文献4】特開平11−259293号公報
【発明の概要】
【発明が解決しようとする課題】
【0007】
前述したように、例えば、大量の情報処理が必要とされるマルチメディア等の分野では、SIMDアーキテクチャが利用されている。
【0008】
しかしながら、そのようなSIMDアーキテクチャでは、命令メモリへのアクセス回数が増大するため、演算処理システムにより消費される電力が大きくなるといった問題がある。
【課題を解決するための手段】
【0009】
一実施形態によれば、プロセッサと、予め複数の命令が格納されている命令メモリと、前記プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第1命令を読み取る命令展開装置と、を有する演算処理装置が提供される。
【0010】
前記命令展開装置は、前記第1命令が展開可能な命令か否かを判断する展開判定部と、前記第1命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて2語以上の第2命令に展開する命令展開部と、を有する。そして、前記命令展開装置は、2語以上の前記第2命令を1サイクルごとに前記プロセッサに出力する。
【発明の効果】
【0011】
開示の演算処理装置および演算処理方法は、命令メモリへのアクセス回数を削減し、消費される電力を低減することができるという効果を奏する。
【図面の簡単な説明】
【0012】
【図1】プロセッサ・アーキテクチャの一例を示すブロック図である。
【図2】SIMDレジスタの一例を示すブロック図である。
【図3】SIMD演算器の一例を示すブロック図である。
【図4】SIMD加算命令の一例を説明するための図である。
【図5】本実施例に係るプロセッサ・アーキテクチャの一例を示すブロック図である。
【図6】図5に示すプロセッサ・アーキテクチャにおける命令メモリの動作を説明するための図である。
【図7】図5に示すプロセッサ・アーキテクチャにおける命令展開装置を示すブロック図である。
【図8】図7に示す命令展開装置の処理の一例を示すフローチャートである。
【図9】図7に示す命令展開装置における信号生成部の処理の一例を示すフローチャートである。
【図10】本実施例の演算処理装置の動作を説明するための図(その1)である。
【図11】本実施例の演算処理装置の動作を説明するための図(その2)である。
【発明を実施するための形態】
【0013】
まず、演算処理装置および演算処理方法の実施例を詳述する前に、演算処理装置およびその問題点を図1〜図4を参照して説明する。
【0014】
図1は、プロセッサ・アーキテクチャの一例を示すブロック図である。図1において、参照符号101はプロセッサ、102は命令メモリ、103はデータメモリ、104はバス、そして、105は外部入出力装置を示す。
【0015】
図1に示されるように、演算処理装置は、プロセッサ101、命令メモリ102、および、データメモリ103を有し、バス104を介して外部入出力装置105と接続されている。ここで、プロセッサ101は、内部に設けられた複数の演算器により大量の情報を処理することができ、プログラムの内容を変えることで、より複雑な内容の処理を行うことができる。
【0016】
命令メモリ102は、プロセッサ101が実行するプログラムの命令を格納し、また、データメモリ103は、プログラムのデータを格納する。プロセッサ101は、プログラムの命令を解析し、命令に従った動作を実行する。
【0017】
図1において、外部入出力装置105は、アーキテクチャの外部からの入力と出力を表し、例えば、磁気記憶装置やネットワークインターフェース、または、各種センサ類、或いは、ディスプレイ等であり、形態は様々である。なお、バス104は、プロセッサ101と外部入出力装置105とを接続するものである。
【0018】
ところで、プロセッサ・アーキテクチャは、様々なものが存在するが、例えば、大量の情報処理が必要とされるマルチメディアや通信、或いは、数値計算等の分野では、SIMDアーキテクチャが利用いられている。
【0019】
図2は、SIMDレジスタの一例を示すブロック図であり、また、図3は、SIMD演算器の一例を示すブロック図である。図2および図3に示されるように、SIMDアーキテクチャは、複数のSIMDレジスタR0〜R7,および、複数のSIMD演算器OP0〜OP7を有する。
【0020】
SIMDレジスタは、複数のデータを格納することができるレジスタであり、例えば、8個のレジスタR0〜R7により8個のデータ(要素0〜要素7)を格納する。また、SIMD演算器は、複数のデータに対して同じ計算を行う演算器であり、例えば、8個の加算器OP0〜OP7により、2組のSIMDレジスタから加算する2つのデータを受け取り、それぞれの和を求めて8つのデータを生成する。
【0021】
ところで、1つのSIMD命令で処理できるデータの数は、アーキテクチャに制約され、この制約されるデータの数は、例えば、2,4,8,…等が一般的である。一方、プログラムは、通常、上述した制約されるデータの数よりも多いデータを処理する。
【0022】
そのため、大量のデータを処理するには、同じSIMD命令を複数回実行する必要があり、命令メモリ102へのアクセス回数が増加する。一般に、メモリからのデータの読み込みは、電力を消費するため、例えば、命令メモリ102へのアクセス数が多いと、その分だけ消費電力が増大することになる。
【0023】
図4は、SIMD加算命令の一例を説明するための図であり、32個ずつのデータの和を求める処理を例にして、上述した消費電力の増大の問題を説明する。ここで、SIMDレジスタは、simd0,simd1,…という形で表現し、1つのSIMDレジスタ(R0〜R7)には、上述したように、8つの要素を格納できるものとする。
【0024】
なお、simd0からsimd3までのレジスタには、予め32個のデータが格納され、また、simd8からsimd11までのレジスタには、もう1組の32個のデータが格納されているものとする。そして、加算器OP0〜OP7により加算された32個のデータの和は、simd16からsimd19までのレジスタに格納する場合を考える。
【0025】
なお、SIMDレジスタ同士の和を求めるSIMD演算命令として、simd-add命令があるものとする。なお、本明細書では、アンダーラインとの差異を明確にするために、アンダーバーをハイフン"-"として記載する。
【0026】
図4に示されるように、simd-add命令は、3つのオペランドを取り、第1オペランドと第2オペランドで表されるSIMDレジスタのそれぞれの要素の和を、第3オペランドで表されるSIMDレジスタに格納する。
【0027】
従って、simd-add命令を用いた、32個の和を求めるコードは、次の通りである。
simd-add simd0, simd8, simd16
simd-add simd1, simd9, simd17
simd-add simd2, simd10, simd18
simd-add simd3, simd11, simd19
【0028】
このように、オペランドが連番となる同じ命令が連続することになる。このとき、図1に示すプロセッサ・アーキテクチャでは、上述したコードを実行するために、命令メモリ102へのアクセスが4回発生することになる。このように、命令メモリ102へのアクセスを複数回数行うと、それに伴って消費される電力が増大する。
【0029】
以下、演算処理装置および演算処理方法の実施例を、添付図面を参照して詳述する。図5は、本実施例に係るプロセッサ・アーキテクチャの一例を示すブロック図である。図5において、参照符号1はプロセッサ、2は命令メモリ、3はデータメモリ、4はバス、5は外部入出力装置、そして、6は命令展開装置を示す。
【0030】
図5と前述した図1との比較から明らかなように、本実施例のプロセッサ・アーキテクチャでは、命令展開装置6が設けられている。すなわち、演算処理装置は、プロセッサ1、命令メモリ2、データメモリ3、および、命令展開装置6を有し、バス4を介して外部入出力装置5と接続されている。
【0031】
命令メモリ2は、プロセッサ1が実行するプログラムの命令を格納し、また、データメモリ3は、プログラムのデータを格納する。プロセッサ1は、プログラムの命令を解析し、命令に従った動作を実行する。
【0032】
なお、外部入出力装置5は、例えば、磁気記憶装置やネットワークインターフェース、または、各種センサ類、或いは、ディスプレイ等であり、バス4は、プロセッサ1と外部入出力装置5とを接続するものである。
【0033】
命令展開装置6は、プロセッサから命令アドレス(プログラムカウンタ値:PC)を受け取り、命令メモリ2にアクセス(ADDim)して命令(DATim)を1語読み取る。そして、読み取った命令が命令展開装置6により展開されない命令であれば、その命令(ISTp)をそのままプロセッサ1に渡す。
【0034】
一方、読み取った命令(DATim)が命令展開装置6により展開されるべき命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて2語以上の命令に展開し、さらに、展開された命令を1サイクルごとにプロセッサ1に供給する。
【0035】
命令展開装置6が展開された命令をプロセッサ1に供給している間、命令メモリ2へのアクセスは行わない。そして、命令展開装置6が命令の展開を終えると、命令メモリ2へアクセス(ADDim)を行い、新たな命令(DATim)を得る。
【0036】
ここで、命令メモリ2には、オペランドが連番とされ、定められた展開数だけ並ぶようにして予め命令を配置しておく。
【0037】
すなわち、命令系列に含まれる展開される命令の数は、予め固定の値に決めることができ、また、その展開される命令の数は、読み取った命令の展開処理の開始時に与えることができる。なお、この読み取った命令は、SIMD命令である。
【0038】
このように、予め定められた展開数は、プログラム全体で固定の値としてもよいが、プログラムの途中で変更することもできる。また、同じオペコードで、展開される命令とそうでない命令が存在するため、区別がつくような条件も定めておく。例えば、オペランドで指定されるレジスタの番号が4の倍数といった条件が考えられる。
【0039】
具体的に、前述した32個の和を求める例では、命令メモリ2へアクセスして受け取る命令は、最初の命令simd-add命令だけにすることができる。すなわち、本実施例の演算処理装置において、命令の展開数が4であるため、命令展開装置6は、初めのsimd-add命令を認識し、展開されるべき命令であると判断する。従って、命令メモリ2が受け取る命令は、次の命令だけになる。
simd-add simd0, simd8, simd16
【0040】
そして、命令展開装置6は、1番目,2番目,3番目のオペランドを、ステップ幅を1ずつ変化させて4つの命令を生成し、1サイクルごとにプロセッサ1に供給する。すなわち、命令展開装置6が展開してプロセッサ1に供給する命令は、図1の演算処理装置と同様に、次のようになる。
simd-add simd0, simd8, simd16
simd-add simd1, simd9, simd17
simd-add simd2, simd10, simd18
simd-add simd3, simd11, simd19
【0041】
図6は、図5に示すプロセッサ・アーキテクチャにおける命令メモリの動作を説明するための図である。図6に示されるように、命令メモリ2は、クロックclockに同期している。
【0042】
任意のサイクルcycle-aで命令メモリ2のアドレス線(ADDim)にアドレスadr-aを入力すると、次のサイクルcycle-bで命令メモリ2からのデータ線(DATim)からadr-aに格納されているデータdata-aが出力される。
【0043】
また、命令メモリ2は、チップイネーブル線(CEim)も有しており、チップイネーブル信号CEimが『1』の時は、命令メモリ2からデータ読み出しが可能で、『0』の時は、命令メモリ2からのデータ読み出しは不可能となる。
【0044】
このチップイネーブル信号CEimは、命令展開装置6から出力され、このチップイネーブル信号CEimが『0』で命令メモリ2をディスエーブルにしている間、命令メモリ2が動作しないため、消費電力をより一層低減することが可能になる。なお、データメモリ3も命令メモリ2と同様で、或るサイクルで入力した内容が次のサイクルで反映される。
【0045】
再び、図5を参照すると、命令展開装置6は、プロセッサ1と命令メモリ2との間に設けられている。
【0046】
命令展開装置6は、プロセッサ1からのプログラムカウンタ値(PC:命令メモリへのアドレス)を受け取るPC線、および、プロセッサ1へ命令ISTpを出力するプロセッサ命令線によりプロセッサ1と接続される。
【0047】
さらに、命令展開装置6は、命令メモリ2に対して命令メモリアドレスADDimを出力するアドレス線、および、命令メモリ2から読み出された命令DATimを受け取るデータ線により命令メモリ2と接続される。
【0048】
ここで、プロセッサ1は、内部にプログラムカウンタを有し、そのプログラムカウンタは、次に実行する命令のアドレスを指し示す。前述した図1に示す演算処理装置では、プログラムカウンタの出力(ADDi)がそのまま命令メモリ102のアドレス線に接続され、命令メモリ102は、次のサイクルでそのアドレスADDiに対応する命令ISTをプロセッサ101に返していた。
【0049】
一方、本実施例では、図5に示されるように、プログラムカウンタの出力(カウント値PC)は,命令展開装置6に入力され、命令展開装置6のアドレス出力ADDimが命令メモリ2のアドレス線に接続される。
【0050】
そして、プロセッサ1は、命令を受け取ると、それぞれの命令に応じた処理を行う。なお、命令としては、加算などの演算命令、条件分岐などのプログラムカウント値PCを変更する命令が含まれる。
【0051】
次に、add命令,ld命令,simd-add命令,iret命令およびnop命令を用いて、命令展開装置6の動作を説明する。このうち、展開できる命令は、simd-add命令で、第1オペランドで表されるレジスタの番号が4の倍数となっている命令である。具体的に、次の命令は、展開することができる。
simd-add simd0, simd8, simd16
【0052】
ここで、展開できる命令には、オペランドが連続する命令が予め決められた展開数−1だけ連続すると約束する。従って、上記の命令の後には、次のような命令が並んでいるものと約束する。
simd-add simd1, simd9, simd17
simd-add simd2, simd10, simd18
simd-add simd3, simd11, simd19
【0053】
一方、次の命令は、展開することができない。
simd-add simd1, simd9, simd17
上記の命令は、simd-add命令ではあるが、第1オペランドで表されるレジスタの番号が4の倍数となっていないため、展開することができないものとする。
【0054】
図7は、図5に示すプロセッサ・アーキテクチャにおける命令展開装置を示すブロック図である。図7において、実線の枠で囲った部分が機能ブロックであり、命令展開装置6は、信号生成部61,次PC推定部62,比較器63,展開判定部64,命令展開部65およびセレクタ66の各機能ブロックを有する。
【0055】
図7において、破線の枠で囲った部分が状態を保存するレジスタであり、命令展開装置6は、前PC保存部67,状態保存部68および前命令保存部69の各レジスタも有する。
【0056】
前PC保存部67は、前のサイクルで得られたプログラムカウンタの値(「前PC」)を保存するレジスタであり、また、前命令保存部69は、前のサイクルでプロセッサ1側に出力された命令(「前命令」)を保存するレジスタである。
【0057】
状態保存部68は、信号生成部61が信号を生成するために必要な状態を保存するレジスタであり、現在展開中か否かを表すフラグとカウンタで構成されている。なお、状態保存部68が格納する内容については、後に詳述する。
【0058】
次PC推定部62は、前PC保存部67に格納された「前PC」の次のアドレスを推定する。ここで、本実施例では、命令メモリ2に格納されている命令の長さは全て等しいという前提を持っているため、次PC推定部62は、与えられた「前PC」の値に一定の値を加算する加算器として実装される。
【0059】
比較器63は、次PC推定部62で求められた、前のサイクルでのプログラムカウンタのアドレスの次のアドレスと、現在のサイクルで与えられるプログラムカウンタのアドレスが等しいか否かを判定する。なお、この判定結果は、信号生成部61に出力する。
【0060】
命令展開部65は、前命令保存部69により保存された「前命令」が展開可能であるとき、「前命令」の次の命令に相当する命令を生成する。本実施例では、命令のオペランド部を変化させて命令を生成するため、本命令展開部65でも命令のオペランド部を変化させて命令を生成する。
【0061】
セレクタ66は、命令メモリ2から得られる命令(DATim)、命令展開部65が生成する命令、および、信号生成部61が生成するセレクト信号SELを受け取る。そして、プロセッサ1に対して実際に返すべき命令(ISTp)を、セレクト信号SELに応じて選択して出力する。
【0062】
展開判定部64は、命令メモリ2から得られる命令(DATim)が展開可能か否かを判定する。本実施例において、展開判定部64は、例えば、与えられた命令のオペコードとオペランドから判断する。
【0063】
信号生成部61は、比較器63で比較した結果、展開判定部64での判定結果、および、状態保存部68に保存されたデータを入力とし、命令メモリ2に与えるチップイネーブル信号CEim、および、セレクタ66に与えるセレクト信号SELを生成する。
【0064】
さらに、信号生成部61は、状態保存部68の次のサイクルでの値を生成して、状態保存部68へ出力する。なお、信号生成部61が信号を生成する方法は、後に詳述する。
【0065】
次に、状態保存部68に保存される内容(データ)を説明する。状態保存部68は、フラグとカウンタを有する。ここで、フラグは、現在のサイクルで受け取った命令を展開するか否かを表す「展開する」または「展開しない」の2つの値をとり、また、カウンタは、後何命令だけ命令を展開するかを表す値をカウントする。なお、フラグの初期値は、「展開しない」であり、また、カウンタの初期値は、「0」である。
【0066】
さらに、信号生成部61の動作について説明する。前述したように、信号生成部61は、命令メモリ2のチップイネーブル信号CEim、セレクト信号SEL、および,状態保存部68の次の値、つまり、フラグおよびカウンタの次サイクルでの値を生成する。
【0067】
ここで、信号生成部61に入力される信号からこれらの値を直接生成する方法を記述するのは冗長であるため、まず、以下の3つの中間値を生成する。なお、以下の記述において、『=』は代入、『==』は等しい、『&&』は論理積、そして、『||』は論理和を示す。
【0068】
展開-継続=(フラグの値==展開する)&&カウンタの値≧1&&「比較器63」の結果が真
展開-中止=(フラグの値==展開する)&&(カウンタの値<1||「比較器63」の結果が偽)
展開-開始=(フラグの値==展開しない)&&「展開判定部64」の結果が真
【0069】
また、チップイネーブル信号CEimおよびセレクト信号SELは、以下のようにして生成する。
CEim=0(展開-継続==真||展開-開始==真の時)
=1(上記以外の時)
SEL=「命令展開部65」の結果を選択(フラグの値==展開するの時)
=命令メモリ2の出力(DATim)を選択(上記以外の時)
【0070】
次のフラグの値=展開しない(展開-中止==真の時)
=展開する (展開-開始==真の時)
=現在のフラグの値(上記以外の時)
次のカウンタの値=現在のカウンタの値−1(展開-継続==真の時)
=0(展開-中止==真の時)
=2(展開-開始==真の時)
=現在のカウンタの値(上記以外の時)
【0071】
次に、命令展開装置6の動作フローについて説明する。図8は、図7に示す命令展開装置の処理の一例を示すフローチャートである。
【0072】
処理を開始すると、まず、ステップST11において、状態保存部68,前PC保存部67および前命令保存部69の各レジスタを初期化する。すなわち、状態保存部68,前PC保存部67および前命令保存部69を以下のように初期化して、ステップST12に進む。
【0073】
「状態保存部68」のフラグ: 『展開しない』
「状態保存部68」のカウンタ: 『0』
「前PC保存部67」: 『無効値』
「前命令保存部69」: 『無効値』
【0074】
そして、ステップST12において、プロセッサ1から読み込むべき命令のアドレスを取得する。すなわち、プロセッサ1内では、このアドレスをプログラムカウンタとして指しているため、そのプログラムカウンタ値PCを取得して、ステップST13に進む。
【0075】
ステップST13では、命令メモリ2のチップイネーブル信号CEim,プロセッサ1に渡す命令ISTp,並びに,命令展開装置6の内部状態を更新する信号を生成する。なお、ステップST13における各信号の生成フローは、後に詳述する。
【0076】
ステップST13において、各種信号の生成が終了したら、ステップST14に進み、次のサイクルに備えて、前PC保存部67,前命令保存部69および状態保存部68の各レジスタの値を更新する。
【0077】
すなわち、前PC保存部67は、与えられたPCの値を「前PC」として保存し,前命令保存部69は、先の段階でプロセッサ1に渡した命令ISTpを「前命令」として保存し。そして、状態保存部は、先の段階で生成した値を保存する。なお、生成されない値に関しては、現在の値を保持するものとする。
【0078】
ステップST14で以上の処理が終了したら、ステップST15に進んで、クロックの経過を待って、次のサイクルに備える。
【0079】
図9は、図7に示す命令展開装置における信号生成部の処理の一例を示すフローチャートである。次に、信号生成部61における命令メモリのチップイネーブル信号CEim、プロセッサ1に渡す命令ISTpおよび命令展開装置6の内部状態を更新する信号の生成を、図9を参照して説明する。
【0080】
処理を開始すると、まず、ステップST21において、状態保存部68のフラグを確認して、プロセッサ1に返すべき命令ISTpは、命令メモリ2から取得すべきものなのか、或いは、前命令保存部69の「前命令」から展開するべきものなのかを判断する。
【0081】
ステップST21において、「前命令」から展開すると判断すると、ステップST22に進んで、「前命令」を展開してプロセッサ1に対して命令ISTpを渡す。ここで、命令を展開する場合、「前PC」の命令を展開してプロセッサ1への信号とする。
【0082】
さらに、ステップST23に進んで、チップイネーブル信号CEimと、状態保存部68で保存する次のサイクルでの値を算出する。これは、状態保存部68のカウンタの値と、「前PC」の次の値および与えられたPCの値との関係により、次の2通りに分かれる。
【0083】
すなわち、ステップST23において、状態保存部68のカウンタの値が『1』以上であり、「前PC」の次の値と与えられたPCの値が等しいとき、ステップST24に進む。ステップST24では、次の命令も展開することになるため、チップイネーブル信号CEimを『0』に設定して命令メモリ2を動作させないようにし、その後、カウンタの値を『1』だけ減じる。
【0084】
次に、ステップST23における条件が成立しないとき、これは、予め決めておいた数の命令を展開し終えた場合、或いは、割り込みなどにより別の場所に飛んでしまった場合が考えられる。
【0085】
このときは、「前命令」から命令を展開することができないため、命令メモリ2から命令を読み込む必要がある。そのため、ステップST25に進んで、チップイネーブル信号CEimを『1』に設定し、命令メモリ2を動作させ、その後、カウンタの値を『0』にして、フラグを「展開しない」という値に設定する。
【0086】
以上が、現在のサイクルで命令を展開してプロセッサに渡す場合、すなわち、ステップST21において、展開すると判断した場合の処理である。以下、現在のサイクルで命令メモリからの命令をプロセッサに渡す場合、すなわち、ステップST21において、展開しないと判定した場合の処理を説明する。
【0087】
このときは、まず、ステップST26において、命令メモリ2からの命令をプロセッサ1への信号線に乗せた後、ステップST27に進んで、この命令が展開できるかどうかを判断する。
【0088】
ステップST27において、命令が展開できると判断すると、ステップST28に進んで、状態保存部68のフラグを「展開する」に設定し、カウンタの値を『2』に設定する。このときのカウンタの初期値は、「展開する命令の数」−2である。本実施例では、4命令を展開するため、ここでは、4−2=2を与えている。
【0089】
一方、ステップST27において、命令が展開できないと判断すると、ステップST29に進み、次の命令は、命令メモリ2から取得するため、チップイネーブル信号CEimを『1』に設定し、命令メモリ2を動作させる。このようにして、命令展開装置6における信号生成部61の処理を実行する。
【0090】
図10および図11は、本実施例の命令展開装置の動作を説明するための図である。まず、命令メモリ2には、図10に示す命令が格納されているものとする。なお、図10において、『simd-add』と書かれた命令が展開される命令である。すなわち、次の命令が、命令展開装置6で展開されるべき命令である。
simd-add simd0, simd8, simd16
【0091】
図11に示されるように、縦方向の時間の経過に従って、処理が進められる。なお、図11おいて、各カラムの意味は、次の通りである。
サイクル:現在のサイクル数を表す。
フラグ:現在のサイクルにおける状態保存部68のフラグの値を表す。なお。「しない」と表記した場合は、命令を展開しないことを意味し、また、「する」と表記した場合は、命令を展開することを意味する。
【0092】
カウンタ:現在のサイクルにおける状態保存部68のカウンタの値を表す。
前PC:前のサイクルにおけるプロセッサ1から与えられたPCの値を表す。
PC:現在のサイクルにおけるプロセッサ1から与えられたPCの値を表す。
CEim:現在のサイクルにおける命令メモリに設定するチップイネーブル信号の値を表す。
プロセッサへの命令:現在のサイクルにおけるプロセッサに返す命令を表す。なお、この命令は、前PCで表されるアドレスと対応している。
【0093】
各サイクルにおける動作は、次の通りである。
サイクル0:フラグの値が「展開しない」なので、命令メモリから命令をロードする。このサイクルでは命令メモリからのデータは無効な値が入っているため、命令は展開できない、と解釈する。そのため、チップイネーブル信号は『1』にする。
【0094】
サイクル1:読み込んだ命令が展開できない命令なので、チップイネーブル信号は1のままにする。
サイクル2:サイクル1と同様である。
サイクル3:読み込んだ命令が展開できる種類の命令であるため、チップイネーブル信号を『0』にする。そして、次のサイクルでのフラグを「展開する」にし、カウンタの値を『2』にする。
【0095】
サイクル4:カウンタの値が1以上であり、前PCの次のアドレスが与えられているPCに等しいため、次のサイクルでも命令を展開する、としている。
サイクル5:サイクル4と同様である。
サイクル6:このサイクルでは、前の命令から展開してプロセッサに渡すが、カウンタの値が1よりも小さくなったので次にサイクルでは命令は展開せずに命令メモリから読み込む。そこでフラグを「展開しない」にし、カウンタを0にし、命令メモリのチップイネーブル信号を1にして命令メモリを動作させる。
【0096】
サイクル7:サイクル1と同様である。
サイクル8:サイクル1と同様である。
サイクル9:サイクル3と同様である。
【0097】
サイクル10:このサイクルでは、前の命令から展開してプロセッサに渡す。ところが、割り込みが発生したため、与えられたPCは100であり、前PCの値9の次のアドレス10と異なっている。そのため、次のサイクルでは命令は展開せずに命令メモリから読み込む。そこでフラグを「展開しない」にし、カウンタを0にし、命令メモリのチップイネーブル信号を1にして命令メモリを動作させる。
【0098】
サイクル11:サイクル1と同様である。
サイクル12:サイクル1と同様である。
サイクル13:このサイクルでは展開できる種類の命令、simd-addを命令メモリから読み込んでプロセッサに渡している。しかし、第1オペランドが4の倍数でないため展開できない命令であると解釈する。
サイクル14:サイクル13と同様である。
サイクル15:サイクル13と同様である。
【0099】
以上において、命令展開装置6により展開可能な命令としては、『simd-add』命令以外に、例えば、『simd-adds』命令や『simd0,scr,simd16』命令といった様々なものがある。
【0100】
以上において、本実施例は、例えば、同じVLIW(Very Long Instruction Word)命令がSIMDアレイの中の所定数(例えば、16個)のシェーダプロセッサに対して同時発行するGPU(Graphics Processing Unit)に適用することができる。
【0101】
さらに、本実施例の演算処理装置および演算処理方法は、このようなGPUだけでなく、1チップとして構成されたプロセッサ、或いは、複数のチップで構成されたプロセッサシステム等に対して幅広く適用することができるのはいうまでもない。
【0102】
以上の実施例を含む実施形態に関し、さらに、以下の付記を開示する。
(付記1)
プロセッサと、
予め複数の命令が格納されている命令メモリと、
前記プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第1命令を読み取る命令展開装置と、を有し、
前記命令展開装置は、
前記第1命令が展開可能な命令か否かを判断する展開判定部と、
前記第1命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて2語以上の第2命令に展開する命令展開部と、を有し、2語以上の前記第2命令を1サイクルごとに前記プロセッサに出力する、
ことを特徴とする演算処理装置。
【0103】
(付記2)
前記第1命令が展開可能な命令であれば、2語以上の前記第2命令を1サイクルごとに前記プロセッサに出力し、前記第1命令が展開されない命令であれば、当該第1命令をそのままプロセッサに出力するセレクタを有する、
ことを特徴とする付記1に記載の演算処理装置。
【0104】
(付記3)
前記命令メモリに格納された複数の命令は、所定数の命令で構成された命令系列を含み、
該命令系列は、それぞれの命令のオペコードが同一であり、それぞれの命令の少なくとも1つのオペランド部が予め決まった規則で変化し、残りのオペランド部が変化しない状態で前記命令メモリに格納されている、
ことを特徴とする付記2に記載の演算処理装置。
【0105】
(付記4)
前記命令系列に含まれる命令の数は、前記プロセッサから指定される、
ことを特徴とする付記3に記載の演算処理装置。
【0106】
(付記5)
前記第2命令は、前記オペランド部が1つずつ加算されるように変化する、
ことを特徴とする付記3または付記4に記載の演算処理装置。
【0107】
(付記6)
前記命令系列に含まれる前記第2命令の数は、予め固定の値に決められている、
ことを特徴とする付記1乃至付記5のいずれか1項に記載の演算処理装置。
【0108】
(付記7)
前記命令系列に含まれる前記第2命令の数は、前記第1命令の展開処理の開始時に与えられる、
ことを特徴とする付記1乃至付記5のいずれか1項に記載の演算処理装置。
【0109】
(付記8)
前記第1命令は、SIMD命令である、
ことを特徴とする付記1乃至付記7のいずれか1項に記載の演算処理装置。
【0110】
(付記9)
プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第1命令を読み取り、
前記第1命令が展開可能な命令か否かを判断し、
前記第1命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて2語以上の第2命令に展開し、
2語以上の前記第2命令を1サイクルごとに前記プロセッサに出力し、
前記第1命令が展開されない命令であれば、当該第1命令をそのままプロセッサに出力する、
ことを特徴とする演算処理方法。
【0111】
(付記10)
前記命令メモリに格納された複数の命令は、所定数の命令で構成された命令系列を含み、
該命令系列は、それぞれの命令のオペコードが同一であり、それぞれの命令の少なくとも1つのオペランド部が予め決まった規則で変化し、残りのオペランド部が変化しない状態で前記命令メモリに格納されている、
ことを特徴とする付記9に記載の演算処理方法。
【0112】
(付記11)
前記命令系列に含まれる命令の数は、前記プロセッサから指定される、
ことを特徴とする付記10に記載の演算処理方法。
【0113】
(付記12)
前記第2命令は、前記オペランド部が1つずつ加算されるように変化する、
ことを特徴とする付記10または付記11に記載の演算処理方法。
【0114】
(付記13)
前記命令系列に含まれる前記第2命令の数は、予め固定の値に決められている、
ことを特徴とする付記9乃至付記12のいずれか1項に記載の演算処理方法。
【0115】
(付記14)
前記命令系列に含まれる前記第2命令の数は、前記第1命令の展開処理の開始時に与えられる、
ことを特徴とする付記9乃至付記12のいずれか1項に記載の演算処理方法。
【0116】
(付記15)
前記第1命令は、SIMD命令である、
ことを特徴とする付記9乃至付記14いずれか1項に記載の演算処理方法。
【符号の説明】
【0117】
1,101 プロセッサ
2,102 命令メモリ
3,103 データメモリ
4,104 バス
5,105 外部入出力装置
6 命令展開装置
61 信号生成部
62 次PC推定部
63 比較器
64 展開判定部
65 命令展開部
66 セレクタ
67 前PC保存部(レジスタ)
68 状態保存部(レジスタ)
69 前命令保存部(レジスタ)
【技術分野】
【0001】
この出願で言及する実施例は、演算処理装置および演算処理方法に関する。
【背景技術】
【0002】
近年、情報技術の発展に伴って、処理すべき情報の量は、増加の一途を辿っている。一方、情報技術の進歩は、処理すべき情報の量の増加ではなく、処理内容そのものも、より高度化、および、より複雑化する変化が要求されている。
【0003】
このような情報技術の要求に応えるべく、プロセッサ・アーキテクチャが存在する。ところで、プロセッサは、多くの演算器を搭載することで大量の情報を処理することができ、また、プログラムの内容を変えることで、より複雑な内容の処理を行うことができる。
【0004】
プロセッサ・アーキテクチャは、様々なものが存在するが、例えば、大量の情報処理が必要とされるマルチメディアや通信、或いは、数値計算等の分野では、SIMD(Single Instruction Multiple Data)アーキテクチャが利用いられている。
【0005】
ところで、従来、演算処理装置としては、様々なものが提案されている。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】国際公開第97/043710号パンフレット
【特許文献2】特開2009−026106号公報
【特許文献3】特開平11−232096号公報
【特許文献4】特開平11−259293号公報
【発明の概要】
【発明が解決しようとする課題】
【0007】
前述したように、例えば、大量の情報処理が必要とされるマルチメディア等の分野では、SIMDアーキテクチャが利用されている。
【0008】
しかしながら、そのようなSIMDアーキテクチャでは、命令メモリへのアクセス回数が増大するため、演算処理システムにより消費される電力が大きくなるといった問題がある。
【課題を解決するための手段】
【0009】
一実施形態によれば、プロセッサと、予め複数の命令が格納されている命令メモリと、前記プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第1命令を読み取る命令展開装置と、を有する演算処理装置が提供される。
【0010】
前記命令展開装置は、前記第1命令が展開可能な命令か否かを判断する展開判定部と、前記第1命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて2語以上の第2命令に展開する命令展開部と、を有する。そして、前記命令展開装置は、2語以上の前記第2命令を1サイクルごとに前記プロセッサに出力する。
【発明の効果】
【0011】
開示の演算処理装置および演算処理方法は、命令メモリへのアクセス回数を削減し、消費される電力を低減することができるという効果を奏する。
【図面の簡単な説明】
【0012】
【図1】プロセッサ・アーキテクチャの一例を示すブロック図である。
【図2】SIMDレジスタの一例を示すブロック図である。
【図3】SIMD演算器の一例を示すブロック図である。
【図4】SIMD加算命令の一例を説明するための図である。
【図5】本実施例に係るプロセッサ・アーキテクチャの一例を示すブロック図である。
【図6】図5に示すプロセッサ・アーキテクチャにおける命令メモリの動作を説明するための図である。
【図7】図5に示すプロセッサ・アーキテクチャにおける命令展開装置を示すブロック図である。
【図8】図7に示す命令展開装置の処理の一例を示すフローチャートである。
【図9】図7に示す命令展開装置における信号生成部の処理の一例を示すフローチャートである。
【図10】本実施例の演算処理装置の動作を説明するための図(その1)である。
【図11】本実施例の演算処理装置の動作を説明するための図(その2)である。
【発明を実施するための形態】
【0013】
まず、演算処理装置および演算処理方法の実施例を詳述する前に、演算処理装置およびその問題点を図1〜図4を参照して説明する。
【0014】
図1は、プロセッサ・アーキテクチャの一例を示すブロック図である。図1において、参照符号101はプロセッサ、102は命令メモリ、103はデータメモリ、104はバス、そして、105は外部入出力装置を示す。
【0015】
図1に示されるように、演算処理装置は、プロセッサ101、命令メモリ102、および、データメモリ103を有し、バス104を介して外部入出力装置105と接続されている。ここで、プロセッサ101は、内部に設けられた複数の演算器により大量の情報を処理することができ、プログラムの内容を変えることで、より複雑な内容の処理を行うことができる。
【0016】
命令メモリ102は、プロセッサ101が実行するプログラムの命令を格納し、また、データメモリ103は、プログラムのデータを格納する。プロセッサ101は、プログラムの命令を解析し、命令に従った動作を実行する。
【0017】
図1において、外部入出力装置105は、アーキテクチャの外部からの入力と出力を表し、例えば、磁気記憶装置やネットワークインターフェース、または、各種センサ類、或いは、ディスプレイ等であり、形態は様々である。なお、バス104は、プロセッサ101と外部入出力装置105とを接続するものである。
【0018】
ところで、プロセッサ・アーキテクチャは、様々なものが存在するが、例えば、大量の情報処理が必要とされるマルチメディアや通信、或いは、数値計算等の分野では、SIMDアーキテクチャが利用いられている。
【0019】
図2は、SIMDレジスタの一例を示すブロック図であり、また、図3は、SIMD演算器の一例を示すブロック図である。図2および図3に示されるように、SIMDアーキテクチャは、複数のSIMDレジスタR0〜R7,および、複数のSIMD演算器OP0〜OP7を有する。
【0020】
SIMDレジスタは、複数のデータを格納することができるレジスタであり、例えば、8個のレジスタR0〜R7により8個のデータ(要素0〜要素7)を格納する。また、SIMD演算器は、複数のデータに対して同じ計算を行う演算器であり、例えば、8個の加算器OP0〜OP7により、2組のSIMDレジスタから加算する2つのデータを受け取り、それぞれの和を求めて8つのデータを生成する。
【0021】
ところで、1つのSIMD命令で処理できるデータの数は、アーキテクチャに制約され、この制約されるデータの数は、例えば、2,4,8,…等が一般的である。一方、プログラムは、通常、上述した制約されるデータの数よりも多いデータを処理する。
【0022】
そのため、大量のデータを処理するには、同じSIMD命令を複数回実行する必要があり、命令メモリ102へのアクセス回数が増加する。一般に、メモリからのデータの読み込みは、電力を消費するため、例えば、命令メモリ102へのアクセス数が多いと、その分だけ消費電力が増大することになる。
【0023】
図4は、SIMD加算命令の一例を説明するための図であり、32個ずつのデータの和を求める処理を例にして、上述した消費電力の増大の問題を説明する。ここで、SIMDレジスタは、simd0,simd1,…という形で表現し、1つのSIMDレジスタ(R0〜R7)には、上述したように、8つの要素を格納できるものとする。
【0024】
なお、simd0からsimd3までのレジスタには、予め32個のデータが格納され、また、simd8からsimd11までのレジスタには、もう1組の32個のデータが格納されているものとする。そして、加算器OP0〜OP7により加算された32個のデータの和は、simd16からsimd19までのレジスタに格納する場合を考える。
【0025】
なお、SIMDレジスタ同士の和を求めるSIMD演算命令として、simd-add命令があるものとする。なお、本明細書では、アンダーラインとの差異を明確にするために、アンダーバーをハイフン"-"として記載する。
【0026】
図4に示されるように、simd-add命令は、3つのオペランドを取り、第1オペランドと第2オペランドで表されるSIMDレジスタのそれぞれの要素の和を、第3オペランドで表されるSIMDレジスタに格納する。
【0027】
従って、simd-add命令を用いた、32個の和を求めるコードは、次の通りである。
simd-add simd0, simd8, simd16
simd-add simd1, simd9, simd17
simd-add simd2, simd10, simd18
simd-add simd3, simd11, simd19
【0028】
このように、オペランドが連番となる同じ命令が連続することになる。このとき、図1に示すプロセッサ・アーキテクチャでは、上述したコードを実行するために、命令メモリ102へのアクセスが4回発生することになる。このように、命令メモリ102へのアクセスを複数回数行うと、それに伴って消費される電力が増大する。
【0029】
以下、演算処理装置および演算処理方法の実施例を、添付図面を参照して詳述する。図5は、本実施例に係るプロセッサ・アーキテクチャの一例を示すブロック図である。図5において、参照符号1はプロセッサ、2は命令メモリ、3はデータメモリ、4はバス、5は外部入出力装置、そして、6は命令展開装置を示す。
【0030】
図5と前述した図1との比較から明らかなように、本実施例のプロセッサ・アーキテクチャでは、命令展開装置6が設けられている。すなわち、演算処理装置は、プロセッサ1、命令メモリ2、データメモリ3、および、命令展開装置6を有し、バス4を介して外部入出力装置5と接続されている。
【0031】
命令メモリ2は、プロセッサ1が実行するプログラムの命令を格納し、また、データメモリ3は、プログラムのデータを格納する。プロセッサ1は、プログラムの命令を解析し、命令に従った動作を実行する。
【0032】
なお、外部入出力装置5は、例えば、磁気記憶装置やネットワークインターフェース、または、各種センサ類、或いは、ディスプレイ等であり、バス4は、プロセッサ1と外部入出力装置5とを接続するものである。
【0033】
命令展開装置6は、プロセッサから命令アドレス(プログラムカウンタ値:PC)を受け取り、命令メモリ2にアクセス(ADDim)して命令(DATim)を1語読み取る。そして、読み取った命令が命令展開装置6により展開されない命令であれば、その命令(ISTp)をそのままプロセッサ1に渡す。
【0034】
一方、読み取った命令(DATim)が命令展開装置6により展開されるべき命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて2語以上の命令に展開し、さらに、展開された命令を1サイクルごとにプロセッサ1に供給する。
【0035】
命令展開装置6が展開された命令をプロセッサ1に供給している間、命令メモリ2へのアクセスは行わない。そして、命令展開装置6が命令の展開を終えると、命令メモリ2へアクセス(ADDim)を行い、新たな命令(DATim)を得る。
【0036】
ここで、命令メモリ2には、オペランドが連番とされ、定められた展開数だけ並ぶようにして予め命令を配置しておく。
【0037】
すなわち、命令系列に含まれる展開される命令の数は、予め固定の値に決めることができ、また、その展開される命令の数は、読み取った命令の展開処理の開始時に与えることができる。なお、この読み取った命令は、SIMD命令である。
【0038】
このように、予め定められた展開数は、プログラム全体で固定の値としてもよいが、プログラムの途中で変更することもできる。また、同じオペコードで、展開される命令とそうでない命令が存在するため、区別がつくような条件も定めておく。例えば、オペランドで指定されるレジスタの番号が4の倍数といった条件が考えられる。
【0039】
具体的に、前述した32個の和を求める例では、命令メモリ2へアクセスして受け取る命令は、最初の命令simd-add命令だけにすることができる。すなわち、本実施例の演算処理装置において、命令の展開数が4であるため、命令展開装置6は、初めのsimd-add命令を認識し、展開されるべき命令であると判断する。従って、命令メモリ2が受け取る命令は、次の命令だけになる。
simd-add simd0, simd8, simd16
【0040】
そして、命令展開装置6は、1番目,2番目,3番目のオペランドを、ステップ幅を1ずつ変化させて4つの命令を生成し、1サイクルごとにプロセッサ1に供給する。すなわち、命令展開装置6が展開してプロセッサ1に供給する命令は、図1の演算処理装置と同様に、次のようになる。
simd-add simd0, simd8, simd16
simd-add simd1, simd9, simd17
simd-add simd2, simd10, simd18
simd-add simd3, simd11, simd19
【0041】
図6は、図5に示すプロセッサ・アーキテクチャにおける命令メモリの動作を説明するための図である。図6に示されるように、命令メモリ2は、クロックclockに同期している。
【0042】
任意のサイクルcycle-aで命令メモリ2のアドレス線(ADDim)にアドレスadr-aを入力すると、次のサイクルcycle-bで命令メモリ2からのデータ線(DATim)からadr-aに格納されているデータdata-aが出力される。
【0043】
また、命令メモリ2は、チップイネーブル線(CEim)も有しており、チップイネーブル信号CEimが『1』の時は、命令メモリ2からデータ読み出しが可能で、『0』の時は、命令メモリ2からのデータ読み出しは不可能となる。
【0044】
このチップイネーブル信号CEimは、命令展開装置6から出力され、このチップイネーブル信号CEimが『0』で命令メモリ2をディスエーブルにしている間、命令メモリ2が動作しないため、消費電力をより一層低減することが可能になる。なお、データメモリ3も命令メモリ2と同様で、或るサイクルで入力した内容が次のサイクルで反映される。
【0045】
再び、図5を参照すると、命令展開装置6は、プロセッサ1と命令メモリ2との間に設けられている。
【0046】
命令展開装置6は、プロセッサ1からのプログラムカウンタ値(PC:命令メモリへのアドレス)を受け取るPC線、および、プロセッサ1へ命令ISTpを出力するプロセッサ命令線によりプロセッサ1と接続される。
【0047】
さらに、命令展開装置6は、命令メモリ2に対して命令メモリアドレスADDimを出力するアドレス線、および、命令メモリ2から読み出された命令DATimを受け取るデータ線により命令メモリ2と接続される。
【0048】
ここで、プロセッサ1は、内部にプログラムカウンタを有し、そのプログラムカウンタは、次に実行する命令のアドレスを指し示す。前述した図1に示す演算処理装置では、プログラムカウンタの出力(ADDi)がそのまま命令メモリ102のアドレス線に接続され、命令メモリ102は、次のサイクルでそのアドレスADDiに対応する命令ISTをプロセッサ101に返していた。
【0049】
一方、本実施例では、図5に示されるように、プログラムカウンタの出力(カウント値PC)は,命令展開装置6に入力され、命令展開装置6のアドレス出力ADDimが命令メモリ2のアドレス線に接続される。
【0050】
そして、プロセッサ1は、命令を受け取ると、それぞれの命令に応じた処理を行う。なお、命令としては、加算などの演算命令、条件分岐などのプログラムカウント値PCを変更する命令が含まれる。
【0051】
次に、add命令,ld命令,simd-add命令,iret命令およびnop命令を用いて、命令展開装置6の動作を説明する。このうち、展開できる命令は、simd-add命令で、第1オペランドで表されるレジスタの番号が4の倍数となっている命令である。具体的に、次の命令は、展開することができる。
simd-add simd0, simd8, simd16
【0052】
ここで、展開できる命令には、オペランドが連続する命令が予め決められた展開数−1だけ連続すると約束する。従って、上記の命令の後には、次のような命令が並んでいるものと約束する。
simd-add simd1, simd9, simd17
simd-add simd2, simd10, simd18
simd-add simd3, simd11, simd19
【0053】
一方、次の命令は、展開することができない。
simd-add simd1, simd9, simd17
上記の命令は、simd-add命令ではあるが、第1オペランドで表されるレジスタの番号が4の倍数となっていないため、展開することができないものとする。
【0054】
図7は、図5に示すプロセッサ・アーキテクチャにおける命令展開装置を示すブロック図である。図7において、実線の枠で囲った部分が機能ブロックであり、命令展開装置6は、信号生成部61,次PC推定部62,比較器63,展開判定部64,命令展開部65およびセレクタ66の各機能ブロックを有する。
【0055】
図7において、破線の枠で囲った部分が状態を保存するレジスタであり、命令展開装置6は、前PC保存部67,状態保存部68および前命令保存部69の各レジスタも有する。
【0056】
前PC保存部67は、前のサイクルで得られたプログラムカウンタの値(「前PC」)を保存するレジスタであり、また、前命令保存部69は、前のサイクルでプロセッサ1側に出力された命令(「前命令」)を保存するレジスタである。
【0057】
状態保存部68は、信号生成部61が信号を生成するために必要な状態を保存するレジスタであり、現在展開中か否かを表すフラグとカウンタで構成されている。なお、状態保存部68が格納する内容については、後に詳述する。
【0058】
次PC推定部62は、前PC保存部67に格納された「前PC」の次のアドレスを推定する。ここで、本実施例では、命令メモリ2に格納されている命令の長さは全て等しいという前提を持っているため、次PC推定部62は、与えられた「前PC」の値に一定の値を加算する加算器として実装される。
【0059】
比較器63は、次PC推定部62で求められた、前のサイクルでのプログラムカウンタのアドレスの次のアドレスと、現在のサイクルで与えられるプログラムカウンタのアドレスが等しいか否かを判定する。なお、この判定結果は、信号生成部61に出力する。
【0060】
命令展開部65は、前命令保存部69により保存された「前命令」が展開可能であるとき、「前命令」の次の命令に相当する命令を生成する。本実施例では、命令のオペランド部を変化させて命令を生成するため、本命令展開部65でも命令のオペランド部を変化させて命令を生成する。
【0061】
セレクタ66は、命令メモリ2から得られる命令(DATim)、命令展開部65が生成する命令、および、信号生成部61が生成するセレクト信号SELを受け取る。そして、プロセッサ1に対して実際に返すべき命令(ISTp)を、セレクト信号SELに応じて選択して出力する。
【0062】
展開判定部64は、命令メモリ2から得られる命令(DATim)が展開可能か否かを判定する。本実施例において、展開判定部64は、例えば、与えられた命令のオペコードとオペランドから判断する。
【0063】
信号生成部61は、比較器63で比較した結果、展開判定部64での判定結果、および、状態保存部68に保存されたデータを入力とし、命令メモリ2に与えるチップイネーブル信号CEim、および、セレクタ66に与えるセレクト信号SELを生成する。
【0064】
さらに、信号生成部61は、状態保存部68の次のサイクルでの値を生成して、状態保存部68へ出力する。なお、信号生成部61が信号を生成する方法は、後に詳述する。
【0065】
次に、状態保存部68に保存される内容(データ)を説明する。状態保存部68は、フラグとカウンタを有する。ここで、フラグは、現在のサイクルで受け取った命令を展開するか否かを表す「展開する」または「展開しない」の2つの値をとり、また、カウンタは、後何命令だけ命令を展開するかを表す値をカウントする。なお、フラグの初期値は、「展開しない」であり、また、カウンタの初期値は、「0」である。
【0066】
さらに、信号生成部61の動作について説明する。前述したように、信号生成部61は、命令メモリ2のチップイネーブル信号CEim、セレクト信号SEL、および,状態保存部68の次の値、つまり、フラグおよびカウンタの次サイクルでの値を生成する。
【0067】
ここで、信号生成部61に入力される信号からこれらの値を直接生成する方法を記述するのは冗長であるため、まず、以下の3つの中間値を生成する。なお、以下の記述において、『=』は代入、『==』は等しい、『&&』は論理積、そして、『||』は論理和を示す。
【0068】
展開-継続=(フラグの値==展開する)&&カウンタの値≧1&&「比較器63」の結果が真
展開-中止=(フラグの値==展開する)&&(カウンタの値<1||「比較器63」の結果が偽)
展開-開始=(フラグの値==展開しない)&&「展開判定部64」の結果が真
【0069】
また、チップイネーブル信号CEimおよびセレクト信号SELは、以下のようにして生成する。
CEim=0(展開-継続==真||展開-開始==真の時)
=1(上記以外の時)
SEL=「命令展開部65」の結果を選択(フラグの値==展開するの時)
=命令メモリ2の出力(DATim)を選択(上記以外の時)
【0070】
次のフラグの値=展開しない(展開-中止==真の時)
=展開する (展開-開始==真の時)
=現在のフラグの値(上記以外の時)
次のカウンタの値=現在のカウンタの値−1(展開-継続==真の時)
=0(展開-中止==真の時)
=2(展開-開始==真の時)
=現在のカウンタの値(上記以外の時)
【0071】
次に、命令展開装置6の動作フローについて説明する。図8は、図7に示す命令展開装置の処理の一例を示すフローチャートである。
【0072】
処理を開始すると、まず、ステップST11において、状態保存部68,前PC保存部67および前命令保存部69の各レジスタを初期化する。すなわち、状態保存部68,前PC保存部67および前命令保存部69を以下のように初期化して、ステップST12に進む。
【0073】
「状態保存部68」のフラグ: 『展開しない』
「状態保存部68」のカウンタ: 『0』
「前PC保存部67」: 『無効値』
「前命令保存部69」: 『無効値』
【0074】
そして、ステップST12において、プロセッサ1から読み込むべき命令のアドレスを取得する。すなわち、プロセッサ1内では、このアドレスをプログラムカウンタとして指しているため、そのプログラムカウンタ値PCを取得して、ステップST13に進む。
【0075】
ステップST13では、命令メモリ2のチップイネーブル信号CEim,プロセッサ1に渡す命令ISTp,並びに,命令展開装置6の内部状態を更新する信号を生成する。なお、ステップST13における各信号の生成フローは、後に詳述する。
【0076】
ステップST13において、各種信号の生成が終了したら、ステップST14に進み、次のサイクルに備えて、前PC保存部67,前命令保存部69および状態保存部68の各レジスタの値を更新する。
【0077】
すなわち、前PC保存部67は、与えられたPCの値を「前PC」として保存し,前命令保存部69は、先の段階でプロセッサ1に渡した命令ISTpを「前命令」として保存し。そして、状態保存部は、先の段階で生成した値を保存する。なお、生成されない値に関しては、現在の値を保持するものとする。
【0078】
ステップST14で以上の処理が終了したら、ステップST15に進んで、クロックの経過を待って、次のサイクルに備える。
【0079】
図9は、図7に示す命令展開装置における信号生成部の処理の一例を示すフローチャートである。次に、信号生成部61における命令メモリのチップイネーブル信号CEim、プロセッサ1に渡す命令ISTpおよび命令展開装置6の内部状態を更新する信号の生成を、図9を参照して説明する。
【0080】
処理を開始すると、まず、ステップST21において、状態保存部68のフラグを確認して、プロセッサ1に返すべき命令ISTpは、命令メモリ2から取得すべきものなのか、或いは、前命令保存部69の「前命令」から展開するべきものなのかを判断する。
【0081】
ステップST21において、「前命令」から展開すると判断すると、ステップST22に進んで、「前命令」を展開してプロセッサ1に対して命令ISTpを渡す。ここで、命令を展開する場合、「前PC」の命令を展開してプロセッサ1への信号とする。
【0082】
さらに、ステップST23に進んで、チップイネーブル信号CEimと、状態保存部68で保存する次のサイクルでの値を算出する。これは、状態保存部68のカウンタの値と、「前PC」の次の値および与えられたPCの値との関係により、次の2通りに分かれる。
【0083】
すなわち、ステップST23において、状態保存部68のカウンタの値が『1』以上であり、「前PC」の次の値と与えられたPCの値が等しいとき、ステップST24に進む。ステップST24では、次の命令も展開することになるため、チップイネーブル信号CEimを『0』に設定して命令メモリ2を動作させないようにし、その後、カウンタの値を『1』だけ減じる。
【0084】
次に、ステップST23における条件が成立しないとき、これは、予め決めておいた数の命令を展開し終えた場合、或いは、割り込みなどにより別の場所に飛んでしまった場合が考えられる。
【0085】
このときは、「前命令」から命令を展開することができないため、命令メモリ2から命令を読み込む必要がある。そのため、ステップST25に進んで、チップイネーブル信号CEimを『1』に設定し、命令メモリ2を動作させ、その後、カウンタの値を『0』にして、フラグを「展開しない」という値に設定する。
【0086】
以上が、現在のサイクルで命令を展開してプロセッサに渡す場合、すなわち、ステップST21において、展開すると判断した場合の処理である。以下、現在のサイクルで命令メモリからの命令をプロセッサに渡す場合、すなわち、ステップST21において、展開しないと判定した場合の処理を説明する。
【0087】
このときは、まず、ステップST26において、命令メモリ2からの命令をプロセッサ1への信号線に乗せた後、ステップST27に進んで、この命令が展開できるかどうかを判断する。
【0088】
ステップST27において、命令が展開できると判断すると、ステップST28に進んで、状態保存部68のフラグを「展開する」に設定し、カウンタの値を『2』に設定する。このときのカウンタの初期値は、「展開する命令の数」−2である。本実施例では、4命令を展開するため、ここでは、4−2=2を与えている。
【0089】
一方、ステップST27において、命令が展開できないと判断すると、ステップST29に進み、次の命令は、命令メモリ2から取得するため、チップイネーブル信号CEimを『1』に設定し、命令メモリ2を動作させる。このようにして、命令展開装置6における信号生成部61の処理を実行する。
【0090】
図10および図11は、本実施例の命令展開装置の動作を説明するための図である。まず、命令メモリ2には、図10に示す命令が格納されているものとする。なお、図10において、『simd-add』と書かれた命令が展開される命令である。すなわち、次の命令が、命令展開装置6で展開されるべき命令である。
simd-add simd0, simd8, simd16
【0091】
図11に示されるように、縦方向の時間の経過に従って、処理が進められる。なお、図11おいて、各カラムの意味は、次の通りである。
サイクル:現在のサイクル数を表す。
フラグ:現在のサイクルにおける状態保存部68のフラグの値を表す。なお。「しない」と表記した場合は、命令を展開しないことを意味し、また、「する」と表記した場合は、命令を展開することを意味する。
【0092】
カウンタ:現在のサイクルにおける状態保存部68のカウンタの値を表す。
前PC:前のサイクルにおけるプロセッサ1から与えられたPCの値を表す。
PC:現在のサイクルにおけるプロセッサ1から与えられたPCの値を表す。
CEim:現在のサイクルにおける命令メモリに設定するチップイネーブル信号の値を表す。
プロセッサへの命令:現在のサイクルにおけるプロセッサに返す命令を表す。なお、この命令は、前PCで表されるアドレスと対応している。
【0093】
各サイクルにおける動作は、次の通りである。
サイクル0:フラグの値が「展開しない」なので、命令メモリから命令をロードする。このサイクルでは命令メモリからのデータは無効な値が入っているため、命令は展開できない、と解釈する。そのため、チップイネーブル信号は『1』にする。
【0094】
サイクル1:読み込んだ命令が展開できない命令なので、チップイネーブル信号は1のままにする。
サイクル2:サイクル1と同様である。
サイクル3:読み込んだ命令が展開できる種類の命令であるため、チップイネーブル信号を『0』にする。そして、次のサイクルでのフラグを「展開する」にし、カウンタの値を『2』にする。
【0095】
サイクル4:カウンタの値が1以上であり、前PCの次のアドレスが与えられているPCに等しいため、次のサイクルでも命令を展開する、としている。
サイクル5:サイクル4と同様である。
サイクル6:このサイクルでは、前の命令から展開してプロセッサに渡すが、カウンタの値が1よりも小さくなったので次にサイクルでは命令は展開せずに命令メモリから読み込む。そこでフラグを「展開しない」にし、カウンタを0にし、命令メモリのチップイネーブル信号を1にして命令メモリを動作させる。
【0096】
サイクル7:サイクル1と同様である。
サイクル8:サイクル1と同様である。
サイクル9:サイクル3と同様である。
【0097】
サイクル10:このサイクルでは、前の命令から展開してプロセッサに渡す。ところが、割り込みが発生したため、与えられたPCは100であり、前PCの値9の次のアドレス10と異なっている。そのため、次のサイクルでは命令は展開せずに命令メモリから読み込む。そこでフラグを「展開しない」にし、カウンタを0にし、命令メモリのチップイネーブル信号を1にして命令メモリを動作させる。
【0098】
サイクル11:サイクル1と同様である。
サイクル12:サイクル1と同様である。
サイクル13:このサイクルでは展開できる種類の命令、simd-addを命令メモリから読み込んでプロセッサに渡している。しかし、第1オペランドが4の倍数でないため展開できない命令であると解釈する。
サイクル14:サイクル13と同様である。
サイクル15:サイクル13と同様である。
【0099】
以上において、命令展開装置6により展開可能な命令としては、『simd-add』命令以外に、例えば、『simd-adds』命令や『simd0,scr,simd16』命令といった様々なものがある。
【0100】
以上において、本実施例は、例えば、同じVLIW(Very Long Instruction Word)命令がSIMDアレイの中の所定数(例えば、16個)のシェーダプロセッサに対して同時発行するGPU(Graphics Processing Unit)に適用することができる。
【0101】
さらに、本実施例の演算処理装置および演算処理方法は、このようなGPUだけでなく、1チップとして構成されたプロセッサ、或いは、複数のチップで構成されたプロセッサシステム等に対して幅広く適用することができるのはいうまでもない。
【0102】
以上の実施例を含む実施形態に関し、さらに、以下の付記を開示する。
(付記1)
プロセッサと、
予め複数の命令が格納されている命令メモリと、
前記プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第1命令を読み取る命令展開装置と、を有し、
前記命令展開装置は、
前記第1命令が展開可能な命令か否かを判断する展開判定部と、
前記第1命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて2語以上の第2命令に展開する命令展開部と、を有し、2語以上の前記第2命令を1サイクルごとに前記プロセッサに出力する、
ことを特徴とする演算処理装置。
【0103】
(付記2)
前記第1命令が展開可能な命令であれば、2語以上の前記第2命令を1サイクルごとに前記プロセッサに出力し、前記第1命令が展開されない命令であれば、当該第1命令をそのままプロセッサに出力するセレクタを有する、
ことを特徴とする付記1に記載の演算処理装置。
【0104】
(付記3)
前記命令メモリに格納された複数の命令は、所定数の命令で構成された命令系列を含み、
該命令系列は、それぞれの命令のオペコードが同一であり、それぞれの命令の少なくとも1つのオペランド部が予め決まった規則で変化し、残りのオペランド部が変化しない状態で前記命令メモリに格納されている、
ことを特徴とする付記2に記載の演算処理装置。
【0105】
(付記4)
前記命令系列に含まれる命令の数は、前記プロセッサから指定される、
ことを特徴とする付記3に記載の演算処理装置。
【0106】
(付記5)
前記第2命令は、前記オペランド部が1つずつ加算されるように変化する、
ことを特徴とする付記3または付記4に記載の演算処理装置。
【0107】
(付記6)
前記命令系列に含まれる前記第2命令の数は、予め固定の値に決められている、
ことを特徴とする付記1乃至付記5のいずれか1項に記載の演算処理装置。
【0108】
(付記7)
前記命令系列に含まれる前記第2命令の数は、前記第1命令の展開処理の開始時に与えられる、
ことを特徴とする付記1乃至付記5のいずれか1項に記載の演算処理装置。
【0109】
(付記8)
前記第1命令は、SIMD命令である、
ことを特徴とする付記1乃至付記7のいずれか1項に記載の演算処理装置。
【0110】
(付記9)
プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第1命令を読み取り、
前記第1命令が展開可能な命令か否かを判断し、
前記第1命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて2語以上の第2命令に展開し、
2語以上の前記第2命令を1サイクルごとに前記プロセッサに出力し、
前記第1命令が展開されない命令であれば、当該第1命令をそのままプロセッサに出力する、
ことを特徴とする演算処理方法。
【0111】
(付記10)
前記命令メモリに格納された複数の命令は、所定数の命令で構成された命令系列を含み、
該命令系列は、それぞれの命令のオペコードが同一であり、それぞれの命令の少なくとも1つのオペランド部が予め決まった規則で変化し、残りのオペランド部が変化しない状態で前記命令メモリに格納されている、
ことを特徴とする付記9に記載の演算処理方法。
【0112】
(付記11)
前記命令系列に含まれる命令の数は、前記プロセッサから指定される、
ことを特徴とする付記10に記載の演算処理方法。
【0113】
(付記12)
前記第2命令は、前記オペランド部が1つずつ加算されるように変化する、
ことを特徴とする付記10または付記11に記載の演算処理方法。
【0114】
(付記13)
前記命令系列に含まれる前記第2命令の数は、予め固定の値に決められている、
ことを特徴とする付記9乃至付記12のいずれか1項に記載の演算処理方法。
【0115】
(付記14)
前記命令系列に含まれる前記第2命令の数は、前記第1命令の展開処理の開始時に与えられる、
ことを特徴とする付記9乃至付記12のいずれか1項に記載の演算処理方法。
【0116】
(付記15)
前記第1命令は、SIMD命令である、
ことを特徴とする付記9乃至付記14いずれか1項に記載の演算処理方法。
【符号の説明】
【0117】
1,101 プロセッサ
2,102 命令メモリ
3,103 データメモリ
4,104 バス
5,105 外部入出力装置
6 命令展開装置
61 信号生成部
62 次PC推定部
63 比較器
64 展開判定部
65 命令展開部
66 セレクタ
67 前PC保存部(レジスタ)
68 状態保存部(レジスタ)
69 前命令保存部(レジスタ)
【特許請求の範囲】
【請求項1】
プロセッサと、
予め複数の命令が格納されている命令メモリと、
前記プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第1命令を読み取る命令展開装置と、を有し、
前記命令展開装置は、
前記第1命令が展開可能な命令か否かを判断する展開判定部と、
前記第1命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて2語以上の第2命令に展開する命令展開部と、を有し、2語以上の前記第2命令を1サイクルごとに前記プロセッサに出力する、
ことを特徴とする演算処理装置。
【請求項2】
前記第1命令が展開可能な命令であれば、2語以上の前記第2命令を1サイクルごとに前記プロセッサに出力し、前記第1命令が展開されない命令であれば、当該第1命令をそのままプロセッサに出力するセレクタを有する、
ことを特徴とする請求項1に記載の演算処理装置。
【請求項3】
前記命令メモリに格納された複数の命令は、所定数の命令で構成された命令系列を含み、
該命令系列は、それぞれの命令のオペコードが同一であり、それぞれの命令の少なくとも1つのオペランド部が予め決まった規則で変化し、残りのオペランド部が変化しない状態で前記命令メモリに格納されている,
ことを特徴とする請求項2に記載の演算処理装置。
【請求項4】
プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第1命令を読み取り、
前記第1命令が展開可能な命令か否かを判断し、
前記第1命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて2語以上の第2命令に展開し、
2語以上の前記第2命令を1サイクルごとに前記プロセッサに出力し、
前記第1命令が展開されない命令であれば、当該第1命令をそのままプロセッサに出力する、
ことを特徴とする演算処理方法。
【請求項5】
前記命令メモリに格納された複数の命令は、所定数の命令で構成された命令系列を含み、
該命令系列は、それぞれの命令のオペコードが同一であり、それぞれの命令の少なくとも1つのオペランド部が予め決まった規則で変化し、残りのオペランド部が変化しない状態で前記命令メモリに格納されている,
ことを特徴とする請求項4に記載の演算処理方法。
【請求項1】
プロセッサと、
予め複数の命令が格納されている命令メモリと、
前記プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第1命令を読み取る命令展開装置と、を有し、
前記命令展開装置は、
前記第1命令が展開可能な命令か否かを判断する展開判定部と、
前記第1命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて2語以上の第2命令に展開する命令展開部と、を有し、2語以上の前記第2命令を1サイクルごとに前記プロセッサに出力する、
ことを特徴とする演算処理装置。
【請求項2】
前記第1命令が展開可能な命令であれば、2語以上の前記第2命令を1サイクルごとに前記プロセッサに出力し、前記第1命令が展開されない命令であれば、当該第1命令をそのままプロセッサに出力するセレクタを有する、
ことを特徴とする請求項1に記載の演算処理装置。
【請求項3】
前記命令メモリに格納された複数の命令は、所定数の命令で構成された命令系列を含み、
該命令系列は、それぞれの命令のオペコードが同一であり、それぞれの命令の少なくとも1つのオペランド部が予め決まった規則で変化し、残りのオペランド部が変化しない状態で前記命令メモリに格納されている,
ことを特徴とする請求項2に記載の演算処理装置。
【請求項4】
プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第1命令を読み取り、
前記第1命令が展開可能な命令か否かを判断し、
前記第1命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて2語以上の第2命令に展開し、
2語以上の前記第2命令を1サイクルごとに前記プロセッサに出力し、
前記第1命令が展開されない命令であれば、当該第1命令をそのままプロセッサに出力する、
ことを特徴とする演算処理方法。
【請求項5】
前記命令メモリに格納された複数の命令は、所定数の命令で構成された命令系列を含み、
該命令系列は、それぞれの命令のオペコードが同一であり、それぞれの命令の少なくとも1つのオペランド部が予め決まった規則で変化し、残りのオペランド部が変化しない状態で前記命令メモリに格納されている,
ことを特徴とする請求項4に記載の演算処理方法。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【公開番号】特開2013−8266(P2013−8266A)
【公開日】平成25年1月10日(2013.1.10)
【国際特許分類】
【出願番号】特願2011−141465(P2011−141465)
【出願日】平成23年6月27日(2011.6.27)
【出願人】(000005223)富士通株式会社 (25,993)
【Fターム(参考)】
【公開日】平成25年1月10日(2013.1.10)
【国際特許分類】
【出願日】平成23年6月27日(2011.6.27)
【出願人】(000005223)富士通株式会社 (25,993)
【Fターム(参考)】
[ Back to top ]