説明

並列処理アーキテクチャおよびそれを用いた並列処理プロセッサ

【課題】並列処理プロセッサをFPGAで構成し単体プロセッサ内でプログラムのプロセスを並列処理する。
【解決手段】プロセッサにプロセス管理用レジスタと汎用の内部スタックレジスタとメモリとリンクを設け、実行するプログラムのプロセス識別番号をプロセス管理用レジスタとメモリで管理し、プロセスの識別番号をメモリ上でリンク構造のスケジューリングリストに形成することによりプロセス間を連結し、プロセスの切り替えやプロセス間のチャンネル通信を実行する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コンピュータシステムの中核となる中央演算処理装置(CPU)に関し、単独で並列処理を行い、さらに複数のCPUと協調またはデータ交換により同期をとりながら並列処理を行う並列処理アーキテクチャおよびそれを用いた並列処理プロセッサに関する。
【背景技術】
【0002】
1980年代後半から1990年代前半にCSP(Communicating Sequential Processes)理論に基づいた並列処理用プロセッサ(トランスピュータ(登録商標))が、英国INMOS社により開発、販売された。このトランスピュータは、複数ネットワーク上で連動して動き、そこで能力を発揮し計算スピードを高めるものであった。しかしその後、このトランスピュータの開発製造販売は中止された。
また、1980年代中頃のVLSI(大規模集積回路)技術では1台のトランスピュータ程度の規模の回路は完全に1個のVLSIチップを占有するほどの場所、空間を占めていたので、トランスピュータのネットワークは巨大なボード(回路基板)で実現されていた。さらに、各インターフェースはチップ間を繋ぐ数本のワイアで実現されていた。
一方、トランスピュータに関する資料はおおまかなアーキテクチャのブロック図しか開示されず、トランスピュータの単体内部に関する並列処理アルゴリズムは公表されていなかった。
【0003】
上述したCSP理論ではある計算システム(プログラム)をプロセスの集合として捉え、プロセス間は相互にメッセージ通信を行うことにより同期化をとり、計算が実行される。なお、プロセスとは「ある一定の行動を逐次的に実行し続ける実態」を示す。また、あるプログラムの中で複数プロセスは独自に同時に動作し、各プロセス同士はプロセス内部で実行された入出力操作を介して通信する。そしてこの通信によりプロセス間の同期が計られる。つまりあるプロセスが入力(出力)操作処理の段階に到達すると他方のプロセスが対応する出力(入力)操作段階に至るのを待ち、互いにデータ(メッセージ)通信段階に到達した時点で通信が実行される。入出力の対象となるデータはキュー(待行列;Queue)をとって格納されたりバッファリングされたりすることなくやり取りされる。こうして2プロセス間の処理が揃えられていく。そして、通信終了後は再び独自の処理を続けていく。
【0004】
上述したCSP理論では、通信を交わす2プロセス、あるいはすべてのプロセスにとってもシェアド(共有)メモリというものは存在せず、チャンネル間通信によってのみデータがプロセス間で共有されていくことになっている。
CSP理論を具現化したプログラミング言語にOccam(オッカム;登録商標)があり、この言語で書かれたプログラムはやはり並列で処理される(走る)プロセスの集合として捉えられる。平行して走る2つのプロセスのデータ交換はチャンネルという概念を用いて行われ、2つのプロセスで共通のチャンネル変数を定義し、これを通してデータ交換、同期化を行っていく。
特許文献1にはスイッチを用いて複数のトランスピュータ間を接続する構成が開示してあり、また特許文献2には外部フレームを用いて画像処理に適用したデータ並列処理方式の例が開示してある。また非特許文献1にはプロセッサのレジスタ構造などが開示されているが、プロセッサ単体の詳細な構造やプロセスを並列に実行するアーキテクチャは開示されていない。
【0005】
【特許文献1】特開昭63−501986号公報
【特許文献2】特開平3−263164号公報
【非特許文献1】トランスピュータ入門;山本正樹、中井泰明、村上安範 共著;日刊工業新聞社
【発明の開示】
【発明が解決しようとする課題】
【0006】
優れた情報科学理論CSP理論に基づき製作されたトランスピュータは、CSP理論に基づいたプログラム言語Occamのみで機能する。そのため、OccamはCSP理論の研究発展に必要不可欠である。しかしそれを用いて動作するトランスピュータがないために理論発展とそれに伴う実用化に大きな問題が生じていた。
トランスピュータの開発は中止されたが、その後、CSP理論を基礎とした並列処理プロセッサのニーズは強まるばかりであった。またトランスピュータ開発時代におけるVLSIのCMOS(Complementary Metal Oxide Semiconductor)実装技術と現代の技術では大きな違いがあり、物理的規模として同規模のVLSIに当時は1つのプロセッサのみを載せることで一杯だったところにCMOSトランジスタの微細化が進み20基程度のプロセッサが載せられるようになった。20基のプロセッサで並列処理プロセッサを構成するとかなり複雑なネットワークを構成することができ、システムを大きく展開することができる。
そこで、本発明はその従来技術を凌ぐだけでなく、トランスピュータを最新のFPGA(Field Programmable Gate Array)に搭載させて高速に動作する並列処理プロセッサのアーキテクチャを提供することにある。また、複数プロセスを単体プロセッサ内で実行するための多くのハードウェアアルゴリズムも提供することにより、従来のトランスピュータの性能より優れた並列処理プロセッサ(TPCORE)を提供することにある。
【課題を解決するための手段】
【0007】
本発明の並列処理アーキテクチャは、オッカム言語でプログラムを実行する並列処理プロセッサの並列処理アーキテクチャであって、上記並列プロセッサは、上記プログラムを構成する基本単位で逐次的に実行されるプロセス実行前の初期段階で該プロセスの開始命令が実行されると上記プロセスを生成し、該プロセス待ちのキューが無いときは生成した上記プロセスを実行して該プロセスの終了命令で終了し、または上記プロセスの実行中、チャンネル通信の提起やタイムアウト処理または停止命令が実行されるとアイドリング状態となり相手プロセスのチャンネルの反応(応答)を見るため待機し、上記プロセスを生成した後プロセス待ちが無いとき、上記プロセスの識別番号を上記プロセス待ちのキューの末尾に追加して待機し、待機中に上記プロセス待ちのキュー内で上記プロセスの識別番号が進み待機中の上記プロセスが先頭プロセスになると先頭待機時のプロセスが切り替えられて、該プロセスが実行され、終了命令により終了し、上記初期段階に遷移する。
【0008】
本発明の並列処理プロセッサは、ネットワークを形成してオッカム言語で実行する並列処理プロセッサであって、算術演算または論理演算を行うALUと、上記ALUを制御するマイクロコードを格納したマイクロコードROMと、命令または次に実行する命令が格納されているメモリアドレスを格納するレジスタと汎用スタックレジスタを有する内部レジスタと、上記プロセッサで処理するプログラムの基本単位で逐次的に実行されるプロセスの識別番号を保持するワークスペースポインタレジスタと、待機プロセスを管理するためのデータを格納するプロセス管理用レジスタと、上記マイクロコードROMを制御するマイクロコードROMコントローラとを有するプロセッサと、上記プロセッサに接続されてデータを入出力する複数のリンクと、上記プロセッサまたは上記リンクの入出力データを格納するとともにワークスペースが設けられ該ワークスペースに上記プロセスを開始する識別番号と次に実行されるプロセスの識別番号のデータを所定アドレス値だけ離して格納しスケジューリングリストを形成して上記識別番号が連結されるメモリと、上記メモリの入出力データの授受を制御するメモリコントローラとを有する。
【0009】
本発明の並列処理アーキテクチャおよびこれを用いた並列処理プロセッサは、プロセッサにプロセス管理用レジスタと汎用の内部レジスタとメモリとリンクブロックを設け、実行するプロセスのプロセス識別番号と次に実行するプロセス番号をプロセス管理用レジスタとメモリに格納し、プロセスの識別番号をメモリに格納しかつリンク構造にされたスケジューリングリストに形成してプロセスの切り替えやプロセス間のチャンネル通信を実行する。
【発明の効果】
【0010】
本発明の並列処理プロセッサ(TPCOREとも称する)は、従来のトランスピュータの機械語(アセンブリ言語)を理解するとともに、アーキテクチャが全く異なる別のプロセッサを構成することにより、トランスピュータの性能を向上させた。
また、機械語を従来のトランスピュータとコンパチブルにすることにより、以前トランスピュータで開発されたソフトウェアはすべてこのTPCOREで動作し、しかもOccamも機能することができる。したがって本発明の並列処理プロセッサを用いてCSP理論の発展研究もOccamを通して再び可能となる。
【発明を実施するための最良の形態】
【0011】
まず、本発明の並列処理プロセッサの主要部のCPU10(中央演算処理装置)について説明する。
図1にCPU10のブロック構成を示す。CPU10は、数種類のレジスタ(内部レジスタ)と2本のバスと、各種の演算処理を行うALU31(Arithmetic Logic Unit)、TPCORE(50)を制御する制御部などで構成される。
内部レジスタのうち、処理全般にかかわるレジスタは、Wptr14(ワークスペースポインタ)、Iptr15(インストラクション(命令)ポインタレジスタ)、Ireg26(インストラクション(命令)レジスタ)、Oreg25(オペランドレジスタ)、汎用スタックジスタのAreg11,Breg12,Creg13で構成される。
【0012】
Iptr15は32bitのデータ幅を持ち、次に実行する命令が格納されているアドレスを保持するレジスタである。
Ireg26は4bitのデータ幅を持ち、取り出してきた命令の上位4bitがこのレジスタに格納される。格納された値は命令解釈を行う専用ハードウェアに送られ、そこでデコードされ実行する命令が決定する。
Oreg25は32bitのデータ幅を持ち、取り出してきた命令の下位4bitがここに格納され、この格納された値は命令解釈時にIreg26の値とともに用いられる。
汎用スタックレジスタのAreg11,Breg12,Creg13は32bitのデータ幅を持ち、スタック構造を形成している。データの入力、出力に応じて、これらのレジスタ間でPUSH(プッシュ)、POP(ポップ)の動作を行う。
【0013】
プロセスを管理するレジスタとしてWptr14(ワークスペースポインタ)、待機プロセス管理用レジスタとしてFptr16(フォワードポインタ)、Bptr17(バックポインタ)がある。
Wptr14は、現在のプロセスを示す32bitの値(プロセスID(識別番号))をこのレジスタに格納する。Wptr14の下位2bitはプロセスの優先度を示す。プロセスIDは、並列プロセスを1台のTPCORE50で実行するために各プロセスにプロセスIDという32bitの値を任意に付ける。
Fptr16、Bptr17の待機用のプロセス管理用レジスタは、Wptr14が現在のプロセスIDを管理しているのに対して、現在実行されていないプロセス、すなわち待機プロセスのIDを管理する。Fptr16は待機プロセスの先頭のプロセスID、Bptr17は最後尾のプロセスIDを保持する。待機プロセスが3つ以上のときは、この2つのレジスタで管理することはできないので、メモリ(42)を利用したリスト構造でこれらを管理する。
【0014】
その他のレジスタとして、cnt21(カウンタレジスタ)とTemp29(テンポラリレジスタ)がある。cnt21は32bitのデータ幅を持ち、繰り返し処理の回数やシフト回数、入出力数を数えるときに用いられる。Temp29は32bitのデータ幅を持ち、ALU31が乗算や除算などを1クロックで演算を実行できないとき一時的に処理結果を保存する。
【0015】
ALU31は、TPCORE50内部で算術、論理演算を行う。処理実行時に演算が必要なときは、レジスタのデータや演算用に任意に生成されたデータが個々に送られ演算処理が行われる。
【0016】
マイクロコードROM27(Microcode ROM)はマイクロコードを記憶し、レジスタ間の通信やメモリ42とレジスタ間の通信制御を行い、またALU31の機能も制御する。この他プロセッサの状態遷移も管理する。一つのマイクロコードは68bit幅であり、各bitによりTPCORE50の動作を制御する。マイクロコードの上位56bitがバスやレジスタ、ALU31の制御を行い、下位11bitでプロセッサの動作を制御する。
マイクロコードROMコントローラ24(Microcode ROM Controller)はマイクロコードのアドレスを算出する。アドレス算出メカニズムは2通りあり、マイクロコードの64bit目の値により区別される。この値が“1”のとき、Ireg26やOreg25の値をもとにしてアドレスを算出し、“0”のとき、マイクロコードROM27の出力9〜0bitの値をそのまま次のアドレスとする。
【0017】
次に図2に、TPCORE50のブロック構成図を示す。TPCORE50は上述したCPU10以外にリンク(Link)ブロック45、メモリコントローラ41(Memory controller)、メモリ42(Memory42−a〜42−d)などで構成される。各メモリ42−a〜42−dは8KByte(キロバイト)ブロックのRAMで構成される。リンクブロック45は4個のインターフェース(リンク)で構成され、他のTPCORE50と通信又はデータの交換を行う。
【0018】
メモリ(Memory42)は、1個のTPCORE50につき32KByteの内部メモリが搭載される。このメモリ42はCPU10とリンクブロック45の両方からアクセスされる。これらのアクセス優先権は後述のメモリコントローラ41で管理される。
また、メモリ42はバイトアクセス、ワードアクセスの2通りの方法でアクセスできる。メモリ42からの読出しやメモリ42への書込みのデータ幅が2通りあるので、32KByteのメモリ42は8KByteのメモリ42−a(〜42−d)を4個組み合わせた構成となっている。各メモリ42−a〜42−dはデータ幅が8bit、深さ1024で構成される。
【0019】
リンクブロック45はリンクインターフェースやレジスタなどを含み、TPCORE50に4個の双方向シリアルリンク(リンク;Link)が構成され、これらの4個のリンクの制御はCPU10と独立に管理される。つまり、リンクブロック45はTPCORE50を構成する他の部分と独立して動作する。したがって、リンクブロック45は、CPU10やメモリ42からデータを受け取ると、CPU10の動作と関係なくデータを送受信することができる。
【0020】
メモリコントローラ41はCPU10からメモリアクセスの要求またはリンクインターフェースからメモリアクセス要求を受ける。そして、このメモリコントローラ41は、FPGAに搭載されたメモリ42の仕様に応じてリクエストを調整する。
メモリコントローラ41は、メモリアクセスの権限とバスデータ幅の変更(バイト(Byte)幅、ワード幅など)について管理する。また、アドレス空間は4GByte(ギガバイト)以上に拡張することができる。
【0021】
次に、メモリアクセス権限について説明する。メモリコントローラ41は1本の制御線でメモリ42の優先度を制御する。例えば、制御信号が“High”(ハイ)レベルのときリンクブロック45がメモリ42を制御し、“Low”(ロー)レベルのときCPU10がメモリ42と接続される。
リンクブロック45にメモリアクセス権限が渡されると、メモリ42はリンク52−a〜52−dを介して他のTPCORE50上にあるメモリ42と直接接続され、所謂DMA(Direct Memory Access)状態となる。そのため、TPCORE50のメッセージパッシング(メッセージ転送)はDMAであるため非常に高速に行われる。
【0022】
次に、メモリコントローラ41によるバスデータ幅の変更管理方法について説明する。
まずアドレスバスについて説明する。TPCORE50は32bitでアクセスできるメモリ空間(4G)のうち、内部メモリとして割り当てられたアドレス空間について、その他のアドレス空間より速いクロックでアクセスすることができる。また、TPCORE50はFPGAに搭載することを前提とし、回路構成を簡素化することにより、全てのアドレス空間を同等にみなしているので、4GByteのメモリ(メモリ42とそれ以外の不図示のメモリ)が同じクロックサイクルでアクセスできる。
さらに、このTPCORE50はFPGAに搭載され、容量が制限されるので32bit幅のうち下位15bitのみ使用する。この15bitの内、14〜2bitがアドレスとして用いられ、1〜0bitは4個のメモリ42−a〜42−dのうちどれを選ぶかを決定するためにバンクセレクトとして使用される。このアドレスバスのデータ幅の変更例を図3に示す。
【0023】
次に、メモリコントローラ41によるデータバス幅の変更について説明する。
CPU10やリンク52−a〜52−dは32bitまたは8bitのどちらのデータでもアクセスできるようにしてあるので、これを制御するためマイクロコードROM27からデータ幅を選択する制御信号が出力される。例えば、通信が成立すると、リンク52−a〜52−dが通信するデータは8bitであるので、データ幅はByte幅に制限される
【0024】
メモリ42のワードアクセスについて説明する。各メモリ42−a〜42−dは8bitでしかデータを入出力することができない。しかし、4個のメモリ42−a〜42−dを組み合わせて、ワード(32bit)幅とバイト幅の2通りのデータを出力することができる。
図4にデータバスのデータ幅の変換について示す。
TPCORE50がメモリ42にアクセスし、データバスの幅がワード幅に決定されたとき、4個のメモリ42−a〜42−dから同時にデータが出力され、メモリコントローラ41により4個のメモリ42−a〜42−dを組み合わせることにより32bit幅のデータを形成する。このとき、アドレスバスから出力されるデータは上位13bitのみ使用し、下位2bitのメモリセレクト部分は使用されない。
【0025】
メモリ42のバイトアクセスについて説明する
データ幅制御信号によりデータ幅がバイト幅に指定されると、TPCORE50がメモリ42にバイトアドレスバスのデータの下位15bitを用いて、データが格納されているメモリ42−a〜42−dとそのアドレスを決定する。TPCORE50がメモリ42にバイトアクセスすると、1個のメモリ42−a〜42−dだけからバイト幅のデータが出力される。
【0026】
次に、TPCORE50は前提条件として以下の(a−1)メモリ、(a−2)プロセス管理用レジスタ、(a−3)内部レジスタを有し、クロックについては(a−4)に示す。
【0027】
(a−1)メモリ42について説明する。
32bit幅(1ワード32bitとする)のメモリ42を用意する。1Byte番地付けとする。例えば0x00000000番地より番地が増えていく方向を正方向,逆を負の方向とする。メモリ量はここでは厳密に定義しないが任意で良い。メモリアクセスとしてはワード単位でプログラムは進んでいくが、チャンネル通信ではバイト単位のデータ転送を行うのでワード、バイトともにアクセスできるようにする必要がある。割り込み発生時各種レジスタ退避のため任意のアドレスに32bit幅で5ワード領域を確保しレジスタ待避専用領域として固定する。それらを退避させるレジスタの名前に対応してCregsaveloc、Bregsaveloc、Aregsaveloc、Iptrsaveloc、Wptrsavelocと便宜的に名付ける(図10参照)。また外部リンク通信用に入力チャンネル4ワード、出力チャンネル4ワードを確保し固定する。それらをLinkInput、・・・、LinkInput、LinkOutput、・・・、LinkOutputと便宜的に名付ける。なお、以下の記述においてアドレス(X)とある場合、Xで示されるアドレスへのアクセスを意味する。
【0028】
(a―2)プロセス管理用レジスタについて説明する。
プロセッサ(CPU10)内にプロセス管理用レジスタとして32bit幅のレジスタを5つ用意する。Wptr14(現行プロセスのワークスペースポインタを保持)と待機プロセス管理用レジスタとしてFptr16とBptr17を用意する。Fptr16、Bptr17は優先度に応じて独立に2組用意する。なお、表現を簡略化するためここではFptr16、Bptr17のサフィックスを省略し、優先度の記号のみを付記する、例えば、Fptr,Bptrを高優先度プロセス用、Fptr、Bptrを低優先度プロセス用とする。以後単にFptr16、Bptr17とのみ記された場合優先度に関係なく、同じ優先度内のレジスタ対であることを意味する。
【0029】
(a−3)内部レジスタについて説明する。
前述したように、命令ポインタ(Iptr15)と呼ばれる32bit幅のレジスタを1つ用意する。次に実行する命令の格納されているメモリアドレスを保持しておく。また同じく32bit幅の汎用スタックレジスタのAreg11、Breg12、Creg13を用意する。任意であるが、いくつか更に内部レジスタを設けなければならない場合がある。この例として、繰り返し操作の回数を保持しておくcnt21(カウンタレジスタ)、一時的なデータ保管用のTemp29(テンポラリレジスタ)などがあるが、以下cnt21が構成されているとする(チャンネル間通信で利用する)。
【0030】
(a−4)TPCORE50のクロックについて説明する。
TPCORE50において、クロックは2種類用意し、優先度の高いプロセスで使用されるクロックの周期は1μ(マイクロ)秒、優先度の低いプロセスで使用されるクロックは64μ秒とする。
【0031】
このように、CPU10を有するTPCORE50は、プロセス管理用レジスタや汎用スタックレジスタとメモリ(RAM)42などのハードウェアを最適化し、また後述するOccam言語で動作するようにすることにより従来のトランスピュータの性能をより向上することができる。
【0032】
次に、TPCORE50を制御するOccam言語の概要について説明する。
まず、コンストラクションで処理するプロセスについて説明する。ここで、コンストラクションとは代入、出力、プロシジャーコール(サブルーチンに相当する)などの最も基本となるプリミティブ(基本)プロセスの集合体を示す。
プリミティブプロセスとは代入文、入力分、出力分の最小単位を示す。
代入プロセスは、変数に値を代入することを示し、yの値を変数xに代入する場合、x:=yと表される。入力プロセスは、変数に値を入力することを示し、ch(チャンネル)1からの変数xを受ける場合、ch1?xと表される。出力プロセスは、変数から値を出力することを示し、ch1へ変数yを出力する場合、ch1!yと表される。
宣言されたチャンネルは、2つの並列動作するプロセス間に存在する。チャンネルは宣言されるとプログラム実行中に通信する相手が変わることは無いが、送信側と受信側は入れ替わることができる。また、TPCORE50間の入出力はお互い同期を取って行われる。
例えば、上(前)の逐次プロセスにより出力プロセスが実行されたとき、下(後)の逐次プロセスが実行されなかったら、実行されるまで上のプロセスは待ち続け、両方が通信可能となったときに通信が開始する。このようにして通信の同期が取られる。
【0033】
Occam言語のコンストラクションはSEQ、PAR、ALT、WHILE、IF、CASEの6種類がある。
SEQ(シーケンシャル)コンストラクションは、プログラムの上から順にプロセスを実行するコンストラクションである。PAR(パラレル)コンストラクションは、記述されている順番に関係なくプロセスを並列に実行する。ALT(オルトネィティブ)コンストラクションは、ALTコンストラクションが求めている条件を1番最初に満たされたプロセスを選択し実行する。WHILE(ホワイル)コンストラクションは、これに付随している論理型の変数に基づいてプロセスが繰り返し実行する。IF(イフ)コンストラクションは、ガードが“真”になった最初のプロセスを実行する。CASE(ケース)コンストラクションは、複数のプロセス群の中から一つのプロセスを選択する。
【0034】
以下、SEQ、PAR、ALTの各コンストラクションについてプログラムを参照しながら具体的に説明する。
SEQコンストラクションを用いたプログラム例を以下に示す。
SEQ
Process 1
Process 2



