(57)【特許請求の範囲】
【請求項１】
複数のプロセッサを備えるマルチプロセッサ装置であって、
外部メモリと、
前記複数のプロセッサのメモリアクセスを集約するメモリ集約装置と、
前記プロセッサが管理するレジスタ数と、同一命令について前記マルチプロセッサ装置全体が処理可能な最大の数である最大処理数との積の数のレジスタメモリと、
前記プロセッサのレジスタアクセスに対し与えられた命令に従って前記レジスタメモリのアクセスを行うマルチプレクサと、
命令からパラメータを抽出し前記プロセッサと前記マルチプレクサに与え制御するとともに、同一命令について前記マルチプロセッサ装置全体に対して要求された処理数である与えられた処理数分を同一命令にて前記プロセッサで前記レジスタメモリのアドレッシングを変化させて順次処理させ、処理数分が終われば次の命令に切り替えて与えられた処理数分の処理を繰り返させる全体制御装置と、
を備えるマルチプロセッサ装置。
【請求項２】
前記全体制御装置は、前記与えられた処理数が前記最大処理数を越える処理数であればいくつかに分割して処理を実行し、前記与えられた処理数が前記最大処理数に満たない処理数であればいくつかを結合して処理を実行する、請求項１記載のマルチプロセッサ装置。
【請求項３】
前記全体制御装置は、命令を切り替えて新たな命令を実行する際に、切替前の命令において、新たな命令の処理順番と同じ処理順番で実施された処理が終了していなければ当該処理が終了するまで新たな命令についての処理を待機させる、または切替前の命令において同じ処理順番で実施された処理のレジスタ書き込み位置と新たな命令でのレジスタ読み込み位置が等しい場合は当該処理が終了するまで新たな命令についての処理を待機させる、あるいは切替前の命令において、新たな命令の処理順番と同じ処理順番で実施されるとともに、予め指定された命令数以前に実施された処理が終了していなければ当該処理が終了するまで新たな命令についての処理を待機させる、請求項１記載のマルチプロセッサ装置。
【請求項４】
前記全体制御装置は、与えられた命令から前記各プロセッサによる処理順番に関する相対的なシフト量を抽出して、当該シフト量を前記マルチプレクサに与えるとともに、当該シフト量が前記プロセッサの数の整数倍以外であれば前記レジスタメモリへのアドレッシングを最初だけ２回行うよう指示し、
前記マルチプレクサは、前記レジスタメモリのアドレッシングで得られるデータと、過去のアドレッシングで得られたデータから、前記シフト量に従ってデータをシフトさせて抽出するとともに、当該抽出したデータを前記複数のプロセッサに与える、請求項１記載のマルチプロセッサ装置。
【請求項５】
前記プロセッサは、与えられた命令と個々の演算結果から分岐条件を示すフラグを生成し、命令に従って前記レジスタメモリに格納された複数の分岐フラグと組み合わせ新たな分岐フラグとして前記レジスタメモリに格納し、
前記プロセッサは与えられた命令と個々の前記レジスタメモリに格納された複数の分岐フラグから、前記レジスタメモリへの演算結果の書き込みの有無、もしくは指定された命令への移動の有無を決定する、請求項１記載のマルチプロセッサ装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のプロセッサで構成されるマルチプロセッサ装置に関する。
【背景技術】
【０００２】
デジタル信号処理において、プログラムによって動作するプロセッサ、例えばＤＳＰなどは、さまざまなアルゴリズムを網羅するにあたって必要不可欠なものである。近年、画像処理など非常に処理量の多い処理が必要になってきた。このため、複数のプロセッサで構成した装置、例えばＧＰＵ（グラフィックスプロセッシングユニット）がＤＳＰに代わるものとして出てきた。【０００３】
従来例をこのＧＰＵを例にして述べる。図２は特開２００９−３７５９３号公報に記載されているＧＰＵの構成である。このＧＰＵは、外部メモリ装置（ＥＭＵ）２０１、外部メモリ２０２、ベクトル処理エンジン（ＶＰＥ）２０５、ベクトル制御装置（ＶＣＵ）２０６、ベクトル処理装置（ＶＰＵ）２０７を備える。【０００４】
ベクトル処理装置（ＶＰＵ）２０７はマルチプロセッサの核となる演算器を有しかつ複数個からなる。この上位の制御装置としてベクトル制御装置（ＶＣＵ）２０６があり、これらを含む１つのセットとしてベクトル処理エンジン（ＶＰＥ）２０５がある。ベクトル処理エンジン（ＶＰＥ）２０５はさらに複数個からなり、お互いのアクセスが相互にできるよう外部メモリ装置（ＥＭＵ）２０１を中継しクロスバー接続されている。また、外部メモリ２０２とも接続しているので、メモリアクセスも可能である。【０００５】
データおよびプログラムの単位である命令は、ベクトル処理装置（ＶＰＵ）２０７が持つＬ１キャッシュ（最下層となるレベル１のキャッシュもしくはテンポラリの記憶装置）、ベクトル処理エンジン（ＶＰＥ）２０５が持つＬ２キャッシュ（上位となるレベル２のキャッシュもしくはテンポラリの記憶装置）に蓄えられる。それぞれ、階層的なメモリアクセスの流れとなる。【０００６】
ベクトル処理エンジン（ＶＰＥ）２０５の実装数は、多ければ多いほど性能は上がる。しかしながら、ベクトル処理エンジン（ＶＰＥ）２０５の動作は同時に同じ命令を実行するＳＩＭＤ（単一命令複数データ）型を基本とするので、実装数が多くなると、メモリアクセスが同時刻に集中し、外部メモリ装置（ＥＭＵ）２０６もしくは外部メモリ２０２の物理的なメモリ帯域の制限により性能劣化が生じる。このため、ベクトル処理装置（ＶＰＵ）２０７の実装数を数個に限定し、逆にベクトル処理エンジン（ＶＰＥ）２０５を増やす。ベクトル処理エンジン（ＶＰＥ）２０５には、異なるプログラム、もしくは時間差を考慮した同じプログラムを与えれば、上記の同時刻のアクセスの集中を避けることができる。【０００７】
一方、各ベクトル処理エンジン（ＶＰＥ）２０５は、外部メモリ装置（ＥＭＵ）２０１を介しての疎結合となり、データ交換を効率的に行う仕組みが必要である。データ交換は、大きなプログラムを小さなプログラムに分解する（ベクトル処理装置（ＶＰＵ）２０７へ処理を分散し性能を高める）場合に必要となる。プログラミングの複雑化を避けるため、これらのデータ交換はプログラムとは関係なく自動的に行われる。【０００８】
データ交換を自動的に行う方法を述べる。先ず、メモリアクセスの要求と転送先、転送元のメッセージを定義しておく。それらを各々の装置が発行および受け取り、処理を行う。複数のメッセージはそれぞれの装置で調停され順序を守りながら並行に処理される。メッセージの処理を行うのは主にベクトル処理エンジン（ＶＰＥ）にあるＤＭＡ（Direct Memory Access）装置である。このような仕組みで、ベクトル処理エンジン（ＶＰＥ）２０５のＬ２キャッシュやベクトル処理装置（ＶＰＵ）２０７のＬ１キャッシュおよび外部メモリ２０２の間のデータ通信が自動的に行われる。これらの処理は突き放し制御になっており、プログラムで意識する必要はない。【０００９】
次に、ベクトル処理装置（ＶＰＵ）２０７について述べる。【００１０】
ＳＩＭＤ型を考えた場合、１つのユニットは簡単化し回路規模を圧縮して数を揃えた方がよい。また、簡単化することで高い周波数で動作させることができる。このため、１つのユニットは単純なパイプライン構造となり、一般的なプロセッサのように高い機能を持たないことが多い。例えば、スーパースカラーなど回路コストの高い方式は採用しないことが多い。【００１１】
プロセッサの構造を簡単化すると、フロー依存が課題となる。例えば、レジスタＡを読み出してパイプライン処理し、レジスタＢに書き込む場合、次の命令でレジスタＢを読み出すには、前の命令のレジスタＢへの書き込みを待つ必要がある。大きなプログラムでは、命令の順序の入れ替えなどのスケジューリングである程度回避可能であるが、プログラムを分散化するとプログラムが小さくなりスケジューリングが難しくなる。【００１２】
結局、レジスタＢへの書き込みが終了するまで次の命令のレジスタＢの読み出しを止めることになる（ハザードの発生）。図３はパイプライン処理において、ハザードの有無を時間軸に沿って示したもので、命令１の書き込みと命令２の読み込みレジスタが同一の場合に生じたハザードを示している。【００１３】
従来のプロセッサではこれを解決するため、図４のように異なるプログラムを互い違いにして与え、フロー依存が生じない手法が考えられた。図４では、プログラムをＡＢＣＤの４つを用意し、それぞれの命令を交互に与える。プログラムＡＢＣＤで異なるレジスタを用意すれば、プログラムＡが書き込むレジスタは、他のプログラムＢＣＤの読み込みレジスタとは重ならない。また、プログラムＡの命令Ａ１と命令Ａ２とは時間差が３つあるので、フロー依存が生じてもハザードが生じる心配はない。【００１４】
以上のように、簡単な構造のプロセッサを数個まとめ、それぞれの命令とデータをキューイング可能なクロスバーで接続し、さらにプログラムの与え方に工夫することで、プロセッサの稼働率の向上とメモリ使用帯域の分散を図ることができる。
【先行技術文献】
【特許文献】
【００１５】
【特許文献１】特開２００９-３７５９３号公報
【発明の概要】
【発明が解決しようとする課題】
【００１６】
しかしながら、従来のマルチプロセッサ装置にあっては、以下のような問題点があった。【００１７】
先ず、プログラムを適切にプロセッサに分配しておく必要がある。静的な手法としては、プログラム全体の分割と配分を予めコンパイラなどで決めておく方法がある。しかし、同時に処理したいプログラムが追加されたりすると、分割と配分を再度決めなおさなければならない。これはプログラム開発の効率を悪くする。【００１８】
動的な手法としては、それぞれのプロセッサの状態を監視する機構を装備する方法がある。監視は、プログラムの進捗具合を共有メモリ等に配置しておき、プロセッサ自体がそれを参照して実行可能なプログラムがあれば自ら実行する。もしくは、別のプロセッサを別途専用に用意しておき、それぞれのプロセッサの状態を逐次管理・起動する。いずれにせよ、全体のハードウェアの機構は複雑化しコスト増となる。【００１９】
次に、プロセッサ間の通信が頻繁に起きると、プロセッサ間のデータの通信が滞って、オーバヘッドになりうる場合がある。また、プロセッサ間の通信効率を上げようとすれば、クロスバーのようなバススイッチが必要となり、回路コストが増大する。【００２０】
最後に、１つのプロセッサに異なるプログラムを交互に実行させるには、異なるプログラムを用意しないといけない。例えば、従来例の複数のベクトル処理エンジン（ＶＰＥ）２０５に複数のプログラムを用意し、さらにそれを複数のプログラムに分割することを考える。これは、静的および動的に関わらず、プログラムの生産性を低下させる要因となる。また、１つのプロセッサに与えるプログラムの数も、パイプラインの段数が多くなるとそれに比例した分が必要となる。このため、パイプラインの段数を上げて動作周波数を上げる、もしくは高度な演算をさせると、プログラム分割の問題がさらに大きくなる。
【課題を解決するための手段】
【００２１】
上述の課題を解決するため、本発明は、以下の技術的手段を採用している。すなわち、本発明に係るマルチプロセッサ装置は、外部メモリ、複数のプロセッサ、メモリ集約装置、レジスタメモリ、マルチプレクサ、及び全体制御装置を備える。メモリ集約装置は、複数のプロセッサのメモリアクセスを集約する。レジスタメモリは、プロセッサが管理するレジスタ数とプロセッサの最大処理数の積の数が用意される。マルチプレクサは、プロセッサのレジスタアクセスに対し与えられた命令に従ってレジスタメモリのアクセスを行う。全体制御装置は、命令からパラメータを抽出しプロセッサとマルチプレクサに与え制御する。また、全体制御装置は、与えられた処理数分を同一命令にてプロセッサでレジスタメモリのアドレッシングを変化させて順次処理させ、処理数分が終われば次の命令に切り替えて与えられた処理数分の処理を繰り返させる。
【発明の効果】
【００２２】
本発明では、物理的なプロセッサ数に対するレジスタだけを用意するのではなく、非常に大きい論理的なプロセッサ数分のレジスタを用意し、処理数を自動で調整する。その結果、プログラムの分割を考慮することなく、簡単に並列処理できるマルチプロセッサ装置を提供することができる。また、調整は処理数の加減算だけなので、プロセッサの並列度は簡単に増減できる。加えて、プログラムはプロセッサの数を意識することはない。【００２３】
また、本発明によれば、プロセッサのパイプラインの段数を格段に増やしても、またフロー依存になっても性能に影響しにくく、高度な演算および動作周波数の向上が容易に図れる。メモリレイテンシが増えても同様に影響が少なく、複雑なメモリアクセス構造を取らずとも自動的に突き放し制御になる。従って、プロセッサ個々に単純なメモリアクセスを行う機構を備えるだけである。【００２４】
比較的に大きいレジスタは必要になるが、パイプライン段数の許容度が増加するに伴い、アクセス速度に劣る低コストＳＲＡＭが使用可能なので、コスト増加は少ない。【００２５】
命令の更新頻度が低いため、命令キャッシュ等を装備して高速化する必要がなく、非常に長い語長を要する演算装置の並列化も容易である。【００２６】
以上のように、プログラム作成が容易になり、性能と機能がスケーラブルかつコストパフォーマンスに優れたマルチプロセッサ装置が本発明により提供できる。
【図面の簡単な説明】
【００２７】
【図１】図１は、本発明の一実施形態におけるマルチプロセッサ装置を説明する図である。
【図２】図２は、従来のマルチプロセッサ装置の構成を説明する図である。
【図３】図３は、従来のマルチプロセッサ装置のハザードが発生しない場合とする場合のパイプライン動作を説明する図である。
【図４】図４は、従来のマルチプロセッサ装置の異なるプログラムを交互に実行したパイプライン動作を説明する図である。
【図５】図５は、本発明の一実施形態におけるマルチプロセッサ装置のレジスタへのアクセスを説明する図である。
【図６】図６は、本発明の一実施形態におけるマルチプロセッサ装置のレジスタメモリに対する構造を説明する図である。
【図７】図７は、本発明の一実施形態におけるマルチプロセッサ装置において、ハザードが発生しない場合の処理サイクルとレジスタメモリに対するアドレッシングを説明する図である。
【図８】図８は、本発明の一実施形態におけるマルチプロセッサ装置において、ハザードが発生する場合の処理サイクルとレジスタメモリに対するアドレッシングを説明する図である。
【図９】図９は、本発明の一実施形態におけるマルチプロセッサ装置を複数の処理ユニットで構成することを説明する図である。
【図１０】図１０は、本発明の一実施形態におけるマルチプロセッサ装置において、異なる論理プロセッサへのレジスタアクセスを説明する図である。
【図１１】図１１は、本発明の一実施形態におけるマルチプロセッサ装置において、画像処理で横方向および縦方向のレジスタアクセスを説明する図である。
【図１２】図１２は、本発明の一実施形態におけるマルチプロセッサ装置の分岐条件の生成を説明する図である。
【図１３】図１３は、本発明の一実施形態におけるマルチプロセッサ装置において、分岐条件を使って生成した画像例を示す図である。
【発明を実施するための形態】
【００２８】
以下、本発明の実施の形態について、図面を参照して詳細に説明する。
【００２９】
本発明の第１の実施形態に係るマルチプロセッサ装置について説明する。本実施の形態は、図１と図５から図９を用いて説明する。
【００３０】
複数のプロセッサはＳＩＭＤ型とし、単一命令を複数実行するものとする。図１に示すように、このマルチプロセッサ装置１００は、メモリ集約装置１０１、外部メモリ１０２、マルチプレクサ１０３、全体制御装置１０５、レジスタメモリ１０６、複数のプロセッサ１０７を備える。メモリ集約装置１０１は、複数のプロセッサ１０７のメモリアクセスを集約する。マルチプレクサ１０３は、プロセッサ１０７のレジスタアクセスに対し与えられた命令に従ってレジスタメモリ１０６のアクセスを行う。
【００３１】
この例では、プロセッサ１０７は物理的に８個とし、ＳＩＭＤとして処理できる論理的な個数（最大処理数）は１０２４個とする。レジスタメモリ１０６はプロセッサ１０７から読み書きするレジスタであり、論理的なプロセッサ数分のレジスタが用意される。例えば、プロセッサ１つあたり１６個のレジスタを持つのであれば、１６×１０２４で１６３８４個のレジスタが用意される。つまり、論理的に保持するレジスタはプロセッサ１０２４個分（１６３８４個のレジスタ）であり、単位時間（１サイクル）当たり物理的に処理できる数は最大８個となる。
【００３２】
８個のプロセッサ１０７は処理数がＮ回の命令が与えられると、レジスタに対するアドレッシングを変化させて、与えられた処理数Ｎの命令を逐次処理する。ここで言うアドレッシングとは、レジスタメモリ１０６において、物理プロセッサごと（８×１６個のレジスタ）に割り付けられた番地に対するアクセスである。例えば、処理数Ｎ＝３００の場合、３８回のアドレッシングを行う。この場合、３７回のアドレッシングにおいて８個のプロセッサ１０７が命令を処理し、１回のアドレッシングにおいて４個のプロセッサ１０７が命令を処理する。したがって、アドレッシングは０から３７まで変化することになる。プロセッサはパイプライン構造を取り、１命令１サイクルのスループットがあるとすれば、３８サイクルでＮ＝３００の処理が可能である。なお、これらの実行回数を制御するのは、全体制御装置１０５である。すなわち、全体制御装置１０５は、与えられた処理数分を同一命令にてプロセッサ１０７でレジスタメモリ１０６のアドレッシングを変化させて順次処理させる。また、全体制御装置１０５は、プロセッサ１０７による当該処理が完了すると、次の命令に切り替えて与えられた処理数分の処理を繰り返させる。特に限定されないが、ここでは、命令は、外部メモリ１０２に格納されている。また、全体制御装置１０５は、命令からパラメータを抽出しプロセッサ１０７とマルチプレクサ１０３に与え制御する。
【００３３】
図５は上記の動作を示す図である。ここでは、便宜上、レジスタメモリ１０６を読み出しと書き込みの２つに分けて図示している。図５では、レジスタメモリ１０６間をプロセッサ１０７が１サイクルごとに昇順にアドレッシングして、合計Ｎ＝３００の処理を実行している。
【００３４】
レジスタメモリ１０６では、上述したように読み出しと書き込みが発生する。例えば、２項演算では、１プロセッサ当たり１６個用意されたレジスタのうち２個を読み出し、レジスタ１個に書き込む。どのレジスタをオペランドとして選ぶかは命令にオペランド番号として記述されており、マルチプレクサ１０３がオペランド番号を受け取ってスイッチする。
【００３５】
ここで、レジスタメモリ１０６は、８個のプロセッサ１０７のアクセスを同時に受け付けるが、８個全て同じ命令なのでオペランド番号も同じである。従って、マルチプレクサ１０３は、各プロセッサ１０７に対して、同一のアドレッシング、かつ同一のスイッチを実現すればよい。ただし、１６個のレジスタは同時に複数選択できるよう、最大１６のレジスタ群に分けておく必要がある。なお、スループットを最大化させるには、読み出しと書き込みが同時にできるようにするべきである。これらは、１６バンクの２ポートＳＲＡＭを用意することで実現できる。
【００３６】
図６は上記の動作を示す図である。図６では、便宜上、マルチプレクサ１０３を、読み出し動作をするマルチプレクサ１０３と、書き込み動作をするマルチプレクサ１０３との２つに分割して示している。図６に示すように、上記の動作では、１６バンクに分けたＳＲＡＭに共通のアドレッシングを行い、命令に記述してある読み出しオペランド番号２つをマルチプレクサ１０３（便宜上上下２つに分けた下方）に入れ、必要なオペランド２つを選択してプロセッサ１０７に入れる。同様に、命令に記述してある書き込みオペランド番号１つをマルチプレクサ１０３（便宜上上下２つに分けた上方）に入れ、プロセッサ１０７の演算結果を指定したバンクのＳＲＡＭに格納する。
【００３７】
実際には、プロセッサ１０７はパイプライン処理を行うので、読み出しと書き込みのアドレッシングはこのパイプラインの段数分だけ遅延する。従って、ＦＩＦＯメモリ等を用いて書き込みのアドレッシングに遅延を付ける。アドレッシングは絶えず変化し、さらに遅延がつくため、読み出しと書き込みの衝突（同一アドレスへのアドレッシング）は起こらない。
【００３８】
命令が次に切り替わるのは、処理数Ｎ＝３００の処理が終わった後になる。この様子を図７に示す。図７において、横軸は時間に対応し、縦軸はアドレッシングに対応する。図７において、横棒はパイプライン処理中を示し、左端がオペランドの読み出し、右端がオペランドの書き込みに相当する。８個のプロセッサ１０７は同一命令を処理数Ｎ＝３００になるまで実施するため、命令０の開始から次に実行される命令１の開始までに、３８サイクルの差が生じる。この差があるため、フロー依存になってもハザードは生じない。例えば、論理プロセッサｎの命令０において「Ｒ０＝Ｒ１＋Ｒ２」（Ｒはレジスタ、添え字は番号）とし、命令１において「Ｒ３＝Ｒ０＊Ｒ０」を記述して、命令０で生成するＲ０を命令１で使用しても、フロー依存でありながら命令０のＲ０への書き込みはかなり前に完了しているので問題は生じない。
【００３９】
これは、処理数Ｎ÷プロセッサ数＞パイプライン段数の関係であれば、ハザードの問題は生じないことを示している。つまり、処理数Ｎが多いほどプロセッサ数を増やしても、もしくはパイプライン段数を増やしても性能劣化が生じにくいことを意味する。
【００４０】
パイプライン段数が増加しても性能が劣化しにくい本構成は、各プロセッサ１０７がメモリ集約装置１０１を通して、外部メモリ１０２へアクセスする場合にも有効である。メモリ集約装置１０１は基本的にメモリへのランダムなアドレス要求に対して、近接するアドレスがある場合に複数の要求を連結したり、キャッシュを搭載して局所的なメモリアクセスの高速化を行ったりする。しかしながら、このような最適化をすればするほど、応答速度の指標であるレイテンシに揺らぎが生じる。しかし、パイプライン段数の上限が高くハザードが生じにくい状態であれば、これらレイテイシもある程度吸収できる。例えば、命令０において「Ｒ０＝［Ｒ１］」（［］内はメモリアドレス）、命令１において「Ｒ３＝Ｒ０＊Ｒ０」とフロー依存の記述をしても、メモリレイテンシが３８サイクル以下であればペナルティは発生しない。
【００４１】
また、パイプライン段数を簡単に増やすことができるので、高度な演算も取り入れることができる。例えば、ＣＯＲＤＩＣ（Coordinate Rotation Digital Computer）と呼ばれる手法は、加減算を繰り返し三角関数や双曲線関数の算出、および割り算を行うことができるが、数十回の繰り返しを必要とするので従来は実装に制限があった。本構成では、このＣＯＲＤＩＣを実装しても、特別な機構や制約を設けずに使用できる。例えば、命令０において「Ｒ０＝ｓｉｎ（Ｒ１）」、命令１において「Ｒ３＝ａｒｃｔａｎ（Ｒ０）」とフロー依存の記述をしても、パイプライン段数が３８サイクル以下であればペナルティは発生しない。
【００４２】
さらに、高い動作周波数で読み書きするレジスタは、一般的にフリップフロップで構成されるが、本構成では、パイプライン段数に余裕があるため、低コストなＳＲＡＭを使用しても問題にならない。例えば、パイプライン化されたＳＲＡＭを使用すれば、アクセスタイムに数サイクルが必要であっても、スループットは１サイクルなので問題にならない。
【００４３】
一方、図７から分かるように、命令は３８サイクルの期間不変である。逆に言うと、命令の更新頻度は低く、命令キャッシュ等のアクセスを高速化する手段をとる必要がない。この特徴は、命令の長さ（語長）の制限も解消し、ＶＬＩＷ（Very Long Instruction Word）と言われる水平型命令（演算器が並列し基本的にお互いを干渉しない）の実装にも有利である。
【００４４】
図９は、マルチプロセッサ装置を複数の処理ユニットで構成することを説明する図である。図９に示すように、このマルチプロセッサ装置１００は、整数ユニット８０１（乗算と加算）、浮動小数点ユニット８０２（乗算と加算）、上述したＣＯＲＤＩＣユニット８０３（三角関数と双曲線関数の算出および割り算）、メモリアクセスユニット８０４を備える。各プロセッサ１０７はこれらを含み、マルチプレクサ１０３はそれぞれのユニットの命令ごとに必要なレジスタを選択し供給するよう拡張されている。
【００４５】
それぞれのユニット８０１から８０４はパイプライン化されており、図中の各ユニットのマス目を１サイクル消費して処理するが、それぞれのレイテンシは異なる。このため、この例では、ＦＩＦＯメモリによりタイミングのずれを吸収し、同期化してマルチプレクサ１０３に結果を返す。図９によれば、基本的にレジスタ読み出しからレジスタ書き込みまでは一方通行で、相互に干渉もなく構造は簡単である。これは、高速化する場合に有利となる。
【００４６】
以上の構成では、命令の語長を簡単に拡張できる。また、ユニットを簡単に着脱（有効化及び無効化）できることから回路の追加・削減を容易に実現できる。これらの結果、ユーザーが目的に合わせて処理回路を簡単にカスタマイズできるマルチプロセッサ装置の提供が容易になる。
【００４７】
なお、レジスタメモリ１０６は基本的にプロセッサ個々にアクセスするものであるが、別途、共通にアクセス可能なレジスタを用意してもよい。このようなレジスタは、例えば、全体の処理に共通の変数を参照する場合に使用される。ただし、複数のプロセッサから書き込まれると、本来とは違った値になる可能性があるので、それを避けるために、論理プロセッサごとに書き込む値を合計してヒストグラムを作るなどの構成にすることが好ましい。
【００４８】
本発明の第２の実施形態に係るマルチプロセッサ装置について説明する。本実施の形態は、図８を参照しながら説明する。
【００４９】
上述のように、第１の実施形態で説明したマルチプロセッサ装置１００は、処理数Ｎが大きいほど効果も大きくなる。しかしながら、論理プロセッサ数（最大処理数）は１０２４個と固定なので、処理数Ｎが論理プロセッサ数に満たない場合の対応と、処理数Ｎが論理プロセッサ数を越えた場合の対応が必要な場合がある。
【００５０】
画像処理を考えた場合、プロセッサごとに画素処理を行うと仮定すれば、ＱＶＧＡサイズで３２０×２４０＝７６，８００なので、処理数は十分大きい。一方、当該処理数は最大論理プロセッサ数１０２４を越えるため、分割処理が必要になる。分割は構成上、従来のプロセッサのように命令ごとに切り替えるのではなく、一連のプログラムが終了してから切り替える。
【００５１】
例えば、ＱＶＧＡ画像のＡｆｆｉｎｅ変換（画像の回転）を考える。Ｃ言語に近い書き方をすると、当該変換は、以下のようになる。ここで、変数ｘ，ｙはＱＶＧＡの座標、Ｃ０からＣ５はＡｆｆｉｎｅ変換の回転を表す定数、ｍｅｍ［］［］はＱＶＧＡのそれぞれの画素を格納するメモリ記述である。以下の記述では、Ｒ２とＲ３に、マトリクス計算（Ａｆｆｉｎｅ変換）で得られる転送元の座標を代入し、Ｒ０を介して転送元のデータを読み出し、読み出した値を変数ｘ，ｙが示す転送先の座標に書き込んでいる。
【００５２】
for (y=0; y<240; y++)
for (x=0; x<320; x++) {
R2 = C0 * x + C1 * y + C2;
R3 = C3 * x + C4 * y + C5;
R0 = mem[R3][R2];
mem[y][x] = R0;
}
【００５３】
変数ｘ，ｙの２重ループになるが、マルチプロセッサ装置１００によると上述のＡｆｆｉｎｅ変換は、以下のような実行手順で実行される。ここで、変数ｘは物理的なプロセッサ数である８個ごとに走査され、変数ｉはプロセッサ数８個分並列に処理される。すなわち、変数ｙが１つ変化するステップで、一連のプログラムを全て処理し、それをＹ座標が最大になるまで繰り返している。
【００５４】
for (y=0; y<240; y++) {
for (x=0; x<320; x+=8)
for (i=0; i<8; i++)
R2 = C0 * (x+i) + C1 * y + C2;
for (x=0; x<320; x+=8)
for (i=0; i<8; i++)
R3 = C3 * (x+i) + C4 * y + C5;
for (x=0; x<320; x+=8)
for (i=0; i<8; i++)
R0 = mem[R3][R2];
for (x=0; x<320; x+=8)
for (i=0; i<8; i++)
mem[y][x] = R0;
}
【００５５】
一方、以上の処理において、論理プロセッサ数を無駄にせず、パイプライン段数に余裕を持たせたい場合は、例えば、以下のように、ループ数を変数ｙで１/３倍、変数ｘで３倍にして補正してやればよい（変数ｘ，ｙを参照している部分の補正は省略）。これにより、変数ｙに沿う方向で３行分の画素を１行に結合した状態での処理が可能になる。ここでは、３つの処理を１つに結合する例を示しているが、結合対象となる処理数は特に限定されず、任意に設定することができる。なお、変数ｘは最大９６０になるので、１０２４−９６０＝６４は無駄になる（説明の簡単のため無駄をなくした最適化は省く）。
【００５６】
for (y=0; y<240/3; y++)
for (x=0; x<320*3; x+=8)
【００５７】
同様に、ＨＤサイズ１９２０×９６０の場合は、以下のように、ループ数を変数ｙで２倍、変数ｘで１/２倍にして補正してやればよい。これにより、変数ｙに沿う方向で１行分の画素を２行に分割した状態での処理が可能になる。ここでは、１つの処理を２つに分割する例を示しているが、分割数は特に限定されず、任意に設定することができる。
【００５８】
for (y=0; y<960*2; y++)
for (x=0; x<1920/2; x+=8)
【００５９】
なお、与えるプログラムが意図してこのような変更をする必要はない。上記の補正は、論理プロセッサ数と画像のサイズが与えられていれば簡単に算出できるので、全体制御装置１０５が自動的に調整する。このような調整は、例えば、１０２４を越えない最大Ｘ座標の倍数を見つけるなどにより実現できる。つまり、本実施形態においても、論理プロセッサ数や物理プロセッサ数などを意識する必要はなく、従来通りのプログラムを与えればよい。
【００６０】
しかしながら、画像処理と言っても二次元配列ではなく、曲線描画のベクター操作など短く補正できない処理もある。また、メモリアクセスで吸収しきれないレイテンシが発生することもある。図８は、パイプラインの段数が６０の場合に生じるハザードの様子を表している。この例では、命令０で３８回プロセッサ１０７を起動した直後、命令１でプロセッサ１０７を起動できない。命令０の処理が終了するサイクル６０まで待機させる必要がある。すなわち、命令を切り替えて新たな命令を実行する際に、切替前の命令において、新たな命令の処理順番と同じ処理順番で実施された処理が終了していなければ当該処理が終了するまで新たな命令についての処理を待機させる必要がある。ここで、処理順番は、順番に処理される処理数Ｎの命令における処理の位置を意味する。例えば、処理順番が「１０」である処理は、処理数Ｎの命令のうち、第１０番目に実施された処理を意味する。
【００６１】
ただし、命令が変わっても同一レジスタさえ参照しなければ、待機させる必要は無い。また、例えばメモリアクセスにおいて、事前にメモリアクセスをしておき、数命令後に読み込んだメモリの値を参照するようにすれば、処理数Ｎを仮想的に数倍にすることができ、レイテンシの揺らぎを大きく吸収できる。
【００６２】
全体制御装置１０５が動的にこれらを制御するには、命令の前後もしくはいくつか離れた命令間でフロー依存を検知すればよい。ただし、当該制御ではオペランド番号の総当り検査が必要になる。一方、全体制御装置１０５に静的なフロー依存の情報を与え処理してもよい。プログラム中の前後のレジスタ番号の重なりの有無がフロー依存の情報になる。例えば、近接するｎ個前の命令の依存関係は無視するなどがコンパイラで変換される。すなわち、切替前の命令において、新たな命令の処理順番と同じ処理順番で実施されるとともに、予め指定された命令数以前に実施された処理が終了していなければ当該処理が終了するまで新たな命令についての処理を待機させる。この場合、予め指定された命令数よりも後に実施された処理については終了を確認することなく、新たな命令についての処理が実施される。
【００６３】
以上の制御により、処理数Ｎやプロセッサの数、プログラムの大きさなどの条件に変更が生じても、構成を大きく変えることなく、ハザードの発生を抑制することができる。
【００６４】
本発明の第３の実施形態に係るマルチプロセッサ装置について説明する。本実施の形態は、図６と図７と図１０と図１１を参照しながら説明する。
【００６５】
先ず、第２の実施形態と同様、本実施形態のマルチプロセッサ装置１００は、画像処理を扱うものとする。このマルチプロセッサ装置１００は、図７に示すように、アドレッシングを変化させ逐次命令を実行する形式を取り、アドレッシングは画像処理のＸ座標に沿って行うものとする。また、プログラム中の命令を実行し終わった後、次のＹ座標について再度処理を行い、画像全体を処理し終わった時点で終了するものとする。
【００６６】
各プロセッサ１０７間の通信は外部メモリ１０２上で行うと、データの往復分のサイクルがかかり非効率である。例えば画像処理の一つであるフィルタを行う場合、左右の画素の演算が必要であり、既に読み出したデータもしくは処理した結果を横方向に参照する必要性が生じる。
【００６７】
この場合、横方向の異なる論理プロセッサのレジスタを参照する必要があるが、図６から分かるように、このような参照はレジスタメモリ１０６のバンクごとの読み出しをシフトすることで実現可能である。上述のように、各プロセッサ１０７において実行される命令は同一であるため、シフトするオペランド番号とシフト量は固定である。したがって、横方向の参照を実現するには、読み出し用のマルチプレクサ１０３にシフト量を命令から与えるだけでよい。この場合、命令には相対的に参照するシフト量が記載される。なお、シフト量にはシフト方向の情報（加算または減算の情報）が含まれる。
【００６８】
また、レジスタファイル１０６へのアドレッシングも上記のシフト量に合わせて変更する。シフト量を指定したオペランドと指定しないオペランドの演算を同時に行うことがあるため、シフト量が指定されていないバンクは操作しない。
【００６９】
図１０は、正方向に１２離れた論理プロセッサのレジスタを参照している。１２離れているので、処理中のアドレッシングをｎとすれば、相対的なアドレッシングはｎ＋１およびｎ＋２にまたがる。１回のアドレッシングで読み出せるのは８個の整えられた連続したデータ（物理プロセッサ数分）なので、これをまたぐ場合、アドレッシングの最初だけ２回行う。次以降のアドレッシングは、前回アクセスした値（データ）を憶えておけば、新たなアドレッシング１回で済む。
【００７０】
例えば、最初の２回のアドレッシングにおいて、アドレッシングｎ＋１の８個のデータと、アドレッシングｎ＋２の８個のデータを取得する場合、使用しないアドレッシングｎ＋２の局所位置番号（論理プロセッサ番号を８で割った余り）「４」から「７」のデータを記憶する。そして、次のアドレッシングでは、アドレッシングｎ＋３の８個のデータを取得する。これにより、記憶していたアドレッシングｎ＋２の局所位置番号「４」から「７」のデータと、新たに取得したアドレッシングｎ＋３の局所位置番号「０」から「３」のデータを使用可能な状態になる。この場合、使用しないアドレッシングｎ＋３の局所位置番号「４」から「７」のデータは記憶され、後続の処理に使用される。
【００７１】
以上のように、全体制御装置１０５は命令に異なるプロセッサのレジスタ参照があれば、アドレッシングの開始だけ２回アクセスさせる。ただし、本事例の場合、異なるプロセッサのレジスタ参照であっても、８の倍数の相対的な参照であれば、アドレッシングが２つにまたがることはないため、２回アクセスさせる必要はない。
【００７２】
マルチプレクサ１０３は、アドレッシングｎ＋１とアドレッシングｎ＋２のデータに対して、図１０に示すように、物理プロセッサの番号０から３までにアドレッシングｎ＋１のデータを配分し、物理プロセッサの番号４から７までにアドレッシングｎ＋２のデータを配分する。前者は、論理プロセッサの局所位置番号４から７をシフトしてそれぞれに与える。同様に後者は、論理プロセッサの局所位置番号０から３をシフトしてそれぞれに与える。
【００７３】
以上により、横方向の異なる論理プロセッサへのレジスタが参照可能となる。
【００７４】
次に縦方向の異なる論理プロセッサへのレジスタ参照方法について述べる。ここで、縦方向の処理は画像処理の上下の画素の演算を行うこととする。
【００７５】
図７にあるように、本実施形態のマルチプロセッサ装置１００は、Ｘ座標に対して全ての命令の実行が終了するまで、異なるＹ座標の実行は行わない。従って、異なるＹ座標の処理中の値は参照できない。ただし、新たなＹ座標のプログラム開始時点で、前のＹ座標で処理し終わった結果がレジスタメモリ１０６に残っている。これを参照することで、Ｙ座標の小さい方の論理プロセッサのレジスタ値が使用できる。
【００７６】
ここで、レジスタＲ０からＲ３を窓として利用し、異なるＹ座標の処理結果を再利用させることを考える。すなわち、Ｒｎ（ｎ＝０から３）が現在のＹ座標−４＋ｎの処理結果を格納しておくものとする。プログラムの開始時はこのままＲ０からＲ３を使用すればいいが、次のＹ座標の処理する場合、新たにＲ０からＲ３を更新する必要がある。
【００７７】
Ｙ座標を更新するたびにプログラムが変えるのは非効率なため、どのＹ座標の処理であっても、Ｒ０からＲ３は次のＹ座標の処理から見て同じ相対位置に見せなければならない。従って、Ｘ座標の処理を終えた時点で、Ｒ１からＲ０へ、Ｒ２からＲ１へ、Ｒ３からＲ２へ、さらにＲ３には現行のＹ座標の結果を転送しなければならない。これをプログラム上で行うと、数命令消費することになる。
【００７８】
このため、レジスタを選択するマルチプレクサ１０３に対して、命令で指定されたオペランド番号にＹ座標の最下位の４ｂｉｔを加えることにする。４ｂｉｔはレジスタ数の最大（ここでは「１６」）をカバーできるｂｉｔ数である。例えば、Ｙ＝０では＋０、Ｙ＝２２（10110）では＋６（0110）、Ｙ＝２３（10111）では＋７（0111）となる。Ｙ＝２３を処理する時点で、Ｒ０はＹ＝２２の処理におけるＲ１に相当する。このように、Ｒ０からＲ３まで、古い順すなわちＹ座標の小さい順にしかるべきデータが並ぶことになる。
【００７９】
なお、Ｙ座標の大きい方の値は、処理していないので参照することができない。しかし、過去の結果のいくつかを参照できるので、Ｙ座標の処理に対して、少し小さいＹ座標の処理を行うことにすれば、上下を参照して処理することに等しくなる。例えば、Ｙ＝１００の時点において、Ｙ＝９６，９７，９８，９９で取得したデータが見えるとする。Ｙ＝１００の処理ではあるが、Ｙ＝９８を中心とした処理を行えば、前後のデータを参照することができる。
【００８０】
以上から、図１１のように、横方向を参照する場合は命令でシフト数（論理プロセッサ間の距離）を指定し、縦方向を参照する場合は意図的に設けたレジスタの窓を参照するプログラムを作成するだけでよくなる。なお、横方向および縦方向の開始・終了時点（すなわち、外周の画素）は、ミラーリングやコピーなどの端処理を含むものとする。ミラーは座標が−１であれば１、−２であれば２とみなして処理するものであり、コピーは座標が負であれば全て座標０とみなして処理するものである。負だけではなく、座標の最大数を超えた場合も同様である。
【００８１】
本発明の第４の実施形態に係るマルチプロセッサ装置について説明する。本実施の形態は、図７と図９と図１２と図１３を参照しながら説明する。
【００８２】
ＳＩＭＤ型プロセッサでは分岐があると、全ての論理プロセッサで同じ命令を実行しなければならないため、分岐不要時も分岐させる必要がある。分岐不要時は、レジスタへの書き込みを制限するなどして、分岐しても処理をさせないようにする。これにより、実質的に、プログラムの一部分の処理を飛ばして、後続の処理を実施するジャンプを実現することができる。これは、分岐の有無（分岐フラグ）を記録しておかないと、多重分岐に対応できないことを意味する。
【００８３】
本実施形態のマルチプロセッサ装置１００は、論理プロセッサごとに分岐条件を蓄えて、蓄えた情報から処理の有無を決定する。これにより、８個のプロセッサ１０７に同一の命令を入力している場合でも、プロセッサ１０７ごとに分岐を実現することができる。ここでレジスタメモリ１０６は、一般的に使用するレジスタの他に、キャリーやオーバーフローなどの演算結果と上記の分岐条件フラグを持つこととする。
【００８４】
図９に示した４つのユニット構成を想定し、演算結果ＣＣ（コンディションコード）を定義しておく。図９の整数ユニット８０１とメモリアクセスユニット８０４のコンディションコードはまとめてＣＣｉｎｔ、浮動小数点ユニットはＣＣｍａｄ、ＣＯＲＤＩＣユニットはＣＣｃｏｒとする。ＣＣは、正負を表すＮ、ゼロを表すＺ、オーバーフローを表すＶ、キャリーを表すＣの４ｂｉｔからなる。
【００８５】
図１２は、分岐フラグＦ０からＦ３を生成する過程を示している。レジスタメモリ１０６に含まれる分岐フラグ１１１は、４つのレベルＦ０からＦ３で構成される。分岐フラグ１１１を生成するため元情報の選択は、選択テーブル１１２に基づいて行われる。当該選択は、命令の中で指定される。
【００８６】
生成テーブル１１３は、選択テーブル１１２に基づいて選択された元情報を構成する４ｂｉｔの全ての組み合わせ（２の４乗の１６パターン）を表しており、４ｂｉｔの各桁の状態から更新用の分岐フラグを生成するテーブルである。当該生成テーブル１１３を用いた更新用の分岐フラグの生成も命令の中で指定される。
【００８７】
指示テーブル１１４は分岐フラグ１１１と、生成テーブル１１３で生成した更新用の分岐フラグを組み合わせ新たな分岐フラグを生成（選択）するテーブルである。当該指示テーブル１１４を用いた新たな分岐フラグの生成も命令の中で指定される。
【００８８】
判断テーブル１１５は、分岐フラグ１１１を構成する４ｂｉｔの全ての組み合わせ（２の４乗の１６パターン）を表しており、４ｂｉｔの各桁状態から判断フラグを生成（選択）するテーブルである。当該判断テーブル１１５を用いた判断フラグの生成も命令の中で指定される。
【００８９】
書込み指示テーブル１１６は、判断テーブル１１５で生成した判断フラグを元に、レジスタメモリ１０６への書き込みと、分岐フラグ１１１への書き込みの有無を決定するテーブルである。当該書込み指示テーブルを用いた書き込みの有無の決定も命令の中で指定される。
【００９０】
図１２に示すように、各ユニットの演算結果に付属するＣＣ（ＣＣｉｎｔ、ＣＣｍａｄ、ＣＣｃｏｒ）か、分岐フラグ１１１のいずれかから、選択テーブル１１２に基づいて更新用の分岐フラグが生成される。例えば、ＣＣｉｎｔのＮＺＶＣのうちＮとＺのｂｉｔが１の場合に分岐フラグを立てたければ、選択テーブル１１２は「１」とし、生成テーブル１１３は２進数表現で「１１１１００００００００００００」（ＮＺが両立するパターン）とする。
【００９１】
次に、更新用の分岐フラグを、元の４つのレベルの分岐フラグにどう組み込むかを指示テーブル１１４に基づいて指示する。例えば、最も過去に生成したフラグを押し出し、空いた箇所に新たな分岐フラグを挿入する場合、指示テーブル１１４は「２」とする。この指示テーブル１１４に基づいて生成された結果が、次の分岐フラグ１１１になる。
【００９２】
一方、図１２の分岐フラグ１１１の状態によって、演算結果をレジスタメモリ１０６に書き込むか否か、および分岐フラグ１１１に書き込むか否かを決めておく。例えば、分岐フラグ１１１のＦ０とＦ１の２ｂｉｔを変化させて４つの状態を作る場合、判断テーブル１１５で状態ごとの設定を行い、指示テーブル１１６を「１」にして処理を行う。これを、以下のＣ言語に近い書き方で説明する（マルチプロセッサに関わるｆｏｒ文は省略）。
【００９３】
switch (F0,F1) {
case 00:
R0 = R1 + R2;
break;
case 01:
R0 = R1 + R2;
break;
case 10:
R3 = R4 / R1;
break;
case 11:
R0 = R1 + R2;
R3 = R4 / R1;
break;
}
【００９４】
プロセッサ１０７に与える命令は、Ｒ０＝Ｒ１＋Ｒ２と、Ｒ３＝Ｒ４/Ｒ１の２つだけ用意すればよい。そして、Ｒ０＝Ｒ１＋Ｒ２はＦ０とＦ１が「１０」の場合に不活性化する設定（判断テーブル１１５は２進数表現で０１０００１０００１０００１００＝０ｘ４４４４）を行えばよい。また、Ｒ３＝Ｒ４/Ｒ１はＦ０とＦ１が「００」と「０１」の場合に不活性化する設定（判断テーブル１１５は２進数表現で００１１００１１００１１００１１＝０ｘ３３３３）を行えばよい。この場合、プロセッサ１０７に与えるプログラムは以下のようになる。ここで、Ｊｕｄｇｅ［］は２進数のテーブル索引をするものとし、Ｆ３２１０は分岐フラグＦ３からＦ０をｂｉｔ連結したものとする。
【００９５】
Judge = 0x4444; if (!Judge[F3210]) R0 = R1 + R2;
Judge = 0x3333; if (!Judge[F3210]) R3 = R4 / R1;
【００９６】
以上説明したように、本構成では、同一命令でありながら、論理プロセッサごとの状態（コンディションコード）で異なる処理を効率的に行うことが可能になる。
【００９７】
次に、命令にプログラム番号が付いており、条件により指定されたプログラム番号へ分岐する場合を述べる。
【００９８】
プログラム番号の分岐は、全ての論理プロセッサの分岐になるため、どの条件で分岐するかを決定しなくてはならない。このような条件は、例えば、上述した判断テーブル１１５で索引した判断フラグが、論理プロセッサ全てで真になるか、もしくは１つでも真になるか、または真の反対になるかなどさまざまである。
【００９９】
当該条件は命令に記載しておけばよいが、例えば分岐でループさせた場合、ループを抜け出す条件が真になりえない場合がある。これは、論理プロセッサ個々では抜け出す条件になるが、全ての論理プロセッサ（処理しない部分は除く）が揃って抜け出す条件にならない場合が出てくるからである。そこで、条件の記載のほかに、ループ回数の上限を記載する。
【０１００】
ここで図７を見ると、命令０から命令１への切り替わりは、命令０の最後のアドレッシングが終了した時点になる。命令０が関わるパラメータ（オペランド指定など）は一度読み込んで蓄えておくだけでよく、命令１に関しては命令０が読み込まれた直後のサイクル以降に、予め読み込んでおいてもよい。この場合、ＦＩＦＯメモリ等でパラメータをスタックしておく。
【０１０１】
しかしながら、分岐を行う場合、命令０のサイクル３７の時点でないと論理プロセッサ全ての分岐フラグの判定ができていない。命令０のサイクル３７の時点で分岐した先の命令を取得しようとすると、プロセッサ１０７の起動がその分遅延してしまう。これは性能劣化に繋がる。
【０１０２】
これを解決するため、遅延分岐を採用する。遅延分岐は、命令０が分岐命令であったとしても、無条件で命令１を実行し、命令１の終了時点で分岐を行うものである。この操作により、命令０実行中に命令１のパラメータを取得し、命令１実行中に命令０終了時点に決まる分岐先の命令のパラメータを取得すればよく、プロセッサ１０７は連続して起動することができる。
【０１０３】
以下は、図９の構成時に分岐命令を使用したプログラム例である。６４×６４のマンデルブロ集合（複素平面上のフラクタル図形）画像生成で、漸化式Ｘｎ＋１＝Ｘｎ＊Ｘｎ−Ｙｎ＊Ｙｎ＋ａ，Ｙｎ＋１＝２ＸｎＹｎ＋ｂの収束回数を記録し図形化するものである。ｆｏｒ文以下の先頭番号は命令番号であり、５つの命令で実現する。このうち、命令２，３で最大６４のループを行い、収束回数をカウント後、その値を画素値とする。
【０１０４】
for (y=0; y<64; y++)
for (x=0; x<64; x++) {
0: R4 = 1/16 * x - 2; R3 = F3210 = 0;
1: R5 = 1/32 * y - 1; R0=R1=0;
2: R2 = R0 * R0 - R1 * R1 + R4; R8 = sqrt(R1 * R1 - 4); R3 += 1;
Judge = 0xaaaa; if (!&Judge[F3210] & (Loop < 64)) goto 2;
Form = 0x3333; F0 |= Form[CCcor];
3: R1 = (R0 * R1 + R5) * 2; R9 = sqrt(R2 * R2 - 4); R0 = R2;
Form = 0x3333; F0 |= Form[CCcor];
4: mem[x][y] = R3;
}
【０１０５】
命令０と１では、操作するＸ，Ｙ座標の正規化を行うとともに、分岐フラグ１１１の初期化と変数の初期化を行う。
【０１０６】
命令２では、浮動小数点ユニット８０２で漸化式の計算（Ｒ２）と、ＣＯＲＤＩＣユニット８０３で収束判定の計算（Ｒ８）を行う。また、収束回数Ｒ３をインクリメントする。ここで、分岐フラグ１１１のＦ０を見て、全ての論理プロセッサ（処理しない部分は除く）が１でない場合、命令２をループさせる（命令中の記号「!&」は否定と全てと言う意味）。ループ回数は最大６４に設定しており、遅延分岐なので命令３は必ず実行される。また、ＣＯＲＤＩＣユニット８０３の結果がオーバーフローＶ（表現できない結果、すなわちＲ＊Ｒ−２＊２＜０）でなければ、Ｆ０に上書きさせる。これは、Ｒ１が２以上で発散・終了したことを示す。
【０１０７】
命令３では、命令２同様、浮動小数点ユニット８０２で漸化式の計算（Ｒ１）と、ＣＯＲＤＩＣユニット８０３で収束判定の計算（Ｒ９）を行う。分岐フラグＦ０も命令２同様の判定を行い、結果を上書きさせる。
【０１０８】
命令４では、収束度を外部メモリ１０２に書き出す。
【０１０９】
上記のプログラムを実行すると、図１３に示すシミュレーション結果が得られる。プログラムは命令２と３をループするので平均２サイクル消費し、平均１６回で収束する場合、プロセッサ数が８個であれば、１画素あたり２×１６／８＝４サイクルの性能が得られる。もし、従来のプロセッサで行うとすれば、条件分岐と演算を数サイクルかけて実行することになり、数倍の性能差が生じる。
【０１１０】
このように、分岐フラグを集約することで、少ない命令数でプログラムが実行できる。特に、演算器を並列に用いて命令数を少なくするシステムで効果を発揮する。
【０１１１】
以上説明したように、本明細書は、外部メモリ、複数のプロセッサ、外部メモリ、複数のプロセッサ、メモリ集約装置、レジスタメモリ、マルチプレクサ、及び全体制御装置を備えるマルチプロセッサ装置を開示している。この構成において、メモリ集約装置は、複数のプロセッサのメモリアクセスを集約する。レジスタメモリは、プロセッサが管理するレジスタ数とプロセッサの最大処理数の積の数が用意される。マルチプレクサは、プロセッサのレジスタアクセスに対し与えられた命令に従ってレジスタメモリのアクセスを行う。全体制御装置は、命令からパラメータを抽出しプロセッサとマルチプレクサに与え制御するとともに、与えられた処理数分を同一命令にてプロセッサでレジスタメモリのアドレッシングを変化させて順次処理させ、処理数分が終われば次の命令に切り替えて与えられた処理数分の処理を繰り返させる。
【０１１２】
以上の構成において、全体制御装置は、上述の与えられた処理数が最大処理数を越える処理数であればいくつかに分割して処理を実行し、上述の与えられた処理数が最大処理数に満たない処理数であればいくつかを結合して処理を実行する構成を採用することができる。
【０１１３】
また、以上の構成において、全体制御装置が、命令を切り替えて新たな命令を実行する際に、切替前の命令において、新たな命令の処理順番と同じ処理順番で実施された処理が終了していなければ当該処理が終了するまで新たな命令についての処理を待機させる構成を採用することができる。または、全体制御装置が、切替前の命令において同じ処理順番で実施された処理のレジスタ書き込み位置と新たな命令でのレジスタ読み込み位置が等しい場合は当該処理が終了するまで新たな命令についての処理を待機させる構成を採用することもできる。あるいは、全体制御装置が、切替前の命令において、新たな命令の処理順番と同じ処理順番で実施されるとともに、予め指定された命令数以前に実施された処理が終了していなければ当該処理が終了するまで新たな命令についての処理を待機させる構成を採用することもできる。この場合、全体制御装置は、予め指定された命令数よりも後に実施された処理については終了を確認することなく、新たな命令についての処理を実施する。
【０１１４】
さらに、以上の構成において、全体制御装置が、与えられた命令から各プロセッサによる処理順番に関する相対的なシフト量を抽出して、当該シフト量をマルチプレクサに与えるとともに、当該シフト量がプロセッサの数の整数倍以外であればレジスタメモリへのアドレッシングを最初だけ２回行うよう指示する構成を採用することもできる。この場合、マルチプレクサは、レジスタメモリのアドレッシングで得られるデータと、過去のアドレッシングで得られたデータから、上述のシフト量に従ってデータをシフトさせて抽出するとともに、当該抽出したデータを複数のプロセッサに与える構成にすることができる。この構成により、レジスタアクセス時にアドレッシングとデータのシフトだけで、プロセッサ間のデータ交換が可能であり、特に、画像処理など２Ｄ処理に有効である。
【０１１５】
加えて、以上の構成において、プロセッサは、与えられた命令と個々の演算結果から分岐条件を示すフラグを生成し、命令に従ってレジスタメモリに格納された複数の分岐フラグと組み合わせ新たな分岐フラグとしてレジスタメモリに格納する構成を採用することができる。この場合、プロセッサは与えられた命令と個々の前記レジスタメモリに格納された複数の分岐フラグから、レジスタメモリへの演算結果の書き込みの有無、もしくは指定された命令への移動の有無を決定する。この構成を採用することで、マルチプロセッサ装置の弱点である分岐に対し、複数の条件を凝縮することで、消費する命令数を少なくすることができる。
【産業上の利用可能性】
【０１１６】
本発明のマルチプロセッサ装置は、計算機システムの応用であるデジタルＡＶ機器、携帯端末、携帯電話、コンピュータ機器、車載制御機器、医療機器などに応用できる。
【符号の説明】
【０１１７】
１００  マルチプロセッサ装置
１０１  メモリ集約装置
１０２  外部メモリ
１０３  マルチプレクサ
１０５  全体制御装置
１０６  レジスタメモリ
１０７  プロセッサ
【図１】
0006551751.tif 000002
【図２】
0006551751.tif 000003
【図３】
0006551751.tif 000004
【図４】
0006551751.tif 000005
【図５】
0006551751.tif 000006
【図６】
0006551751.tif 000007
【図７】
0006551751.tif 000008
【図８】
0006551751.tif 000009
【図９】
0006551751.tif 000010
【図１０】
0006551751.tif 000011
【図１１】
0006551751.tif 000012
【図１２】
0006551751.tif 000013
【図１３】
0006551751.tif 000014