(57)【要約】【課題】並列処理プロセッサをＦＰＧＡで構成し単体プロセッサ内でプログラムのプロセスを並列処理する。【解決手段】プロセッサにプロセス管理用レジスタと汎用の内部スタックレジスタとメモリとリンクを設け、実行するプログラムのプロセス識別番号をプロセス管理用レジスタとメモリで管理し、プロセスの識別番号をメモリ上でリンク構造のスケジューリングリストに形成することによりプロセス間を連結し、プロセスの切り替えやプロセス間のチャンネル通信を実行する。【選択図】図１
2009048306.tif 000002
【特許請求の範囲】
【請求項１】
オッカム言語でプログラムを実行する並列処理プロセッサの並列処理アーキテクチャであって、上記並列プロセッサは、上記プログラムを構成する基本単位で逐次的に実行されるプロセスの実行前の初期段階で該プロセスの開始命令が実行されると上記プロセスを生成し、該プロセス待ちのキューが無いときは生成した上記プロセスを実行して該プロセスの終了命令で終了し、または上記プロセスの実行中にチャンネル通信の提起やタイムアウト処理または停止命令が実行されるとアイドリング状態となり相手プロセスのチャンネルの応答を見るため待機し、上記プロセスを生成した後プロセス待ちが無いとき、上記プロセスの識別番号を上記プロセス待ちのキューの末尾に追加して待機し、待機中に上記プロセス待ちのキュー内で上記プロセスの識別番号が進み、待機中の上記プロセスが先頭プロセスになると先頭待機時のプロセスが切り替えられて該プロセスが実行され終了命令により終了し、上記初期段階に遷移する
並列処理アーキテクチャ。
【請求項２】
上記並列プロセッサはポインタレジスタとメモリを有し、上記プロセスを実行するとき、該プロセスの識別番号を上記ポインタレジスタまたはメモリのワークスペースに格納し、該ワークスペースに格納されたプロセスを上記識別番号によりリンク構造にして複数の上記プロセスが連結され、上記識別番号に従って上記ワークスペースの値が示すプロセスが実行され、該実行しているプロセスが実行不可能または上記プロセッサがアイドリング状態になった時にプロセスを切り替える
請求項１記載の並列処理アーキテクチャ。
【請求項３】
上記並列プロセッサは、上記プロセスのパラレルコンストラクションを実行するとき、上記ポインタレジスタと上記ワークスペースで上記識別番号を授受し、上記ワークスペースのキューを検出して該キューの先頭プロセスを実行する
請求項２記載の並列処理アーキテクチャ。
【請求項４】
上記並列プロセッサは、上記プロセス間のチャンネル通信を実行するとき、上記プロセスの識別番号をメモリのワークスペースに格納して該ワークスペースのキューからはずしてプロセスの切り替え処理を行い、待機していたプロセスを開始する
請求項２記載の並列処理アーキテクチャ。
【請求項５】
上記並列プロセッサは、上記プロセスのオルトネィティブコンストラクションを実行するとき、上記ポインタレジスタと上記ワークスペースで上記識別番号を授受し、上記プロセスのガードの値を検出してガードがはずされた最初のプロセスの処理を実行する
請求項２記載の並列処理アーキテクチャ。
【請求項６】
ネットワークを形成してオッカム言語で実行する並列処理プロセッサであって、
算術演算または論理演算を行うＡＬＵと、上記ＡＬＵを制御するマイクロコードを格納したマイクロコードＲＯＭと、命令または次に実行する命令が格納されているメモリアドレスを格納するレジスタと汎用スタックレジスタを有する内部レジスタと、上記プロセッサで処理するプログラムの基本単位で逐次的に実行されるプロセスの識別番号を保持するワークスペースポインタレジスタと、待機プロセスを管理するためのデータを格納するプロセス管理用レジスタと、上記マイクロコードＲＯＭを制御するマイクロコードＲＯＭコントローラとを有するプロセッサと、
上記プロセッサに接続されてデータを入出力する複数のリンクと、
上記プロセッサまたは上記リンクの入出力データを格納するとともにワークスペースが設けられ該ワークスペースに上記プロセスを開始する識別番号と次に実行されるプロセスの識別番号のデータを所定アドレス値だけ離して格納しスケジューリングリストを形成して上記識別番号が連結されるメモリと、
上記メモリの入出力データの授受を制御するメモリコントローラと
を有する
並列処理プロセッサ。
【請求項７】
上記プロセスは上記ワークスペースポインタレジスタと上記スケジューリングリストによって管理され、上記ワークスペースポインタレジスタは現在のプロセスの識別番号を格納し、上記スケジューリングリストには待機プロセスが保持される
請求項６記載の並列処理プロセッサ。
【請求項８】
上記ワークスペースポインタレジスタの値が示すプロセスが実行され、該実行しているプロセスが実行不可能または上記プロセッサがアイドリング状態になった時に該実行中のプロセスは切り替えられる
請求項６記載の並列処理プロセッサ。
【請求項９】
上記プロセスを実行中に新しく別のプロセスが生成されまたは割り込みが発生したとき、該プロセスの識別番号は待機プロセスとして上記スケジューリングリストの最後尾に追加される
請求項８記載の並列処理プロセッサ。
【請求項１０】
上記メモリはＦＰＧＡ上で上記プロセッサと同一基板に形成され、上記ワークスペースは上記プロセスごとに該メモリ上にメモリ領域を設け、該メモリ領域に上記プロセス識別番号が示す値を基準にしてメモリアドレスの負方向に所定ワード単位で数ワード設けられる
請求項６記載の並列処理プロセッサ。
【請求項１１】
上記ワークスペースは並列処理される上記プロセスが他のプロセスの割り込みにより一時的に中断されるとき各レジスタのデータの保持、チャンネル通信、オルトネィティブコンストラクションの実行またはプロセススケジューリングに用いる
請求項６記載の並列処理プロセッサ。
【請求項１２】
上記プロセス管理用レジスタは第１と第２のポインタレジスタを有し、上記スケジューリングリストは先頭プロセス、最後尾プロセスと中間プロセスで形成され、上記第１のポインタレジスタは上記先頭プロセスの識別番号を保持し、上記第２のポインタレジスタは上記最後尾プロセスの識別番号を保持し、識別番号によりリンクリスト構造を形成して上記待機プロセスを連結する
請求項６記載の並列処理プロセッサ。
【請求項１３】
上記内部レジスタは第１と第２のスタックレジスタを有し、パラレルコンストラクションの実行時、開始する該パラレルコンストラクションの命令のプロセス識別番号を上記第１のスタックレジスタに格納し、プロセス開始時に実行する命令アドレスとオフセットを上記第２のスタックレジスタに格納し、待ちプロセスがあるとき上記第１のポインタレジスタが示す上記メモリのアドレスに上記第１のスタックレジスタのデータを格納し、待ちプロセスがないとき上記第２のポインタレジスタに第１のスタックレジスタのデータを格納するとともに命令ポインタを格納する第３のポインタレジスタと上記第２のスタックレジスタのデータとを上記メモリの所定アドレスに格納する
請求項６記載の並列処理プロセッサ。
【請求項１４】
上記プロセッサは上記パラレルコンストラクションの実行時、待機プロセスの有無を調べ、該待機プロセスがあるとき上記第３のポインタレジスタと上記第１のポインタレジスタ間でデータを授受してプロセスを切り替え、上記待機プロセスがないときアイドリング状態とする
請求項１３記載の並列処理プロセッサ。
【請求項１５】
上記プロセッサは上記プロセスが実行中に割り込みが発生した場合、上記ワークスペースポインタレジスタと上記命令ポインタレジスタおよび上記内部レジスタのデータを上記ワークスペースの所定領域に格納し、上記ワークスペースポインタレジスタと上記命令ポインタレジスタに上記第１のポインタレジスタのデータを格納する
請求項６記載の並列処理プロセッサ。
【請求項１６】
先行されている上記プロセスはチャンネル間通信の命令が実行されると、該チャンネルのアドレス値が空であれば上記ワークスペースにチャンネル通信直後に開始される命令アドレスと上記内部レジスタのデータを格納して上記スケジューリングリストから除去し、次に待機しているプロセスを実行する
請求項６記載の並列処理プロセッサ。
【請求項１７】
上記プロセッサは、上記プロセス間のチャンネル通信が成立してプロセス待ちのキュー状態を検査した結果プロセス待ちのキューが有るとき、上記第２のポインタレジスタに通信相手のプロセス識別番号を格納して該プロセス識別番号を上記プロセス待ちのキューの最後に付加し、上記プロセス待ちのキューが無いとき、上記第２のポインタレジスタは上記通信相手のプロセス識別番号を格納する
請求項１６記載の並列処理プロセッサ。
【請求項１８】
上記プロセスのオルトネィティブコンストラクションは、ガードを構成する論理式とチャンネル入力またはチャンネル入力のみで構成される部分とプロセスで構成され、上記ガードの論理式の結果が真値で上記プロセス管理用の第１のスタックレジスタを検査して上記プロセスがレディ状態で上記スケジューリングリストのプロセスが有るとき、上記第１のスタックレジスタはリスト先頭で待っているプロセスのワークスペースポインタを格納し、上記オルトネィティブコンストラクションのプロセスと通信するプロセスをリストの先頭に位置し、上記スケジューリングリストにデータが無いとき、上記第２のポインタレジスタは上記プロセス管理用の第２のスタックレジスタの値を格納する
請求項６記載の並列処理プロセッサ。
【請求項１９】
上記オルトネィティブコンストラクションは、上記すべてのチャンネルを入力待ちした後、待機状態を示す値を上記メモリのワークスペースに格納し、上記第１のポインタレジスタの値を上記ワークスペースポインタレジスタに格納して次の待機プロセスを起動する
請求項１８記載の並列処理プロセッサ。
【請求項２０】
上記オルトネィティブコンストラクションは、上記ガードを構成する論理式が真のとき上記チャンネルに入力データが供給されると上記ワークスペースのデータを上記第１のポインタレジスタに格納し上記オルトネィティブコンストラクションのプロセスを上記スケジューリングの先頭待機プロセスとし、上記第１のスタックレジスタにレディ状態を示す値を格納する
請求項１８記載の並列処理プロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータシステムの中核となる中央演算処理装置（CPU）に関し、単独で並列処理を行い、さらに複数のＣＰＵと協調またはデータ交換により同期をとりながら並列処理を行う並列処理アーキテクチャおよびそれを用いた並列処理プロセッサに関する。
【背景技術】
【０００２】
１９８０年代後半から１９９０年代前半にＣＳＰ（Ｃｏｍｍｕｎｉｃａｔｉｎｇ  Ｓｅｑｕｅｎｔｉａｌ  Ｐｒｏｃｅｓｓｅｓ）理論に基づいた並列処理用プロセッサ（トランスピュータ（登録商標））が、英国ＩＮＭＯＳ社により開発、販売された。このトランスピュータは、複数ネットワーク上で連動して動き、そこで能力を発揮し計算スピードを高めるものであった。しかしその後、このトランスピュータの開発製造販売は中止された。
また、１９８０年代中頃のＶＬＳＩ（大規模集積回路）技術では1台のトランスピュータ程度の規模の回路は完全に１個のＶＬＳＩチップを占有するほどの場所、空間を占めていたので、トランスピュータのネットワークは巨大なボード（回路基板）で実現されていた。さらに、各インターフェースはチップ間を繋ぐ数本のワイアで実現されていた。
一方、トランスピュータに関する資料はおおまかなアーキテクチャのブロック図しか開示されず、トランスピュータの単体内部に関する並列処理アルゴリズムは公表されていなかった。
【０００３】
上述したＣＳＰ理論ではある計算システム（プログラム）をプロセスの集合として捉え、プロセス間は相互にメッセージ通信を行うことにより同期化をとり、計算が実行される。なお、プロセスとは「ある一定の行動を逐次的に実行し続ける実態」を示す。また、あるプログラムの中で複数プロセスは独自に同時に動作し、各プロセス同士はプロセス内部で実行された入出力操作を介して通信する。そしてこの通信によりプロセス間の同期が計られる。つまりあるプロセスが入力（出力）操作処理の段階に到達すると他方のプロセスが対応する出力（入力）操作段階に至るのを待ち、互いにデータ（メッセージ）通信段階に到達した時点で通信が実行される。入出力の対象となるデータはキュー（待行列；Ｑｕｅｕｅ）をとって格納されたりバッファリングされたりすることなくやり取りされる。こうして２プロセス間の処理が揃えられていく。そして、通信終了後は再び独自の処理を続けていく。
【０００４】
上述したＣＳＰ理論では、通信を交わす２プロセス、あるいはすべてのプロセスにとってもシェアド（共有）メモリというものは存在せず、チャンネル間通信によってのみデータがプロセス間で共有されていくことになっている。
ＣＳＰ理論を具現化したプログラミング言語にＯｃｃａｍ（オッカム；登録商標）があり、この言語で書かれたプログラムはやはり並列で処理される（走る）プロセスの集合として捉えられる。平行して走る２つのプロセスのデータ交換はチャンネルという概念を用いて行われ、２つのプロセスで共通のチャンネル変数を定義し、これを通してデータ交換、同期化を行っていく。
特許文献１にはスイッチを用いて複数のトランスピュータ間を接続する構成が開示してあり、また特許文献２には外部フレームを用いて画像処理に適用したデータ並列処理方式の例が開示してある。また非特許文献１にはプロセッサのレジスタ構造などが開示されているが、プロセッサ単体の詳細な構造やプロセスを並列に実行するアーキテクチャは開示されていない。
【０００５】
【特許文献１】特開昭６３−５０１９８６号公報
【特許文献２】特開平３−２６３１６４号公報
【非特許文献１】トランスピュータ入門；山本正樹、中井泰明、村上安範  共著；日刊工業新聞社
【発明の開示】
【発明が解決しようとする課題】
【０００６】
優れた情報科学理論ＣＳＰ理論に基づき製作されたトランスピュータは、ＣＳＰ理論に基づいたプログラム言語Ｏｃｃａｍのみで機能する。そのため、ＯｃｃａｍはＣＳＰ理論の研究発展に必要不可欠である。しかしそれを用いて動作するトランスピュータがないために理論発展とそれに伴う実用化に大きな問題が生じていた。
トランスピュータの開発は中止されたが、その後、ＣＳＰ理論を基礎とした並列処理プロセッサのニーズは強まるばかりであった。またトランスピュータ開発時代におけるＶＬＳＩのCMOS（Ｃｏｍｐｌｅｍｅｎｔａｒｙ  Ｍｅｔａｌ  Ｏｘｉｄｅ  Ｓｅｍｉｃｏｎｄｕｃｔｏｒ）実装技術と現代の技術では大きな違いがあり、物理的規模として同規模のＶＬＳＩに当時は1つのプロセッサのみを載せることで一杯だったところにＣＭＯＳトランジスタの微細化が進み２０基程度のプロセッサが載せられるようになった。２０基のプロセッサで並列処理プロセッサを構成するとかなり複雑なネットワークを構成することができ、システムを大きく展開することができる。
そこで、本発明はその従来技術を凌ぐだけでなく、トランスピュータを最新のＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）に搭載させて高速に動作する並列処理プロセッサのアーキテクチャを提供することにある。また、複数プロセスを単体プロセッサ内で実行するための多くのハードウェアアルゴリズムも提供することにより、従来のトランスピュータの性能より優れた並列処理プロセッサ（ＴＰＣＯＲＥ）を提供することにある。
【課題を解決するための手段】
【０００７】
本発明の並列処理アーキテクチャは、オッカム言語でプログラムを実行する並列処理プロセッサの並列処理アーキテクチャであって、上記並列プロセッサは、上記プログラムを構成する基本単位で逐次的に実行されるプロセス実行前の初期段階で該プロセスの開始命令が実行されると上記プロセスを生成し、該プロセス待ちのキューが無いときは生成した上記プロセスを実行して該プロセスの終了命令で終了し、または上記プロセスの実行中、チャンネル通信の提起やタイムアウト処理または停止命令が実行されるとアイドリング状態となり相手プロセスのチャンネルの反応（応答）を見るため待機し、上記プロセスを生成した後プロセス待ちが無いとき、上記プロセスの識別番号を上記プロセス待ちのキューの末尾に追加して待機し、待機中に上記プロセス待ちのキュー内で上記プロセスの識別番号が進み待機中の上記プロセスが先頭プロセスになると先頭待機時のプロセスが切り替えられて、該プロセスが実行され、終了命令により終了し、上記初期段階に遷移する。
【０００８】
本発明の並列処理プロセッサは、ネットワークを形成してオッカム言語で実行する並列処理プロセッサであって、算術演算または論理演算を行うＡＬＵと、上記ＡＬＵを制御するマイクロコードを格納したマイクロコードＲＯＭと、命令または次に実行する命令が格納されているメモリアドレスを格納するレジスタと汎用スタックレジスタを有する内部レジスタと、上記プロセッサで処理するプログラムの基本単位で逐次的に実行されるプロセスの識別番号を保持するワークスペースポインタレジスタと、待機プロセスを管理するためのデータを格納するプロセス管理用レジスタと、上記マイクロコードＲＯＭを制御するマイクロコードＲＯＭコントローラとを有するプロセッサと、上記プロセッサに接続されてデータを入出力する複数のリンクと、上記プロセッサまたは上記リンクの入出力データを格納するとともにワークスペースが設けられ該ワークスペースに上記プロセスを開始する識別番号と次に実行されるプロセスの識別番号のデータを所定アドレス値だけ離して格納しスケジューリングリストを形成して上記識別番号が連結されるメモリと、上記メモリの入出力データの授受を制御するメモリコントローラとを有する。
【０００９】
本発明の並列処理アーキテクチャおよびこれを用いた並列処理プロセッサは、プロセッサにプロセス管理用レジスタと汎用の内部レジスタとメモリとリンクブロックを設け、実行するプロセスのプロセス識別番号と次に実行するプロセス番号をプロセス管理用レジスタとメモリに格納し、プロセスの識別番号をメモリに格納しかつリンク構造にされたスケジューリングリストに形成してプロセスの切り替えやプロセス間のチャンネル通信を実行する。
【発明の効果】
【００１０】
本発明の並列処理プロセッサ（ＴＰＣＯＲＥとも称する）は、従来のトランスピュータの機械語（アセンブリ言語）を理解するとともに、アーキテクチャが全く異なる別のプロセッサを構成することにより、トランスピュータの性能を向上させた。
また、機械語を従来のトランスピュータとコンパチブルにすることにより、以前トランスピュータで開発されたソフトウェアはすべてこのＴＰＣＯＲＥで動作し、しかもＯｃｃａｍも機能することができる。したがって本発明の並列処理プロセッサを用いてＣＳＰ理論の発展研究もＯｃｃａｍを通して再び可能となる。
【発明を実施するための最良の形態】
【００１１】
まず、本発明の並列処理プロセッサの主要部のＣＰＵ１０（中央演算処理装置）について説明する。
図１にＣＰＵ１０のブロック構成を示す。ＣＰＵ１０は、数種類のレジスタ（内部レジスタ）と２本のバスと、各種の演算処理を行うＡＬＵ３１（Ａｒｉｔｈｍｅｔｉｃ  Ｌｏｇｉｃ  Ｕｎｉｔ）、ＴＰＣＯＲＥ（５０）を制御する制御部などで構成される。
内部レジスタのうち、処理全般にかかわるレジスタは、Ｗｐｔｒ１４（ワークスペースポインタ）、Ｉｐｔｒ１５（インストラクション（命令）ポインタレジスタ）、Ｉｒｅｇ２６（インストラクション（命令）レジスタ）、Ｏｒｅｇ２５（オペランドレジスタ）、汎用スタックジスタのＡｒｅｇ１１，Ｂｒｅｇ１２，Ｃｒｅｇ１３で構成される。
【００１２】
Ｉｐｔｒ１５は３２ｂｉｔのデータ幅を持ち、次に実行する命令が格納されているアドレスを保持するレジスタである。
Ｉｒｅｇ２６は４ｂｉｔのデータ幅を持ち、取り出してきた命令の上位４ｂｉｔがこのレジスタに格納される。格納された値は命令解釈を行う専用ハードウェアに送られ、そこでデコードされ実行する命令が決定する。
Ｏｒｅｇ２５は３２ｂｉｔのデータ幅を持ち、取り出してきた命令の下位４ｂｉｔがここに格納され、この格納された値は命令解釈時にＩｒｅｇ２６の値とともに用いられる。
汎用スタックレジスタのＡｒｅｇ１１，Ｂｒｅｇ１２，Ｃｒｅｇ１３は３２ｂｉｔのデータ幅を持ち、スタック構造を形成している。データの入力、出力に応じて、これらのレジスタ間でＰＵＳＨ（プッシュ）、ＰＯＰ（ポップ）の動作を行う。
【００１３】
プロセスを管理するレジスタとしてＷｐｔｒ１４（ワークスペースポインタ）、待機プロセス管理用レジスタとしてＦｐｔｒ１６（フォワードポインタ）、Ｂｐｔｒ１７（バックポインタ）がある。
Ｗｐｔｒ１４は、現在のプロセスを示す３２ｂｉｔの値（プロセスＩＤ（識別番号））をこのレジスタに格納する。Ｗｐｔｒ１４の下位２ｂｉｔはプロセスの優先度を示す。プロセスＩＤは、並列プロセスを１台のＴＰＣＯＲＥ５０で実行するために各プロセスにプロセスＩＤという３２ｂｉｔの値を任意に付ける。
Ｆｐｔｒ１６、Ｂｐｔｒ１７の待機用のプロセス管理用レジスタは、Ｗｐｔｒ１４が現在のプロセスＩＤを管理しているのに対して、現在実行されていないプロセス、すなわち待機プロセスのＩＤを管理する。Ｆｐｔｒ１６は待機プロセスの先頭のプロセスＩＤ、Ｂｐｔｒ１７は最後尾のプロセスＩＤを保持する。待機プロセスが３つ以上のときは、この２つのレジスタで管理することはできないので、メモリ（４２）を利用したリスト構造でこれらを管理する。
【００１４】
その他のレジスタとして、ｃｎｔ２１（カウンタレジスタ）とＴｅｍｐ２９（テンポラリレジスタ）がある。ｃｎｔ２１は３２ｂｉｔのデータ幅を持ち、繰り返し処理の回数やシフト回数、入出力数を数えるときに用いられる。Ｔｅｍｐ２９は３２ｂｉｔのデータ幅を持ち、ＡＬＵ３１が乗算や除算などを１クロックで演算を実行できないとき一時的に処理結果を保存する。
【００１５】
ＡＬＵ３１は、ＴＰＣＯＲＥ５０内部で算術、論理演算を行う。処理実行時に演算が必要なときは、レジスタのデータや演算用に任意に生成されたデータが個々に送られ演算処理が行われる。
【００１６】
マイクロコードＲＯＭ２７（Ｍｉｃｒｏｃｏｄｅ  ＲＯＭ）はマイクロコードを記憶し、レジスタ間の通信やメモリ４２とレジスタ間の通信制御を行い、またＡＬＵ３１の機能も制御する。この他プロセッサの状態遷移も管理する。一つのマイクロコードは６８ｂｉｔ幅であり、各ｂｉｔによりＴＰＣＯＲＥ５０の動作を制御する。マイクロコードの上位５６ｂｉｔがバスやレジスタ、ＡＬＵ３１の制御を行い、下位１１ｂｉｔでプロセッサの動作を制御する。
マイクロコードＲＯＭコントローラ２４（Ｍｉｃｒｏｃｏｄｅ  ＲＯＭ  Ｃｏｎｔｒｏｌｌｅｒ）はマイクロコードのアドレスを算出する。アドレス算出メカニズムは２通りあり、マイクロコードの６４ｂｉｔ目の値により区別される。この値が“１”のとき、Ｉｒｅｇ２６やＯｒｅｇ２５の値をもとにしてアドレスを算出し、“０”のとき、マイクロコードＲＯＭ２７の出力９〜０ｂｉｔの値をそのまま次のアドレスとする。
【００１７】
次に図２に、ＴＰＣＯＲＥ５０のブロック構成図を示す。ＴＰＣＯＲＥ５０は上述したＣＰＵ１０以外にリンク（Ｌｉｎｋ）ブロック４５、メモリコントローラ４１（Ｍｅｍｏｒｙ  ｃｏｎｔｒｏｌｌｅｒ）、メモリ４２（Ｍｅｍｏｒｙ４２−ａ〜４２−ｄ）などで構成される。各メモリ４２−ａ〜４２−ｄは８ＫＢｙｔｅ（キロバイト）ブロックのＲＡＭで構成される。リンクブロック４５は４個のインターフェース（リンク）で構成され、他のＴＰＣＯＲＥ５０と通信又はデータの交換を行う。
【００１８】
メモリ（Ｍｅｍｏｒｙ４２）は、１個のＴＰＣＯＲＥ５０につき３２ＫＢｙｔｅの内部メモリが搭載される。このメモリ４２はＣＰＵ１０とリンクブロック４５の両方からアクセスされる。これらのアクセス優先権は後述のメモリコントローラ４１で管理される。
また、メモリ４２はバイトアクセス、ワードアクセスの２通りの方法でアクセスできる。メモリ４２からの読出しやメモリ４２への書込みのデータ幅が２通りあるので、３２ＫＢｙｔｅのメモリ４２は８ＫＢｙｔｅのメモリ４２−ａ（〜４２−ｄ）を４個組み合わせた構成となっている。各メモリ４２−ａ〜４２−ｄはデータ幅が８ｂｉｔ、深さ１０２４で構成される。
【００１９】
リンクブロック４５はリンクインターフェースやレジスタなどを含み、ＴＰＣＯＲＥ５０に４個の双方向シリアルリンク（リンク；Ｌｉｎｋ）が構成され、これらの４個のリンクの制御はＣＰＵ１０と独立に管理される。つまり、リンクブロック４５はＴＰＣＯＲＥ５０を構成する他の部分と独立して動作する。したがって、リンクブロック４５は、ＣＰＵ１０やメモリ４２からデータを受け取ると、ＣＰＵ１０の動作と関係なくデータを送受信することができる。
【００２０】
メモリコントローラ４１はＣＰＵ１０からメモリアクセスの要求またはリンクインターフェースからメモリアクセス要求を受ける。そして、このメモリコントローラ４１は、ＦＰＧＡに搭載されたメモリ４２の仕様に応じてリクエストを調整する。
メモリコントローラ４１は、メモリアクセスの権限とバスデータ幅の変更（バイト（Ｂｙｔｅ）幅、ワード幅など）について管理する。また、アドレス空間は４ＧＢｙｔｅ（ギガバイト）以上に拡張することができる。
【００２１】
次に、メモリアクセス権限について説明する。メモリコントローラ４１は１本の制御線でメモリ４２の優先度を制御する。例えば、制御信号が“Ｈｉｇｈ”（ハイ）レベルのときリンクブロック４５がメモリ４２を制御し、“Ｌｏｗ”（ロー）レベルのときＣＰＵ１０がメモリ４２と接続される。
リンクブロック４５にメモリアクセス権限が渡されると、メモリ４２はリンク５２−ａ〜５２−ｄを介して他のＴＰＣＯＲＥ５０上にあるメモリ４２と直接接続され、所謂ＤＭＡ（Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）状態となる。そのため、ＴＰＣＯＲＥ５０のメッセージパッシング（メッセージ転送）はＤＭＡであるため非常に高速に行われる。
【００２２】
次に、メモリコントローラ４１によるバスデータ幅の変更管理方法について説明する。
まずアドレスバスについて説明する。ＴＰＣＯＲＥ５０は３２ｂｉｔでアクセスできるメモリ空間（４Ｇ）のうち、内部メモリとして割り当てられたアドレス空間について、その他のアドレス空間より速いクロックでアクセスすることができる。また、ＴＰＣＯＲＥ５０はＦＰＧＡに搭載することを前提とし、回路構成を簡素化することにより、全てのアドレス空間を同等にみなしているので、４ＧＢｙｔｅのメモリ（メモリ４２とそれ以外の不図示のメモリ）が同じクロックサイクルでアクセスできる。
さらに、このＴＰＣＯＲＥ５０はＦＰＧＡに搭載され、容量が制限されるので３２ｂｉｔ幅のうち下位１５ｂｉｔのみ使用する。この１５ｂｉｔの内、１４〜２ｂｉｔがアドレスとして用いられ、１〜０ｂｉｔは４個のメモリ４２−ａ〜４２−ｄのうちどれを選ぶかを決定するためにバンクセレクトとして使用される。このアドレスバスのデータ幅の変更例を図３に示す。
【００２３】
次に、メモリコントローラ４１によるデータバス幅の変更について説明する。
ＣＰＵ１０やリンク５２−ａ〜５２−ｄは３２ｂｉｔまたは８ｂｉｔのどちらのデータでもアクセスできるようにしてあるので、これを制御するためマイクロコードＲＯＭ２７からデータ幅を選択する制御信号が出力される。例えば、通信が成立すると、リンク５２−ａ〜５２−ｄが通信するデータは８ｂｉｔであるので、データ幅はＢｙｔｅ幅に制限される
【００２４】
メモリ４２のワードアクセスについて説明する。各メモリ４２−ａ〜４２−ｄは８ｂｉｔでしかデータを入出力することができない。しかし、４個のメモリ４２−ａ〜４２−ｄを組み合わせて、ワード（３２ｂｉｔ）幅とバイト幅の２通りのデータを出力することができる。
図４にデータバスのデータ幅の変換について示す。
ＴＰＣＯＲＥ５０がメモリ４２にアクセスし、データバスの幅がワード幅に決定されたとき、４個のメモリ４２−ａ〜４２−ｄから同時にデータが出力され、メモリコントローラ４１により４個のメモリ４２−ａ〜４２−ｄを組み合わせることにより３２ｂｉｔ幅のデータを形成する。このとき、アドレスバスから出力されるデータは上位１３ｂｉｔのみ使用し、下位２ｂｉｔのメモリセレクト部分は使用されない。
【００２５】
メモリ４２のバイトアクセスについて説明する
データ幅制御信号によりデータ幅がバイト幅に指定されると、ＴＰＣＯＲＥ５０がメモリ４２にバイトアドレスバスのデータの下位１５ｂｉｔを用いて、データが格納されているメモリ４２−ａ〜４２−ｄとそのアドレスを決定する。ＴＰＣＯＲＥ５０がメモリ４２にバイトアクセスすると、１個のメモリ４２−ａ〜４２−ｄだけからバイト幅のデータが出力される。
【００２６】
次に、ＴＰＣＯＲＥ５０は前提条件として以下の（ａ−１）メモリ、（ａ−２）プロセス管理用レジスタ、（ａ−３）内部レジスタを有し、クロックについては（ａ−４）に示す。
【００２７】
（ａ−１）メモリ４２について説明する。
３２ｂｉｔ幅（１ワード３２ｂｉｔとする）のメモリ４２を用意する。１Ｂｙｔｅ番地付けとする。例えば0x00000000番地より番地が増えていく方向を正方向，逆を負の方向とする。メモリ量はここでは厳密に定義しないが任意で良い。メモリアクセスとしてはワード単位でプログラムは進んでいくが、チャンネル通信ではバイト単位のデータ転送を行うのでワード、バイトともにアクセスできるようにする必要がある。割り込み発生時各種レジスタ退避のため任意のアドレスに３２ｂｉｔ幅で５ワード領域を確保しレジスタ待避専用領域として固定する。それらを退避させるレジスタの名前に対応してＣｒｅｇｓａｖｅｌｏｃ、Ｂｒｅｇｓａｖｅｌｏｃ、Ａｒｅｇｓａｖｅｌｏｃ、Ｉｐｔｒｓａｖｅｌｏｃ、Ｗｐｔｒｓａｖｅｌｏｃと便宜的に名付ける（図１０参照）。また外部リンク通信用に入力チャンネル４ワード、出力チャンネル４ワードを確保し固定する。それらをＬｉｎｋ０Ｉｎｐｕｔ、・・・、Ｌｉｎｋ３Ｉｎｐｕｔ、Ｌｉｎｋ０Ｏｕｔｐｕｔ、・・・、Ｌｉｎｋ３Ｏｕｔｐｕｔと便宜的に名付ける。なお、以下の記述においてアドレス（Ｘ）とある場合、Ｘで示されるアドレスへのアクセスを意味する。
【００２８】
（ａ―２）プロセス管理用レジスタについて説明する。
プロセッサ（ＣＰＵ１０）内にプロセス管理用レジスタとして３２ｂｉｔ幅のレジスタを５つ用意する。Ｗｐｔｒ１４（現行プロセスのワークスペースポインタを保持）と待機プロセス管理用レジスタとしてＦｐｔｒ１６とＢｐｔｒ１７を用意する。Ｆｐｔｒ１６、Ｂｐｔｒ１７は優先度に応じて独立に２組用意する。なお、表現を簡略化するためここではＦｐｔｒ１６、Ｂｐｔｒ１７のサフィックスを省略し、優先度の記号のみを付記する、例えば、Ｆｐｔｒ０，Ｂｐｔｒ０を高優先度プロセス用、Ｆｐｔｒ１、Ｂｐｔｒ１を低優先度プロセス用とする。以後単にＦｐｔｒ１６、Ｂｐｔｒ１７とのみ記された場合優先度に関係なく、同じ優先度内のレジスタ対であることを意味する。
【００２９】
（ａ−３）内部レジスタについて説明する。
前述したように、命令ポインタ（Ｉｐｔｒ１５）と呼ばれる３２ｂｉｔ幅のレジスタを１つ用意する。次に実行する命令の格納されているメモリアドレスを保持しておく。また同じく３２ｂｉｔ幅の汎用スタックレジスタのＡｒｅｇ１１、Ｂｒｅｇ１２、Ｃｒｅｇ１３を用意する。任意であるが、いくつか更に内部レジスタを設けなければならない場合がある。この例として、繰り返し操作の回数を保持しておくｃｎｔ２１（カウンタレジスタ）、一時的なデータ保管用のＴｅｍｐ２９（テンポラリレジスタ）などがあるが、以下ｃｎｔ２１が構成されているとする（チャンネル間通信で利用する）。
【００３０】
（ａ−４）ＴＰＣＯＲＥ５０のクロックについて説明する。
ＴＰＣＯＲＥ５０において、クロックは２種類用意し、優先度の高いプロセスで使用されるクロックの周期は１μ（マイクロ）秒、優先度の低いプロセスで使用されるクロックは６４μ秒とする。
【００３１】
このように、ＣＰＵ１０を有するＴＰＣＯＲＥ５０は、プロセス管理用レジスタや汎用スタックレジスタとメモリ（ＲＡＭ）４２などのハードウェアを最適化し、また後述するＯｃｃａｍ言語で動作するようにすることにより従来のトランスピュータの性能をより向上することができる。
【００３２】
次に、ＴＰＣＯＲＥ５０を制御するＯｃｃａｍ言語の概要について説明する。
まず、コンストラクションで処理するプロセスについて説明する。ここで、コンストラクションとは代入、出力、プロシジャーコール（サブルーチンに相当する）などの最も基本となるプリミティブ（基本）プロセスの集合体を示す。
プリミティブプロセスとは代入文、入力分、出力分の最小単位を示す。
代入プロセスは、変数に値を代入することを示し、ｙの値を変数ｘに代入する場合、ｘ：＝ｙと表される。入力プロセスは、変数に値を入力することを示し、ｃｈ（チャンネル）１からの変数ｘを受ける場合、ｃｈ１？ｘと表される。出力プロセスは、変数から値を出力することを示し、ｃｈ１へ変数ｙを出力する場合、ｃｈ１！ｙと表される。
宣言されたチャンネルは、２つの並列動作するプロセス間に存在する。チャンネルは宣言されるとプログラム実行中に通信する相手が変わることは無いが、送信側と受信側は入れ替わることができる。また、ＴＰＣＯＲＥ５０間の入出力はお互い同期を取って行われる。
例えば、上（前）の逐次プロセスにより出力プロセスが実行されたとき、下（後）の逐次プロセスが実行されなかったら、実行されるまで上のプロセスは待ち続け、両方が通信可能となったときに通信が開始する。このようにして通信の同期が取られる。
【００３３】
Ｏｃｃａｍ言語のコンストラクションはＳＥＱ、ＰＡＲ、ＡＬＴ、ＷＨＩＬＥ、ＩＦ、ＣＡＳＥの６種類がある。
ＳＥＱ（シーケンシャル）コンストラクションは、プログラムの上から順にプロセスを実行するコンストラクションである。ＰＡＲ（パラレル）コンストラクションは、記述されている順番に関係なくプロセスを並列に実行する。ＡＬＴ（オルトネィティブ）コンストラクションは、ＡＬＴコンストラクションが求めている条件を１番最初に満たされたプロセスを選択し実行する。ＷＨＩＬＥ（ホワイル）コンストラクションは、これに付随している論理型の変数に基づいてプロセスが繰り返し実行する。ＩＦ（イフ）コンストラクションは、ガードが“真”になった最初のプロセスを実行する。ＣＡＳＥ（ケース）コンストラクションは、複数のプロセス群の中から一つのプロセスを選択する。
【００３４】
以下、ＳＥＱ、ＰＡＲ、ＡＬＴの各コンストラクションについてプログラムを参照しながら具体的に説明する。
ＳＥＱコンストラクションを用いたプログラム例を以下に示す。
ＳＥＱ
Ｐｒｏｃｅｓｓ  １
Ｐｒｏｃｅｓｓ  ２
・
・
・
Ｐｒｏｃｅｓｓ  ｎ
【００３５】
上述したプログラムにおいて、ＳＥＱコンストラクションは、記述されたプロセスをＰｒｏｃｅｓｓ  １から順にＰｒｏｃｅｓｓ  ２，Ｐｒｏｃｅｓｓ  ３，・・・と逐次実行していく。そして、最後のプロセスＰｒｏｃｅｓｓ  ｎが終了すると、ＳＥＱコンストラクション自身が終了する。
【００３６】
ＰＡＲコンストラクションを用いたプログラム例を示す。
ＰＡＲ
Ｐｒｏｃｅｓｓ  １
Ｐｒｏｃｅｓｓ  ２
・
・
・
Ｐｒｏｃｅｓｓ  ｎ
【００３７】
ＰＡＲコンストラクションは、記述されたプロセスを同時に実行して行く。そして全てのプロセスが終了したときＰＡＲコンストラクション自身が終了する。並列動作するプロセス同士は、唯一チャンネルを用いて通信することで相互作用を行う。ＰＡＲコンストラクション内のプロセス一つに対して一つのＴＰＣＯＲＥ５０が割り当てられている場合は、同じＰＡＲコンストラクション内のプロセスは同時に実行が開始される。しかし、１台のＴＰＣＯＲＥ５０で実行されるＰＡＲコンストラクションは、時分割に管理されて擬似並列的に実行される。この擬似並列動作については後述する。
また、並列に実行されるプロセスに優先度を付けることができ、ＰＡＲコンストラクションの前にＰＲＩの予約語を追加する。
【００３８】
ＡＬＴコンストラクションを用いたプログラム例を示す。
ＡＬＴ
ｉｎｐｕｔ１
Ｐｒｏｃｅｓｓ１
ｉｎｐｕｔ２
Ｐｒｏｃｅｓｓ２
・
・
・
ｉｎｐｕｔｎ
Ｐｒｏｃｅｓｓｎ
【００３９】
ＡＬＴコンストラクションは、多くのプロセスから実行すべきプロセスを一つ選択する。上述のプログラムにおいて、ｉｎｐｕｔ１，ｉｎｐｕｔ２，・・・，ｉｎｐｕｔｎは入力ガードを示し、最初にレディ状態になった入力ガード内のプロセスが実効される。そして、選択されたプロセスが実行された後、ＡＬＴコンストラクションは終了する。
ＡＬＴコンストラクションもまたＰＡＲコンストラクションと同様に優先度を付けることができ、ＰＲＩの予約語をＡＬＴの前に追加する。なお、Ｏｃｃａｍ言語では、上から順に優先度をつけているが、ＴＰＣＯＲＥ５０とトランスピュータでは２つの優先度しかない。そのため、プログラムの一番上に記述されたプロセスが優先度は高く、それ以下のプロセスは優先度が低い。
【００４０】
次に、ＦＰＧＡ上でのＴＰＣＯＲＥ５０ネットワークについて説明する。
図５に示すように、ＴＰＣＯＲＥ５０は従来のトランスピュータと同様に4つの外部インターフェース５２−ａ〜５２−ｄ（またはリンク（Ｌｉｎｋ）とも称する）を備えている。ボックス５１がＴＰＣＯＲＥ５０本体を示し、このボックス５１の各辺の中央に辺と直交している線はインターフェース５２−ａ〜５２−ｄを示す。
図５に示すように、このインターフェース５２−ａ〜５２−ｄを他のＴＰＣＯＲＥ５０のインターフェース５２−ａ〜５２−ｄとつなぎ合わせＴＰＣＯＲＥ５０ネットワークを構築することができる。
【００４１】
図６（ａ）〜（ｃ）に、ＴＰＣＯＲＥネットワーク１００の構成図を示す。ＴＰＣＯＲＥネットワーク１００はＴＰＣＯＲＥ５０のインターフェース５２−ａ〜５２−ｄを介して複数個ＴＰＣＯＲＥ５０を接続して、ツリー接続（図６（ａ））、パイプライン接続（図６（ｂ））、格子接続（図６（ｃ））されて並列処置プロセッサのネットワークを構築する。例えば、グラッフィクスアクセラレータとしては格子接続を、また並列データベース検索システムではツリー接続とすることにより、応用形態によって短時間で容易にネットワークを構成することができる。
また、上述したＴＰＣＯＲＥ５０をＦＰＧＡで形成することにより、ネットワークも並列処理を応用するシステムによって自由にそのトポロジーを改編できる。従って、ＴＰＣＯＲＥ５０をＦＰＧＡ上で実現させることのメリットは非常に大きい。
【００４２】
次に、外部リンク（Ｌｉｎｋ）を用いた並列処理プロセッサの通信動作について説明する。ここでは説明を分かり易くするため、２個のＴＰＣＯＲＥ５０−１，５０−２を用いた通信の例を示す。なお、図７においてＬｉｎｋ  Ｉｎｔｅｒｆａｃｅ（リンクインターフェース）を単にリンク（Ｌｉｎｋ１、Ｌｉｎｋ２）とも称する。
図７に示すように、ＴＰＣＯＲＥ５０−１，５０−２間の通信は、Ａｃｋｎｏｗｌｅｄｇｅ（ＡＣＫ；アクノレッジ）パケットにより成立する。このＡＣＫパケットが送られてこなければ、これを受信するまで送信（Ｏｕｔ）側のＬｉｎｋ１（リンクインターフェース）４５ａはアイドリング状態として待機する。
例えば、ＴＰＣＯＲＥ５０−１のＢｒｅｇ１２が0x80000008という状態でｏｕｔ命令が実行されるとリンクブロック４５を構成するＬｉｎｋ２（リンクインターフェース）４５を通じて外部にデータを出力しようとする。ＣＰＵ１０はスタックレジスタ（Ａｒｅｇ１１，Ｂｒｅｇ１２，Ｃｒｅｇ１３）の内容やプロセスＩＤをリンクインターフェースの各レジスタに渡し、Ｌｉｎｋ２に通信処理を委ねる。そして、現在実効していたプロセスを終了して、スケジューリングリストの次の実行を始める。
【００４３】
ＴＰＣＯＲＥ５０−１は１Ｂｙｔｅのデータを送信後、相手側のＴＰＣＯＲＥ５０−２からＡＣＫパケットが送られて来るまでアイドリングし、それらを受信すると通信が成立する（図８参照）。通信が成立した後も１Ｂｙｔｅずつ送信し、ＡＣＫパケットでデータの送受信をお互い確認し合いながらｃｎｔ２１に格納されたバイト数のデータを通信する。
ＣＰＵ１０とＬｉｎｋ１４５ａが同時にメモリ４２ａにアクセスすることはできないので、この通信が実行されているときはＬｉｎｋ１４５ａがメモリ４２ａを占用する。通信が終了すると、通信前にＬｉｎｋ１４５ａに渡したＩＤをメモリ４２ａに形成されたスケジューリングリストの最後尾へ追加する。この追加を実行するための制御はマイクロコードにより行われる。また、通信終了と同時にＣＰＵ１０がアイドリング状態から復帰し、メモリ４２，４２ａの占有権もＣＰＵ１０に渡される。図９に、ＴＰＣＯＲＥ５０−１，ＴＰＣＯＲＥ５０−２が各実行中のプロセスを停止してメモリ４２の使用権限をＬｉｎｋ１４５ａ，Ｌｉｎｋ２４５に渡し、ＴＰＣＯＲＥ５０−１とＴＰＣＯＲＥ５０−２間でＡＣＫパケットとデータを送出する例を示す。
【００４４】
次に、ＴＰＣＯＲＥ５０のプロセッサの単体内部における複数のプロセスの並列処理について説明する。なお、ＴＰＣＯＲＥ５０は前提条件として上述の（ａ−１）メモリ、（ａ−２）プロセス管理用レジスタ、（ａ−３）内部レジスタを有する。
【００４５】
まず、ＴＰＣＯＲＥ５０のプロセス管理について説明する。
以下レジスタのサフィックスの小文字の時はレジスタを示し、（ＸＸ）の記号はそのデータ（アドレス値など）を示す。例えばＡｒｅｇ１１はレジスタを示し、（Ａｒｅｇ１１）はＡレジスタに格納された（される）データを示す。
プロセスはＷｐｔｒ１４とスケジューリングリストによって管理される。Ｗｐｔｒ１４は現在のプロセスのＩＤ（識別番号）を格納するために用いられ、スケジューリングリストは待機プロセスを保持するために用いられる。
あるプロセスを実行中に新しく別のプロセスが生成されたり、割り込みが発生したりするとそのプロセスＩＤは待機プロセスとして、スケジューリングリストの最後尾に追加される。このリストは先に格納されたものが先に実行されるＱｕｅｕｅ（キュー）として取り扱われる。また、このスケジューリングリストはリンクリスト構造で実行されるプロセスの順序を管理する。
【００４６】
（ｂ−１）プロセスＩＤ
プロセスを１つの処理の単位とし、このプロセスにプロセスＩＤ（３２ｂｉｔ）を付与する。このプロセスＩＤの下位２ｂｉｔはそのプロセスの優先度を示し、優先度は“Ｈｉｇｈ”（下位１ｂｉｔ＝０）と“Ｌｏｗ”（下位１ｂｉｔ＝１）とする。上位３０ｂｉｔはプロセスごとに格納するメモリ４２のワークスペース上でのアドレスを示す。なお、プロセスのワークスペースはＯｃｃａｍコンパイラが管理する。
【００４７】
（ｂ−２）ワークスペース
プロセスごとにＲＡＭで構成されるメモリ４２上にワークスペースというメモリ領域を設け、このメモリ領域にプロセスＩＤが示す値を基準にそこからメモリ負方向に３２ｂｉｔワード単位で数ワード（必ず）用意する。ワークスペースは並列処理されるプロセスが他のプロセスの割り込みにより一時的に中断されるときデータ（各種レジスタ）の保持、チャンネル通信、ＡＬＴコンストラクション命令の実行、プロセススケジューリングに利用する。ワークスペース先頭−４番地（プロセスＩＤ−４、つまりワークスペースより１ワード目）にプロセス開始（あるいは再開）時のＩｐｔｒ１５の値を入れる。
【００４８】
図１０に、プロセスＩＤ（Ｗｐｔｒ１４）のワークスペースの例を示す。例えば、プロセスＩＤが示すアドレス（Ｗｐｔｒ１４）の一つ前のアドレス（Ｗｐｔｒ１４−１）をアクセスする時は、Ｗｐｔｒ１４の値をＡＬＵ３１に送り１減らした値をアドレスとしてアクセスする。同様に、アドレス（Ｗｐｔｒ１４−２）にアクセスする時は、アドレス（Ｗｐｔｒ１４）から２を引いた値をアドレスとしてアクセスする。
【００４９】
（ｂ−３）ワークスペース管理
現在実行中のプロセスＩＤはＷｐｔｒ１４に保持する。プロセスを実行中に新たなプロセスが生成された場合、そのプロセスは待機プロセスとしてプロセススケジューリングリストの最後尾に付け加える。このリストは先入先出構造（ＦＩＦＯ）を持つ。プロセスＩＤの示すそのプロセス独自のアドレス（ワークスペース−８）、即ちアドレス（ワークスペース−２ワード）目にそのプロセスの次に実行されるべきプロセスのワークスペースアドレス（即ちプロセスＩＤ）を収納する。もしそれ以降に実行すべきプロセスがない場合は空信号（ｅｍｐｔｙ，エンプティフラグ）として例えば0x80000000あるいは0x80000001（それぞれ低い優先度のプロセス用，高い優先度のプロセス用）という値を持たせる。このアドレス（ワークスペース−８）に次に実行させるプロセスＩＤを持たせることによりリンクリストの型でプロセススケジューリングリストを構成する。待機プロセスの先頭のプロセスＩＤをＦｐｔｒ１６に、最後尾のプロセスＩＤをＢｐｔｒ１７に保持させる。アドレス（Ｂｐｔｒ１７−８）にはしたがってｅｍｐｔｙが格納されている。この構造によるスケジューリングリスト（以下キュー（Ｑｕｅｕｅ）とも称する）は２つの優先度（ｈｉｇｈ，ｌｏｗ）について独立に保持する。図１０に、メモリ４２上のプロセスＩＤ（Ｗｐｔｒ１４）のワークスペースの例を示す。アドレス（Ｗｐｔｒ１４，Ｗｐｔｒ１４−１，・・・，Ｗｐｔｒ１４−５）と汎用レジスタとプロセス管理用レジスタに対応する記憶場所の関係について示す。
【００５０】
次に、メモリ４２上のワークスペースに関する具体例を表１，２に示す。表１は、ＰＡＲコンストラクションの実行時のワークスペース内容を示し、ワークスペース相対アドレスと格納データの関係を示す。また表２には、ＡＬＴコンストラクションの実行時のワークスペースの内容を示す。いずれのコンストラクションにおいても、負方向に所定ワード離れたアドレスにデータが格納される。ＰＡＲコンストラクションでは所定アドレス離れてプロセス開始時や復帰時に実行されるアドレス、次に実行されるプロセスのＩＤ、通信開始時アクセスするメモリ４２の先頭アドレスが格納される。また、ＡＬＴコンストラクションではアドレスの負方向に所定アドレス離れて、ガード選択状態、プロセス開始時や復帰時に実行されるアドレス、次に実行されるプロセスのＩＤ、ＡＬＴ実行状態が格納される。
【００５１】
【表１】
2009048306.tif 000003
【００５２】
【表２】
2009048306.tif 000004
【００５３】
次に、ＴＰＣＯＲＥ５０単体における並列プロセス処理について説明する。
図１１に、並列で数種類のプロセスが走る環境下でのプロセス状態遷移図を示す。並列処理はプログラムが実行される前のグランドステージ（初期（基本）段階）で、ＴＰＣＯＲＥ５０にプロセスを開始するｓｔａｒｔｐ（開始）命令が供給されプログラムが実行されると（ＳＴ１）プロセスを生成する（ＳＴ２）。そして、キュー（Ｑｕｅｕｅ）が空のときは生成したプロセスを実行し（ＳＴ３）、ｅｎｄｐ（終了）命令でプロセスを終了する。また、プロセス（ＳＴ３）の実行中、チャンネル通信の提起やタイムアウト処理やｓｔｏｐｐ命令が実行されると、アイドリング状態となり（ＳＴ４）相手方プロセスのチャンネルの反応を見るため待機する（ＳＴ５）。
一方、プロセスを生成した後（ＳＴ２）キューが空でないとき、プロセスＩＤをキューの末尾に追加して待機する（ＳＴ５）。待機中にキュー内でプロセスＩＤが進む。待機中のプロセスが先頭プロセスになると先頭待機時のプロセスがチェンジして（切り替えられて）待機中のプロセスが実行され（ＳＴ３）、ｅｎｄｐ命令によりプロセスが終了し、最初のグランドステージに遷移する（ＳＴ１）。以後同様な遷移が繰り返される。
【００５４】
以下、上述した並列プロセスの処理の具体例に説明する。
Ｏｃｃａｍ言語で作成されたプログラムにＰＡＲコンストラクションやＡＬＴコンストラクションなど新しくプロセスを生成するようなコンストラクションが存在すると、コンパイラは以下の実行をするようにアセンブラコード群を生成する。
（ａ１）生成するプロセスＩＤを作る。
（ａ２）アセンブラ命令ｓｔａｒｔｐを用いてプロセスを生成する。
（ａ３）生成されたプロセスはその優先度に応じたスケジューリングリストへと追加される。
この（ａ１）〜（ａ３）の実行は生成するプロセスの数（並列プロセスの数）だけ繰り返えされる。
【００５５】
次にプロセスの実行と切り替えについて図１，２を参照しながら説明する。
ＴＰＣＯＲＥ５０は、Ｗｐｔｒ１４の値が示すプロセスを実行する。しかし、実行しているプロセスが実行不可能またはプロセッサ（ＴＰＣＯＲＥ５０）がアイドリング状態になった時にプロセスの切り替が起こる。つまりアイドリング状態になった時、再び実行可能状態になるまでその状態を待ち続けるのでなく、別のプロセスを実行することでアイドリング状態を減らしている。
上述したプロセス実行不可能またはアイドリング状態にする要因は以下の例がある。
（ｂ１）プロセスを終了または停止させるようなアセンブラ命令が実行された場合。
（ｂ２）入出力命令を実行したとき、通信する相手が準備できていない場合。
（ｂ３）遅延やタイムアウト処理を行う命令を実行した時、目的の時間が経過していない場合。
このとき、ＴＰＣＯＲＥ５０におけるハードウェアのメカニズムは次のようのになる。
（ｂ４）待機プロセスの有無を調べ、無ければアイドリング状態にし、有ればプロセスの切り替え次のステップへ進む。
（ｂ５）Ｆｐｔｒ１６の値をＷｐｔｒ１４へ格納する。それと同時にアドレス（Ｗｐｔｒ１４−１）に格納されている値をＩｐｔｒ１５へ格納する。
（ｂ６）次に待機プロセスのＩＤをアドレス（Ｗｐｔｒ１４−２）から取り出し、それをＦｐｔｒ１６へ格納する。
（ｂ７）Ｗｐｔｒ１４へ格納されたプロセスを開始する。
このようなプロセス切り替えを行うハードウェアの状態の遷移はマイクロコードに記述してあり、それによって制御される。また例外的にプロセスが切り換る要因として割り込みがあるが、これについては後述する。
【００５６】
次に、上述したスケジューリングリストについて説明する。
スケジューリングリストはメモリ４２上に形成され、リンクリスト構造で実行されるプロセスの順序を管理する。プロセスはプロセス自身ワークスペースを持ち、これを用いてスケジューリングリストを形成する。図１２ではプロセスが４個存在しているときのスケジューリングリストの例を示す。なお、図１２において煩雑さを避けるため、Ｗｐｔｒ１４の記号をＷｐｔｒと略記して、プロセス番号をＷｐｔｒに付記する。
メモリ４２（Ｍｅｍｏｒｙ）上で形成されたスケジューリングリストにおいて、例えば、あるプロセス（プロセス０）のＩＤがアドレス（Ｗｐｔｒ０）であるとき、そのプロセスの次に実行されるプロセスＩＤはアドレス（Ｗｐｔｒ０−２）に格納される。また自らのプロセスが実行され始めるときの命令取得先のアドレス（Ｉｐｔｒ１５の値）は（Ｗｐｔｒ１−１）に格納される。４番目の最後のプロセスＩＤ（アドレス（Ｂｐｔｒ１７））はアドレス（Ｗｐｔｒ３）に格納される。図１２に示すように、例えば、３番目のプロセスに関するアドレス（Ｗｐｔｒ２−２）には次の（４番目の）プロセスＩＤのＷｐｔｒ３が格納され、プロセス自身が次のプロセスを指し示すリンクリスト構造でプロセスは実行順に待機している。
ＴＰＣＯＲＥ５０は、このようなスケジューリングリストにアクセスするためにＦｐｔｒ１６とＢｐｔｒ１７の２種類のレジスタを用意している。
待機プロセスの先頭のプロセスＩＤがＦｐｔｒ１６、最後尾のプロセスＩＤがＢｐｔｒ１７で記憶される。実行中のプロセスが終了し、次の待機プロセスを開始するときなどは、Ｆｐｔｒ１６にアクセスし次のプロセスが開始する。また、プロセスが生成したときなどはＢｐｔｒ１７を用いてスケジューリングリストの最後尾にアクセスし、このプロセスを追加する。このスケジューリングリストの動作メカニズムやＦｐｔｒ１６、Ｂｐｔｒ１７の制御はマイクロコードにより制御される。
【００５７】
スケジューリングリストは、アドレス（Ｆｐｔｒ１６）、アドレス（Ｂｐｔｒ１７）、メモリ（中間プロセス）の３つの要素で構成され、リンクリスト構造で待機プロセスが連結している。
したがって、待機プロセスがメモリ４２で保持されるので使用するレジスタの数が減り、ハードウェアのリソースが節約できる。レジスタなどで待機プロセスを保持すると、スケジューリングリストとして用意したレジスタ以上の待機プロセスが生成されたとき、レジスタに空きができるまで、プロセスの生成を禁止したりしなくてはならない。このようなことはハードウェアの構造を複雑にする。しかし、上述したリンクリスト構造では、ほとんど無限に待機プロセスを生成することができ、またハードウェアの構造をシンプルにすることができる。
【００５８】
次に、ＴＰＣＯＲＥ５０におけるＰＡＲコンストラクションの実行について具体的に説明する。
（ｃ−１）プロセスの実行
プロセッサ５０はＩｐｔｒ１５を基にプロセスを実行させるとともにＷｐｔｒ１４で示されるワークスペースの各値を１マシン命令実行ごとに（必要があれば）更新する。
（ｃ−２）プロセスの開始
Ａｒｅｇ１１に開始すべきプロセスのプロセスＩＤを入れ、またＢｒｅｇ１２にプロセスの開始時に実行する命令のアドレスとアドレス（Ｉｐｔｒ１５）とのオフセットを入れておく（Ｏｃｃａｍコンパイラで整えられる）。待ちプロセスがなければ（スケジューリングリストにプロセスＩＤが登録されていないとき；アドレス（Ｆｐｔｒ１６）＝（Ｂｐｔｒ１７）＝ｅｍｐｔｙ）、Ｂｐｔｒ１７にＡｒｅｇ１１のデータを格納し、アドレス（ワークスペース−４）にＩｐｔｒ１５＋４＋Ｂｒｅｇ１２を格納する。待ちプロセスがある場合、すなわちアドレス（Ｆｐｔｒ１６）≠アドレス（Ｂｐｔｒ１７）の場合、アドレス（Ｂｐｔｒ１７−８）にＡｒｅｇ１１のデータを格納する。
【００５９】
（ｃ−３）現行プロセスの実行中断・終了
現行プロセスがプロセス終了あるいは停止命令の実行を行ったとき、入出力命令を実行したとき、あるいはチャンネル通信での待機、遅延（ディレイ）やタイムアウト処理を行う命令の実行に入ったとき、プロセスを中断させる（図１３のＳＴ１１ａ，図１４のＳＴ２１，図１５のＳＴ１１ｂ，図１６のＳＴ３１参照）。
【００６０】
（ｃ−４）プロセスの切り替え
ＰＡＲコンストラクションにおけるプロセスの切り替え動作について説明する（図１３〜図１６と表３〜表６参照）。なお、表３〜６，表８において、煩雑さを避けるため各ポインタレジスタのサフィックスは省略する。
待機プロセスの有無を調べ、待機プロセスが無ければプロセッサ（ＴＰＣＯＲＥ５０）そのものがアイドリング状態となる（図１６，表３参照）。
【００６１】
【表３】
2009048306.tif 000005
待機プロセスが１個以上ある場合（Ｆｐｔｒ１６≠Ｂｐｔｒ１７）プロセスを切り替えるためにＦｐｔｒ１６の値をＷｐｔｒ１４に格納し、アドレス（Ｆｐｔｒ１６−４）にある値をＩｐｔｒ１５に格納し、アドレス（Ｆｐｔｒ１６−８）に保持されている次のプロセスのプロセスＩＤをＦｐｔｒ１６に格納するという手続きを踏みプロセスの切り替えを行う（図１３と表４のＴａ１，Ｔａ２、図１５と表５のＴＣ１，ＴＣ２参照）。
【００６２】
【表４】
2009048306.tif 000006
【００６３】
【表５】
2009048306.tif 000007
なお待機プロセスが１個のみの場合（Ｆｐｔｒ１６＝Ｂｐｔｒ１７）、プロセスを切り替えた後、次のプロセスのプロセスＩＤの代わりにＦｐｔｒ１６にｅｍｐｔｙを入れておく。なおプロセスを切り替えようとしてＦｐｔｒ１６＝Ｂｐｔｒ１７＝ｅｍｐｔｙであった場合、Ｗｐｔｒ１４＝ｅｍｐｔｙとしてプロセッサ（ＴＰＣＯＲＥ５０）はアイドリング状態となる。高優先度のプロセスから復帰して低優先度のプロセスに切り替わる場合、たとえアドレス（Ｆｐｔｒ１６）＝（Ｂｐｔｒ１７）＝ｅｍｐｔｙと待機プロセスがなくてもワークスペース割り込み保存領域のＷｐｔｒｓａｖｅｌｏｃにあるアドレス（Ｗｐｔｒ１４）を持ってきて実行を再開させる（図１３と表４のＴａ３、図１５と表５のＴＣ３参照）。そして後述の「割り込みからの復帰」と同じ操作が行われる。
また、高優先度キューが空で中断プロセスは高優先度の場合、待機プロセスが有るとＷｓａｖｅｌｏｃをＷｐｔｒ１４に格納し、アドレス（Ｗｐｔｒ１４−４）のデータをＩｐｔｒ１５に格納し、待機プロセスを取り出し、実行する（図１４と表６参照）。
【００６４】
【表６】
2009048306.tif 000008
【００６５】
（ｃ−５）低優先度プロセス実行中の高優先度プロセスの切り替え
低い（ｌｏｗ）優先度のプロセス実行中に高い（ｈｉｇｈ）優先度のプロセス（Ｆｐｔｒ（１６）０＝Ｂｐｔｒ（１７）０）が生成されたり、アイドリング状態から復帰しかつＦｐｔｒ（１６）０＝Ｂｐｔｒ（１７）０≠ｅｍｐｔｙであれば、そのプロセスのみがＱｕｅｕｅにある高優先度プロセスの実行が割り込んでくる。この場合、現在実行させているプロセスのＷｐｔｒ１４、Ｉｐｔｒ１５およびスタックレジスタのＡｒｅｇ１１、Ｂｒｅｇ１２、Ｃｒｅｇ１３をそのワークスペースの所定の保存領域（Ｗｐｔｒｓａｖｅｌｏｃ、Ｉｐｔｒｓａｖｅｌｏｃ、Ａｒｅｇｓａｖｅｌｏｃ、Ｂｒｅｇｓａｖｅｌｏｃ、Ｃｒｅｇｓａｖｅｌｏｃ、Ｗｐｔｒｓａｖｅｌｏｃから連続でＷｐｔｒｓａｖｅｌｏｃ＋１６まで）に格納させる。そしてＷｐｔｒ１４にＦｐｔｒ０（プロセス０のＦｐｔｒ１６）、Ｉｐｔｒ１５にアドレス（Ｆｐｔｒ０−４）の内容を格納する。
【００６６】
（ｃ−６）割り込みからの復帰
高優先度プロセスのスケジューリングリストが空になりＷｐｔｒｓａｖｅｌｏｃに割り込み以前のワークスペースアドレスが格納されている場合割り込み復帰を行う。Ｗｐｔｒ１４、Ｉｐｔｒ１５、Ａｒｅｇ１１、Ｂｒｅｇ１２、Ｃｒｅｇ１３をそれぞれ退避先のメモリ４２からレジスタに戻す。そしてＷｐｔｒｓａｖｅｌｏｃ＝ｅｍｐｔｙを格納する。
【００６７】
次に、ＴＰＣＯＲＥ５０におけるチャンネル間通信について説明する。
ＴＰＣＯＲＥ５０では、“ｉｎ”や“ｏｕｔ”のような通信用アセンブリ命令が実効されたとき、まず通信は同じＴＰＣＯＲＥ５０内のプロセスと通信するか他のＴＰＣＯＲＥ５０と通信するかを調べる。外部リンク（Ｌｉｎｋ）を用いる通信であった場合は、現在のＡｒｅｇ１１、Ｂｒｅｇ１２、Ｃｒｅｇ１３、Ｗｐｔｒ１４の値をリンクインターフェースに渡して通信処理の全権をリンクインターフェースに委ねる。内部通信であった場合は、メモリ４２上のチャンネルにアクセスし、そこに格納されているＩＤを読み取り、その後の実行を行う。内部通信と確認した後、ＴＰＣＯＲＥ５０は、すぐに入出力作業を行うのではなく、この通信するチャンネルがすでにＡＬＴ関連のアセンブラ命令でＥｎａｂｌｅ（イネーブル）状態にされているチャンネルであるかどうか調べる。そしてチャンネルがＡＬＴコンストラクション用のチャンネルでなかったら、入出力処理を始める。
【００６８】
以下、ＴＰＣＯＲＥ５０における内部通信の実行について具体的に説明する。
（ｄ−１）チャンネル
プロセス間の通信に使われるためにメモリ内の任意領域に１語を確保する（Ｏｃｃａｍコンパイラが用意する）。このアドレスをチャンネルアドレスとする。そのチャンネルアドレスにはプロセスＩＤあるいは初期値として例えばｅｍｐｔｙ（0x8000000x；Ｘ＝０，１は優先度を示す）を格納する。
（ｄ−２）チャンネル間通信の開始
チャンネル間通信が要求されるとＯｃｃａｍコンパイラは通信に必要な情報としてＡｒｅｇ１１に送受信するデータ数、Ｂｒｅｇ１２にチャンネルアドレス、Ｃｒｅｇ１３に送受信するデータを格納する（している）メモリ領域のアドレスを格納する。通信が開始されるとまずこのチャンネルがＡＬＴコンストラクションにより利用されているチャンネルかどうかを調べ、そうでなければ平行して走る当該２プロセス間でチャンネル間の入出力を開始する。
【００６９】
（ｄ−３）通信の提起
上述した擬似並列動作ではプロセスは並行して実行されるとなっているが、１プロセッサ（ＴＰＣＯＲＥ５０）のみでは一度に1命令しか実行できないので、ある瞬間ではプロセスは１つのみしか実行されていないことになる。したがってチャンネル通信も結局のところ先行プロセスと後発プロセスの間のデータ交換という形をとる。
先行プロセスはスタックレジスタＡｒｅｇ１１，Ｂｒｅｇ１２，Ｃｒｅｇ１３に所定のデータが格納され、チャンネル間通信に対応する命令の実行部に至ると、チャンネルアドレスで示されるメモリが空（ｅｍｐｔｙ）であればまずワークスペース（アドレス（Ｗｐｔｒ１４）で示される）より１ワード負のアドレス（Ｗｐｔｒ１４−４）にチャンネル間通信直後に開始される命令のアドレスを格納し、さらに２ワード負のアドレス（Ｗｐｔｒ１４）−１２にＣｒｅｇ１３の値を格納する（即ちデータ格納先アドレス）。そしてチャンネルアドレスに現在のプロセスＩＤを格納する。そしてこのプロセスをスケジューリングリストからはずし、次に待機しているプロセスを実行させる。つまりＦｐｔｒ１６のデータをＷｐｔｒ１４に入れてアドレス（Ｆｐｔｒ１６−４）をＩｐｔｒ１５とする。これによりプロセスは入出力待ちによるアイドリング状態となる。待機（後発）プロセスが存在しない時、プロセッサ（ＴＰＣＯＲＥ５０）はアイドリング状態となる。
【００７０】
（ｄ−４）通信の成立
プロセスが切り替わり、後発プロセスの実行が開始され、その通信開始に対応する命令部に至れば、前述の通信の提起で述べたアルゴリズムを実行する。しかし該当するチャンネルアドレス（アドレス（Ｂｒｅｇ１２）で示される）にはすでに前述の操作で空でない情報（即ち先行プロセスのプロセスＩＤ）が書かれてあるので、そのプロセスとの通信が成立することになる。この時点でプロセス待ちのキューが空かどうかチェックする。
空でない場合、Ｆｐｔｒ１６≠ｅｍｐｔｙ、それは通信相手方プロセス以外の他のプロセスが並列して走っている（実効されている）ことを意味するのでアドレス（Ｂｒｅｇ１２−８）に相手方のプロセスＩＤを入れてプロセスをキューの最後尾につける。
もしキューが空Ｆｐｔｒ１６＝ｅｍｐｔｙならＢｐｔｒ１７に相手方のプロセスＩＤを格納する。相手方のプロセスＩＤから相手側のワークスペースの先頭アドレスがわかり、そこから−１２番地の場所には相手方のチャンネル通信でデータを保持すべき（あるいは保持している）アドレスが格納されている。これは端的に言うとアドレス（Ｂｒｅｇ１２−１２）に格納されているデータである。この操作で先行アドレスのデータ保持アドレスと自（後発）プロセスのデータ保持アドレス（前述したようにＣｒｅｇ１３に格納されている）が明らかになる。チャンネルアドレスにプロセスＩＤが書かれている先行プロセスはこの時点でこの通信が自分にとって入力か出力か記憶していないが、後発プロセスがこの情報を持っている（現行命令を調べてチャンネル入力か出力か判断できる）ので問題なくチャンネル間入出力は行われる（つまりどちらが源でどちらが行き先か一義的に判明する）。この時点でＡｒｅｇ１１の値（通信バイト数）分のデータを送信側から受信側に移動させる。Ａｒｅｇ１１は他目的で使われることが多いので、転送バイト数を記憶させておくために通信開始時にオプショナルな（カウンタ）レジスタのｃｎｔ２１にその値をコピーしている。
【００７１】
（ｄ−５）通信の終了
「通信の提起」で記述したように、アイドリング状態にある先行プロセスをスケジューリングリストの最後尾に追加する。Ｂｐｔｒ１７＝アドレス（Ｂｒｅｇ１２）、アドレス（Ｂｐｔｒ１７−４）には先行プロセスの復帰後の最初に実行される命令のアドレスが格納されている。そして該当チャンネルアドレスをｅｍｐｔｙにする。
【００７２】
図１７と表７に２プロセス間の通信の状態遷移図を示す。
２プロセスをプロセスＡ（先行プロセス）とプロセスＢ（後発プロセス）とし、まずプロセスＡを実行し（ＳＴ５１）この時にプロセスＢは待機中（ＳＴ５４）とする。プロセスＡにおいてチャンネル通信命令が実行されるとスタックレジスタ（Ａｒｅｇ１１，Ｂｒｅｇ１２，Ｃｒｅｇ１３）に移動データ数、チャンネルアドレス、データ格納先アドレスが格納されて、チャンネル通信が開始する（ＳＴ５２）。チャンネルアドレスにプロセスＡのＩＤを格納し、プロセスＡをキューからはずし、プロセス切り替え処理を行い、プロセスＡをアイドリング状態にする（ＳＴ５３）。プロセスＡからプロセスＢに切り替えられると、プロセスＢはプロセスの実行を開始し、チャンネル通信命令があるとチャンネル通信を実行する（ＳＴ５６）。チャンネルアドレスのデータを相手先のプロセスＩＤに格納し、データソースアドレスやデータ数などのプロセスＡの通信情報をアクセスする。そして、プロセスＢとプロセスＡ間のデータの移動が行われ（ＳＴ５７）、一方、プロセスＢは動作を終了する（ＳＴ５８）。そして、プロセスＡが待機リストへ復帰し、キュー待ちして待機する（ＳＴ５９）。プロセスＡのＩＤが先頭になるとプロセスＡが再開し（ＳＴ６０）、中断された処理が行われ、プロセス終了命令でプロセスＡが終了する（ＳＴ６１）。
【００７３】
【表７】
2009048306.tif 000009
【００７４】
次に、ＡＬＴコンストラクションについて説明する。
ＡＬＴコンストラクションは２つ以上の同形の構造から成り立っている。この構造単位はガードと呼ばれる論理式とチャンネル入力、あるいはチャンネル入力のみで構成される部分とそれに引き続くプロセスである（ガード＋プロセス）。
並列で走っている他の複数のプロセスのうちいくつかのプロセスがＡＬＴ命令プロセスのガードを構成しているどれかのチャンネルと通信を始めようとしたとする。ＡＬＴ命令はそのうち最初に（論理式が満たされかつ）チャンネル入力があったガード（この過程をガードがはずされると称する）に引き続くプロセスを選択的に実行するメカニズムである。このメカニズムはＣＳＰ理論の重要なプログラム方式の一つである。
【００７５】
次に、ＴＰＣＯＲＥ５０上でのＡＬＴコンストラクションの実行について図１８と表８を参照しながら説明する。
（ｅ−１）ＡＬＴコンストラクションの内部状態
ＡＬＴコンストラクションは「イネーブル（Ｅｎａｂｌｅ）」、「待機（Ｗａｉｔ）」、「レディ（Ｒｅａｄｙ）」の３つの状態とリセット（Ｒｅｓｅｔ）状態とを遷移して実現する。これらの状態を３２ｂｉｔ幅の値で区別しＡＬＴコンストラクション実行時にある特定のメモリ領域（後述のＡＬＴプロセスのワークスペース内）にその値が保持される。この値を例えばそれぞれ0x80000001，0x80000002，0x80000003とする。
【００７６】
（ｅ−２）ＡＬＴコンストラクションプロセス
図１８と表８にＡＬＴコンストラクションの状態遷移図を示す。ＡＬＴコンストラクションが開始されるとは１つの独立したプロセスが開始されることを示す。メモリ４２に独自のワークスペースをもちその先頭アドレスの値をプロセスＩＤとして設定する。Ｂｐｔｒ１７にその値が格納される。そしてそのアドレスから負方向３ワード目アドレス（Ｗｐｔｒ１４−１２に状態「イネーブル」を表す0x80000001を入れる（ＳＴ８１，Ｆ１参照）。
【００７７】
【表８】
2009048306.tif 000010
（ｅ−３）ガード入力の有無の検査
すべてのガードについて、ガードごとに以下のことを行う。ガードの一部に論理式を使っている場合、ＯｃｃａｍコンパイラはＡＬＴコンストラクション実行時での論理式の結果値をＡｒｅｇ１１に入れるようにする。
ガードの論理式実行においてＡｒｅｇ１１が真値をもっていれば、次にチャンネル入力のチャンネルアドレスの値（Ｂｒｅｇ１２に格納されている）を検査する（図１８，Ｆ２参照）。ここ（Ｂｒｅｇ１２）がｅｍｐｔｙでなくすでに他のプロセスＩＤが書き込まれていたら（即ちチャンネル出力プロセス側からのチャンネル通信の提起が始まっていることを示す）、ＡＬＴプロセスは「レディ」状態となり（ＳＴ８３，Ｆ４参照）、Ｗｐｔｒ１４にレディフラッグを示す0x80000003を格納すると同時にアドレス（Ｗｐｔｒ１４）に分岐先未決定フラグ（１）を格納する。
この時点でプロセススケジューリングリストにプロセスが存在する場合、リスト先頭で待っているプロセスのワークスペースポインタ（Ｆｐｔｒ１６）をアドレス（チャンネルアドレス−８）に格納させ、Ｆｐｔｒ１６＝アドレス（チャンネルアドレス）としてＡＬＴコンストラクションプロセスと通信するプロセスをリスト先頭に持ってくる（すでにそうなっていればこの部分はスキップ）。
あるいはスケジューリングリストが空であればＢｐｔｒ１７にチャネルアドレスを格納するガードのチャンネルが未入力の場合（Ａｒｅｇ１１の値が偽値であるか、アドレス（Ｂｒｅｇ１２）がＡＬＴコンストラクションプロセスのＷｐｔｒ１４値であるか）このガードは無視される。ガードの論理式が真でかつアドレス（Ｂｒｅｇ１２）＝ｅｍｐｔｙであればアドレス（Ｂｒｅｇ１２）にＡＬＴコンストラクションプロセスのワークスペースアドレス（Ｗｐｔｒ１４に保持されている）を入れる。（ガード有無の検査については、図１８，表８を参照。）
【００７８】
（ｅ−４）待機状態（Ｗａｉｔ）
すべてのチャンネルを入力待ちにした後（即ちガードに使われているチャンネルのチャンネルアドレスにＡＬＴプロセスのワークスペースアドレスが書かれたら）、アドレス（Ｗｐｔｒ１４−１２）は「待機」を示す0x80000002を格納し、Ｗｐｔｒ１４＝Ｆｐｔｒ１６として次に待機しているプロセスに起動をかける（Ｉｐｔｒ１５にＦｐｔｒ１６−４を格納）（ＳＴ８２，Ｆ３参照）。
こうしてまたＡＬＴコンストラクションプロセスはスケジューリングリストからはずしておく。ＡＬＴコンストラクションプロセスはガードを構成するチャンネルの入力を待つ。
ワークスペースの先頭アドレス（Ｗｐｔｒ１４）には分岐先未決定フラグ（１）を格納しておく。前述したように、ガード入力の有無の検査中にすでにチャンネル通信要求が感知されればこの状態を経ずに次のレディ状態に遷移する。
【００７９】
（ｅ−５）レディ状態（Ｒｅａｄｙ）
いずれかのガードを構成する論理式（もしあれば）が真値を持ちそのチャンネルに入力が入ってくれば、ワークスペースがＦｐｔｒ１６に格納され、ＡＬＴコンストラクションプロセスをスケジュールリストの先頭待機プロセスとする。Ａｒｅｇ１１に「レディ状態」を示す値0x80000003を入れる。ＡＬＴコンストラクションプロセスへチャンネルアクセスを試みようとするプロセスはチャンネルアドレスからＡＬＴプロセスのワークスペースを得てそこに収納されている値を調べる。この値が１であるとこのチャンネルアドレスはＡＬＴプロセスによって使われているものと判断する（前述の「チャンネル間通信の開始」でのＡＬＴコンストラクションでの使用検査法の記述参照）。そしてこのＡＬＴコンストラクションプロセスがチャンネル出力側プロセスにより再びスケジューリングリストの先頭（Ｆｐｔｒ１６）に登録されることになる（ＳＴ８３とＦ６参照）。
【００８０】
（ｅ−６）ガードのリセット（Ｒｅｓｅｔ）
ＡＬＴコンストラクションプロセスの入力ガードにおいて論理式が満たされチャンネルアクセスが認められるのは最初にガードがはずれた１つのみである。このガード以外のガードはすべてリセットさせなければならない。ＡＬＴコンストラクションプロセス中、Ａｒｅｇ１１の値はガードの論理式の結果である。
チャンネル通信が他のプロセスからなされたが論理式が真とならなかった場合はＡｒｅｇ１１を偽値にリセットする。論理式は真であったがチャンネル通信が行われなかった場合、当該チャンネルのアドレス（チャンネルアドレス）にｅｍｐｔｙを格納する。入力ガードがはずされたチャンネルはアドレス（Ｗｐｔｒ１４）（ＡＬＴコンストラクションプロセスのワークスペースを保持）の内容をみてそこがまだ−１かどうかをチェックする。−１であれば宛先未決定ということなのでアドレス（Ｗｐｔｒ１４）＝アドレス（チャンネルアドレス）として相手方のプロセスＩＤを格納する。そしてガードのはずれたあとのプロセスのアドレスをＩｐｔｒ１５に格納し実行をそこに移す（ＳＴ８４，Ｆ７参照）。
【００８１】
以上ＰＡＲおよびＡＬＴコンストラクションの実装方法、１マイクロプロセッサ（プロセッサ）内で複数プロセスとチャンネル通信方法についてのハードウェアアルゴリズムについて述べた。
このように本発明のＴＰＣＯＲＥ５０は複数プロセスの実行を１プロセッサ内部のみでも可能とした。これは、Ｏｃｃａｍのもつ並列処理コマンド（コンストラクタ）を単体内部で行えるようにハードウェアアルゴリズムを工夫してそれを実装したことによる。
すなわち、
・  逐次実行（通常のシングル命令の順次実行）（ＳＥＱコンストラクション）
・  並列処理（ＰＡＲコンストラクション）
・  プロセス間のデータ通信と同期（チャンネルの概念）
・  多重チャンネル入力処理（ＡＬＴコンストラクション）
を工夫したことによる。
【００８２】
本発明のＦＰＧＡに搭載したＴＰＣＯＲＥ５０はトランスピュータの命令の実行を完全に行えるということを示したが、従来のアーキテクチャとはまったく異なっている。その結果、とくにメモリアクセス方法に、（ａ）メモリおよび外部インターフェースのアクセスレートとＴＰＣＯＲＥ動作周波数、（ｂ）メモリアドレス空間の均質化、という相違点が生じ、それらは性能の向上につながっている。
【００８３】
なお本発明において、ＯｃｃａｍはＣＳＰ理論に基づいて作られた言語である。本発明のプログラムはいくつかのプロセスが集合して構成されたものを示す。本発明のグランドステージは並列処理中のある１つのプロセスの遷移状態におけるスタート命令が実行される前の基本段階を示す。本発明のプロセスはある一定の行動を逐次的に実行し続ける実態を示す。また、コンストラクションとは代入、出力、プロシジャーコール（サブルーチンに相当する）などの最も基本となるプリミティブプロセスの集合体を示す。チャンネルとは並列に実行されているプロセス間の通信（データ交換）に用いられる概念または手段である。本発明のキューは待ち行列またはスケジューリングリストを示す。本発明のワークスペースはコンストラクション、命令、識別番号、アドレス、データなどを格納するメモリ空間を示す。本発明のスケジューリングリストは実行プロセスや待機プロセスの識別番号をメモリ上に格納して形成したリストを示す。本発明のアイドリングはプロセッサがプログラム実行前の待機状態を示す。
【００８４】
以上述べたように、本発明の並列処理プロセッサは、従来のトランスピュータのアーキテクチャを絞り込み、精査し直して設計することにより、できるだけ本体のゲート数・ロジックセル数を減らしスリム化させコンパクトなプロセッサを実現した。この結果、現在入手できる最大のＦＰＧＡで最大１８個のＴＰＣＯＲＥを１個のＦＰＧＡに組み込むことができる。この条件で、ルート部に最大８個のＴＰＣＯＲＥを配置した４段のツリー構造、また格子形態だと４×４のメッシュを1個のＦＰＧＡに組み込むとができる。
【００８５】
また、本発明のＴＰＣＯＲＥはＦＰＧＡで形成するので、ネットワークを構成する場合、並列処理を応用するシステムによって自由にそのトポロジーを改編できる。したがって、ＴＰＣＯＲＥをＦＰＧＡ上で実現させることのメリットは非常に大きくなる。
【００８６】
さらに、本発明のＴＰＣＯＲＥのシステムアーキテクチャは、外部インターフェースへのデータ転送レートとメモリのアクセスレートにおいて従来のトランスピュータと異なり、ＴＰＣＯＲＥの動作周波数と同期する。また、ＴＰＣＯＲＥではインターフェースの転送レートとクロックは独立している。
さらに、トランスピュータのメモリには階層性がありアクセスの早い内部メモリと遅いメモリがあったが、本発明のＴＰＣＯＲＥではメモリをすべて均質化しアクセスレートを４Ｇバイト空間すべてで同一とした。即ち、同じクロックレートですべてのメモリ空間を均一にアクセスできる。
【図面の簡単な説明】
【００８７】
【図１】本発明のＣＰＵの構成図である。
【図２】並列処理プロセッサの構成図である。
【図３】アドレスバスのデータ幅の変換図である。
【図４】データバスのデータ幅の変換図である。
【図５】インターフェースを有する並列処理プロセッサの構成図である。
【図６】ＴＰＣＯＲＥネットワークの構成図である。
【図７】ＴＰＣＯＲＥの通信開始の動作を示す図である。
【図８】ＴＰＣＯＲＥの通信が成立時の動作を示す図である。
【図９】ＴＰＣＯＲＥの通信動作を示す図である。
【図１０】プロセスＩＤのワークスペースを示す図である。
【図１１】並列処理中の１プロセスの状態遷移を表す図である。
【図１２】スケジューリングリストの構造を示す図である。
【図１３】ＰＡＲコンストラクションの動作を示すプロセス切り替え状態遷移図である。
【図１４】ＰＡＲコンストラクションの動作を示す他のプロセス切り替え状態遷移図である。
【図１５】ＰＡＲコンストラクションの動作を示す他のプロセス切り替え状態遷移図である。
【図１６】ＰＡＲコンストラクションの動作を示す他のプロセス切り替え状態遷移図である。
【図１７】プロセス間のチャンネル通信の動作を示す状態遷移図である。
【図１８】ＡＬＴコンストラクションの動作を示す状態遷移図である。
【符号の説明】
【００８８】
１０…ＣＰＵ、１１…Ａｒｅｇ（Ａレジスタ）、１２…Ｂｒｅｇ、１３…Ｃｒｅｇ、１４…Ｗｐｔｒ（ワークスペースポインタ）、１５…Ｉｐｔｒ、１６…Ｆｐｔｒ、１７…Ｂｐｔｒ、２１…ｃｎｔ、２２…ｃｌｋ、２３…Ｔｉｍｅｏｕｔ、２４…マイクロコードＲＯＭコントローラ、２５…Ｏｒｅｇ、２６…Ｉｒｅｇ、２７…マイクロコードＲＯＭ、２８…マイクロコントローラ、２９…Ｔｅｍｐ、３１…ＡＬＵ、４１…メモリコントローラ、４２，４２−ａ〜４２−ｄ…メモリ、４５…リンクブロック、５０，５０−１，５０−２…ＴＰＣＯＲＥ、５２−ａ〜５２−ｄ…リンク（Ｌｉｎｋ）インターフェース、１００…ＴＰＣＯＲＥネットワーク。
【図１】
2009048306.tif 000011
【図２】
2009048306.tif 000012
【図３】
2009048306.tif 000013
【図４】
2009048306.tif 000014
【図５】
2009048306.tif 000015
【図６】
2009048306.tif 000016
【図７】
2009048306.tif 000017
【図８】
2009048306.tif 000018
【図９】
2009048306.tif 000019
【図１０】
2009048306.tif 000020
【図１１】
2009048306.tif 000021
【図１２】
2009048306.tif 000022
【図１３】
2009048306.tif 000023
【図１４】
2009048306.tif 000024
【図１５】
2009048306.tif 000025
【図１６】
2009048306.tif 000026
【図１７】
2009048306.tif 000027
【図１８】
2009048306.tif 000028