Process n
【0035】
上述したプログラムにおいて、SEQコンストラクションは、記述されたプロセスをProcess 1から順にProcess 2,Process 3,・・・と逐次実行していく。そして、最後のプロセスProcess nが終了すると、SEQコンストラクション自身が終了する。
【0036】
PARコンストラクションを用いたプログラム例を示す。
PAR
Process 1
Process 2



Process n
【0037】
PARコンストラクションは、記述されたプロセスを同時に実行して行く。そして全てのプロセスが終了したときPARコンストラクション自身が終了する。並列動作するプロセス同士は、唯一チャンネルを用いて通信することで相互作用を行う。PARコンストラクション内のプロセス一つに対して一つのTPCORE50が割り当てられている場合は、同じPARコンストラクション内のプロセスは同時に実行が開始される。しかし、1台のTPCORE50で実行されるPARコンストラクションは、時分割に管理されて擬似並列的に実行される。この擬似並列動作については後述する。
また、並列に実行されるプロセスに優先度を付けることができ、PARコンストラクションの前にPRIの予約語を追加する。
【0038】
ALTコンストラクションを用いたプログラム例を示す。
ALT
input1
Process1
input2
Process2



inputn
Processn
【0039】
ALTコンストラクションは、多くのプロセスから実行すべきプロセスを一つ選択する。上述のプログラムにおいて、input1,input2,・・・,inputnは入力ガードを示し、最初にレディ状態になった入力ガード内のプロセスが実効される。そして、選択されたプロセスが実行された後、ALTコンストラクションは終了する。
ALTコンストラクションもまたPARコンストラクションと同様に優先度を付けることができ、PRIの予約語をALTの前に追加する。なお、Occam言語では、上から順に優先度をつけているが、TPCORE50とトランスピュータでは2つの優先度しかない。そのため、プログラムの一番上に記述されたプロセスが優先度は高く、それ以下のプロセスは優先度が低い。
【0040】
次に、FPGA上でのTPCORE50ネットワークについて説明する。
図5に示すように、TPCORE50は従来のトランスピュータと同様に4つの外部インターフェース52−a〜52−d(またはリンク(Link)とも称する)を備えている。ボックス51がTPCORE50本体を示し、このボックス51の各辺の中央に辺と直交している線はインターフェース52−a〜52−dを示す。
図5に示すように、このインターフェース52−a〜52−dを他のTPCORE50のインターフェース52−a〜52−dとつなぎ合わせTPCORE50ネットワークを構築することができる。
【0041】
図6(a)〜(c)に、TPCOREネットワーク100の構成図を示す。TPCOREネットワーク100はTPCORE50のインターフェース52−a〜52−dを介して複数個TPCORE50を接続して、ツリー接続(図6(a))、パイプライン接続(図6(b))、格子接続(図6(c))されて並列処置プロセッサのネットワークを構築する。例えば、グラッフィクスアクセラレータとしては格子接続を、また並列データベース検索システムではツリー接続とすることにより、応用形態によって短時間で容易にネットワークを構成することができる。
また、上述したTPCORE50をFPGAで形成することにより、ネットワークも並列処理を応用するシステムによって自由にそのトポロジーを改編できる。従って、TPCORE50をFPGA上で実現させることのメリットは非常に大きい。
【0042】
次に、外部リンク(Link)を用いた並列処理プロセッサの通信動作について説明する。ここでは説明を分かり易くするため、2個のTPCORE50−1,50−2を用いた通信の例を示す。なお、図7においてLink Interface(リンクインターフェース)を単にリンク(Link1、Link2)とも称する。
図7に示すように、TPCORE50−1,50−2間の通信は、Acknowledge(ACK;アクノレッジ)パケットにより成立する。このACKパケットが送られてこなければ、これを受信するまで送信(Out)側のLink1(リンクインターフェース)45aはアイドリング状態として待機する。
例えば、TPCORE50−1のBreg12が0x80000008という状態でout命令が実行されるとリンクブロック45を構成するLink2(リンクインターフェース)45を通じて外部にデータを出力しようとする。CPU10はスタックレジスタ(Areg11,Breg12,Creg13)の内容やプロセスIDをリンクインターフェースの各レジスタに渡し、Link2に通信処理を委ねる。そして、現在実効していたプロセスを終了して、スケジューリングリストの次の実行を始める。
【0043】
TPCORE50−1は1Byteのデータを送信後、相手側のTPCORE50−2からACKパケットが送られて来るまでアイドリングし、それらを受信すると通信が成立する(図8参照)。通信が成立した後も1Byteずつ送信し、ACKパケットでデータの送受信をお互い確認し合いながらcnt21に格納されたバイト数のデータを通信する。
CPU10とLink145aが同時にメモリ42aにアクセスすることはできないので、この通信が実行されているときはLink145aがメモリ42aを占用する。通信が終了すると、通信前にLink145aに渡したIDをメモリ42aに形成されたスケジューリングリストの最後尾へ追加する。この追加を実行するための制御はマイクロコードにより行われる。また、通信終了と同時にCPU10がアイドリング状態から復帰し、メモリ42,42aの占有権もCPU10に渡される。図9に、TPCORE50−1,TPCORE50−2が各実行中のプロセスを停止してメモリ42の使用権限をLink145a,Link245に渡し、TPCORE50−1とTPCORE50−2間でACKパケットとデータを送出する例を示す。
【0044】
次に、TPCORE50のプロセッサの単体内部における複数のプロセスの並列処理について説明する。なお、TPCORE50は前提条件として上述の(a−1)メモリ、(a−2)プロセス管理用レジスタ、(a−3)内部レジスタを有する。
【0045】
まず、TPCORE50のプロセス管理について説明する。
以下レジスタのサフィックスの小文字の時はレジスタを示し、(XX)の記号はそのデータ(アドレス値など)を示す。例えばAreg11はレジスタを示し、(Areg11)はAレジスタに格納された(される)データを示す。
プロセスはWptr14とスケジューリングリストによって管理される。Wptr14は現在のプロセスのID(識別番号)を格納するために用いられ、スケジューリングリストは待機プロセスを保持するために用いられる。
あるプロセスを実行中に新しく別のプロセスが生成されたり、割り込みが発生したりするとそのプロセスIDは待機プロセスとして、スケジューリングリストの最後尾に追加される。このリストは先に格納されたものが先に実行されるQueue(キュー)として取り扱われる。また、このスケジューリングリストはリンクリスト構造で実行されるプロセスの順序を管理する。
【0046】
(b−1)プロセスID
プロセスを1つの処理の単位とし、このプロセスにプロセスID(32bit)を付与する。このプロセスIDの下位2bitはそのプロセスの優先度を示し、優先度は“High”(下位1bit=0)と“Low”(下位1bit=1)とする。上位30bitはプロセスごとに格納するメモリ42のワークスペース上でのアドレスを示す。なお、プロセスのワークスペースはOccamコンパイラが管理する。
【0047】
(b−2)ワークスペース
プロセスごとにRAMで構成されるメモリ42上にワークスペースというメモリ領域を設け、このメモリ領域にプロセスIDが示す値を基準にそこからメモリ負方向に32bitワード単位で数ワード(必ず)用意する。ワークスペースは並列処理されるプロセスが他のプロセスの割り込みにより一時的に中断されるときデータ(各種レジスタ)の保持、チャンネル通信、ALTコンストラクション命令の実行、プロセススケジューリングに利用する。ワークスペース先頭−4番地(プロセスID−4、つまりワークスペースより1ワード目)にプロセス開始(あるいは再開)時のIptr15の値を入れる。
【0048】
図10に、プロセスID(Wptr14)のワークスペースの例を示す。例えば、プロセスIDが示すアドレス(Wptr14)の一つ前のアドレス(Wptr14−1)をアクセスする時は、Wptr14の値をALU31に送り1減らした値をアドレスとしてアクセスする。同様に、アドレス(Wptr14−2)にアクセスする時は、アドレス(Wptr14)から2を引いた値をアドレスとしてアクセスする。
【0049】
(b−3)ワークスペース管理
現在実行中のプロセスIDはWptr14に保持する。プロセスを実行中に新たなプロセスが生成された場合、そのプロセスは待機プロセスとしてプロセススケジューリングリストの最後尾に付け加える。このリストは先入先出構造(FIFO)を持つ。プロセスIDの示すそのプロセス独自のアドレス(ワークスペース−8)、即ちアドレス(ワークスペース−2ワード)目にそのプロセスの次に実行されるべきプロセスのワークスペースアドレス(即ちプロセスID)を収納する。もしそれ以降に実行すべきプロセスがない場合は空信号(empty,エンプティフラグ)として例えば0x80000000あるいは0x80000001(それぞれ低い優先度のプロセス用,高い優先度のプロセス用)という値を持たせる。このアドレス(ワークスペース−8)に次に実行させるプロセスIDを持たせることによりリンクリストの型でプロセススケジューリングリストを構成する。待機プロセスの先頭のプロセスIDをFptr16に、最後尾のプロセスIDをBptr17に保持させる。アドレス(Bptr17−8)にはしたがってemptyが格納されている。この構造によるスケジューリングリスト(以下キュー(Queue)とも称する)は2つの優先度(high,low)について独立に保持する。図10に、メモリ42上のプロセスID(Wptr14)のワークスペースの例を示す。アドレス(Wptr14,Wptr14−1,・・・,Wptr14−5)と汎用レジスタとプロセス管理用レジスタに対応する記憶場所の関係について示す。
【0050】
次に、メモリ42上のワークスペースに関する具体例を表1,2に示す。表1は、PARコンストラクションの実行時のワークスペース内容を示し、ワークスペース相対アドレスと格納データの関係を示す。また表2には、ALTコンストラクションの実行時のワークスペースの内容を示す。いずれのコンストラクションにおいても、負方向に所定ワード離れたアドレスにデータが格納される。PARコンストラクションでは所定アドレス離れてプロセス開始時や復帰時に実行されるアドレス、次に実行されるプロセスのID、通信開始時アクセスするメモリ42の先頭アドレスが格納される。また、ALTコンストラクションではアドレスの負方向に所定アドレス離れて、ガード選択状態、プロセス開始時や復帰時に実行されるアドレス、次に実行されるプロセスのID、ALT実行状態が格納される。
【0051】
【表1】

