(57)【要約】【課題】命令メモリへのアクセス回数を削減し、消費される電力を低減することができる演算処理装置および演算処理方法の提供を図る。【解決手段】プロセッサと、予め複数の命令が格納されている命令メモリと、前記プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第１命令を読み取る命令展開装置６と、を有し、前記命令展開装置は、前記第１命令が展開可能な命令か否かを判断する展開判定部６４と、前記第１命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて２語以上の第２命令に展開する命令展開部６５と、を有し、２語以上の前記第２命令を１サイクルごとに前記プロセッサに出力する。【選択図】図７
2013008266.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサと、
予め複数の命令が格納されている命令メモリと、
前記プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第１命令を読み取る命令展開装置と、を有し、
前記命令展開装置は、
前記第１命令が展開可能な命令か否かを判断する展開判定部と、
前記第１命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて２語以上の第２命令に展開する命令展開部と、を有し、２語以上の前記第２命令を１サイクルごとに前記プロセッサに出力する、
ことを特徴とする演算処理装置。
【請求項２】
前記第１命令が展開可能な命令であれば、２語以上の前記第２命令を１サイクルごとに前記プロセッサに出力し、前記第１命令が展開されない命令であれば、当該第１命令をそのままプロセッサに出力するセレクタを有する、
ことを特徴とする請求項１に記載の演算処理装置。
【請求項３】
前記命令メモリに格納された複数の命令は、所定数の命令で構成された命令系列を含み、
該命令系列は、それぞれの命令のオペコードが同一であり、それぞれの命令の少なくとも１つのオペランド部が予め決まった規則で変化し、残りのオペランド部が変化しない状態で前記命令メモリに格納されている，
ことを特徴とする請求項２に記載の演算処理装置。
【請求項４】
プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第１命令を読み取り、
前記第１命令が展開可能な命令か否かを判断し、
前記第１命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて２語以上の第２命令に展開し、
２語以上の前記第２命令を１サイクルごとに前記プロセッサに出力し、
前記第１命令が展開されない命令であれば、当該第１命令をそのままプロセッサに出力する、
ことを特徴とする演算処理方法。
【請求項５】
前記命令メモリに格納された複数の命令は、所定数の命令で構成された命令系列を含み、
該命令系列は、それぞれの命令のオペコードが同一であり、それぞれの命令の少なくとも１つのオペランド部が予め決まった規則で変化し、残りのオペランド部が変化しない状態で前記命令メモリに格納されている，
ことを特徴とする請求項４に記載の演算処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この出願で言及する実施例は、演算処理装置および演算処理方法に関する。
【背景技術】
【０００２】
近年、情報技術の発展に伴って、処理すべき情報の量は、増加の一途を辿っている。一方、情報技術の進歩は、処理すべき情報の量の増加ではなく、処理内容そのものも、より高度化、および、より複雑化する変化が要求されている。
【０００３】
このような情報技術の要求に応えるべく、プロセッサ・アーキテクチャが存在する。ところで、プロセッサは、多くの演算器を搭載することで大量の情報を処理することができ、また、プログラムの内容を変えることで、より複雑な内容の処理を行うことができる。
【０００４】
プロセッサ・アーキテクチャは、様々なものが存在するが、例えば、大量の情報処理が必要とされるマルチメディアや通信、或いは、数値計算等の分野では、ＳＩＭＤ（Single Instruction Multiple Data）アーキテクチャが利用いられている。
【０００５】
ところで、従来、演算処理装置としては、様々なものが提案されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】国際公開第９７／０４３７１０号パンフレット
【特許文献２】特開２００９−０２６１０６号公報
【特許文献３】特開平１１−２３２０９６号公報
【特許文献４】特開平１１−２５９２９３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
前述したように、例えば、大量の情報処理が必要とされるマルチメディア等の分野では、ＳＩＭＤアーキテクチャが利用されている。
【０００８】
しかしながら、そのようなＳＩＭＤアーキテクチャでは、命令メモリへのアクセス回数が増大するため、演算処理システムにより消費される電力が大きくなるといった問題がある。
【課題を解決するための手段】
【０００９】
一実施形態によれば、プロセッサと、予め複数の命令が格納されている命令メモリと、前記プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第１命令を読み取る命令展開装置と、を有する演算処理装置が提供される。
【００１０】
前記命令展開装置は、前記第１命令が展開可能な命令か否かを判断する展開判定部と、前記第１命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて２語以上の第２命令に展開する命令展開部と、を有する。そして、前記命令展開装置は、２語以上の前記第２命令を１サイクルごとに前記プロセッサに出力する。
【発明の効果】
【００１１】
開示の演算処理装置および演算処理方法は、命令メモリへのアクセス回数を削減し、消費される電力を低減することができるという効果を奏する。
【図面の簡単な説明】
【００１２】
【図１】プロセッサ・アーキテクチャの一例を示すブロック図である。
【図２】ＳＩＭＤレジスタの一例を示すブロック図である。
【図３】ＳＩＭＤ演算器の一例を示すブロック図である。
【図４】ＳＩＭＤ加算命令の一例を説明するための図である。
【図５】本実施例に係るプロセッサ・アーキテクチャの一例を示すブロック図である。
【図６】図５に示すプロセッサ・アーキテクチャにおける命令メモリの動作を説明するための図である。
【図７】図５に示すプロセッサ・アーキテクチャにおける命令展開装置を示すブロック図である。
【図８】図７に示す命令展開装置の処理の一例を示すフローチャートである。
【図９】図７に示す命令展開装置における信号生成部の処理の一例を示すフローチャートである。
【図１０】本実施例の演算処理装置の動作を説明するための図（その１）である。
【図１１】本実施例の演算処理装置の動作を説明するための図（その２）である。
【発明を実施するための形態】
【００１３】
まず、演算処理装置および演算処理方法の実施例を詳述する前に、演算処理装置およびその問題点を図１〜図４を参照して説明する。
【００１４】
図１は、プロセッサ・アーキテクチャの一例を示すブロック図である。図１において、参照符号１０１はプロセッサ、１０２は命令メモリ、１０３はデータメモリ、１０４はバス、そして、１０５は外部入出力装置を示す。
【００１５】
図１に示されるように、演算処理装置は、プロセッサ１０１、命令メモリ１０２、および、データメモリ１０３を有し、バス１０４を介して外部入出力装置１０５と接続されている。ここで、プロセッサ１０１は、内部に設けられた複数の演算器により大量の情報を処理することができ、プログラムの内容を変えることで、より複雑な内容の処理を行うことができる。
【００１６】
命令メモリ１０２は、プロセッサ１０１が実行するプログラムの命令を格納し、また、データメモリ１０３は、プログラムのデータを格納する。プロセッサ１０１は、プログラムの命令を解析し、命令に従った動作を実行する。
【００１７】
図１において、外部入出力装置１０５は、アーキテクチャの外部からの入力と出力を表し、例えば、磁気記憶装置やネットワークインターフェース、または、各種センサ類、或いは、ディスプレイ等であり、形態は様々である。なお、バス１０４は、プロセッサ１０１と外部入出力装置１０５とを接続するものである。
【００１８】
ところで、プロセッサ・アーキテクチャは、様々なものが存在するが、例えば、大量の情報処理が必要とされるマルチメディアや通信、或いは、数値計算等の分野では、ＳＩＭＤアーキテクチャが利用いられている。
【００１９】
図２は、ＳＩＭＤレジスタの一例を示すブロック図であり、また、図３は、ＳＩＭＤ演算器の一例を示すブロック図である。図２および図３に示されるように、ＳＩＭＤアーキテクチャは、複数のＳＩＭＤレジスタＲ０〜Ｒ７，および、複数のＳＩＭＤ演算器ＯＰ０〜ＯＰ７を有する。
【００２０】
ＳＩＭＤレジスタは、複数のデータを格納することができるレジスタであり、例えば、８個のレジスタＲ０〜Ｒ７により８個のデータ（要素０〜要素７）を格納する。また、ＳＩＭＤ演算器は、複数のデータに対して同じ計算を行う演算器であり、例えば、８個の加算器ＯＰ０〜ＯＰ７により、２組のＳＩＭＤレジスタから加算する２つのデータを受け取り、それぞれの和を求めて８つのデータを生成する。
【００２１】
ところで、１つのＳＩＭＤ命令で処理できるデータの数は、アーキテクチャに制約され、この制約されるデータの数は、例えば、２，４，８，…等が一般的である。一方、プログラムは、通常、上述した制約されるデータの数よりも多いデータを処理する。
【００２２】
そのため、大量のデータを処理するには、同じＳＩＭＤ命令を複数回実行する必要があり、命令メモリ１０２へのアクセス回数が増加する。一般に、メモリからのデータの読み込みは、電力を消費するため、例えば、命令メモリ１０２へのアクセス数が多いと、その分だけ消費電力が増大することになる。
【００２３】
図４は、ＳＩＭＤ加算命令の一例を説明するための図であり、３２個ずつのデータの和を求める処理を例にして、上述した消費電力の増大の問題を説明する。ここで、ＳＩＭＤレジスタは、ｓｉｍｄ０，ｓｉｍｄ１，…という形で表現し、１つのＳＩＭＤレジスタ（Ｒ０〜Ｒ７）には、上述したように、８つの要素を格納できるものとする。
【００２４】
なお、ｓｉｍｄ０からｓｉｍｄ３までのレジスタには、予め３２個のデータが格納され、また、ｓｉｍｄ８からｓｉｍｄ１１までのレジスタには、もう１組の３２個のデータが格納されているものとする。そして、加算器ＯＰ０〜ＯＰ７により加算された３２個のデータの和は、ｓｉｍｄ１６からｓｉｍｄ１９までのレジスタに格納する場合を考える。
【００２５】
なお、ＳＩＭＤレジスタ同士の和を求めるＳＩＭＤ演算命令として、ｓｉｍｄ-ａｄｄ命令があるものとする。なお、本明細書では、アンダーラインとの差異を明確にするために、アンダーバーをハイフン"-"として記載する。
【００２６】
図４に示されるように、ｓｉｍｄ-ａｄｄ命令は、３つのオペランドを取り、第１オペランドと第２オペランドで表されるＳＩＭＤレジスタのそれぞれの要素の和を、第３オペランドで表されるＳＩＭＤレジスタに格納する。
【００２７】
従って、ｓｉｍｄ-ａｄｄ命令を用いた、３２個の和を求めるコードは、次の通りである。
ｓｉｍｄ-ａｄｄ  ｓｉｍｄ０，  ｓｉｍｄ８，  ｓｉｍｄ１６
ｓｉｍｄ-ａｄｄ  ｓｉｍｄ１，  ｓｉｍｄ９，  ｓｉｍｄ１７
ｓｉｍｄ-ａｄｄ  ｓｉｍｄ２，  ｓｉｍｄ１０，  ｓｉｍｄ１８
ｓｉｍｄ-ａｄｄ  ｓｉｍｄ３，  ｓｉｍｄ１１，  ｓｉｍｄ１９
【００２８】
このように、オペランドが連番となる同じ命令が連続することになる。このとき、図１に示すプロセッサ・アーキテクチャでは、上述したコードを実行するために、命令メモリ１０２へのアクセスが４回発生することになる。このように、命令メモリ１０２へのアクセスを複数回数行うと、それに伴って消費される電力が増大する。
【００２９】
以下、演算処理装置および演算処理方法の実施例を、添付図面を参照して詳述する。図５は、本実施例に係るプロセッサ・アーキテクチャの一例を示すブロック図である。図５において、参照符号１はプロセッサ、２は命令メモリ、３はデータメモリ、４はバス、５は外部入出力装置、そして、６は命令展開装置を示す。
【００３０】
図５と前述した図１との比較から明らかなように、本実施例のプロセッサ・アーキテクチャでは、命令展開装置６が設けられている。すなわち、演算処理装置は、プロセッサ１、命令メモリ２、データメモリ３、および、命令展開装置６を有し、バス４を介して外部入出力装置５と接続されている。
【００３１】
命令メモリ２は、プロセッサ１が実行するプログラムの命令を格納し、また、データメモリ３は、プログラムのデータを格納する。プロセッサ１は、プログラムの命令を解析し、命令に従った動作を実行する。
【００３２】
なお、外部入出力装置５は、例えば、磁気記憶装置やネットワークインターフェース、または、各種センサ類、或いは、ディスプレイ等であり、バス４は、プロセッサ１と外部入出力装置５とを接続するものである。
【００３３】
命令展開装置６は、プロセッサから命令アドレス（プログラムカウンタ値：ＰＣ）を受け取り、命令メモリ２にアクセス（ＡＤＤim）して命令（ＤＡＴim）を１語読み取る。そして、読み取った命令が命令展開装置６により展開されない命令であれば、その命令（ＩＳＴｐ）をそのままプロセッサ１に渡す。
【００３４】
一方、読み取った命令（ＤＡＴim）が命令展開装置６により展開されるべき命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて２語以上の命令に展開し、さらに、展開された命令を１サイクルごとにプロセッサ１に供給する。
【００３５】
命令展開装置６が展開された命令をプロセッサ１に供給している間、命令メモリ２へのアクセスは行わない。そして、命令展開装置６が命令の展開を終えると、命令メモリ２へアクセス（ＡＤＤim）を行い、新たな命令（ＤＡＴim）を得る。
【００３６】
ここで、命令メモリ２には、オペランドが連番とされ、定められた展開数だけ並ぶようにして予め命令を配置しておく。
【００３７】
すなわち、命令系列に含まれる展開される命令の数は、予め固定の値に決めることができ、また、その展開される命令の数は、読み取った命令の展開処理の開始時に与えることができる。なお、この読み取った命令は、ＳＩＭＤ命令である。
【００３８】
このように、予め定められた展開数は、プログラム全体で固定の値としてもよいが、プログラムの途中で変更することもできる。また、同じオペコードで、展開される命令とそうでない命令が存在するため、区別がつくような条件も定めておく。例えば、オペランドで指定されるレジスタの番号が４の倍数といった条件が考えられる。
【００３９】
具体的に、前述した３２個の和を求める例では、命令メモリ２へアクセスして受け取る命令は、最初の命令ｓｉｍｄ-ａｄｄ命令だけにすることができる。すなわち、本実施例の演算処理装置において、命令の展開数が４であるため、命令展開装置６は、初めのｓｉｍｄ-ａｄｄ命令を認識し、展開されるべき命令であると判断する。従って、命令メモリ２が受け取る命令は、次の命令だけになる。
ｓｉｍｄ-ａｄｄ  ｓｉｍｄ０，  ｓｉｍｄ８，  ｓｉｍｄ１６
【００４０】
そして、命令展開装置６は、１番目，２番目，３番目のオペランドを、ステップ幅を１ずつ変化させて４つの命令を生成し、１サイクルごとにプロセッサ１に供給する。すなわち、命令展開装置６が展開してプロセッサ１に供給する命令は、図１の演算処理装置と同様に、次のようになる。
ｓｉｍｄ-ａｄｄ  ｓｉｍｄ０，  ｓｉｍｄ８，  ｓｉｍｄ１６
ｓｉｍｄ-ａｄｄ  ｓｉｍｄ１，  ｓｉｍｄ９，  ｓｉｍｄ１７
ｓｉｍｄ-ａｄｄ  ｓｉｍｄ２，  ｓｉｍｄ１０，  ｓｉｍｄ１８
ｓｉｍｄ-ａｄｄ  ｓｉｍｄ３，  ｓｉｍｄ１１，  ｓｉｍｄ１９
【００４１】
図６は、図５に示すプロセッサ・アーキテクチャにおける命令メモリの動作を説明するための図である。図６に示されるように、命令メモリ２は、クロックｃｌｏｃｋに同期している。
【００４２】
任意のサイクルｃｙｃｌｅ-ａで命令メモリ２のアドレス線（ＡＤＤim）にアドレスａｄｒ-ａを入力すると、次のサイクルｃｙｃｌｅ-ｂで命令メモリ２からのデータ線（ＤＡＴim）からａｄｒ-ａに格納されているデータｄａｔａ-ａが出力される。
【００４３】
また、命令メモリ２は、チップイネーブル線（ＣＥim）も有しており、チップイネーブル信号ＣＥimが『１』の時は、命令メモリ２からデータ読み出しが可能で、『０』の時は、命令メモリ２からのデータ読み出しは不可能となる。
【００４４】
このチップイネーブル信号ＣＥimは、命令展開装置６から出力され、このチップイネーブル信号ＣＥimが『０』で命令メモリ２をディスエーブルにしている間、命令メモリ２が動作しないため、消費電力をより一層低減することが可能になる。なお、データメモリ３も命令メモリ２と同様で、或るサイクルで入力した内容が次のサイクルで反映される。
【００４５】
再び、図５を参照すると、命令展開装置６は、プロセッサ１と命令メモリ２との間に設けられている。
【００４６】
命令展開装置６は、プロセッサ１からのプログラムカウンタ値（ＰＣ：命令メモリへのアドレス）を受け取るＰＣ線、および、プロセッサ１へ命令ＩＳＴpを出力するプロセッサ命令線によりプロセッサ１と接続される。
【００４７】
さらに、命令展開装置６は、命令メモリ２に対して命令メモリアドレスＡＤＤimを出力するアドレス線、および、命令メモリ２から読み出された命令ＤＡＴimを受け取るデータ線により命令メモリ２と接続される。
【００４８】
ここで、プロセッサ１は、内部にプログラムカウンタを有し、そのプログラムカウンタは、次に実行する命令のアドレスを指し示す。前述した図１に示す演算処理装置では、プログラムカウンタの出力（ＡＤＤi）がそのまま命令メモリ１０２のアドレス線に接続され、命令メモリ１０２は、次のサイクルでそのアドレスＡＤＤiに対応する命令ＩＳＴをプロセッサ１０１に返していた。
【００４９】
一方、本実施例では、図５に示されるように、プログラムカウンタの出力（カウント値ＰＣ）は，命令展開装置６に入力され、命令展開装置６のアドレス出力ＡＤＤimが命令メモリ２のアドレス線に接続される。
【００５０】
そして、プロセッサ１は、命令を受け取ると、それぞれの命令に応じた処理を行う。なお、命令としては、加算などの演算命令、条件分岐などのプログラムカウント値ＰＣを変更する命令が含まれる。
【００５１】
次に、ａｄｄ命令，ｌｄ命令，ｓｉｍｄ-ａｄｄ命令，ｉｒｅｔ命令およびｎｏｐ命令を用いて、命令展開装置６の動作を説明する。このうち、展開できる命令は、ｓｉｍｄ-ａｄｄ命令で、第１オペランドで表されるレジスタの番号が４の倍数となっている命令である。具体的に、次の命令は、展開することができる。
ｓｉｍｄ-ａｄｄ  ｓｉｍｄ０，  ｓｉｍｄ８，  ｓｉｍｄ１６
【００５２】
ここで、展開できる命令には、オペランドが連続する命令が予め決められた展開数−１だけ連続すると約束する。従って、上記の命令の後には、次のような命令が並んでいるものと約束する。
ｓｉｍｄ-ａｄｄ  ｓｉｍｄ１，  ｓｉｍｄ９，  ｓｉｍｄ１７
ｓｉｍｄ-ａｄｄ  ｓｉｍｄ２，  ｓｉｍｄ１０，  ｓｉｍｄ１８
ｓｉｍｄ-ａｄｄ  ｓｉｍｄ３，  ｓｉｍｄ１１，  ｓｉｍｄ１９
【００５３】
一方、次の命令は、展開することができない。
ｓｉｍｄ-ａｄｄ  ｓｉｍｄ１，  ｓｉｍｄ９，  ｓｉｍｄ１７
上記の命令は、ｓｉｍｄ-ａｄｄ命令ではあるが、第１オペランドで表されるレジスタの番号が４の倍数となっていないため、展開することができないものとする。
【００５４】
図７は、図５に示すプロセッサ・アーキテクチャにおける命令展開装置を示すブロック図である。図７において、実線の枠で囲った部分が機能ブロックであり、命令展開装置６は、信号生成部６１，次ＰＣ推定部６２，比較器６３，展開判定部６４，命令展開部６５およびセレクタ６６の各機能ブロックを有する。
【００５５】
図７において、破線の枠で囲った部分が状態を保存するレジスタであり、命令展開装置６は、前ＰＣ保存部６７，状態保存部６８および前命令保存部６９の各レジスタも有する。
【００５６】
前ＰＣ保存部６７は、前のサイクルで得られたプログラムカウンタの値（「前ＰＣ」）を保存するレジスタであり、また、前命令保存部６９は、前のサイクルでプロセッサ１側に出力された命令（「前命令」）を保存するレジスタである。
【００５７】
状態保存部６８は、信号生成部６１が信号を生成するために必要な状態を保存するレジスタであり、現在展開中か否かを表すフラグとカウンタで構成されている。なお、状態保存部６８が格納する内容については、後に詳述する。
【００５８】
次ＰＣ推定部６２は、前ＰＣ保存部６７に格納された「前ＰＣ」の次のアドレスを推定する。ここで、本実施例では、命令メモリ２に格納されている命令の長さは全て等しいという前提を持っているため、次ＰＣ推定部６２は、与えられた「前ＰＣ」の値に一定の値を加算する加算器として実装される。
【００５９】
比較器６３は、次ＰＣ推定部６２で求められた、前のサイクルでのプログラムカウンタのアドレスの次のアドレスと、現在のサイクルで与えられるプログラムカウンタのアドレスが等しいか否かを判定する。なお、この判定結果は、信号生成部６１に出力する。
【００６０】
命令展開部６５は、前命令保存部６９により保存された「前命令」が展開可能であるとき、「前命令」の次の命令に相当する命令を生成する。本実施例では、命令のオペランド部を変化させて命令を生成するため、本命令展開部６５でも命令のオペランド部を変化させて命令を生成する。
【００６１】
セレクタ６６は、命令メモリ２から得られる命令（ＤＡＴim）、命令展開部６５が生成する命令、および、信号生成部６１が生成するセレクト信号ＳＥＬを受け取る。そして、プロセッサ１に対して実際に返すべき命令（ＩＳＴｐ）を、セレクト信号ＳＥＬに応じて選択して出力する。
【００６２】
展開判定部６４は、命令メモリ２から得られる命令（ＤＡＴim）が展開可能か否かを判定する。本実施例において、展開判定部６４は、例えば、与えられた命令のオペコードとオペランドから判断する。
【００６３】
信号生成部６１は、比較器６３で比較した結果、展開判定部６４での判定結果、および、状態保存部６８に保存されたデータを入力とし、命令メモリ２に与えるチップイネーブル信号ＣＥim、および、セレクタ６６に与えるセレクト信号ＳＥＬを生成する。
【００６４】
さらに、信号生成部６１は、状態保存部６８の次のサイクルでの値を生成して、状態保存部６８へ出力する。なお、信号生成部６１が信号を生成する方法は、後に詳述する。
【００６５】
次に、状態保存部６８に保存される内容（データ）を説明する。状態保存部６８は、フラグとカウンタを有する。ここで、フラグは、現在のサイクルで受け取った命令を展開するか否かを表す「展開する」または「展開しない」の２つの値をとり、また、カウンタは、後何命令だけ命令を展開するかを表す値をカウントする。なお、フラグの初期値は、「展開しない」であり、また、カウンタの初期値は、「０」である。
【００６６】
さらに、信号生成部６１の動作について説明する。前述したように、信号生成部６１は、命令メモリ２のチップイネーブル信号ＣＥim、セレクト信号ＳＥＬ、および，状態保存部６８の次の値、つまり、フラグおよびカウンタの次サイクルでの値を生成する。
【００６７】
ここで、信号生成部６１に入力される信号からこれらの値を直接生成する方法を記述するのは冗長であるため、まず、以下の３つの中間値を生成する。なお、以下の記述において、『＝』は代入、『＝＝』は等しい、『＆＆』は論理積、そして、『｜｜』は論理和を示す。
【００６８】
展開-継続＝（フラグの値＝＝展開する）＆＆カウンタの値≧１＆＆「比較器６３」の結果が真
展開-中止＝（フラグの値＝＝展開する）＆＆（カウンタの値＜１｜｜「比較器６３」の結果が偽）
展開-開始＝（フラグの値＝＝展開しない）＆＆「展開判定部６４」の結果が真
【００６９】
また、チップイネーブル信号ＣＥimおよびセレクト信号ＳＥＬは、以下のようにして生成する。
ＣＥim＝０（展開-継続＝＝真｜｜展開-開始＝＝真の時）
＝１（上記以外の時）
ＳＥＬ＝「命令展開部６５」の結果を選択（フラグの値＝＝展開するの時）
＝命令メモリ２の出力（ＤＡＴim）を選択（上記以外の時）
【００７０】
次のフラグの値＝展開しない（展開-中止＝＝真の時）
＝展開する  （展開-開始＝＝真の時）
＝現在のフラグの値（上記以外の時）
次のカウンタの値＝現在のカウンタの値−１（展開-継続＝＝真の時）
＝０（展開-中止＝＝真の時）
＝２（展開-開始＝＝真の時）
＝現在のカウンタの値（上記以外の時）
【００７１】
次に、命令展開装置６の動作フローについて説明する。図８は、図７に示す命令展開装置の処理の一例を示すフローチャートである。
【００７２】
処理を開始すると、まず、ステップＳＴ１１において、状態保存部６８，前ＰＣ保存部６７および前命令保存部６９の各レジスタを初期化する。すなわち、状態保存部６８，前ＰＣ保存部６７および前命令保存部６９を以下のように初期化して、ステップＳＴ１２に進む。
【００７３】
「状態保存部６８」のフラグ：  『展開しない』
「状態保存部６８」のカウンタ：  『０』
「前ＰＣ保存部６７」：  『無効値』
「前命令保存部６９」：  『無効値』
【００７４】
そして、ステップＳＴ１２において、プロセッサ１から読み込むべき命令のアドレスを取得する。すなわち、プロセッサ１内では、このアドレスをプログラムカウンタとして指しているため、そのプログラムカウンタ値ＰＣを取得して、ステップＳＴ１３に進む。
【００７５】
ステップＳＴ１３では、命令メモリ２のチップイネーブル信号ＣＥim，プロセッサ１に渡す命令ＩＳＴp，並びに，命令展開装置６の内部状態を更新する信号を生成する。なお、ステップＳＴ１３における各信号の生成フローは、後に詳述する。
【００７６】
ステップＳＴ１３において、各種信号の生成が終了したら、ステップＳＴ１４に進み、次のサイクルに備えて、前ＰＣ保存部６７，前命令保存部６９および状態保存部６８の各レジスタの値を更新する。
【００７７】
すなわち、前ＰＣ保存部６７は、与えられたＰＣの値を「前ＰＣ」として保存し，前命令保存部６９は、先の段階でプロセッサ１に渡した命令ＩＳＴpを「前命令」として保存し。そして、状態保存部は、先の段階で生成した値を保存する。なお、生成されない値に関しては、現在の値を保持するものとする。
【００７８】
ステップＳＴ１４で以上の処理が終了したら、ステップＳＴ１５に進んで、クロックの経過を待って、次のサイクルに備える。
【００７９】
図９は、図７に示す命令展開装置における信号生成部の処理の一例を示すフローチャートである。次に、信号生成部６１における命令メモリのチップイネーブル信号ＣＥim、プロセッサ１に渡す命令ＩＳＴpおよび命令展開装置６の内部状態を更新する信号の生成を、図９を参照して説明する。
【００８０】
処理を開始すると、まず、ステップＳＴ２１において、状態保存部６８のフラグを確認して、プロセッサ１に返すべき命令ＩＳＴpは、命令メモリ２から取得すべきものなのか、或いは、前命令保存部６９の「前命令」から展開するべきものなのかを判断する。
【００８１】
ステップＳＴ２１において、「前命令」から展開すると判断すると、ステップＳＴ２２に進んで、「前命令」を展開してプロセッサ１に対して命令ＩＳＴpを渡す。ここで、命令を展開する場合、「前ＰＣ」の命令を展開してプロセッサ１への信号とする。
【００８２】
さらに、ステップＳＴ２３に進んで、チップイネーブル信号ＣＥimと、状態保存部６８で保存する次のサイクルでの値を算出する。これは、状態保存部６８のカウンタの値と、「前ＰＣ」の次の値および与えられたＰＣの値との関係により、次の２通りに分かれる。
【００８３】
すなわち、ステップＳＴ２３において、状態保存部６８のカウンタの値が『１』以上であり、「前ＰＣ」の次の値と与えられたＰＣの値が等しいとき、ステップＳＴ２４に進む。ステップＳＴ２４では、次の命令も展開することになるため、チップイネーブル信号ＣＥimを『０』に設定して命令メモリ２を動作させないようにし、その後、カウンタの値を『１』だけ減じる。
【００８４】
次に、ステップＳＴ２３における条件が成立しないとき、これは、予め決めておいた数の命令を展開し終えた場合、或いは、割り込みなどにより別の場所に飛んでしまった場合が考えられる。
【００８５】
このときは、「前命令」から命令を展開することができないため、命令メモリ２から命令を読み込む必要がある。そのため、ステップＳＴ２５に進んで、チップイネーブル信号ＣＥimを『１』に設定し、命令メモリ２を動作させ、その後、カウンタの値を『０』にして、フラグを「展開しない」という値に設定する。
【００８６】
以上が、現在のサイクルで命令を展開してプロセッサに渡す場合、すなわち、ステップＳＴ２１において、展開すると判断した場合の処理である。以下、現在のサイクルで命令メモリからの命令をプロセッサに渡す場合、すなわち、ステップＳＴ２１において、展開しないと判定した場合の処理を説明する。
【００８７】
このときは、まず、ステップＳＴ２６において、命令メモリ２からの命令をプロセッサ１への信号線に乗せた後、ステップＳＴ２７に進んで、この命令が展開できるかどうかを判断する。
【００８８】
ステップＳＴ２７において、命令が展開できると判断すると、ステップＳＴ２８に進んで、状態保存部６８のフラグを「展開する」に設定し、カウンタの値を『２』に設定する。このときのカウンタの初期値は、「展開する命令の数」−２である。本実施例では、４命令を展開するため、ここでは、４−２＝２を与えている。
【００８９】
一方、ステップＳＴ２７において、命令が展開できないと判断すると、ステップＳＴ２９に進み、次の命令は、命令メモリ２から取得するため、チップイネーブル信号ＣＥimを『１』に設定し、命令メモリ２を動作させる。このようにして、命令展開装置６における信号生成部６１の処理を実行する。
【００９０】
図１０および図１１は、本実施例の命令展開装置の動作を説明するための図である。まず、命令メモリ２には、図１０に示す命令が格納されているものとする。なお、図１０において、『ｓｉｍｄ-ａｄｄ』と書かれた命令が展開される命令である。すなわち、次の命令が、命令展開装置６で展開されるべき命令である。
ｓｉｍｄ-ａｄｄ  ｓｉｍｄ０，  ｓｉｍｄ８，  ｓｉｍｄ１６
【００９１】
図１１に示されるように、縦方向の時間の経過に従って、処理が進められる。なお、図１１おいて、各カラムの意味は、次の通りである。
サイクル：現在のサイクル数を表す。
フラグ：現在のサイクルにおける状態保存部６８のフラグの値を表す。なお。「しない」と表記した場合は、命令を展開しないことを意味し、また、「する」と表記した場合は、命令を展開することを意味する。
【００９２】
カウンタ：現在のサイクルにおける状態保存部６８のカウンタの値を表す。
前ＰＣ：前のサイクルにおけるプロセッサ１から与えられたＰＣの値を表す。
ＰＣ：現在のサイクルにおけるプロセッサ１から与えられたＰＣの値を表す。
ＣＥim：現在のサイクルにおける命令メモリに設定するチップイネーブル信号の値を表す。
プロセッサへの命令：現在のサイクルにおけるプロセッサに返す命令を表す。なお、この命令は、前ＰＣで表されるアドレスと対応している。
【００９３】
各サイクルにおける動作は、次の通りである。
サイクル０：フラグの値が「展開しない」なので、命令メモリから命令をロードする。このサイクルでは命令メモリからのデータは無効な値が入っているため、命令は展開できない、と解釈する。そのため、チップイネーブル信号は『１』にする。
【００９４】
サイクル１：読み込んだ命令が展開できない命令なので、チップイネーブル信号は１のままにする。
サイクル２：サイクル１と同様である。
サイクル３：読み込んだ命令が展開できる種類の命令であるため、チップイネーブル信号を『０』にする。そして、次のサイクルでのフラグを「展開する」にし、カウンタの値を『２』にする。
【００９５】
サイクル４：カウンタの値が１以上であり、前ＰＣの次のアドレスが与えられているＰＣに等しいため、次のサイクルでも命令を展開する、としている。
サイクル５：サイクル４と同様である。
サイクル６：このサイクルでは、前の命令から展開してプロセッサに渡すが、カウンタの値が１よりも小さくなったので次にサイクルでは命令は展開せずに命令メモリから読み込む。そこでフラグを「展開しない」にし、カウンタを０にし、命令メモリのチップイネーブル信号を１にして命令メモリを動作させる。
【００９６】
サイクル７：サイクル１と同様である。
サイクル８：サイクル１と同様である。
サイクル９：サイクル３と同様である。
【００９７】
サイクル１０：このサイクルでは、前の命令から展開してプロセッサに渡す。ところが、割り込みが発生したため、与えられたＰＣは１００であり、前ＰＣの値９の次のアドレス１０と異なっている。そのため、次のサイクルでは命令は展開せずに命令メモリから読み込む。そこでフラグを「展開しない」にし、カウンタを０にし、命令メモリのチップイネーブル信号を１にして命令メモリを動作させる。
【００９８】
サイクル１１：サイクル１と同様である。
サイクル１２：サイクル１と同様である。
サイクル１３：このサイクルでは展開できる種類の命令、ｓｉｍｄ-ａｄｄを命令メモリから読み込んでプロセッサに渡している。しかし、第１オペランドが４の倍数でないため展開できない命令であると解釈する。
サイクル１４：サイクル１３と同様である。
サイクル１５：サイクル１３と同様である。
【００９９】
以上において、命令展開装置６により展開可能な命令としては、『ｓｉｍｄ-ａｄｄ』命令以外に、例えば、『ｓｉｍｄ-ａｄｄｓ』命令や『ｓｉｍｄ０，ｓｃｒ，ｓｉｍｄ１６』命令といった様々なものがある。
【０１００】
以上において、本実施例は、例えば、同じＶＬＩＷ（Very Long Instruction Word）命令がＳＩＭＤアレイの中の所定数（例えば、１６個）のシェーダプロセッサに対して同時発行するＧＰＵ（Graphics Processing Unit）に適用することができる。
【０１０１】
さらに、本実施例の演算処理装置および演算処理方法は、このようなＧＰＵだけでなく、１チップとして構成されたプロセッサ、或いは、複数のチップで構成されたプロセッサシステム等に対して幅広く適用することができるのはいうまでもない。
【０１０２】
以上の実施例を含む実施形態に関し、さらに、以下の付記を開示する。
（付記１）
プロセッサと、
予め複数の命令が格納されている命令メモリと、
前記プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第１命令を読み取る命令展開装置と、を有し、
前記命令展開装置は、
前記第１命令が展開可能な命令か否かを判断する展開判定部と、
前記第１命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて２語以上の第２命令に展開する命令展開部と、を有し、２語以上の前記第２命令を１サイクルごとに前記プロセッサに出力する、
ことを特徴とする演算処理装置。
【０１０３】
（付記２）
前記第１命令が展開可能な命令であれば、２語以上の前記第２命令を１サイクルごとに前記プロセッサに出力し、前記第１命令が展開されない命令であれば、当該第１命令をそのままプロセッサに出力するセレクタを有する、
ことを特徴とする付記１に記載の演算処理装置。
【０１０４】
（付記３）
前記命令メモリに格納された複数の命令は、所定数の命令で構成された命令系列を含み、
該命令系列は、それぞれの命令のオペコードが同一であり、それぞれの命令の少なくとも１つのオペランド部が予め決まった規則で変化し、残りのオペランド部が変化しない状態で前記命令メモリに格納されている、
ことを特徴とする付記２に記載の演算処理装置。
【０１０５】
（付記４）
前記命令系列に含まれる命令の数は、前記プロセッサから指定される、
ことを特徴とする付記３に記載の演算処理装置。
【０１０６】
（付記５）
前記第２命令は、前記オペランド部が１つずつ加算されるように変化する、
ことを特徴とする付記３または付記４に記載の演算処理装置。
【０１０７】
（付記６）
前記命令系列に含まれる前記第２命令の数は、予め固定の値に決められている、
ことを特徴とする付記１乃至付記５のいずれか１項に記載の演算処理装置。
【０１０８】
（付記７）
前記命令系列に含まれる前記第２命令の数は、前記第１命令の展開処理の開始時に与えられる、
ことを特徴とする付記１乃至付記５のいずれか１項に記載の演算処理装置。
【０１０９】
（付記８）
前記第１命令は、ＳＩＭＤ命令である、
ことを特徴とする付記１乃至付記７のいずれか１項に記載の演算処理装置。
【０１１０】
（付記９）
プロセッサから命令アドレスを受け取り、命令メモリにアクセスして第１命令を読み取り、
前記第１命令が展開可能な命令か否かを判断し、
前記第１命令が展開可能な命令であれば、同じオペコードでオペランドを同じステップ幅で変化させて２語以上の第２命令に展開し、
２語以上の前記第２命令を１サイクルごとに前記プロセッサに出力し、
前記第１命令が展開されない命令であれば、当該第１命令をそのままプロセッサに出力する、
ことを特徴とする演算処理方法。
【０１１１】
（付記１０）
前記命令メモリに格納された複数の命令は、所定数の命令で構成された命令系列を含み、
該命令系列は、それぞれの命令のオペコードが同一であり、それぞれの命令の少なくとも１つのオペランド部が予め決まった規則で変化し、残りのオペランド部が変化しない状態で前記命令メモリに格納されている、
ことを特徴とする付記９に記載の演算処理方法。
【０１１２】
（付記１１）
前記命令系列に含まれる命令の数は、前記プロセッサから指定される、
ことを特徴とする付記１０に記載の演算処理方法。
【０１１３】
（付記１２）
前記第２命令は、前記オペランド部が１つずつ加算されるように変化する、
ことを特徴とする付記１０または付記１１に記載の演算処理方法。
【０１１４】
（付記１３）
前記命令系列に含まれる前記第２命令の数は、予め固定の値に決められている、
ことを特徴とする付記９乃至付記１２のいずれか１項に記載の演算処理方法。
【０１１５】
（付記１４）
前記命令系列に含まれる前記第２命令の数は、前記第１命令の展開処理の開始時に与えられる、
ことを特徴とする付記９乃至付記１２のいずれか１項に記載の演算処理方法。
【０１１６】
（付記１５）
前記第１命令は、ＳＩＭＤ命令である、
ことを特徴とする付記９乃至付記１４いずれか１項に記載の演算処理方法。
【符号の説明】
【０１１７】
１，１０１    プロセッサ
２，１０２    命令メモリ
３，１０３    データメモリ
４，１０４    バス
５，１０５    外部入出力装置
６    命令展開装置
６１    信号生成部
６２    次ＰＣ推定部
６３    比較器
６４    展開判定部
６５    命令展開部
６６    セレクタ
６７    前ＰＣ保存部（レジスタ）
６８    状態保存部（レジスタ）
６９    前命令保存部（レジスタ）
【図１】
2013008266.tif 000003
【図２】
2013008266.tif 000004
【図３】
2013008266.tif 000005
【図４】
2013008266.tif 000006
【図５】
2013008266.tif 000007
【図６】
2013008266.tif 000008
【図７】
2013008266.tif 000009
【図８】
2013008266.tif 000010
【図９】
2013008266.tif 000011
【図１０】
2013008266.tif 000012
【図１１】
2013008266.tif 000013