【0052】
【表2】

【0053】
次に、TPCORE50単体における並列プロセス処理について説明する。
図11に、並列で数種類のプロセスが走る環境下でのプロセス状態遷移図を示す。並列処理はプログラムが実行される前のグランドステージ(初期(基本)段階)で、TPCORE50にプロセスを開始するstartp(開始)命令が供給されプログラムが実行されると(ST1)プロセスを生成する(ST2)。そして、キュー(Queue)が空のときは生成したプロセスを実行し(ST3)、endp(終了)命令でプロセスを終了する。また、プロセス(ST3)の実行中、チャンネル通信の提起やタイムアウト処理やstopp命令が実行されると、アイドリング状態となり(ST4)相手方プロセスのチャンネルの反応を見るため待機する(ST5)。
一方、プロセスを生成した後(ST2)キューが空でないとき、プロセスIDをキューの末尾に追加して待機する(ST5)。待機中にキュー内でプロセスIDが進む。待機中のプロセスが先頭プロセスになると先頭待機時のプロセスがチェンジして(切り替えられて)待機中のプロセスが実行され(ST3)、endp命令によりプロセスが終了し、最初のグランドステージに遷移する(ST1)。以後同様な遷移が繰り返される。
【0054】
以下、上述した並列プロセスの処理の具体例に説明する。
Occam言語で作成されたプログラムにPARコンストラクションやALTコンストラクションなど新しくプロセスを生成するようなコンストラクションが存在すると、コンパイラは以下の実行をするようにアセンブラコード群を生成する。
(a1)生成するプロセスIDを作る。
(a2)アセンブラ命令startpを用いてプロセスを生成する。
(a3)生成されたプロセスはその優先度に応じたスケジューリングリストへと追加される。
この(a1)〜(a3)の実行は生成するプロセスの数(並列プロセスの数)だけ繰り返えされる。
【0055】
次にプロセスの実行と切り替えについて図1,2を参照しながら説明する。
TPCORE50は、Wptr14の値が示すプロセスを実行する。しかし、実行しているプロセスが実行不可能またはプロセッサ(TPCORE50)がアイドリング状態になった時にプロセスの切り替が起こる。つまりアイドリング状態になった時、再び実行可能状態になるまでその状態を待ち続けるのでなく、別のプロセスを実行することでアイドリング状態を減らしている。
上述したプロセス実行不可能またはアイドリング状態にする要因は以下の例がある。
(b1)プロセスを終了または停止させるようなアセンブラ命令が実行された場合。
(b2)入出力命令を実行したとき、通信する相手が準備できていない場合。
(b3)遅延やタイムアウト処理を行う命令を実行した時、目的の時間が経過していない場合。
このとき、TPCORE50におけるハードウェアのメカニズムは次のようのになる。
(b4)待機プロセスの有無を調べ、無ければアイドリング状態にし、有ればプロセスの切り替え次のステップへ進む。
(b5)Fptr16の値をWptr14へ格納する。それと同時にアドレス(Wptr14−1)に格納されている値をIptr15へ格納する。
(b6)次に待機プロセスのIDをアドレス(Wptr14−2)から取り出し、それをFptr16へ格納する。
(b7)Wptr14へ格納されたプロセスを開始する。
このようなプロセス切り替えを行うハードウェアの状態の遷移はマイクロコードに記述してあり、それによって制御される。また例外的にプロセスが切り換る要因として割り込みがあるが、これについては後述する。
【0056】
次に、上述したスケジューリングリストについて説明する。
スケジューリングリストはメモリ42上に形成され、リンクリスト構造で実行されるプロセスの順序を管理する。プロセスはプロセス自身ワークスペースを持ち、これを用いてスケジューリングリストを形成する。図12ではプロセスが4個存在しているときのスケジューリングリストの例を示す。なお、図12において煩雑さを避けるため、Wptr14の記号をWptrと略記して、プロセス番号をWptrに付記する。
メモリ42(Memory)上で形成されたスケジューリングリストにおいて、例えば、あるプロセス(プロセス0)のIDがアドレス(Wptr)であるとき、そのプロセスの次に実行されるプロセスIDはアドレス(Wptr−2)に格納される。また自らのプロセスが実行され始めるときの命令取得先のアドレス(Iptr15の値)は(Wptr−1)に格納される。4番目の最後のプロセスID(アドレス(Bptr17))はアドレス(Wptr)に格納される。図12に示すように、例えば、3番目のプロセスに関するアドレス(Wptr−2)には次の(4番目の)プロセスIDのWptrが格納され、プロセス自身が次のプロセスを指し示すリンクリスト構造でプロセスは実行順に待機している。
TPCORE50は、このようなスケジューリングリストにアクセスするためにFptr16とBptr17の2種類のレジスタを用意している。
待機プロセスの先頭のプロセスIDがFptr16、最後尾のプロセスIDがBptr17で記憶される。実行中のプロセスが終了し、次の待機プロセスを開始するときなどは、Fptr16にアクセスし次のプロセスが開始する。また、プロセスが生成したときなどはBptr17を用いてスケジューリングリストの最後尾にアクセスし、このプロセスを追加する。このスケジューリングリストの動作メカニズムやFptr16、Bptr17の制御はマイクロコードにより制御される。
【0057】
スケジューリングリストは、アドレス(Fptr16)、アドレス(Bptr17)、メモリ(中間プロセス)の3つの要素で構成され、リンクリスト構造で待機プロセスが連結している。
したがって、待機プロセスがメモリ42で保持されるので使用するレジスタの数が減り、ハードウェアのリソースが節約できる。レジスタなどで待機プロセスを保持すると、スケジューリングリストとして用意したレジスタ以上の待機プロセスが生成されたとき、レジスタに空きができるまで、プロセスの生成を禁止したりしなくてはならない。このようなことはハードウェアの構造を複雑にする。しかし、上述したリンクリスト構造では、ほとんど無限に待機プロセスを生成することができ、またハードウェアの構造をシンプルにすることができる。
【0058】
次に、TPCORE50におけるPARコンストラクションの実行について具体的に説明する。
(c−1)プロセスの実行
プロセッサ50はIptr15を基にプロセスを実行させるとともにWptr14で示されるワークスペースの各値を1マシン命令実行ごとに(必要があれば)更新する。
(c−2)プロセスの開始
Areg11に開始すべきプロセスのプロセスIDを入れ、またBreg12にプロセスの開始時に実行する命令のアドレスとアドレス(Iptr15)とのオフセットを入れておく(Occamコンパイラで整えられる)。待ちプロセスがなければ(スケジューリングリストにプロセスIDが登録されていないとき;アドレス(Fptr16)=(Bptr17)=empty)、Bptr17にAreg11のデータを格納し、アドレス(ワークスペース−4)にIptr15+4+Breg12を格納する。待ちプロセスがある場合、すなわちアドレス(Fptr16)≠アドレス(Bptr17)の場合、アドレス(Bptr17−8)にAreg11のデータを格納する。
【0059】
(c−3)現行プロセスの実行中断・終了
現行プロセスがプロセス終了あるいは停止命令の実行を行ったとき、入出力命令を実行したとき、あるいはチャンネル通信での待機、遅延(ディレイ)やタイムアウト処理を行う命令の実行に入ったとき、プロセスを中断させる(図13のST11a,図14のST21,図15のST11b,図16のST31参照)。
【0060】
(c−4)プロセスの切り替え
PARコンストラクションにおけるプロセスの切り替え動作について説明する(図13〜図16と表3〜表6参照)。なお、表3〜6,表8において、煩雑さを避けるため各ポインタレジスタのサフィックスは省略する。
待機プロセスの有無を調べ、待機プロセスが無ければプロセッサ(TPCORE50)そのものがアイドリング状態となる(図16,表3参照)。
【0061】
【表3】


待機プロセスが1個以上ある場合(Fptr16≠Bptr17)プロセスを切り替えるためにFptr16の値をWptr14に格納し、アドレス(Fptr16−4)にある値をIptr15に格納し、アドレス(Fptr16−8)に保持されている次のプロセスのプロセスIDをFptr16に格納するという手続きを踏みプロセスの切り替えを行う(図13と表4のTa1,Ta2、図15と表5のTC1,TC2参照)。
【0062】
【表4】

【0063】
【表5】


なお待機プロセスが1個のみの場合(Fptr16=Bptr17)、プロセスを切り替えた後、次のプロセスのプロセスIDの代わりにFptr16にemptyを入れておく。なおプロセスを切り替えようとしてFptr16=Bptr17=emptyであった場合、Wptr14=emptyとしてプロセッサ(TPCORE50)はアイドリング状態となる。高優先度のプロセスから復帰して低優先度のプロセスに切り替わる場合、たとえアドレス(Fptr16)=(Bptr17)=emptyと待機プロセスがなくてもワークスペース割り込み保存領域のWptrsavelocにあるアドレス(Wptr14)を持ってきて実行を再開させる(図13と表4のTa3、図15と表5のTC3参照)。そして後述の「割り込みからの復帰」と同じ操作が行われる。
また、高優先度キューが空で中断プロセスは高優先度の場合、待機プロセスが有るとWsavelocをWptr14に格納し、アドレス(Wptr14−4)のデータをIptr15に格納し、待機プロセスを取り出し、実行する(図14と表6参照)。
【0064】
【表6】

【0065】
(c−5)低優先度プロセス実行中の高優先度プロセスの切り替え
低い(low)優先度のプロセス実行中に高い(high)優先度のプロセス(Fptr(16)0=Bptr(17)0)が生成されたり、アイドリング状態から復帰しかつFptr(16)0=Bptr(17)0≠emptyであれば、そのプロセスのみがQueueにある高優先度プロセスの実行が割り込んでくる。この場合、現在実行させているプロセスのWptr14、Iptr15およびスタックレジスタのAreg11、Breg12、Creg13をそのワークスペースの所定の保存領域(Wptrsaveloc、Iptrsaveloc、Aregsaveloc、Bregsaveloc、Cregsaveloc、Wptrsavelocから連続でWptrsaveloc+16まで)に格納させる。そしてWptr14にFptr(プロセス0のFptr16)、Iptr15にアドレス(Fptr−4)の内容を格納する。
【0066】
(c−6)割り込みからの復帰
高優先度プロセスのスケジューリングリストが空になりWptrsavelocに割り込み以前のワークスペースアドレスが格納されている場合割り込み復帰を行う。Wptr14、Iptr15、Areg11、Breg12、Creg13をそれぞれ退避先のメモリ42からレジスタに戻す。そしてWptrsaveloc=emptyを格納する。
【0067】
次に、TPCORE50におけるチャンネル間通信について説明する。
TPCORE50では、“in”や“out”のような通信用アセンブリ命令が実効されたとき、まず通信は同じTPCORE50内のプロセスと通信するか他のTPCORE50と通信するかを調べる。外部リンク(Link)を用いる通信であった場合は、現在のAreg11、Breg12、Creg13、Wptr14の値をリンクインターフェースに渡して通信処理の全権をリンクインターフェースに委ねる。内部通信であった場合は、メモリ42上のチャンネルにアクセスし、そこに格納されているIDを読み取り、その後の実行を行う。内部通信と確認した後、TPCORE50は、すぐに入出力作業を行うのではなく、この通信するチャンネルがすでにALT関連のアセンブラ命令でEnable(イネーブル)状態にされているチャンネルであるかどうか調べる。そしてチャンネルがALTコンストラクション用のチャンネルでなかったら、入出力処理を始める。
【0068】
以下、TPCORE50における内部通信の実行について具体的に説明する。
(d−1)チャンネル
プロセス間の通信に使われるためにメモリ内の任意領域に1語を確保する(Occamコンパイラが用意する)。このアドレスをチャンネルアドレスとする。そのチャンネルアドレスにはプロセスIDあるいは初期値として例えばempty(0x8000000x;X=0,1は優先度を示す)を格納する。
(d−2)チャンネル間通信の開始
チャンネル間通信が要求されるとOccamコンパイラは通信に必要な情報としてAreg11に送受信するデータ数、Breg12にチャンネルアドレス、Creg13に送受信するデータを格納する(している)メモリ領域のアドレスを格納する。通信が開始されるとまずこのチャンネルがALTコンストラクションにより利用されているチャンネルかどうかを調べ、そうでなければ平行して走る当該2プロセス間でチャンネル間の入出力を開始する。
【0069】
(d−3)通信の提起
上述した擬似並列動作ではプロセスは並行して実行されるとなっているが、1プロセッサ(TPCORE50)のみでは一度に1命令しか実行できないので、ある瞬間ではプロセスは1つのみしか実行されていないことになる。したがってチャンネル通信も結局のところ先行プロセスと後発プロセスの間のデータ交換という形をとる。
先行プロセスはスタックレジスタAreg11,Breg12,Creg13に所定のデータが格納され、チャンネル間通信に対応する命令の実行部に至ると、チャンネルアドレスで示されるメモリが空(empty)であればまずワークスペース(アドレス(Wptr14)で示される)より1ワード負のアドレス(Wptr14−4)にチャンネル間通信直後に開始される命令のアドレスを格納し、さらに2ワード負のアドレス(Wptr14)−12にCreg13の値を格納する(即ちデータ格納先アドレス)。そしてチャンネルアドレスに現在のプロセスIDを格納する。そしてこのプロセスをスケジューリングリストからはずし、次に待機しているプロセスを実行させる。つまりFptr16のデータをWptr14に入れてアドレス(Fptr16−4)をIptr15とする。これによりプロセスは入出力待ちによるアイドリング状態となる。待機(後発)プロセスが存在しない時、プロセッサ(TPCORE50)はアイドリング状態となる。
【0070】
(d−4)通信の成立
プロセスが切り替わり、後発プロセスの実行が開始され、その通信開始に対応する命令部に至れば、前述の通信の提起で述べたアルゴリズムを実行する。しかし該当するチャンネルアドレス(アドレス(Breg12)で示される)にはすでに前述の操作で空でない情報(即ち先行プロセスのプロセスID)が書かれてあるので、そのプロセスとの通信が成立することになる。この時点でプロセス待ちのキューが空かどうかチェックする。
空でない場合、Fptr16≠empty、それは通信相手方プロセス以外の他のプロセスが並列して走っている(実効されている)ことを意味するのでアドレス(Breg12−8)に相手方のプロセスIDを入れてプロセスをキューの最後尾につける。
もしキューが空Fptr16=emptyならBptr17に相手方のプロセスIDを格納する。相手方のプロセスIDから相手側のワークスペースの先頭アドレスがわかり、そこから−12番地の場所には相手方のチャンネル通信でデータを保持すべき(あるいは保持している)アドレスが格納されている。これは端的に言うとアドレス(Breg12−12)に格納されているデータである。この操作で先行アドレスのデータ保持アドレスと自(後発)プロセスのデータ保持アドレス(前述したようにCreg13に格納されている)が明らかになる。チャンネルアドレスにプロセスIDが書かれている先行プロセスはこの時点でこの通信が自分にとって入力か出力か記憶していないが、後発プロセスがこの情報を持っている(現行命令を調べてチャンネル入力か出力か判断できる)ので問題なくチャンネル間入出力は行われる(つまりどちらが源でどちらが行き先か一義的に判明する)。この時点でAreg11の値(通信バイト数)分のデータを送信側から受信側に移動させる。Areg11は他目的で使われることが多いので、転送バイト数を記憶させておくために通信開始時にオプショナルな(カウンタ)レジスタのcnt21にその値をコピーしている。
【0071】
(d−5)通信の終了
「通信の提起」で記述したように、アイドリング状態にある先行プロセスをスケジューリングリストの最後尾に追加する。Bptr17=アドレス(Breg12)、アドレス(Bptr17−4)には先行プロセスの復帰後の最初に実行される命令のアドレスが格納されている。そして該当チャンネルアドレスをemptyにする。
【0072】
図17と表7に2プロセス間の通信の状態遷移図を示す。
2プロセスをプロセスA(先行プロセス)とプロセスB(後発プロセス)とし、まずプロセスAを実行し(ST51)この時にプロセスBは待機中(ST54)とする。プロセスAにおいてチャンネル通信命令が実行されるとスタックレジスタ(Areg11,Breg12,Creg13)に移動データ数、チャンネルアドレス、データ格納先アドレスが格納されて、チャンネル通信が開始する(ST52)。チャンネルアドレスにプロセスAのIDを格納し、プロセスAをキューからはずし、プロセス切り替え処理を行い、プロセスAをアイドリング状態にする(ST53)。プロセスAからプロセスBに切り替えられると、プロセスBはプロセスの実行を開始し、チャンネル通信命令があるとチャンネル通信を実行する(ST56)。チャンネルアドレスのデータを相手先のプロセスIDに格納し、データソースアドレスやデータ数などのプロセスAの通信情報をアクセスする。そして、プロセスBとプロセスA間のデータの移動が行われ(ST57)、一方、プロセスBは動作を終了する(ST58)。そして、プロセスAが待機リストへ復帰し、キュー待ちして待機する(ST59)。プロセスAのIDが先頭になるとプロセスAが再開し(ST60)、中断された処理が行われ、プロセス終了命令でプロセスAが終了する(ST61)。
【0073】
【表7】

【0074】
次に、ALTコンストラクションについて説明する。
ALTコンストラクションは2つ以上の同形の構造から成り立っている。この構造単位はガードと呼ばれる論理式とチャンネル入力、あるいはチャンネル入力のみで構成される部分とそれに引き続くプロセスである(ガード+プロセス)。
並列で走っている他の複数のプロセスのうちいくつかのプロセスがALT命令プロセスのガードを構成しているどれかのチャンネルと通信を始めようとしたとする。ALT命令はそのうち最初に(論理式が満たされかつ)チャンネル入力があったガード(この過程をガードがはずされると称する)に引き続くプロセスを選択的に実行するメカニズムである。このメカニズムはCSP理論の重要なプログラム方式の一つである。
【0075】
次に、TPCORE50上でのALTコンストラクションの実行について図18と表8を参照しながら説明する。
(e−1)ALTコンストラクションの内部状態
ALTコンストラクションは「イネーブル(Enable)」、「待機(Wait)」、「レディ(Ready)」の3つの状態とリセット(Reset)状態とを遷移して実現する。これらの状態を32bit幅の値で区別しALTコンストラクション実行時にある特定のメモリ領域(後述のALTプロセスのワークスペース内)にその値が保持される。この値を例えばそれぞれ0x80000001,0x80000002,0x80000003とする。
【0076】
(e−2)ALTコンストラクションプロセス
図18と表8にALTコンストラクションの状態遷移図を示す。ALTコンストラクションが開始されるとは1つの独立したプロセスが開始されることを示す。メモリ42に独自のワークスペースをもちその先頭アドレスの値をプロセスIDとして設定する。Bptr17にその値が格納される。そしてそのアドレスから負方向3ワード目アドレス(Wptr14−12に状態「イネーブル」を表す0x80000001を入れる(ST81,F1参照)。
【0077】
【表8】


(e−3)ガード入力の有無の検査
すべてのガードについて、ガードごとに以下のことを行う。ガードの一部に論理式を使っている場合、OccamコンパイラはALTコンストラクション実行時での論理式の結果値をAreg11に入れるようにする。
ガードの論理式実行においてAreg11が真値をもっていれば、次にチャンネル入力のチャンネルアドレスの値(Breg12に格納されている)を検査する(図18,F2参照)。ここ(Breg12)がemptyでなくすでに他のプロセスIDが書き込まれていたら(即ちチャンネル出力プロセス側からのチャンネル通信の提起が始まっていることを示す)、ALTプロセスは「レディ」状態となり(ST83,F4参照)、Wptr14にレディフラッグを示す0x80000003を格納すると同時にアドレス(Wptr14)に分岐先未決定フラグ(1)を格納する。
この時点でプロセススケジューリングリストにプロセスが存在する場合、リスト先頭で待っているプロセスのワークスペースポインタ(Fptr16)をアドレス(チャンネルアドレス−8)に格納させ、Fptr16=アドレス(チャンネルアドレス)としてALTコンストラクションプロセスと通信するプロセスをリスト先頭に持ってくる(すでにそうなっていればこの部分はスキップ)。
あるいはスケジューリングリストが空であればBptr17にチャネルアドレスを格納するガードのチャンネルが未入力の場合(Areg11の値が偽値であるか、アドレス(Breg12)がALTコンストラクションプロセスのWptr14値であるか)このガードは無視される。ガードの論理式が真でかつアドレス(Breg12)=emptyであればアドレス(Breg12)にALTコンストラクションプロセスのワークスペースアドレス(Wptr14に保持されている)を入れる。(ガード有無の検査については、図18,表8を参照。)
【0078】
(e−4)待機状態(Wait)
すべてのチャンネルを入力待ちにした後(即ちガードに使われているチャンネルのチャンネルアドレスにALTプロセスのワークスペースアドレスが書かれたら)、アドレス(Wptr14−12)は「待機」を示す0x80000002を格納し、Wptr14=Fptr16として次に待機しているプロセスに起動をかける(Iptr15にFptr16−4を格納)(ST82,F3参照)。
こうしてまたALTコンストラクションプロセスはスケジューリングリストからはずしておく。ALTコンストラクションプロセスはガードを構成するチャンネルの入力を待つ。
ワークスペースの先頭アドレス(Wptr14)には分岐先未決定フラグ(1)を格納しておく。前述したように、ガード入力の有無の検査中にすでにチャンネル通信要求が感知されればこの状態を経ずに次のレディ状態に遷移する。
【0079】
(e−5)レディ状態(Ready)
いずれかのガードを構成する論理式(もしあれば)が真値を持ちそのチャンネルに入力が入ってくれば、ワークスペースがFptr16に格納され、ALTコンストラクションプロセスをスケジュールリストの先頭待機プロセスとする。Areg11に「レディ状態」を示す値0x80000003を入れる。ALTコンストラクションプロセスへチャンネルアクセスを試みようとするプロセスはチャンネルアドレスからALTプロセスのワークスペースを得てそこに収納されている値を調べる。この値が1であるとこのチャンネルアドレスはALTプロセスによって使われているものと判断する(前述の「チャンネル間通信の開始」でのALTコンストラクションでの使用検査法の記述参照)。そしてこのALTコンストラクションプロセスがチャンネル出力側プロセスにより再びスケジューリングリストの先頭(Fptr16)に登録されることになる(ST83とF6参照)。
【0080】
(e−6)ガードのリセット(Reset)
ALTコンストラクションプロセスの入力ガードにおいて論理式が満たされチャンネルアクセスが認められるのは最初にガードがはずれた1つのみである。このガード以外のガードはすべてリセットさせなければならない。ALTコンストラクションプロセス中、Areg11の値はガードの論理式の結果である。
チャンネル通信が他のプロセスからなされたが論理式が真とならなかった場合はAreg11を偽値にリセットする。論理式は真であったがチャンネル通信が行われなかった場合、当該チャンネルのアドレス(チャンネルアドレス)にemptyを格納する。入力ガードがはずされたチャンネルはアドレス(Wptr14)(ALTコンストラクションプロセスのワークスペースを保持)の内容をみてそこがまだ−1かどうかをチェックする。−1であれば宛先未決定ということなのでアドレス(Wptr14)=アドレス(チャンネルアドレス)として相手方のプロセスIDを格納する。そしてガードのはずれたあとのプロセスのアドレスをIptr15に格納し実行をそこに移す(ST84,F7参照)。
【0081】
以上PARおよびALTコンストラクションの実装方法、1マイクロプロセッサ(プロセッサ)内で複数プロセスとチャンネル通信方法についてのハードウェアアルゴリズムについて述べた。
このように本発明のTPCORE50は複数プロセスの実行を1プロセッサ内部のみでも可能とした。これは、Occamのもつ並列処理コマンド(コンストラクタ)を単体内部で行えるようにハードウェアアルゴリズムを工夫してそれを実装したことによる。
すなわち、
・ 逐次実行(通常のシングル命令の順次実行)(SEQコンストラクション)
・ 並列処理(PARコンストラクション)
・ プロセス間のデータ通信と同期(チャンネルの概念)
・ 多重チャンネル入力処理(ALTコンストラクション)
を工夫したことによる。
【0082】
本発明のFPGAに搭載したTPCORE50はトランスピュータの命令の実行を完全に行えるということを示したが、従来のアーキテクチャとはまったく異なっている。その結果、とくにメモリアクセス方法に、(a)メモリおよび外部インターフェースのアクセスレートとTPCORE動作周波数、(b)メモリアドレス空間の均質化、という相違点が生じ、それらは性能の向上につながっている。
【0083】
なお本発明において、OccamはCSP理論に基づいて作られた言語である。本発明のプログラムはいくつかのプロセスが集合して構成されたものを示す。本発明のグランドステージは並列処理中のある1つのプロセスの遷移状態におけるスタート命令が実行される前の基本段階を示す。本発明のプロセスはある一定の行動を逐次的に実行し続ける実態を示す。また、コンストラクションとは代入、出力、プロシジャーコール(サブルーチンに相当する)などの最も基本となるプリミティブプロセスの集合体を示す。チャンネルとは並列に実行されているプロセス間の通信(データ交換)に用いられる概念または手段である。本発明のキューは待ち行列またはスケジューリングリストを示す。本発明のワークスペースはコンストラクション、命令、識別番号、アドレス、データなどを格納するメモリ空間を示す。本発明のスケジューリングリストは実行プロセスや待機プロセスの識別番号をメモリ上に格納して形成したリストを示す。本発明のアイドリングはプロセッサがプログラム実行前の待機状態を示す。
【0084】
以上述べたように、本発明の並列処理プロセッサは、従来のトランスピュータのアーキテクチャを絞り込み、精査し直して設計することにより、できるだけ本体のゲート数・ロジックセル数を減らしスリム化させコンパクトなプロセッサを実現した。この結果、現在入手できる最大のFPGAで最大18個のTPCOREを1個のFPGAに組み込むことができる。この条件で、ルート部に最大8個のTPCOREを配置した4段のツリー構造、また格子形態だと4×4のメッシュを1個のFPGAに組み込むとができる。
【0085】
また、本発明のTPCOREはFPGAで形成するので、ネットワークを構成する場合、並列処理を応用するシステムによって自由にそのトポロジーを改編できる。したがって、TPCOREをFPGA上で実現させることのメリットは非常に大きくなる。
【0086】
さらに、本発明のTPCOREのシステムアーキテクチャは、外部インターフェースへのデータ転送レートとメモリのアクセスレートにおいて従来のトランスピュータと異なり、TPCOREの動作周波数と同期する。また、TPCOREではインターフェースの転送レートとクロックは独立している。
さらに、トランスピュータのメモリには階層性がありアクセスの早い内部メモリと遅いメモリがあったが、本発明のTPCOREではメモリをすべて均質化しアクセスレートを4Gバイト空間すべてで同一とした。即ち、同じクロックレートですべてのメモリ空間を均一にアクセスできる。
【図面の簡単な説明】
【0087】
【図1】本発明のCPUの構成図である。
【図2】並列処理プロセッサの構成図である。
【図3】アドレスバスのデータ幅の変換図である。
【図4】データバスのデータ幅の変換図である。
【図5】インターフェースを有する並列処理プロセッサの構成図である。
【図6】TPCOREネットワークの構成図である。
【図7】TPCOREの通信開始の動作を示す図である。
【図8】TPCOREの通信が成立時の動作を示す図である。
【図9】TPCOREの通信動作を示す図である。
【図10】プロセスIDのワークスペースを示す図である。
【図11】並列処理中の1プロセスの状態遷移を表す図である。
【図12】スケジューリングリストの構造を示す図である。
【図13】PARコンストラクションの動作を示すプロセス切り替え状態遷移図である。
【図14】PARコンストラクションの動作を示す他のプロセス切り替え状態遷移図である。
【図15】PARコンストラクションの動作を示す他のプロセス切り替え状態遷移図である。
【図16】PARコンストラクションの動作を示す他のプロセス切り替え状態遷移図である。
【図17】プロセス間のチャンネル通信の動作を示す状態遷移図である。
【図18】ALTコンストラクションの動作を示す状態遷移図である。
【符号の説明】
【0088】
10…CPU、11…Areg(Aレジスタ)、12…Breg、13…Creg、14…Wptr(ワークスペースポインタ)、15…Iptr、16…Fptr、17…Bptr、21…cnt、22…clk、23…Timeout、24…マイクロコードROMコントローラ、25…Oreg、26…Ireg、27…マイクロコードROM、28…マイクロコントローラ、29…Temp、31…ALU、41…メモリコントローラ、42,42−a〜42−d…メモリ、45…リンクブロック、50,50−1,50−2…TPCORE、52−a〜52−d…リンク(Link)インターフェース、100…TPCOREネットワーク。

【特許請求の範囲】
【請求項1】
オッカム言語でプログラムを実行する並列処理プロセッサの並列処理アーキテクチャであって、上記並列プロセッサは、上記プログラムを構成する基本単位で逐次的に実行されるプロセスの実行前の初期段階で該プロセスの開始命令が実行されると上記プロセスを生成し、該プロセス待ちのキューが無いときは生成した上記プロセスを実行して該プロセスの終了命令で終了し、または上記プロセスの実行中にチャンネル通信の提起やタイムアウト処理または停止命令が実行されるとアイドリング状態となり相手プロセスのチャンネルの応答を見るため待機し、上記プロセスを生成した後プロセス待ちが無いとき、上記プロセスの識別番号を上記プロセス待ちのキューの末尾に追加して待機し、待機中に上記プロセス待ちのキュー内で上記プロセスの識別番号が進み、待機中の上記プロセスが先頭プロセスになると先頭待機時のプロセスが切り替えられて該プロセスが実行され終了命令により終了し、上記初期段階に遷移する
並列処理アーキテクチャ。
【請求項2】
上記並列プロセッサはポインタレジスタとメモリを有し、上記プロセスを実行するとき、該プロセスの識別番号を上記ポインタレジスタまたはメモリのワークスペースに格納し、該ワークスペースに格納されたプロセスを上記識別番号によりリンク構造にして複数の上記プロセスが連結され、上記識別番号に従って上記ワークスペースの値が示すプロセスが実行され、該実行しているプロセスが実行不可能または上記プロセッサがアイドリング状態になった時にプロセスを切り替える
請求項1記載の並列処理アーキテクチャ。
【請求項3】
上記並列プロセッサは、上記プロセスのパラレルコンストラクションを実行するとき、上記ポインタレジスタと上記ワークスペースで上記識別番号を授受し、上記ワークスペースのキューを検出して該キューの先頭プロセスを実行する
請求項2記載の並列処理アーキテクチャ。
【請求項4】
上記並列プロセッサは、上記プロセス間のチャンネル通信を実行するとき、上記プロセスの識別番号をメモリのワークスペースに格納して該ワークスペースのキューからはずしてプロセスの切り替え処理を行い、待機していたプロセスを開始する
請求項2記載の並列処理アーキテクチャ。
【請求項5】
上記並列プロセッサは、上記プロセスのオルトネィティブコンストラクションを実行するとき、上記ポインタレジスタと上記ワークスペースで上記識別番号を授受し、上記プロセスのガードの値を検出してガードがはずされた最初のプロセスの処理を実行する
請求項2記載の並列処理アーキテクチャ。
【請求項6】
ネットワークを形成してオッカム言語で実行する並列処理プロセッサであって、
算術演算または論理演算を行うALUと、上記ALUを制御するマイクロコードを格納したマイクロコードROMと、命令または次に実行する命令が格納されているメモリアドレスを格納するレジスタと汎用スタックレジスタを有する内部レジスタと、上記プロセッサで処理するプログラムの基本単位で逐次的に実行されるプロセスの識別番号を保持するワークスペースポインタレジスタと、待機プロセスを管理するためのデータを格納するプロセス管理用レジスタと、上記マイクロコードROMを制御するマイクロコードROMコントローラとを有するプロセッサと、
上記プロセッサに接続されてデータを入出力する複数のリンクと、
上記プロセッサまたは上記リンクの入出力データを格納するとともにワークスペースが設けられ該ワークスペースに上記プロセスを開始する識別番号と次に実行されるプロセスの識別番号のデータを所定アドレス値だけ離して格納しスケジューリングリストを形成して上記識別番号が連結されるメモリと、
上記メモリの入出力データの授受を制御するメモリコントローラと
を有する
並列処理プロセッサ。
【請求項7】
上記プロセスは上記ワークスペースポインタレジスタと上記スケジューリングリストによって管理され、上記ワークスペースポインタレジスタは現在のプロセスの識別番号を格納し、上記スケジューリングリストには待機プロセスが保持される
請求項6記載の並列処理プロセッサ。
【請求項8】
上記ワークスペースポインタレジスタの値が示すプロセスが実行され、該実行しているプロセスが実行不可能または上記プロセッサがアイドリング状態になった時に該実行中のプロセスは切り替えられる
請求項6記載の並列処理プロセッサ。
【請求項9】
上記プロセスを実行中に新しく別のプロセスが生成されまたは割り込みが発生したとき、該プロセスの識別番号は待機プロセスとして上記スケジューリングリストの最後尾に追加される
請求項8記載の並列処理プロセッサ。
【請求項10】
上記メモリはFPGA上で上記プロセッサと同一基板に形成され、上記ワークスペースは上記プロセスごとに該メモリ上にメモリ領域を設け、該メモリ領域に上記プロセス識別番号が示す値を基準にしてメモリアドレスの負方向に所定ワード単位で数ワード設けられる
請求項6記載の並列処理プロセッサ。
【請求項11】
上記ワークスペースは並列処理される上記プロセスが他のプロセスの割り込みにより一時的に中断されるとき各レジスタのデータの保持、チャンネル通信、オルトネィティブコンストラクションの実行またはプロセススケジューリングに用いる
請求項6記載の並列処理プロセッサ。
【請求項12】
上記プロセス管理用レジスタは第1と第2のポインタレジスタを有し、上記スケジューリングリストは先頭プロセス、最後尾プロセスと中間プロセスで形成され、上記第1のポインタレジスタは上記先頭プロセスの識別番号を保持し、上記第2のポインタレジスタは上記最後尾プロセスの識別番号を保持し、識別番号によりリンクリスト構造を形成して上記待機プロセスを連結する
請求項6記載の並列処理プロセッサ。
【請求項13】
上記内部レジスタは第1と第2のスタックレジスタを有し、パラレルコンストラクションの実行時、開始する該パラレルコンストラクションの命令のプロセス識別番号を上記第1のスタックレジスタに格納し、プロセス開始時に実行する命令アドレスとオフセットを上記第2のスタックレジスタに格納し、待ちプロセスがあるとき上記第1のポインタレジスタが示す上記メモリのアドレスに上記第1のスタックレジスタのデータを格納し、待ちプロセスがないとき上記第2のポインタレジスタに第1のスタックレジスタのデータを格納するとともに命令ポインタを格納する第3のポインタレジスタと上記第2のスタックレジスタのデータとを上記メモリの所定アドレスに格納する
請求項6記載の並列処理プロセッサ。
【請求項14】
上記プロセッサは上記パラレルコンストラクションの実行時、待機プロセスの有無を調べ、該待機プロセスがあるとき上記第3のポインタレジスタと上記第1のポインタレジスタ間でデータを授受してプロセスを切り替え、上記待機プロセスがないときアイドリング状態とする
請求項13記載の並列処理プロセッサ。
【請求項15】
上記プロセッサは上記プロセスが実行中に割り込みが発生した場合、上記ワークスペースポインタレジスタと上記命令ポインタレジスタおよび上記内部レジスタのデータを上記ワークスペースの所定領域に格納し、上記ワークスペースポインタレジスタと上記命令ポインタレジスタに上記第1のポインタレジスタのデータを格納する
請求項6記載の並列処理プロセッサ。
【請求項16】
先行されている上記プロセスはチャンネル間通信の命令が実行されると、該チャンネルのアドレス値が空であれば上記ワークスペースにチャンネル通信直後に開始される命令アドレスと上記内部レジスタのデータを格納して上記スケジューリングリストから除去し、次に待機しているプロセスを実行する
請求項6記載の並列処理プロセッサ。
【請求項17】
上記プロセッサは、上記プロセス間のチャンネル通信が成立してプロセス待ちのキュー状態を検査した結果プロセス待ちのキューが有るとき、上記第2のポインタレジスタに通信相手のプロセス識別番号を格納して該プロセス識別番号を上記プロセス待ちのキューの最後に付加し、上記プロセス待ちのキューが無いとき、上記第2のポインタレジスタは上記通信相手のプロセス識別番号を格納する
請求項16記載の並列処理プロセッサ。
【請求項18】
上記プロセスのオルトネィティブコンストラクションは、ガードを構成する論理式とチャンネル入力またはチャンネル入力のみで構成される部分とプロセスで構成され、上記ガードの論理式の結果が真値で上記プロセス管理用の第1のスタックレジスタを検査して上記プロセスがレディ状態で上記スケジューリングリストのプロセスが有るとき、上記第1のスタックレジスタはリスト先頭で待っているプロセスのワークスペースポインタを格納し、上記オルトネィティブコンストラクションのプロセスと通信するプロセスをリストの先頭に位置し、上記スケジューリングリストにデータが無いとき、上記第2のポインタレジスタは上記プロセス管理用の第2のスタックレジスタの値を格納する
請求項6記載の並列処理プロセッサ。
【請求項19】
上記オルトネィティブコンストラクションは、上記すべてのチャンネルを入力待ちした後、待機状態を示す値を上記メモリのワークスペースに格納し、上記第1のポインタレジスタの値を上記ワークスペースポインタレジスタに格納して次の待機プロセスを起動する
請求項18記載の並列処理プロセッサ。
【請求項20】
上記オルトネィティブコンストラクションは、上記ガードを構成する論理式が真のとき上記チャンネルに入力データが供給されると上記ワークスペースのデータを上記第1のポインタレジスタに格納し上記オルトネィティブコンストラクションのプロセスを上記スケジューリングの先頭待機プロセスとし、上記第1のスタックレジスタにレディ状態を示す値を格納する
請求項18記載の並列処理プロセッサ。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate

【図17】
image rotate

【図18】
image rotate