(57)【要約】  処理要素を伴うマルチ・プロセッサ・システム、散在したメモリ、ならびに高性能および低電力散逸を求めて最適化された一次相互接続ネットワークおよび二次相互接続ネットワークについて開示する。二次ネットワークでは、複数のメッセージ・ルーティング・ノードは、複数のプロセッサと共に散在方式で配列される。所与のメッセージ・ルーティング・ノードは、他のメッセージノードからメッセージを受信し、メッセージに含まれる相対オフセットを使用して、宛先メッセージ・ルーティング・ノードに受信したメッセージを中継してよい。相対オフセットは、メッセージを発生させたメッセージノードから宛先メッセージノードに至るメッセージノードの数を指定してよい。
2021501947.tif 000002
【特許請求の範囲】
【請求項１】
装置であって、
複数のプロセッサを含むマルチプロセッサと、
散在した配列で前記複数のプロセッサに連結した複数のメッセージノードであって、前記複数のメッセージノードのうちの特定のメッセージノードは、
ペイロードおよびルーティング情報を含む第１のメッセージを受信し、
前記ルーティング情報および前記マルチプロセッサの動作情報に基づき、前記複数のメッセージノードのうちの異なるメッセージノードを選択し、
前記異なるメッセージノードに基づき、前記第１のメッセージの前記ルーティング情報を修正して、第２のメッセージを生成し、
前記異なるメッセージノードに前記第２のメッセージを送付する
ように構成された複数のメッセージノードと
を備える装置。
【請求項２】
前記ルーティング情報は、前記第１のメッセージに関する絶対宛先を示す情報を含む、請求項１に記載の装置。
【請求項３】
前記ルーティング情報は、前記特定のメッセージノードから、前記第１のメッセージの宛先として指定された、前記複数のメッセージノードのうちの別のメッセージノードに至る相対オフセットを示す情報を含む、請求項１に記載の装置。
【請求項４】
前記特定のメッセージノードは、
前記第１のメッセージがブロードキャストメッセージであるという判断に応答することに基づく複数の第３のメッセージを生成し、
前記複数のメッセージノードの対応する１つに前記複数の第３のメッセージの各々を送付する
ようにさらに構成される、請求項１に記載の装置。
【請求項５】
前記第１のメッセージは、前記動作情報の少なくとも一部分を含む、請求項１に記載の装置。
【請求項６】
前記異なるメッセージノードを選択するために、前記特定のメッセージノードは、宛先を指定する前記第１のメッセージに含まれる情報を使用して、前記特定のメッセージノードに含まれるテーブルから次の宛先を取り出すようにさらに構成される、請求項１に記載の装置。
【請求項７】
方法であって、
マルチ・プロセッサ・アレイに含まれる複数のメッセージノードのうちの特定のメッセージノードにより、ペイロードおよびルーティング情報を含む第１のメッセージを受信するステップと、
前記特定のメッセージノードにより、前記ルーティング情報および前記マルチ・プロセッサ・アレイの動作情報に基づき、前記複数のメッセージノードのうちの異なるメッセージノードを選択するステップと、
前記特定のメッセージノードにより、前記異なるメッセージノードに基づく第２のメッセージを生成するステップと、
前記特定のメッセージノードにより、前記異なるメッセージノードに前記第２のメッセージを送付するステップと
を備える方法。
【請求項８】
前記第２のメッセージを生成する前記ステップは、前記第１のメッセージの前記ルーティング情報を修正して、前記第２のメッセージに含まれる修正ルーティング情報を生成するステップを含む、請求項７に記載の方法。
【請求項９】
前記ルーティング情報は、前記第１のメッセージに関する絶対宛先を示す情報を含む、請求項７に記載の方法。
【請求項１０】
前記ルーティング情報は、前記特定のメッセージノードから、前記第１のメッセージの宛先として指定された、前記複数のメッセージノードのうちの別のメッセージノードに至る相対オフセットを示す情報を含む、請求項７に記載の方法。
【請求項１１】
前記特定のメッセージノードにより、前記マルチ・プロセッサ・アレイに含まれる処理要素からリクエストを受信し、前記特定のメッセージノードにより、前記リクエストに基づき第３のメッセージを生成する、請求項７に記載の方法。
【請求項１２】
前記第１のメッセージがブロードキャストメッセージであるという判断に応答することに基づく複数の第３のメッセージを生成するステップと、
前記複数のメッセージノードのうちの対応する１つに前記複数の第３のメッセージの各々を送付するステップと
をさらに備える、請求項７に記載の方法。
【請求項１３】
テーブルから、前記特定のメッセージノードにより、前記ルーティング情報の少なくとも一部を使用して、前記第１のメッセージに関する次の宛先を示す情報を取り出すステップをさらに備える、請求項７に記載の方法。
【請求項１４】
装置であって、
ペイロードおよびルーティング情報を含む第１のメッセージを受信するように構成された、メッセージバスに連結されたルータ回路と、
ネットワークプロセッサ回路であって、
前記ルーティング情報、およびマルチ・プロセッサ・アレイに関する動作情報に基づき、前記メッセージバスを介して一緒に連結された、複数のメッセージノードのうちの特定のメッセージノードを選択し、
前記特定のメッセージノードに基づき、前記第１のメッセージの前記ルーティング情報を修正して、第２のメッセージを生成する
ように構成されたネットワークプロセッサ回路と
を備え、
前記ルータ回路は、前記特定のメッセージノードに前記第２のメッセージを送付するようにさらに構成される装置。
【請求項１５】
前記ルーティング情報は、前記第１のメッセージに関する絶対宛先を示す情報を含む、請求項１４に記載の装置。
【請求項１６】
前記ルーティング情報は、前記第１のメッセージの宛先として指定された、複数のメッセージノードのうちの所与のメッセージノードに至る相対オフセットを示す情報を含む、請求項１４に記載の装置。
【請求項１７】
前記動作情報を記憶するように構成された構成回路をさらに備える、請求項１４に記載の装置。
【請求項１８】
前記第１のメッセージは、前記動作情報の少なくとも一部分を含む、請求項１４に記載の装置。
【請求項１９】
前記ネットワークプロセッサ回路は、前記マルチ・プロセッサ・アレイに含まれる処理要素からリクエストを受信し、前記リクエストに基づき第３のメッセージを生成するように構成され、前記ルータ回路は、前記第３のメッセージに含まれる情報に基づき、前記複数のメッセージノードのうちの異なるメッセージノードに前記第３のメッセージを送付するようにさらに構成される、請求項１４に記載の装置。
【請求項２０】
複数のエントリを記憶するように構成されたテーブルをさらに備え、前記ネットワークプロセッサ回路は、前記第１のメッセージに含まれる情報を使用して前記テーブルから次の宛先を取り出すようにさらに構成される、請求項１４に記載の装置。
【発明の詳細な説明】
【技術分野】
【０００１】
（関連出願の相互参照）
発明者がＭｉｃｈａｅｌ  Ｂ．  Ｄｏｅｒｒ、Ｃａｒｌ  Ｓ．  Ｄｏｂｂｓ、Ｍｉｃｈａｅｌ  Ｂ．  Ｓｏｌｋａ、Ｍｉｃｈａｅｌ  Ｒ．  Ｔｒｏｃｉｎｏ、Ｋｅｎｎｅｔｈ  Ｒ．  Ｆａｕｌｋｎｅｒ、Ｋｅｉｔｈ  Ｍ．  Ｂｉｎｄｌｏｓｓ、Ｓｕｍｅｅｒ  Ａｒｙａ、Ｊｏｈｎ  Ｍａｒｋ  Ｂｅａｒｄｓｌｅｅ、およびＤａｖｉｄ  Ａ．  Ｇｉｂｓｏｎである、「Ｍｅｍｏｒｙ−Ｎｅｔｗｏｒｋ  Ｐｒｏｃｅｓｓｏｒ  ｗｉｔｈ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｏｐｔｉｍｉｚａｔｉｏｎｓ（プログラム可能な最適化を有するメモリ・ネットワーク・プロセッサ）」と題する米国特許第９，４３０，３６９号明細書は、あらゆる点で完全に本明細書に示されているように全体が参照により本明細書に組み入れられる。
【０００２】
発明者がＭｉｃｈａｅｌ  Ｂ．  Ｄｏｅｒｒ、Ｃａｒｌ  Ｓ．  Ｄｏｂｂｓ、Ｍｉｃｈａｅｌ  Ｂ．  Ｓｏｌｋａ、Ｍｉｃｈａｅｌ  Ｒ．  Ｔｒｏｃｉｎｏ、およびＤａｖｉｄ  Ａ．  Ｇｉｂｓｏｎである、「Ｍｕｌｔｉｐｒｏｃｅｓｓｏｒ  ｆａｂｒｉｃ  ｈａｖｉｎｇ  ｃｏｎｆｉｇｕｒａｂｌｅ  ｃｏｍｍｕｎｉｃａｔｉｏｎ  ｔｈａｔ  ｉｓ  ｓｅｌｅｃｔｉｖｅｌｙ  ｄｉｓａｂｌｅｄ  ｆｏｒ  ｓｅｃｕｒｅ  ｐｒｏｃｅｓｓｉｎｇ（安全な処理のために選択的に無効化されるマルチプロセッサ構成）」と題する米国特許第９，４２４，４４１号明細書は、あらゆる点で完全に本明細書に示されているように全体が参照により本明細書に組み入れられる。
【０００３】
本発明は、マルチ・プロセッサ・システムに関し、より詳細にはプロセッサの動作および実行の改善に関する。
【背景技術】
【０００４】
一般的ハードウェアシステムの主要な目的は、完全なプログラム可能性を維持しながら、特定用途向け（プログラム可能ではない）ハードウェア性能を達成することである。歴史的に、これら２つの概念は、両極端にある。特定用途向けハードウェアは、可能な最も効率的方法で特有の機能を遂行する固定したハードウェア解決手段である。この解決手段は、通常は機能あたりのエネルギー、または１つもしくは複数の動作あたりのエネルギーに関して、ならびに製品の部分的費用に関係がある可能性がある（回路）面積あたりの機能に関して測定される。チップ製品の費用は、ダイ面積および最終パッケージを含む多くの要因からなる。費用はまた、製品を開発するためのエコシステム全体を考慮すべきである。このエコシステム費用は、特有のアプリケーションを特有のハードウェア解決手段に変換するための時間、システム全体を構成するのに必要な特有のハードウェア解決手段の数、およびカスタム化した通信およびメモリの構造によって特有のハードウェア解決手段のすべてを一体化するのにかかる時間などからなる。したがって、完全に一体化された解決手段は、カスタムな相互接続を伴う数多くの特有のハードウェア解決手段のすべてをサポートする必要があり、その結果、単一チップダイ上に非常に大きな面積要件をもたらす。歴史的に、この過程は、面積、エネルギー、および市場に出るまでの時間に関して非効率的な解決手段をもたらしてきた。
【０００５】
プログラム可能性の世界、および対象とするハードウェアの概念について考えるとき、ハードウェアアーキテクチャおよびソフトウェア開発様式の観点から見た市場または状況は、Ｉｎｔｅｌ、ＡＭＤ、およびＡＲＭが提供する汎用プロセッサ（Ｇｅｎｅｒａｌ  Ｐｕｒｐｏｓｅ  Ｐｒｏｃｅｓｓｏｒ、ＧＰＰ）、ＮＶＩＤＩＡおよびＡＭＤから得られるグラフィカル処理ユニット（Ｇｒａｐｈｉｃａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ、ＧＰＵ）、Ｔｅｘａｓ  ＩｎｓｔｒｕｍｅｎｔｓおよびＡｎａｌｏｇ  Ｄｅｖｉｃｅｓから得られるデジタル・シグナル・プロセッサ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ、ＤＳＰ）、Ｘｉｌｉｎｘ、Ａｌｔｅｒａなどから得られるＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）、ＣａｖｉｕｍおよびＴｉｌｅｒａから得られるマルチ・コア・アーキテクチャ／メニー・コア・プロセッサ、ならびに特定用途向け集積回路（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ、ＡＳＩＣ）またはシステム・オン・チップ（Ｓｙｓｔｅｍ  Ｏｎ  Ｃｈｉｐ、ＳｏＣ）により代表される。
【０００６】
ＧＰＰは、汎用処理のためにある、すなわち、古いが検証済みの、４０年以上にわたって考えられているハードウェアアーキテクチャに基づき、何でも屋になろうとしている。ＧＰＰの一般的目的は、サポートするオペレーティングシステム（たとえば、ＷｉｎｄｏｗｓおよびＬｉｎｕｘ（登録商標））を用いて、ユーザインタフェース（ｕｓｅｒ  ｉｎｔｅｒｆａｃｅ、ＵＩ）、およびＭＳＷｏｒｄ、Ｅｘｃｅｌ、電子メールなどのような高度な対話型ＵＩを集約的に用いるアプリケーションを走らせることである。電力散逸に影響を及ぼすハードウェア特性は、マルチ・レベル・キャッシュ、複雑なハードウェアメモリ管理ユニット、大規模バス、および大規模クロック制御構造である。要するに、ＧＰＰは、これらのタスクを遂行するために大量の電力を散逸する。ソフトウェア開発の観点から、目標とするのは、最も簡単なソフトウェア・プログラミング・モデルであると考えられる。このモデルは、ユーザが連続的または直列に実行する単一スレッドを開発しているという観点から得られる。並列処理、または複数のハードウェアスレッド（約４つより多くのスレッド）を導入するとき、スレッドを効率的にプログラムする能力は、はるかに難解になる。これは、基本的に、並列スレッド動作をサポートするためのアーキテクチャが開発されなかったという事実、およびその結果、ハードウェアアーキテクチャは、管理するために途方もない量のオーバーヘッドとなる複雑性を必要とするという事実に起因する。ソフトウェア・プログラミング・モデルは、複数のソフトウェアスレッドの規定をサポートするために、ＡＰＩまたは言語の拡張を導入する必要がある。この拡張は、複雑である必要はないが、不都合なことに現在のＧＰＰハードウェアアーキテクチャは、そのような複雑性を必要とする。
【０００７】
高い水準では、世界のあらゆるスーパーコンピュータで長年の間Ｃ、Ｃ＋＋、Ｆｏｒｔｒａｎなどと共に広範囲にわたって使用されてきたＡＰＩは、１９９０年代初頭以来の業界標準であるＭＰＩ（ｍｅｓｓａｇｅ  ｐａｓｓｉｎｇ  ｉｎｔｅｒｆａｃｅ、メッセージ受渡インタフェース）ＡＰＩである。このＭＰＩは、非常に簡単で、よく理解されている、ハードウェア実装を制限しないＡＰＩである。ＭＰＩ  ＡＰＩは、ハードウェアとは無関係な手法でソフトウェアスレッドおよび通信の規定を可能にする。このＭＰＩ  ＡＰＩは、ＯｐｅｎＭＰ、Ｃｏａｒｒａｙ  Ｆｏｒｔｒａｎ、ＯｐｅｎＣＬなど、ならびに想定される基盤となるハードウェアモデルを本来規定する他の言語／ＡＰＩと異なり、したがってそれにより、解釈の柔軟性を制限し、前方互換性の問題を引き起こす。換言すれば、これらの他の言語／ＡＰＩを用いる場合、プログラマは、対象となるあらゆる新しいハードウェアプラットフォーム用プログラムを書き直す必要がある。
【０００８】
ＧＰＵは、歴史的にデータ表示を処理し、対象とするために開発された。ＧＰＵは、ＧＰＵのコア外（外部）メモリモデル要件および内部コアメモリモデル要件によりアーキテクチャ上制約されるハードウェアである。コア外メモリは、ＧＰＰに対してＧＰＵメモリ空間内にデータを配置するように要求する。ＧＰＵは、次いでデータを得て、パイプライン方式でデータに対して動作し、次いでデータをＧＰＵの外部メモリ空間に戻して配置する。ここから表示装置にデータを送信することができる、またはＧＰＰは、一般的処理を受ける動作でさらに使用／記憶するために、ＧＰＵメモリ空間の外にデータを移動させる必要がある。ハードウェアが非効率なのは、（１）コア外ハードウェア制約をサポートするためにデータをあちこち移動させるために必要なサポート、ならびに（２）能率化されたパイプラインでデータを処理するように制約される、深くパイプライン化されたＳＩＭＤ機械に類似する限定的内部コアメモリ構造に起因する。その結果、データを処理するためのハードウェアが非効率であることに起因して電力利用が高い。使用するソフトウェア・プログラミング・モデルは、極度にハードウェア中心のＯｐｅｎＣＬ、ＣＵＤＡなどであり、したがって、効率を達成するには複雑であり、それほど移植可能ではなく、新しいハードウェア対象プラットフォームに移行しようとするとき、コードを書き換えて、再構成しなければならない。
【０００９】
ＤＳＰは、一般的信号処理用に縮小され、かつその処理を対象とした命令セットを用いるＧＰＰと考えることができる。ＤＳＰは、その兄貴分／姉貴分であるＧＰＰと同じキャッシュ、ＭＭＵ、およびバスの悩みを欠点として持つ。追加で、Ｖｉｔｅｒｂｉ／Ｔｕｒｂｏ復号または動き推定などの、実際に高スループットの任意の処理機能は、通常は商業市場での限定的な１組の特有の標準だけをサポートしている、限定的能力を伴うＡＳＩＣアクセラレータになっている。プログラミングモデルは、単一のハードウェアスレッドを対象とするときにはＧＰＰに類似するが、実行ユニットのハードウェアでは信号処理命令の取り組み方法であるので、任意の高効率を達成するには、関数のハンドアセンブリを必要とする、または所有権のあるソフトウェアライブラリを使用する必要がある。上記で論じた並列ＧＰＰに類似する多重並列ＤＳＰアーキテクチャを作成するとき、問題はさらに悪化する。
【００１０】
ＦＰＧＡは、機能の規定をビットレベルで行うことができ、プログラム可能な有線構造によって論理機能間の通信が行われる、完全に異なるハードウェア取り組み方法である。このハードウェア取り組み方法は、途方もないオーバーヘッドおよび複雑性を導入する。これに起因して、ＶｅｒｉｌｏｇまたはＶＨＤＬなどのハードウェアプログラミング言語で効率的プログラミングを遂行する。プログラム可能な配線およびプログラム可能論理が、ＡＳＩＣ／ＳＯＣで必要とされるものに類似するが構造化された有線構成を伴うタイミング収束障害を導入することに起因して、コンパイル処理は、はるかにより複雑である。特有の機能に関する電力散逸および性能スループットは、ＦＰＧＡが、プログラムされたことだけを正確に遂行し、他に何も遂行しないことに起因して、一度に１つの機能だけを比較するとき、ＧＰＰまたはＧＰＵよりもはるかに良好であることは明らかである。しかしながら、ＧＰＰの能力のすべてをＦＰＧＡ内に実装しようとする場合、ＦＰＧＡは、ＧＰＰよりもはるかに劣ることは明らかである。ハードウェアレベルでプログラムすることの困難さは明らかである（たとえば、タイミング収束）。ＦＰＧＡのプログラミングは、実際には「プログラミング」ではなく、むしろ、論理／ハードウェア設計であり、ＶＨＤＬ／Ｖｅｒｉｌｏｇは、論理／ハードウェア設計言語であり、プログラミング言語ではない。
【００１１】
マルチ・コア・アーキテクチャ／メニー・コア・アーキテクチャのほとんどすべては、ハードウェアの観点から、コアプロセッサ、キャッシュ、ＭＭＵ、バス、およびすべての関連する論理を採用しており、これらをダイ上でこれらの周囲の通信バス／構成と共に複製している。マルチ・コア・アーキテクチャの例は、ＩＢＭのＣｅｌｌ、ＩｎｔｅｌおよびＡＭＤのクアッドコアおよびＮマルチコア、ＣａｖｉｕｍおよびＴｉｌｅｒａの製品、いくつかのカスタムＳｏＣなどである。追加で、マルチ・コア・アーキテクチャで達成される電力低減は、大部分は微々たるものである。この結果は、マルチコアの取り組み方法がＧＰＵの取り組み方法を単に置換しているにすぎないという事実から導出される。マルチ・コア・アーキテクチャで唯一実際に電力節約するのは、いくつかのＩＯドライバの低減であり、これらのドライバは、コアが以前は別個のチップ上にあったのに対して、チップ上の通信バスにより接続されるので、今では必要ない。したがって、マルチコアの取り組み方法は、エネルギーをそれほど節約しない。第２に、ソフトウェア・プログラミング・モデルは、上記で論じたＧＰＰから改善されていない。
【００１２】
その他の取り組み方法で識別される問題のリストは、特有の市場では、システム開発者が、特有のＧＰＰ、ＤＳＰ、およびＡＳＩＣアクセラレータを有するカスタムチップに任せて、システム・オン・チップ（ＳｏＣ）を形成する理由から生じる。ＳｏＣは、電力散逸および費用のバランスをとるために、必要な場合にプログラム可能性を、および特有の機能のためにＡＳＩＣ性能を提供する。しかしながら、今ではソフトウェア・プログラミング・モデルは、上記のプログラム可能なハードウェア解決手段のもとで論じたよりもさらにより複雑である。追加で、ＳｏＣは、完全にプログラム可能な解決手段に関連する柔軟性を失う結果となることがある。
【００１３】
これらのプログラム可能な解決手段すべての間で共通なことは、今日市場を代表するソフトウェア・プログラミング・モデルが、多くの場合、実行モデルおよび基盤となるハードウェアアーキテクチャを、ハードウェア非依存になるのではなく、より多くのアプリケーションをより効率的にサポートするように外挿することに焦点を当てていることである。
【００１４】
ＯｐｅｎＣＬは、いくつかの制限事項および追加事項と共にＡＮＳＩ  Ｃプログラミング言語を使用してカーネルを書くことをサポートする。ＯｐｅｎＣＬは、関数ポインタ、再帰、ビットフィールド、可変長アレイ、および標準ヘッダフィールドの使用を許可しない。言語は、ベクトル型およびベクトル動作を伴う並列処理、同期、ならびに作業項目／グループを用いて作業するための関数をサポートするように拡張されている。アプリケーション・プログラミング・インタフェース（ａｐｐｌｉｃａｔｉｏｎ  ｐｒｏｇｒａｍｍｉｎｇ  ｉｎｔｅｒｆａｃｅ、ＡＰＩ）を使用して、プラットフォームを規定し、次いでプラットフォームを制御する。ＯｐｅｎＣＬは、コースレベルでタスクに基づく並列処理およびデータに基づく並列処理を使用して並列コンピューティングをサポートする。
【００１５】
マルチ・プロセッサ・システム上で並列実行するためのソフトウェアアプリケーションを開発するための従来技術の取り組み方法は、一般に開発しやすさと並列実行の効率の間のトレードオフを必要とする。換言すれば、一般に、プログラマにとって開発過程が容易であるほど、それだけ結果として得られる実行可能プログラムは、ハードウェア上でより非効率に実行され、逆に、より効率的に実行するには、一般にプログラマがさらにかなり努力する必要がある、すなわち、非効率な処理を回避するために、プログラムをより詳細に設計して、対象とするハードウェアの、効率を高める特徴を使用する必要があるというのが事実であった。
【先行技術文献】
【特許文献】
【００１６】
【特許文献１】米国特許第９，４３０，３６９号
【特許文献２】米国特許第９，４２４，４４１号
【発明の概要】
【発明が解決しようとする課題】
【００１７】
したがって、アプリケーションおよびシステムレベルの視点からソフトウェア記述を容易にして、実行モデルおよび基盤となるハードウェアアーキテクチャを対象とするソフトウェア・プログラミング・モデルおよびその後ソフトウェア・プログラミング・モデルの使用を推進するための、改善されたシステムおよび方法が望まれる。この過程を通して、アプリケーションの効率的でプログラム可能な実装を可能にする仕組みを提供する改善もまた望まれる。ＭＰＩ（Ｍｅｓｓａｇｅ  Ｐａｓｓｉｎｇ  Ｉｎｔｅｒｆａｃｅ）は、標準化され言語に依存しない、拡張可能で移植可能なメッセージ受渡通信プロトコルＡＰＩである。ＭＰＩ  ＡＰＩは、言語特有構文法（結合）を用いて、言語独立な方法で（ノード／サーバ／コンピュータインスタンスにマッピングされた）１組の処理間で、不可欠の仮想トポロジ、同期、および通信機能性を提供することを意図する。ＭＰＩ  ＡＰＩ標準は、さまざまな挙動を規定可能なポイント間通信および集合通信／ブロードキャスト通信の送信動作／受信動作ならびに処理の同期のためのサポートを含むが、それらのサポートに限定されないライブラリルーチンのコアの構文法および意味論を規定する。ＭＰＩは今日、高性能コンピューティングで使用される支配的モデルである。システムレベルで電力散逸のワットあたり、より高い性能を得るためのさらに大きな進展は、密な通信状態にある多くの処理要素、分散高速メモリ、およびシステムをモジュールの階層に分割する、より洗練されたソフトウェア開発ツールを用いるならば可能である。階層の最下部には、処理要素に割り付けられたタスク、サポートするメモリ、および動的に構成可能な相互接続ネットワークにわたる柔軟な通信経路が存在する。
【課題を解決するための手段】
【００１８】
複数のメッセージノードを含むマルチプロセッサ集積回路のためのさまざまな実施形態を開示する。大まかに言えば、複数のメッセージノードは、マルチプロセッサに含まれる複数のプロセッサに散在した配列で連結される。複数のメッセージノードのうちの特定のメッセージノードは、ペイロードおよびルーティング情報を含む第１のメッセージを受信して、ルーティング情報およびマルチプロセッサの動作情報に基づき、複数のメッセージノードのうちの異なるメッセージノードを選択するように構成される。特定のメッセージノードはまた、異なるメッセージノードに基づき第１のメッセージのルーティング情報を修正して、第２のメッセージを生成して、異なるメッセージノードに第２のメッセージを送付するように構成される。
【図面の簡単な説明】
【００１９】
【図１】マルチ・プロセッサ・アレイのある実施形態を描く。
【図２】ＰＥのデータパスのある実施形態を描く。
【図３】命令デコーダのある実施形態の構成図である。
【図４】アドレス生成器のある実施形態を例示する構成図である。
【図５】プログラミングモデルを比較する構成図である。
【図６】述語（ｐｒｅｄｉｃａｔｅ）フラグの試験を描く表を例示する。
【図７】異なる条件付命令を描く３つの表を例示する。
【図８】条件付ブロック命令を例示する。
【図９】データパス論理回路について記述する。
【図１０】ターボ命令用の、活動状態にある論理回路を例示する構成図である。
【図１１】ハーフターボ命令用の、活動状態にある論理回路を例示する構成図である。
【図１２】ボックスプラス（ｂｏｘ  ｐｌｕｓ）命令用の、活動状態にある論理回路を例示する構成図である。
【図１３】Ｍａｘ＊命令用の、活動状態にある論理回路を例示する構成図である。
【図１４】別のＭａｘ＊命令用の、活動状態にある論理回路を例示する構成図である。
【図１５】マルチ・プロセッサ・アレイに含まれるメッセージバスの論理的概観を描く。
【図１６】メッセージバス上でメッセージを送信する一部としてプログラムすべき情報を描く表である。
【図１７】メッセージ・バス・ノードの一般的インタフェースを描く構成図である。
【図１８】メッセージ・バス・ノードの内部構成要素を例示する構成図である。
【図１９】メッセージ・バス・ネットワークのある実施形態を描く構成図である。
【図２０】ＨｙｐｅｒＯｐデータパスを描く構成図である。
【図２１】プログラミングモデルを描く構成図である。
【図２２】メッセージノードを動作させるための方法のある実施形態を例示する流れ図を描く。
【発明を実施するための形態】
【００２０】
本開示は、さまざまな修正形態および代替形態が可能であるが、それらの具体的実施形態について、図面で例として示し、本明細書で詳細に記述する。しかしながら、それらの実施形態に対する図面および詳細な記述は、例示する特定の形態に本開示を限定することを意図するものではなく、それどころか、本発明は、添付の特許請求の範囲により規定されるような本開示の精神および範囲に入るすべての修正形態、均等物、および代替形態を包含するためにあることを理解されたい。本明細書で使用する見出しは、編成するためだけにあり、本明細書の範囲を限定するために使用するものではない。本出願全体を通して使用するとき、単語「ｍａｙ（してよい、することがある）」は、義務的な意味（すなわち、しなければならない（ｍｕｓｔ）を意味する）ではなく、許可する意味（すなわち、する可能性を有することを意味する）で使用される。同様に、単語「ｉｎｃｌｕｄｅ（含む）」、「ｉｎｃｌｕｄｉｎｇ」、および「ｉｎｃｌｕｄｅｓ」は、含むが、限定されるわけではないことを意味する。
【００２１】
流れ図は、代表的実施形態を例示するために提供され、例示する特定のステップに本開示を限定することを意図するものではない。さまざまな実施形態では、図示する方法の要素のいくつかは、同時に遂行されてよい、示すのと異なる順序で遂行されてよい、または省略されてよい。追加の方法の要素はまた、望み通りに遂行されてよい。
【００２２】
さまざまなユニット、回路、または他の構成要素について、１つまたは複数のタスクを遂行する「ように構成される」として記述することがある。そのような文脈では、「ように構成される」は、動作中に１つまたは複数のタスクを遂行する「回路を有すること」を一般に意味する構造についての包括的な詳述である。したがって、ユニット／回路／構成要素は、現在作動していないときでさえ、タスクを遂行するように構成することができる。一般に、「ように構成される」に対応する構造を形成する回路は、ハードウェアの回路を含んでもよい。同様に、さまざまなユニット／回路／構成要素について、説明の便宜上、１つまたは複数のタスクを遂行するとして記述することがある。そのような記述は、「ように構成される」という語句を含むと解釈されるべきである。１つまたは複数のタスクを遂行するように構成されたユニット／回路／構成要素について記載することは、そのユニット／回路／構成要素に関して米国特許法第１１２条段落６の解釈を引用することを明示的に意図するものではない。より一般的には、任意の要素の記載は、用語「ための手段（ｍｅａｎｓ  ｆｏｒ）」または「ためのステップ（ｓｔｅｐ  ｆｏｒ）」が具体的に記載されない限り、その要素に関して米国特許法第１１２条段落６の解釈を引用することを明示的に意図するものではない。
【００２３】
実施形態の詳細な記述
図１を参照すると、マルチ・プロセッサ・システム（ＭＰＳ）の一実施形態を例示する構成図が描かれている。例示する実施形態では、ＭＰＳ１０は、複数のプロセッサ要素（ｐｒｏｃｅｓｓｏｒ  ｅｌｅｍｅｎｔ、ＰＥ）と、データおよび命令を互いに通信するように連結された、動的に構成可能なコミュニケータまたは動的に構成可能な通信要素と呼ばれることもある複数のデータ・メモリ・ルータ（ｄａｔａ  ｍｅｍｏｒｙ  ｒｏｕｔｅｒ、ＤＭＲ）とを含む。本明細書で使用するとき、ＰＥはまた、ＰＥノードと呼ばれることもあり、ＤＭＲはまた、ＤＭＲノードと呼ばれることもある。
【００２４】
デュアル／クアッド処理要素（ＰＥ）およびそのデータ用ローカル補助メモリ（ｓｕｐｐｏｒｔｉｎｇ  ｍｅｍｏｒｙ、ＳＭ）のある実施形態に関するデータパス図を図２に示す。図２の左上隅は、データ用ＳＭ（データＲＡＭ）のためのアドレス生成器を示し、右上は、レジスタファイル、およびデータ・メモリ・ルータ（ＤＭＲ）用のいくつかの制御レジスタを示す。ＤＭＲは、ＰＥ間の一次相互接続ネットワーク（Ｐｒｉｍａｒｙ  ｉｎｔｅｒｃｏｎｎｅｃｔｉｏｎ  ｎｅｔｗｏｒｋ、ＰＩＮ）内のノードである。大規模ＭＵＸ（多重通信）を使用して、異なるデータソースを主要な入力オペランドレジスタＡ、Ｂ、およびＣの中に切り替える。別の大規模ＭＵＸは、オペランドデータを算術パイプラインＤＰ１およびＤＰ０のＸおよびＹの入力に切り替える。第３の大規模ＭＵＸは、算術パイプライン出力Ｚ１およびＺ０をデータパスＤに切り替えて、レジスタファイルまたはデータＲＡＭに戻す。データＲＡＭは近接するＰＥと共有され、アクセス衝突はハードウェアにより調停される。パイプラインの制御は、図３の命令復号ブロックから得られる。
【００２５】
図４のアドレス生成器を参照すると、プログラム可能算術ユニットは、アドレスを実際に使用する前にいくつかの動作を開始してよい洗練されたアドレス計算をサポートするために含まれている。図４に示すアドレス生成器は、３つの整数加算ユニット（ＡＧＵ０、ＡＧＵ１、およびＡＧＵ２）、汎用整数ＡＬＵ（ＧＡＬＵ）、および「反復Ｈ／Ｗ（ハードウェア）および自動インクリメンタ（Ａｕｔｏ  Ｉｎｃｒｅｍｅｎｔｅｒ）」用ボックスを含む。レジスタは、独立した基底値およびストライド値を伴う最大８つまでのインデックスを用いて入れ子ループをサポートする。追加汎用レジスタは、ＧＡＬＵおよび反復ユニットをサポートする。出力マルチプレクサは、任意の計算されたアドレスをデータＲＡＭのＡ、Ｂ、またはＤのアドレスポートにルーティングするのをサポートする。
【００２６】
図２の中心に示す実行レジスタおよび述語フラグにより、命令の条件付実行をサポートする。命令の実行は、実行状態に依存し、述語は従来技術である。毎回すべての命令が特有のクロックサイクル数後に終了する場合、条件付実行は、利益にならない可能性が高い。しかし多くの事例では、重要な命令は、より少ないクロックサイクル内に終了することができ、次の命令が必要とする、または複数の命令が必要とする結果を提供する。これらの次の命令は、状態ビットを待つように条件付けられている場合、上記の事例ではより速やかに開始されてよい。述語は、ただ待つためではなく、さらにまた選択および分岐するために、より一般的に条件付命令により使用されてよい数ビットである。また、いくつかの命令を使用して、述語値を設定／クリアする。
【００２７】
さまざまな実施形態では、ＰＥは、２つのタイプの命令を、すなわち６４ビットおよび１２８ビットを混合するプログラムをサポートしてよい。より短い命令は、以下で図５の左側に示すように、アセンブリ言語プログラミングモデルをサポートする。これは、旧来のコードおよびより簡単なコンパイラをサポートするのに有用である。より長い１２８ビット命令は、図５の右側に示す「ＨｙｐｅｒＯｐ」プログラミングモデルをサポートする。より長い命令は、二重データパスハードウェアをより正確に制御して、二重データパスハードウェアを信号処理のためにより効率的にするために必要であり、その結果、所与の電力散逸（Ｐｄｉｓｓ）に関する性能を高めるが、しかしながら、プログラミングは、より洗練される必要がある。
【００２８】
ＰＥアーキテクチャの図２では、（他のアーキテクチャでのハードウェア支援スケジューリングとは対照的に）各パイプライン内部の動作の詳細なスケジューリングをプログラムコンパイルにより規定する。しかしながら、ＰＥ命令は、条件付実行用に設計されており、実行するための条件は、実行状態および述語の登録値に依存する。いくつかの事例では、６つの述語が対で、すなわち、データパスで２対が、アドレス生成器で１対が出現する。単一の条件付命令は、単一対の述語にアクセスすることができるが、より多くの命令にわたり、すべての述語にアクセスすることができる。いくつかの実施形態では、条件付実行を使用して、二重パイプラインまたは多プロセッサＩＣの状況でＰＥの性能を最適化してよい。条件付実行は、さまざまな実施形態では、各アプリケーションのアルゴリズムの流れ構造詳細に基づき、平均速度／電力比（「速度／Ｐｄｉｓｓ比」とも呼ばれる）を改善することがある。
【００２９】
さまざまな実施形態では、図１の実施形態に含まれるＰＥは、以下の特徴を含んでよい：
●２つのデータパス、それぞれ（サイクルあたり）以下が可能：
○１つ／２つの１６×１６の積算、または１つの３２×１６の積算
○１つ／２つの１６ビット加算／減算、または１つの３２ビット加算／減算
○４０ビットのバレルシフト
○３２ビットの論理動作
●４０ビットの累積、２つの４０ビットアキュムレータ
○（サイクルあたり）データパスを一緒に遂行することができる：
○１つの３２×３２積算または積和演算
●１つの３２ビット浮動小数点加算／減算／積算
○３つのアドレス生成ユニット（Ａｄｄｒｅｓｓ  Ｇｅｎｅｒａｔｉｏｎ  Ｕｎｉｔ、ＡＧＵ）
○３つのロード：ｓｒｃＡ（ソースＡ）、ｓｒｃＢ（ソースＢ）、ｓｒｃＣ（ソースＣ）
○２つのロードおよび１つの記憶：ｓｒｃＡ、ｓｒｃＢ、ｄｓｔＤ（宛先Ｄ）
○８つの基底レジスタおよび８つのインデックスレジスタ
●ＧＰレジスタファイル
○１６×３２ビットレジスタまたは８×６４ビットレジスタとしてアクセス可能な３２×１６ビットレジスタ
●命令復号：
○６４ビットの従来型アセンブリ命令
○１２８ビットのＨｙｐｅｒＯｐ命令
○ＩＭは任意の６４ビット整列で１２８ビット／サイクルを提供する
●反復ループハードウェア
○ゼロ・オーバーヘッド・ルーピング
○３つの一次インデックスレジスタを使用して、３つのレベルの入れ子をサポートする
○４つの二次基底レジスタ／インデックスレジスタの自動増分
●ループバッファ
○１つまたは複数の内部ループ中に命令フェッチ電力を低減する
【００３０】
コードの小規模セクションの繰返しを提供するために設計の中に組み込まれた反復ループハードウェアが存在する。このハードウェアは、インデックスカウンタ、増分／減分論理、完了試験、およびこれらの「オーバーヘッド」機能を行うソフトウェア命令の実行よりも効率的な分岐機能を含んでよい。適切に行われると、これらのハードウェアは、オーバーヘッド機能を遂行するための命令サイクルを除去する。オーバーヘッド機能のためのソフトウェア命令なしにルーピングを実行するハードウェア状態機械を直接プログラムするＲＥＰＥＡＴ（反復）命令を使用して、最大３レベルまでのネスティングのゼロ・オーバーヘッド・ルーピングを提供してよい。オペランドのアドレス計算を管理するためにループ内部で追加の命令を通常は必要としないように、インデックス付けを自動的に管理する。これにより、複数のアレイは、ループ内で追加命令のオーバーヘッドなしにアクセスし、管理することができるようになり、電力を節約し、よりよい性能を提供する。さまざまな実施形態では、反復ループハードウェアは、以下を含んでよい：
●８つのベースレジスタＢ０〜Ｂ７
○Ｂ０は、アドレス指定モードで値ゼロをもたらす
○Ｂ０は、スタックポインタ（ＳＰ相対アドレス指定モード）として使用される
●８つのインデックスレジスタＩ０〜Ｉ７
○Ｉ０は、アドレス指定モードで値ゼロをもたらす
○Ｉ０は、他のＡＧＵ算術用一時レジスタとして使用することができる（このレジスタは、レジスタマップでは、Ｉ０ではなくＧＲ０と呼ばれる）
●７つのストライドレジスタＳ１〜Ｓ７
○Ｓｎは、ＩｎまたはＢｎと共に使用される
●３レベルの反復ループ用ハードウェアサポート
○一次ループインデックスは、Ｉ１、Ｉ２、Ｉ３である
●二次インデックスまたは基底レジスタ用の４つの追加増分
○インデックスレジスタＩ４〜Ｉ７
○基底レジスタＢ４〜Ｂ７
○ストライドレジスタＳ４〜Ｓ７による増分
○開始アドレス／一時レジスタＴ４〜Ｔ７
【００３１】
反復ループはＲＥＰＥＡＴ命令により制御される：
●ＲＥＰＥＡＴは、先行するＨｙｐｅｒＸ世代に類似し、以下の改善を伴う：
●一次ループインデックスＩ１、Ｉ２、Ｉ３
●ループの終わりに増分される、最大４つまでのベースレジスタ／インデックスレジスタ、すなわちＩ４／Ｂ４、Ｉ５／Ｂ５、Ｉ６／Ｂ６、Ｉ７／Ｂ７を選択するオプション。
●反復ループ情報は、ループ命令を規定するラベルの前でループレジスタの中にロードされる。
【００３２】
反復バッファは、反復ループを備える命令を保持するための命令ＦＩＦＯである。その目的は、コードの最も時間のかかるセクションの間に命令フェッチ電力消費を低減することである。バッファへの命令の配分は、ＨｙｐｅｒＸツールによりコンパイル時に決定され、ユーザに決定させない。本明細書では、ユーザに基本的理解を提供することだけについて記述する。反復バッファの主要な特徴は、以下を含んでよい：
●ＲＥＰＥＡＴ命令およびそのラベルにより、命令のグループを決定する。
●反復バッファ使用法は、コンパイル時に決定され、フラグによりＲＥＰＥＡＴ命令の中で示される。
●あらゆる反復ループの最初の命令は、性能および電力の理由で、反復バッファの中に常にロードされる。
●バッファは、６４ビットまたは１２８ビットの命令を保持することができる。
●最大１２個の６４ビットエントリを利用可能である。１２８ビット命令用に、２つのエントリを使用する。
●ループの最初の命令をバッファに入れる以外のどんなことのためにもバッファを使用するために、ループ全体は、バッファに収まらなければならない。
【００３３】
反復ハードウェアは、一次インデックス（Ｉ１〜Ｉ３）および関連する他の制御レジスタを使用して、ループ動作を制御する。一次ハードウェアに加えて、ＡＧＵによる追加アドレス計算のために、反復ハードウェアにより自動的に管理することができる別の１組のレジスタが存在する。これらの特別のレジスタは、以下である：
●Ｂ４〜Ｂ７―４つの追加基底レジスタ。
●Ｉ４〜Ｉ７―４つの追加インデックスレジスタ。
●Ｓ４〜Ｓ７―４つの追加ストライドレジスタ。
●Ｔ４〜Ｔ７―基底レジスタまたはインデックスレジスタを初期化するために使用する４つの追加レジスタ。
【００３４】
これらのレジスタ上で加算を遂行するために利用可能な追加加算器が４つ存在する。これらの加算器は、命令（ＩＮＩＴおよびＩＮＣＲ）により、またはＲＥＰＥＡＴ命令およびハードウェアの自動増分特徴により、制御することができる。本明細書の他の箇所で記述するＡＵＴＯＩＮＣレジスタを使用して、各一次ＲＥＰＥＡＴ動作を結びつけて、さらにまた、１つまたは複数のインデックスレジスタまたは基底レジスタ上でアドレス加算を遂行することができる。
【００３５】
各加算器を使用して、任意の一次インデックス（Ｉ１〜Ｉ３）に対するループによる各繰返しに対して、所与のストライド（Ｓ４〜Ｄ７）を同じ番号の基底（Ｂ４〜Ｂ７）または同じ番号のインデックス（Ｉ４〜Ｉ７）に加算することができる。追加で、ループ指示の最初で、一次インデックスに開始値をロードさせるときはいつでも、指示されたＡＵＴＯＩＮＣ  ＢＡＳＥまたはＩＮＤＥＸに、同じ番号のＴレジスタ（Ｔ４〜Ｔ７）をロードする。これにより、複数のアレイは、ループ内で追加命令のオーバーヘッドなしにアクセスし、管理することができるようになり、電力を節約し、よりよい性能を提供する。
【００３６】
さまざまな実施形態では、条件付実行は、述語フラグに基づいてよい。そのようなフラグは、以下を含んでよい：
●Ｐ０〜Ｐ３：
○ＤＰ試験命令により設定される
○ＤＰのタイミングに従って設定される
●ＧＰ０およびＧＰ１
○ＡＧＵ試験命令により設定される（図６に例を示す）
○ＡＧＵのタイミングに従って設定される
【００３７】
述語フラグは、以下を遂行するＴＥＳＴクラスの命令を使用して設定される：
●ＴＥＳＴ動作を実行する
●結果として得られる条件を確認する
●選択された述語フラグを設定する
【００３８】
【表１】
2021501947.tif 000003
【００３９】
条件付命令は、１対の述語フラグに対する試験を指定する。たとえば：
●ＧＰ０、ＧＰ１―ＡＧＵ命令により使用される
●Ｐ０、Ｐ１―ＤＰ命令により、典型的にはＤＰ０で使用される
●Ｐ２、Ｐ３―ＤＰ命令により、典型的にはＤＰ１で使用される
【００４０】
述語フラグを試験するある例を図６に例示する。追加で、ＤＰの条件付命令、ＡＧＵの条件付命令、およびプログラムの流れの命令を図７に例示する。
【００４１】
条件付ブロック命令を図８に例示する。図８に例示する命令の説明は、実際の動作の簡略版である。ＳＴＡＲＴＩＦ、ＥＬＳＥ、ＥＮＤＩＦの命令は入れ子可能であるので、入れ子された条件状態を保持する条件スタックが存在する。ＳＴＡＲＴＩＦは、条件スタックの上に新しい条件をプッシュし、ＥＬＳＥは、現在の条件状態（スタックの最上部）をトグルし、ＥＮＤＩＦは、条件スタックをポップする。現在の条件状態は、ＳＴＡＲＴＩＦ、ＥＬＳＥ、およびＥＮＤＩＦの動作を禁止してよい。
【００４２】
さまざまな方法でＨｙｐｅｒ−Ｏｐを実行してよい。Ｈｙｐｅｒ−Ｏｐ実行のある例を表３に例示する。
【００４３】
【表２】
2021501947.tif 000004
2021501947.tif 000005
【００４４】
ＧＰｎは、次のサイクルで準備が整い、したがって、ＧＴＥＳＴ命令を使用して、ＧＰｎビットを設定する場合、分岐予測はまったく必要ない。しかしながら、ＧＰｎビットがＭＯＶにより汎用レジスタから書き込まれている場合、分岐予測は遅延させられ、正常な分岐予測が遂行される。Ｐｎは、５サイクル後に準備が整い、したがって、分岐予測を必要とする。ｎが試験命令と分岐の間にある命令サイクルの数である場合、予測ミスによる犠牲は、５−ｎサイクルである。試験命令をコード内で前方へ移動させることができる場合、ｎを増大させることができ、予測ミスによる犠牲は、おそらくはゼロ（０）サイクルまで低減することができる。
【００４５】
述語は、述語を設定するために明示的命令を使用して計算され、かつ他の命令により修正されないので、多くの場合、コードをスケジュールして、予測ミスによる分岐に関連するどんな犠牲も大きく低減することが可能である。分岐予測は、静的に行われ、分岐確率に関する業界標準のヒューリスティクスに基づき、コンパイル時に決定されてよい。
【００４６】
Ｈｙｐｅｒ−Ｏｐモードは、命令を符号化できるようにしてよく、この場合、データパスの分離した各部分は、命令符号化の一部により制御される。これにより、ハードウェアの並列処理をより直接的に制御できるようになる。１２８ビットＨｙｐｅｒ−Ｏｐフォーマットは、表４に描く並列処理を可能にする。
【００４７】
【表３】
2021501947.tif 000006
【００４８】
ＨｙｐｅｒＯｐ命令がＤＰ０およびＤＰ１で並列に実行することができる制約事項が存在する。２つのＨｙｐｅｒＯｐ命令は、同じ待ち時間を有する場合、並列に実行することができる。定義によれば、ＤＰ０およびＤＰ１のスロットは、常に同一命令を並列に実行することができる（ＳＩＭＤに等価）。数少ない例外が存在する。単一のＦＰ命令だけは、両方のＤＰスロットの計算で両方のデータパスからのハードウェアを使用するとき、両方のＤＰスロットで走らせることができる。同じ命令を実行するＳＩＭＤ形態をサポートするが、一方では、使用モデルは、待ち時間が同じの任意の２つの命令を並列に実行できるようにするという点ではるかにより柔軟性があることに留意されたい。
【００４９】
アドレス命令は、ＦＤパイプライン段階中に発生し、１サイクルかかり、結果は、次のサイクルで、すべてのロード／記憶命令が使用するために利用可能である。さまざまな実施形態では、自動増分および反復は、オーバーヘッドを低減するためのリロードを含む。
【００５０】
各ＤＭＲは、マルチ・ポイント・ソースおよびマルチポイント宛先を同時にサポートするための直接メモリアクセス（ｄｉｒｅｃｔ  ｍｅｍｏｒｙ  ａｃｃｅｓｓ、ＤＭＡ）エンジンを有してよい。さらに、各ＤＭＡエンジンの完全な状態を取り込んで、メモリの中に保存してよく、この状態情報を後で取り出して、ＤＭＡ動作が中断した場合にＤＭＡ動作を再開してよい。ＤＭＡ構成の状態を保存する能力は、ＰＥがＤＭＡの全体の状態を得るために最大１１までのＤＭレジスタを読み出すように要求する。これらのレジスタの多くは、状態を取り込む目的で外部からのアクセスにさらされる内部ＤＭＡレジスタであった。
【００５１】
レジスタ空間を節約するために、ＤＭＡは、その状態を記述子と呼ばれるコンパクトな形態でメモリに保存することができる。ＰＥは、この記述子の開始場所を指定し、ＤＭＡおよび修正されたプッシュエンジンは、指定されたメモリアドレスから始まるメモリにレジスタデータを書き込むことができる。プッシュエンジンは、ルーティングされるメッセージを一方の宛先ＤＭＲから第２の宛先ＤＭＲに拡張するために使用する、ＤＭＡエンジンの一部である。
【００５２】
プッシュエンジンは、ＤＭＡをプログラムするためにＤＭＡ内の各レジスタを通してステップを進める状態機械をすでに有する。この同じ機械をさらにまた使用して、レジスタを読み出すことができる。読み出したデータは、次いで近接するポート内モジュールの中に向けられる必要がある。重要な部分は、任意のＤＭＡ書込機能停止をプッシュエンジンの中に結びつけることである。これは、プッシュエンジンのビジー入力信号上でＤＭＡ機能停止をゲート制御することにより行われてよい。
【００５３】
ＤＭＡウェイクアップを使用して、記述子を保存したＰＥに信号を送ることができる。その時点で、ＰＥは、タスクを自由にスワップできる。新しいタスクが完了すると、ＰＥは、保存した記述子を指し示すことができ、ＤＭＡの処理は再開する。ポート内またはポート外のルータは、タスクスワップの間に適切に構成される必要があることが留意される。
【００５４】
アキュムレータの記憶は、所定のシフト量だけ、任意選択の右へのポストシフト（ｐｏｓｔ−ｓｈｉｆｔ）を有する。さまざまな実施形態では、以下のシフト量が存在する：
●１：平均をとるため
●８：
●１６：ＡＣＣＨ＝ＡＣＣ［３１：１６］を記憶するため
●１５：
【００５５】
これらの値は、間接シフト量として使用する３つのシフトフィールドに記憶される。３つのフィールドは、ＨｙｐｅｒＯｐ構文法でＳＨＲ１、ＳＨＲ２、およびＳＨＲ３として示され、ＰＥ＿ＣＯＮＦＩＧレジスタ内のシフト値フィールドＳＨＩＦＴ＿ＣＴＬ１〜３を指す。
【００５６】
２つのタイプのアキュムレータ対、すなわち、各ＤＰから１つのアキュムレータ（ＡＣＣ２＿ＡＣＣ０、ＡＣＣ２＿ＡＣＣ１、ＡＣＣ３＿ＡＣＣ０、ＡＣＣ３＿ＡＣＣ１）、およびＳＩＭＤの１６ビットデータとして取り扱われるアキュムレータの２等分（ＡＣＣ０Ｈ＿ＡＣＣ０Ｌ、ＡＣＣ１Ｈ＿ＡＣＣ１Ｌ、ＡＣＣ２Ｈ＿ＡＣＣ２Ｌ、ＡＣＣ３Ｈ＿ＡＣＣ３Ｌ）が存在する。アキュムレータ対のポストシフトを伴う記憶は、ビット位置の番号は同じであるが、アキュムレータ対の各部分に対して独立したシフトを遂行する。以下の記述では、「ｔｍｐ（一時的）」指定は、意味論を明確にしようと試みるために使用され、実際のハードウェアレジスタではない。
【００５７】
【表４】
2021501947.tif 000007
2021501947.tif 000008
【００５８】
シフトはまた、分割記憶および分割ロードで行われてよい。より多くのシフト動作は、一般にハードウェア電力散逸（Ｐｄｉｓｓ）を増大させる。さまざまな実施形態では、シフトハードウェア設計は、所与のＰｄｉｓｓ予算のために最も必要とされるシフトオプションを選択することにより進められてよい。アプリケーションコードおよびＰＥアーキテクチャを分析することにより、最も必要とされるシフトオプションを決定してよい。いくつかの実施形態では、たとえばメモリがバイトでアドレス指定される代わりにワードでアドレス指定される場合、最も必要なことは、ワード境界に／ワード境界からバイトを整列させるシフトのためにあってよい。
【００５９】
いくつかの実施形態では、性能を増大させるために、追加補助計算ユニットを採用してよい。考えられる補助計算ユニットのリストを表６に描く。
【００６０】
【表５】
2021501947.tif 000009
【００６１】
ＨｙｐｅｒＯｐ命令―プログラムコンパイル処理で静的スケジューリングを使用して、二重データパスの個々の制御を可能にする。実行スレッドをコンパイラにかけて、コンパイラにすべての動作を静的にスケジュールさせる。比較すると、現代のＧＰＰアーキテクチャ用コンパイラは、関係のある命令を機械コードの中に一緒に配置するが、動作スケジューリングの細かな詳細は、（電力を消費する）ハードウェアにより行われる。静的スケジューリングは、実行時のＰｄｉｓｓをかなり節約する。
【００６２】
データ伝送中、システム内の欠陥は、伝送信号の歪みまたは劣化をもたらす可能性がある。伝送信号のそのような歪みまたは劣化は、受信側回路でデータビットの値が正しくない結果をもたらすことがある。そのような影響を除去するために、いくつかの実施形態では、前方誤り訂正（Ｆｏｒｗａｒｄ  Ｅｒｒｏｒ  Ｃｏｒｒｅｃｔｉｏｎ、ＦＥＣ）符号化および復号をサポートするための命令を含んでいる。ＦＥＣは、すべての種類のデジタル通信、ならびに記憶媒体からのデジタル記録および再生などの他の分野に応用されている。基本的考え方は、任意の入力データのブロックを取り出して、受信側または再生電子回路でビット誤り訂正を可能にするような方法で、追加パリティビットを用いてブロックを符号化することである。データおよびパリティビットからなる符号化されたブロックをＦＥＣフレームと呼ぶ。変調器によりＦＥＣフレームをさらに処理し、次いで媒体（有線、無線、または記憶媒体）の中に伝送してよい。
【００６３】
受信側では、アンテナまたはトランスデューサにより信号を拾い上げ、増幅し、復調し、ＡＤ変換器（Ａ  ｔｏ  Ｄ  ｃｏｎｖｅｒｔｅｒ、ＡＤＣ）によりサンプリングする。媒体内の信号は、干渉、フェージング、およびエコーを受けたことがあり、受信側により雑音を加えられたことがある。ＡＤＣの出力は、デジタルサンプルのシーケンスである。サンプルのシーケンスを取り上げて、同期を得て、ＦＥＣフレームの中にフォーマットするための方法はさまざま存在するが、これらの方法は、ＦＥＣ計算にほとんど無関係であり、これらの方法についてここでは記述しない。フォーマットされたＦＥＣフレーム内の各ビット位置は、ソフトビットと呼ばれることがあるデジタル値を有し、デジタルシステムで整数の実際のビットにより表される。
【００６４】
ＦＥＣ復号は、フォーマットされたＦＥＣフレーム内のソフトビットを取り出し、ビット誤り訂正を計算し、ビット誤り訂正を適用し、訂正されたＦＥＣフレームを出力する処理である。ＦＥＣ復号アルゴリズムの目的は、パリティビットを生成した方法の知識を前提として、最も可能性の高い正しいデータフレームを出力することである。ＦＥＣが正しく作動するためには、特定のＦＥＣ復号方式（誤り訂正のためのパリティビット使用）をＦＥＣ符号化方式（パリティビット生成）と調和させなければならない。
【００６５】
ハミング符号、ＢＣＨ符号、およびリード−ソロモン符号を用いて、ＦＥＣの初期の成功は達成された。畳込み符号、および畳込み符号と他の符号の直列連結を用いて、さらに成功を得た。復号側では、目的は、雑音によって誘発された誤りを伴う受信ソフトビットを前提として、正しい可能性が最も高いデータのブロックを見つけ出すことである。これは、単一パスアルゴリズム（Ｖｉｔｅｒｂｉなど）または繰返アルゴリズム（Ｔｕｒｂｏなど）で達成することができる。
【００６６】
ＦＥＣの計算は、サンプラから得られる、観察された値のシーケンスに応じて、バイナリビットの値に対する２つの選択の、予測される正しさを計算することを伴う。絶えず変化する値のシーケンスをランダム変数として取り扱ってよいので、確率の数学的処理を適用してよい。主要な関心事は、ＦＥＣフレーム内のソフトビットの値を前提として、特定の伝送データビットが１であったか、−１であったかということである。伝送データに関する硬判定を行う前に、多数の軟判定を計算することができる。これらの軟判定は、確率を比較することにより計算してよく、パリティビットを含む、確率を比較するする方法は、尤度比（ｌｉｋｅｌｉｈｏｏｄ  ｒａｔｉｏ、ＬＲ）と呼ばれる条件付確率の比を計算することである。ＬＲの対数（ｌｏｇａｒｉｔｈｍ  ｏｆ  ＬＲ、ＬＬＲ）は、積算および除算が加算および減算に変換されるので、特に興味があり、加算および減算は、ＰＥでは、より迅速に計算され、オーバーフローおよびアンダーフローを起こすことはほとんどない。その結果として、整数で記憶されたＬＬＲの値を用いて、ＦＥＣ復号を計算することができる。
【００６７】
対数確率の積和は、ＭＡＸ＊演算子とも呼ばれる。さまざまな実施形態では、オフセット命令を用いて加算−比較−選択（ａｄｄ−ｃｏｍｐａｒｅ−ｓｅｌｅｃｔ、ＡＣＳ）に類似する方式でＭＡＸ＊演算子を遂行してよい。ＭＡＸ＊演算子は、指数確率上で対数領域の数学的処理に関する積和タイプの動作を提供する。多くの場合、記号形式をＭａｘ＊（ｘ０＋ｙ０，ｘ１＋ｙ１）と書く。
【００６８】
さまざまな実施形態では、ＰＥは、以下のような関数を実装する：
Ｚ［１５：０］＝ＭＡＸ（（Ｘ［１５：０］＋Ｙ［１５：０］），（Ｘ［３１：１６］＋Ｙ［３１：１６］））＋ＴＬＵオフセット
【００６９】
オペランド使用法を少し修正して、ターボ動作に有用なより高いスループット形態を提供することにより、二重対数確率積和命令を達成してよい。この１つは、Ｍａｘ＊（ｘ１＋ｙ０、ｘ０＋ｙ１）：Ｍａｘ＊（ｘ０＋ｙ０，ｘ１＋ｙ１）という形態の単一データパスで２つの結果をもたらす。
【００７０】
さまざまな実施形態では、ＰＥは、以下のような関数を実装する：
Ｚ［３１：１６］＝ＭＡＸ（（Ｘ［３１：１６］＋Ｙ［１５：０］），（Ｘ［１５：０］＋Ｙ［３１：１６］））＋ＴＬＵオフセット
Ｚ［１５：０］＝ＭＡＸ（（Ｘ［１５：０］＋Ｙ［１５：０］），（Ｘ［３１：１６］＋Ｙ［３１：１６］））＋ＴＬＵオフセット
【００７１】
別の形態のＭＡＸ＊動作は、以下の形態でデータパスあたり３２ビットを作り出す：
Ｍａｘ＊（０，ｘ１＋ｙ１）−Ｍａｘ＊（ｘ１，ｙ１）：Ｍａｘ＊（０，ｘ０＋ｙ０）−Ｍａｘ＊（ｘ０，ｙ０）
【００７２】
さまざまな実施形態では、ＰＥは、以下のような関数を実装する：
Ｚ［３１：１６］＝ＭＡＸ（０，（Ｘ［３１：１６］＋Ｙ［３１：１６］））＋ＴＬＵオフセット−（ＭＡＸ（Ｘ［３１：１６］，Ｙ［３１：１６］））＋ＴＬＵオフセット）
Ｚ［１５：０］＝ＭＡＸ（０，（Ｘ［１５：０］＋Ｙ［１５：０］））＋ＴＬＵオフセット−（ＭＡＸ（Ｘ［１５：０］，Ｙ［１５：０］）＋ＴＬＵオフセット）
【００７３】
別の命令は、２つのオペランドに対する二重ＭＡＸ＊動作に各データパス内にある２つのアキュムレータ内の値を提供してよい。別の命令は、ＭＡＸＡＣ命令が行うのと同じように、アキュムレータを使用することにより、大きなグループの数値に対してＭＡＸ＊の結果を得る高速な方法を提供する。２つの１６ビットの結果は、２つのアキュムレータの中に移行する。両方のデータパスを使用する場合、入力データが全部そろったとき、４つのアキュムレータは、それらの入力データに対してＭＡＸ＊動作を走らせて、最終結果を得る必要がある。記号的に、等式は、以下のように見える：
ＡＣＣn+1＝Ｍａｘ＊（ＡＣＣn+1，Ｍａｘ＊（ｘ１，ｙ１））：ＡＣＣn＝Ｍａｘ＊（ＡＣＣn，Ｍａｘ＊（ｘ０，ｙ０））
【００７４】
次式を使用して、対数確率積和のための二重の累積形態を達成してよい：
ＡＣＣn+1＝Ｍａｘ＊（ＡＣＣn+1，ｘ０＋ｙ０）：ＡＣＣn＝Ｍａｘ＊（ＡＣＣn，ｘ１＋ｙ）
【００７５】
ＬＰ命令用の特別なハードウェアの当然の結果は、「０」インデックスデータを上位ＡＣＣに、「１」インデックスデータを下位ＡＣＣにスワップすることが留意される。これは、このデータがデータパス内で容易にスワップされる場合、好ましい。さまざまな実施形態では、ＰＥは、以下のような関数を実装する：
ＡＣＣn+1＝ＭＡＸ（ＡＣＣn+1，（Ｘ［１５：０］＋Ｙ［１５：+１］））＋ＴＬＵオフセット
ＡＣＣn＝ＭＡＸ（ＡＣＣn，（Ｘ［３１：１６］＋Ｙ［３１：+１６］））＋ＴＬＵオフセット
【００７６】
また、対数領域で商の二重和を生成することも可能である。すでに示したものに類似する方式で、加算の代わりに減算を使用して、以下を提供する：
ＡＣＣn+1＝Ｍａｘ＊（ＡＣＣn+1，ｘ０−ｙ０）：ＡＣＣn＝Ｍａｘ＊（ＡＣＣn，ｘ１−ｙ１）
【００７７】
さまざまな実施形態では、ＰＥは、以下のような関数を実装する：
ＡＣＣn+1＝ＭＡＸ（ＡＣＣn+1，（Ｘ［１５：０］−Ｙ［１５：０］））＋ＴＬＵオフセット
ＡＣＣn＝ＭＡＸ（ＡＣＣn，（Ｘ［３１：１６］−Ｙ［３１：１６］））＋ＴＬＵオフセット
【００７８】
上記で参照した命令を実装するために、図９〜図１４に描くような専用論理回路を採用してよい。いくつかの事例では、命令のタイプに基づき論理回路を選択的に有効にしてよく、それにより、最小量の論理回路を使用して、複数の命令を遂行できるようになる。
【００７９】
ＰＥ上で走る、チップＩ／Ｏポートと通信するアプリケーション内部で、またはそれらのアプリケーション間で、広帯域で待ち時間の短いデータ転送のために、ＭＰＳの一次相互接続ネットワーク（ｐｒｉｍａｒｙ  ｉｎｔｅｒｃｏｎｎｅｃｔｉｏｎ  ｎｅｔｗｏｒｋ、ＰＩＮ）を設計する。相互接続ネットワーク（ｉｎｔｅｒｃｏｎｎｅｃｔｉｏｎ  ｎｅｔｗｏｒｋ、ＩＮ）は、１組のノード間を接続するリンクを伴う１組のノードとして一般に記述されてよい。大部分のＰＩＮは、はるかに多くの配線を必要とするので、１段階で完全にポイント・ツー・ポイントの能力があるであるわけではない。むしろ、大部分のＰＩＮは、ネットワークの各ノードでルータを用いる多段式であり、ノードは、リンクにより互いに接続される。ＰＩＮを通してメッセージをルーティングすることができ、ＰＩＮは、ソースノードから宛先ノードへメッセージを開始し、一時停止し、配送するための規則を強制する。メッセージは、開いたままである場合、データパイプとして不定に使用されてよい。しかしながら、多段式であるので、現存するメッセージは、新しいメッセージにより指定されるリンクまたは宛先を占有することにより新しいメッセージのセットアップを遮断する可能性があり、その結果、メッセージ配送は、保証されない。これを軽減するいくつかのものは、動的カットスルーおよび輻輳を「飛び越える」ための長距離ルートなど、文献に見られるようになった。しかしながら、本発明者らの取り組み方法は、相互接続の層を追加することであり、各層は、別の１組のリンクを有する。追加の各層を用いて、ＰＩＮノードルータを拡張して、メッセージが一方の層から別の層へ横断できるようにする。
【００８０】
大規模ＭＰＳでは、ＰＩＮの動作効率に影響を及ぼすことなくシステムを管理する必要がある。このことは、いくつかの実施形態では、ＰＩＮよりも低い帯域幅を有してよいが、メッセージ配送を保証してよい二次相互接続ネットワーク（ｓｅｃｏｎｄａｒｙ  ｉｎｔｅｒｃｏｎｎｅｃｔｉｏｎ  ｎｅｔｗｏｒｋ、ＳＩＮ）の開発につながった。そのような相互接続ネットワークを図１５に示す。例示するように、メッセージバス１５００は、固定接続性方式で互いに連結された複数のメッセージ・バス・ノードを含む。メッセージバスは、ＰＥとＤＭＲの両方の場所を含む、チップ内部のアクセス可能なあらゆるレジスタおよびメモリの場所に到達する、適度な帯域幅、変数待ち時間、および保証された配送法だけではなく、Ｉ／Ｏコントローラ１５０２などのＩ／Ｏコントローラも提供する。
【００８１】
コアアレイ構造の外側にあるデータをブートし、デバッグし、ロードするだけではなく、ＭＰＳ機器を通して実質的にすべてのアドレス可能な場所にアクセスできるようにするためにメッセージバスを使用してよい。たとえば、メッセージバスは、すべてのＰＥ／ＤＭＲのデータおよび命令のメモリの場所、内部ＰＥレジスタ、ＤＭＲレジスタ（レジスタバスの場所を含む）、ならびにＩ／Ｏバスに取り付けられたＩ／Ｏ周辺機器にアクセスしてよい。
【００８２】
メッセージバスは、いくつかの実施形態では、ＰＥ、開発アクセスポート（ｄｅｖｅｌｏｐｍｅｎｔ  ａｃｃｅｓｓ  ｐｏｒｔ、ＤＡＰ）１５０３、ブート制御１５０４、およびＩ／Ｏプロセッサなどの、多重同時マスタのためのサポートを提供してよい。メッセージは、ソースおよび宛先の相対的位置決めに基づき、自動ルーティングを使用してメッセージバス上でルーティングされる。返答は、相対的場所を使用して、リクエストに類似する手法で自動的にルーティングされる。エラー返答ルートは、メッセージ内に維持されたソースに至る引き続く場所を利用する。
【００８３】
いくつかの実施形態では、メッセージバスは、２つ以上の独立したメッセージ構成を備えてよい。独立した構成上のメッセージが、自動調停が有用な同じ宛先にアクセスしようとする場合が生じる。調停の結果は、優先度構造などの簡単な方式により決定されてよい。メッセージバス優先度構造は、ＤＭＲアドレスにアクセスするために確立された２つの固有の優先度、すなわち最低または最高を考慮してよく、すべてのＰＥアドレスへのアクセスは、ＰＥでは最低の優先度にある。
【００８４】
メッセージバスは、複数のエンドポイント・メッセージ・グループをサポートして、アレイのサブセットが単一メッセージに応答可能にする。複数のグループメンバーシップを単一ノード上に設定してよい。さまざまな実施形態では、ブロードキャスト能力を使用して、すべてのノードに到達してよく、配分するために、多くの独立したグループが利用可能であってよい。
【００８５】
さまざまな実施形態では、メッセージバスは、複数のチップ動作を可能にしてよい。複数のダイ構造を実装する場合、チップ間で宛先の相対アドレスをブリッジしてよい。いくつかの事例では、メッセージフォーマットは、Ｘ方向およびＹ方向に最大２５６個までのＭＢＮノードを許可してよい。他の実施形態では、追加ノードをサポートするようにメッセージを拡張することができる。テーブル（たとえば、テーブル１８０７）を使用する中継技法を採用することにより、任意の適切な数のメッセージノードをサポートしてよい。
【００８６】
メッセージバスは、機器内部のプロセッサが機器内のあらゆるアドレス可能な場所に到達できるようにする能力を有する。この能力により、プロセッサ間でメッセージを渡すこと、アルゴリズムが進行するにつれ値のテーブルを更新すること、遠隔Ｉ／Ｏコントローラの挙動を管理すること、動作時の統計情報を収集すること、セルのセキュリティを管理すること、およびプロセッサ間で時間を重要視すべきではない情報の一般的通信を含む、さまざまな実現性を可能にする。
【００８７】
メッセージバスは、ＰＩＮルーティング構成の特別な層として使用することを望ましくなくする、ある種の特徴を欠くことがあることが留意される。第一に、帯域幅は、はるかにより低い。たとえば、いくつかの実装形態では、メッセージバスは、ＰＩＮよりも１０倍ほども遅いことがあり、一方では、他の実装形態では、ＰＩＮよりも２倍だけ遅いことがある。第二に、データ配送の待ち時間は、同じソースと宛先の対の間のメッセージに対してさえ大きく変わる。プログラムされたルートセットアップおよび解体の概念はなく、この場合、構成内では、メッセージのために既知の長さのルートをセットアップし、ルートを使用するたびに同じ配線を横断して、２つのエンドポイントを接続し、その結果、データ配送に関して予測可能な待ち時間がもたらされる。メッセージバスを用いる場合、構成ハードウェアにより決定されるルートを用いてソースから宛先へ比較的短いメッセージを誘導する。メッセージは、進路に沿ったある地点で遮断される場合、メッセージを遮断しているその他のメッセージが完了するのを待ち、次いで継続する。構成上で一度に１つのメッセージだけを用いる場合（宛先で優先順の遅延はない）、メッセージによるデータ配送は、予測可能な待ち時間を示してよい。しかしながら、構成上の追加メッセージトラフィックは、データ配送を混乱させることがあり、その後の各メッセージがとるルートを変更することがある。その結果、到達時間は保証されないので、メッセージバスは、同期メッセージを分配するのに適さないことがある。
【００８８】
メッセージバスは、ＭＰＳ内の任意の宛先との間で、より低帯域の短いメッセージを高い電力効率で配送するのを保証するのに有用である。これらのメッセージは、ＰＩＮ構成内の資源をかなり消費し、延長された時間の間リンクを潜在的に拘束し、データはほとんど通過しない、またはリンクがシステムを遮断できないようにするために、リンクの絶え間ないセットアップおよび解体を必要とする。メッセージバスはまた、チップＩ／Ｏの遠隔プロセッサ管理を簡略化し、ＭＰＳでは、この場合、Ｉ／Ｏポートの近くにあるこれらのプロセッサだけが、ポート、およびポートに取り付けられた任意の周辺機器を制御してよい。
【００８９】
タイミングが重要な用途に好適ではないが、メッセージバスは、かなりの性能を依然として利用可能にする。バス自体は、クロックあたり１ワードを移動させ、クロックは、１５００ＭＨｚの目標周波数を有してよい機能コアクロックと同じであってよい。このクロックは、ノード間で実効的に１５００ＭＨｚワード／秒の移動をもたらす。メッセージバスは、レジスタに配送されるワードごとに、バス全体にわたってデータおよびアドレスをプッシュし、次いで、できるだけ迅速に他のメッセージにバスを解放するように設計されるので、ルートを規定して、どこからワードを読み出す、または書き込むかを識別し、リクエストを行っているノードにデータまたは状態をどのように戻すかを識別するために必要な、固有のオーバーヘッドが存在する。これらの非データワードは、単一トランザクションではバスのスループットを低減する。メッセージ構造のオーバーヘッドの影響を制限するために、任意の数のワードを１つのメッセージで転送することができ、唯一の制限は、それらのワードが単一開始アドレスから連続していなければならないことである。
【００９０】
正常な条件のもとでは、ＭＰＳ機器内部にある任意の通常アクセス可能な場所へのアクセスを利用可能である。これは、任意のレジスタ、メモリの場所、または正常モードのアドレスを有する周辺機器を、特有のアドレスにアクセスしているパラメータの中で書き込む、または読み出すことができることを意味する。いくつかのＰＥ内部レジスタでは、ＰＥが動作している間にＰＥの内容を読み出すことができ、しかしながら、包含する値は、読出しが行われたときのスナップショットを表し、値が要求されたときだけ更新される。追加で、リクエストが生成されたときと、メッセージバスによりＰＥまたはＤＭＲから値を読み出したときと、要求元に結果を戻して配送するときとの間に時間間隔が存在し、この時間間隔は、システムおよびメッセージバスの負荷に応じて、結果を待つ時間がかなりあることを表す。ほとんどすべてのクロックで、動作に必要なある種のＰＥ内部レジスタにアクセスするために過大に待つ可能性があり、ＰＥがブレークポイントで停止するまで、事実上リクエストを機能停止させる。コードの中にギャップが出現し、これらのレジスタを読み出すことでできるようになる可能性があるが、ＰＥは、いくつかのレジスタを動作させる必要があり、メッセージバスのメッセージがこれらのレジスタをデフォルトの低優先度で読み出そうと試みることにより、一般にメッセージの機能停止を引き延ばす結果となる。ＤＭＲ内部では、アクセスの優先度はプログラム可能であるので、そのアドレス領域に対して他のリクエストがまったく保留されなくなるまでリクエストを待たせることができる、またはそのアドレスに即座にアクセスして、リクエストに同じ領域へのアクセスを試みる他のリクエストすべてを遮断することができる。
【００９１】
正常モードのアドレスの場所は、以下を含んでよい：
●任意のＤＭＲデータメモリの場所への読出し／書込みのアクセス
●任意のＤＭＲメモリ・マップド・レジスタへの読出し／書込みのアクセス
●任意のＰＥ命令メモリの場所への読出し／書込みのアクセス
●ＰＥ状態および制御レジスタへの読出し／書込みのアクセス
●クロック制御レジスタへの読出し／書込みのアクセス
●ハードウェアブレーク挿入を除くブレークポイント制御
●ＰＥウェイクアップ制御
●パリティ制御
●ＰＥメッセージ受渡し
●ＰＥプログラマ・レジスタ・アクセス
●ＩＯバス上のメモリおよび周辺機器
【００９２】
プログラムを実行している間、命令メモリ上で動作しているときに、大いに配慮しなければならない。命令のブロックをメモリに書き込むことが可能であり、現在走らせているプログラムを実行していることに起因して、新しいコードの一部分は、コードのブロックを最初に完全に置換することなく実行されることがあり、その結果、予測できない動作を引き起こす。ＭＰＳは、メモリへの各書込みに対してパリティビットを含み、かつあらゆる読出し動作でパリティを検査するように構成可能であってよく、エラーを検出する場合、故障状態に分岐する。しかしながら、パリティ検査は、それを行わないときよりも多くの電力を消費する。ＭＰＳでのパリティ検査は、パリティありおよびなしがメモリの別個の動作モードであることを意味する極端な環境で使用すべき動作モードであると考えてよく、そのメモリを使用するアプリケーションを走らせている間、これらのモードの間を移行することは、賢明ではない。
【００９３】
クロック制御へのアクセスは、すべての条件のもとで可能であるが、しかしながら、クロックレジスタの状態を変えることは、いつも賢明であるというわけではない。システムが動作している間、特に複数のプロセッサ間で共有されるデータセットに対して動作しているとき、クロック制御の変更は、他のノードに関係なくローカルに行われ、他のノードはまた、それらの場所でクロック制御を更新するためにさらにまたアクセスされてよい。アルゴリズムを走らせている間にクロック構成を変えようとする場合、データにアクセスするタイミングが失われる可能性が高い。
【００９４】
ＰＥがブレークポイントで停止したとき、メッセージバスへの追加アクセスが利用可能である。ＰＥが中断したとき、プログラムカウンタは停止し、ハードウェアブレークポイントの更新が可能である。正常モードの能力のすべては利用可能であり、ハードウェアブレークポイント挿入能力が追加で利用可能である。
【００９５】
ブレークポイントを実装したことに起因して、システムが動作中に値を変更することは、中断見落としおよび意図しない中断を含む、予測できない結果につながる可能性がある。したがって、ブレークポイントの変更は、最も信頼できることには、プログラム実行が停止している間に効果的になる。
【００９６】
ＰＥがブレークポイントで停止したとき、内部レジスタアクセス時間は改善され、停止したプロセッサに向けた戻り値は依然として正確なままである。ＰＥレジスタアクセスに関する調停は、変わりない間は、活動状態の、より高い優先度の要求元を有せず、デバッグシステムがＰＥの内部状態レジスタに、より高速にアクセス可能にする。同様に、ＤＭＲ上では、ＤＭＡ動作の完了後、アドレスを求めて競合するアクセスが他に存在せず、最低の優先度のリクエストさえ、即座に満たされる。
【００９７】
ブート中に、メッセージバスを利用して、初めてプロセッサをロードし、クロックおよびセキュリティを構成し、ＰＥをリセットから解放して、動作を開始させてよい。ブート動作では、メッセージバス上のトランザクションの大部分は、機器全体にわたる宛先を用いてブートプロセッサから生じることが期待される。長いバースト動作が優勢であり、アドレスに起因するプログラムロードのオーバーヘッドを低減することが期待される。
【００９８】
その後、ブートコントローラの１つの用途は、動的セルを実装することであり、この場合、すでに作動しているシステムの中に新しいセルをロードさせることが可能である。本明細書で使用し、規定するとき、セルは、１つまたは複数のＰＥおよび１つまたは複数のＤＭＲに割り当てられたアプリケーションの一部分である。セルに含まれる、関連するＰＥ用命令メモリの役割を果たすために、少なくとも１つのＤＭＲがセルに含まれることが留意される。この場合、メッセージバス上に、より多くの活動が存在する可能性が高いが、この場合も、すでに機器の周囲にあるので、調停を簡略化して、アレイの中に新しいセルを伝送する。より大規模なブロック転送を利用することにより、動的セルをロードする時間を最小にすることができる。最初のロードとは異なり、置換セルをロードする間に、何らかの時点で競合が存在する可能性が高い。動的セルのロードは、潜在的に長時間パスを消費し、他のメッセージを配送する際の遅延につながるので、動的セルのロードを実装するとき、バーストの全長を考慮すべきである。
【００９９】
システム内デバッガに共通する１つの問題は、デバッグ設備とシステムの機能動作に相互作用がある可能性があることである。ある種の事例では、相互作用の可能性は、デバッグに従事しているときに機能システムの挙動の変化を、またはさらに問題があることには、デバッグが動作しているときに誤りの訂正または変更をもたらすことがある。調停されなければならない任意のアクセスは、機能システムと並列デバッグ設備の間の相互作用を完全に取り除くことは決してできないが、デバッグ動作を別個のメッセージ・バス・インスタンスの中にマッピングする場合、このマッピングは、最終データアクセス調停を除き、すべての相互作用を取り除くことができる。最低の優先度になるようにデバッグを注意深く選択することによって、デバッグは、他の方法で使用されない間、システムとだけ相互作用し、機能システムから発生する機能上のアクセスを混乱させない。さまざまな実施形態では、優先度を高低の間で変更してよい。
【０１００】
プロセッサがブレークポイントにあるとき、ＤＭＲに配送されるリクエストを発生させるＰＥはまったくない。これは、ＰＥが停止している間、ＤＭＡリクエストを連続して処理することができるので、ＤＭＲ内にリクエストがまったく存在しないことを意味するのではない。これは、データを求める他のリクエストがまったく存在しないので、ＰＥのリクエストが即座に満たされる分割状態と、ＤＭＡトランザクションがデバッグリクエストの前にあり続けるＤＭＲ状態をもたらす。論理的には、これは、ブレークポイントのないプロセッサではデバッグが動作と干渉すべきではないという考えを支持する。
【０１０１】
バス自体の詳細を探る前に、メッセージバスに関連して、メッセージが何を意味するかを最初に理解することは役に立つ。最も一般的な意味では、メッセージは、意図する宛先にメッセージを配送するための手段、配送すべきデータ、および開始点に応答を戻すための手段を必要とする。詳細には、メッセージバスがそのネットワークを通して渡す、固有に異なるメッセージはいくつかあり、次にそれについて取り扱う。
【０１０２】
メッセージ・バス・ノード内部の構成レジスタをプログラムすることによりメッセージを構築し、送信する。メッセージバスの２つのチャネル（ＡおよびＢ）用にこれらのレジスタが２組存在する。これらのレジスタのプログラミングについて以下で論じる。利用可能なメッセージフォーマットがいくつか存在する。これらは、以下のようにカテゴリ分類することができる：
●ポイント・ツー・ポイント・メッセージ―任意の他の単一ノードから情報を読み出す、または書き込むことができるようにする。
●マルチ・ポイント・メッセージ―単一メッセージを用いてエンド・ポイント・ノードのグループに読み出す、または書き込むことができるようにする。
●応答メッセージ―ユーザが直接生成しない。他のメッセージの肯定応答を提供するために、メッセージバスが使用する。
●安全な構成メッセージ―チップ用のセキュリティを構成するために使用するメッセージの形態。
【０１０３】
メッセージを送信するために、プログラムは、メッセージの基本構成要素を構成レジスタの中に、次いで送信すべきメッセージ用に信号をプログラムしなければならない。プログラミング構成要素を図１６に列挙する。
【０１０４】
ＳＴＡＴＵＳ（状態）レジスタを使用して、送信したメッセージの状態を観察する。送信されているメッセージを直接制御するこれらのレジスタに加えて、メッセージ・バス・システムの他の側面を制御するために使用する、後で記述する他の構成レジスタがいくつか存在する。新しいメッセージを規定するために修正する必要があるレジスタだけは、次のメッセージを送信する前に更新される必要があることに留意されたい。たとえば、同じメッセージを５つの場所に送信するために、ＤＥＬＴＡ＿ＯＦＦＳＥＴ内のルート情報を単に更新し、ＧＥＮ＿ＭＳＧを使用してメッセージを再送する。メッセージフォーマットについて以下でより完全に記述する。
【０１０５】
チップ内の任意の場所に到達するために任意のマスタにより使用することができる最も基本的メッセージは、ポイント・ツー・ポイント・メッセージである。その名称が意味するように、このメッセージは、単一の場所を対象とし、単一の場所から発行される。中間にあるすべての場所には、通過するデータをスヌープする（ｓｎｏｏｐ）ための手段がまったくないので、２つのノード間で渡される情報は、２つのノードによりメッセージバスの外部だけで見られ、この点では、すべてのポイント・ツー・ポイント・メッセージは安全である。このメッセージタイプに関する能力およびオーバーヘッドの釣り合いをとるさまざまなオプションが、メッセージを構築するために利用可能である。
【０１０６】
スレーブは、一度に１つのメッセージだけを受信し、処理することができるので、どのノードがデータアクセスを要求しているかを知る必要がなく、マスタに戻るルートだけが必要であり、その結果、応答を届けることができる。リクエストメッセージの一部は、ポイント・ツー・ポイント・メッセージの往復を完了するために必要な、応答用の戻りパスを含む。
【０１０７】
ポイント・ツー・ポイント・メッセージは、読出リクエストまたは書込リクエストとすることができ、読出リクエストは、要求した読出しデータを包含する応答メッセージを生成し、書込リクエストは、書込み遂行の成功または失敗を示す応答を生成する。読出リクエストまたは書込リクエストのメッセージが能力と性能の釣り合いをとるのとよく類似して、応答メッセージはまた、マスタで柔軟性を多少失うという犠牲を払ってオーバーヘッドを最小にする。
【０１０８】
各ポイント・ツー・ポイント読出リクエストまたは書込リクエストに対して１つの応答メッセージが存在し、複数のデータワードが含まれる場合、複数の応答ワードが含まれ、その結果、送出されるあらゆるアドレスは、書込みの状態または読み出すためのデータという応答を戻される。メッセージ本体内のデータは、リクエストが送信されたときと同じ順序で戻される。要求しているノードに戻されて到着したときにデータがバスからすばやく取り除かれることを確実にするために、応答を切り離して記憶すべきアドレスをＭＢＮ内にプログラムする。応答場所を一度に１つだけ記憶することができるので、戻りで２ワード以上期待され、かつ自動メモリローディングの仕組みを使用する場合、各ＭＢＮは、一度に１つの未処理のトランザクションを有する可能性がある。プロセッサがノードからすべてのデータを抽出する場合、プロセッサが望むだけ多くのリクエストが未処理になる可能性がある。
【０１０９】
複数のエンドポイント応答すべてのために同じ応答メッセージフォーマットを使用するが、しかしながら、これら複数のエンドポイント応答では、単一の応答ワードをペイロードの中に挿入する。たとえば、読出メッセージでは、応答は、要求されたアドレスの値を、または安全な領域に対して有効ではない読出しを試みる場合にはセキュリティエラー制御ワードを含んでよい。あるいは、書込メッセージでは、応答は、リクエストによる書込みを遂行したかしなかったかを示す、成功または失敗の値を含んでよい。
【０１１０】
２つ以上の活動状態のノードは、複数のエンドポイント書込メッセージを受信する。このメッセージは、セル内部の通信用に有用であり、この場合、セルは、メッセージバス構成アドレス書込みを通してどのメッセージに反応すべきかを命令されることができる。セキュリティにより、書込みの発生を防止されることがあり、個々のワード状態が潜在的に妨害を生じさせるので、個々のワード状態ではなく、メッセージ全体に対して単一の書込状態が戻される。マルチ・キャスト・メッセージは、アレイを通して分配されるので、応答アドレスは、計算された、要求しているノードからのデルタオフセットとして記録される。これは、マスタへ応答メッセージを戻すために多くのパスを使用する結果となり、多くは、期待される、リクエストと同じパスに従わない。複数のエンドポイントメッセージの事例は、すべてのノードを一度にアドレスするブロードキャストメッセージである。
【０１１１】
また、メッセージ・バス・ノードの収集物から同じアドレスを読み出すことができることが有用であるときがあってよい。これらの事例では、複数のエンドポイント読出しが利用可能である。動作は、マルチ・ノード・アドレスに適合するノードだけが応答するように機能する。その他の複数のエンドポイントメッセージと同様に、応答パスは、応答するノードに至る途中に計算されたデルタオフセットにより決定される。応答は、いくつかのルートに従い、要求しているノードに戻り、ルートの多くは、ソースから宛先までとったパスと異なる。また、すべてのノードが応答し、１つのワードを戻す場合もある。
【０１１２】
各ノードで、ノードで許可される動作について記述するセキュリティ構成を維持する。この構成の設定は、安全な活動でなければならず、ブート動作の一部として選択されたＩＯプロセッサを通して実装される。このメッセージを使用して、セキュリティ構成を更新し、システム内の選択されたプロセッサによりセキュリティ構成を生成することができる。このメッセージのフォーマットは、固有であり、データ書込みにより構築することができず、したがって、識別されたセキュリティプロセッサだけが、このメッセージを生成することができる。唯一の考慮事項がメッセージの配送であるので、セキュリティ構成メッセージの生成につながる、基礎となるセキュリティ判定は、メッセージバスの範囲外である。機能ネットワークからデバッグを強制的に分離することを実装するためにマスタを無効にすることができるのとよく似て、セキュリティマスタに選択されないノードは、セキュリティメッセージを送信できないようになるが、この場合、ネットワーク隔離の場合のようにすべてのメッセージではなく、あるタイプのメッセージだけが制約される。
【０１１３】
メッセージバスを、図１５に示すように２次元メッシュネットワークとして実装してよい。追加で、２つの同一ネットワークが並列に動作しており、再結合点は、各ノード内部に位置する。図示する各リンクは、両方のネットワーク用に複製された入力ポートと出力ポートの両方を備え、両方のネットワークは、ノードの任意の側で有効な、総計で最大４つまでのメッセージのためにノードの同じ側で伝送および受信を同時に可能にする。ネットワークの一方の最大使用事例では、４つの入力ポートおよび４つの出力ポートすべてを利用して、ノード全体にわたりメッセージを転送することができる。最大使用事例で動作するとき、ルーティングの唯一の制約は、Ｕターンルートがまったく許可されないことであるが、他の３つの出力に至るルートの任意の他の組合せは、受入可能である。あらゆるノードで２つのネットワークが存在するが、２つのネットワークは、互いに完全に独立して動作し、２つのネットワーク間のルーティングは不可能であり、一方のネットワークで遮断を発生させる可能性があるが、他方のネットワークはアイドルである。
【０１１４】
他のトポロジと比較してメッシュネットワークとして実装する利点はいくつかあり、最大の利点は、障害物を迂回してルーティングする能力である。メッセージバスは、ノード間を動的にルーティングするネットワークであるので、他のメッセージによりすでに使用中のノードから、チップ全体の電力消費を低減するために電源が切られたノードまで、２つのノード間の直接パス上で障害物に遭遇する可能性が常に存在する。メッシュ構造は、宛先に到達するためのオプションを提供し、大部分の事例では、エンドポイントのより近くにメッセージを移動させる論理的方向が２つ存在し、端部により近くなる一方の方向が遮断された場合でさえ、別の方向が一般に存在することを意味する。ルーティングできないメッセージを有する可能性が依然としてあるが、これは、メッセージをルーティングするための障害では必ずしもないシステムの障害である電源を切った領域に位置するエンドポイントなど、要求されたエンドポイント間のパスがまったく存在しないことに起因する。
【０１１５】
メッシュネットワークの別の利点は、メッセージの移動距離が低減することである。多数のノードに対して、直列チェーン、複数のループ、行または列指向バス、およびメッシュといった、可能な接続法がいくつか存在する。直列チェーンでは、主要な欠点は、メッセージが２つの地点間を移動しなければならないことがある距離が長いことである。追加で、典型的にはチップを通して利用可能なパスが１つだけ存在するので、ネットワークで共存することができるメッセージの数は、一般に低減される。直列チェーンのアクセスタイミングは、可変であってよく、適切なタイミングマージンを求めて設計することが困難であることがある。
【０１１６】
大規模直列チェーンに伴う別の問題は、電力、およびノードのいずれかが、関係のないノードにアクセスする必要があるパスの一部である場合に任意の領域の電力を切ることができないことである。単一の直列バスに対する改善は、いくつかのより小さいループであるが、これは、ループ間を移動する必要があるという集中化問題、およびループ間の接続点で衝突が発生する場合に著しく遅延する可能性につながる。複数のループにはまた、ループ全体が、かなり大きな電力ステップをもたらす電力の入り切りを必要とするので、電力最適化に伴う問題があり続ける。同時アクセス数は、増大するが、独立したループ間でデータが移動しなければならない地点で依然として制限される。
【０１１７】
多重バス指向配列は、複数のループ構成に似た問題を有する、すなわち、さまざまなバスセグメント間で移動する必要がある地点は、最終的に相互接続ネットワーク全体の隘路になる。バス配列は、一度に複数のメッセージを送信するためのより容易な手段を実際に可能にするが、しかしながら、一方のバスセグメント上でメッセージを得る容易さは、異なるバスセグメント間で調停する必要があるという複雑さにより低減される。これにより、バス間相互接続の場所に応じて、バスセグメント間でデータを移動させることができるという理由だけで、機器の一定の領域がオンのままでなければならないことがある。機器の周囲にＩＯを散在させた状態で、データは、機器のどちらの側にも潜在的に親和性があるので、バス間コネクタを配置する理想的場所はない。これは、いくつかのレイアウトは比較的電力効率がよいという結果をもたらすが、一方では、他のバスセグメントと相互接続することができる、本来なら未使用の多数のノードをオンの状態で必要とするために、他のレイアウトを性能が劣ったレイアウトのままにする。
【０１１８】
メッシュはまた、多くのメッセージが並列に作動するのをサポートする。ルートには共通の隘路は存在しないので、多くのメッセージは、ネットワークを同時に通って移動できる。かなりの障害物を通ってルートが合併して、単一ノードを通過するように制約されない限り、各メッセージは、多くの場合、メッセージがいつ送信されたかにかかわらず別のメッセージに決して遭遇することなく進行することができる。各プロセッサが一度に１つのメッセージをサポートする場合、継続期間の長い同時発生メッセージの上限は、システム内にあるプロセッサの数に等しい。しかしながら、並列メッセージを配送して、メッセージに対する応答を戻すために必要なルートに応じて、輻輳は、実際の上限を低減することがある。
【０１１９】
メッセージバス構造内部のノードはすべて、マスタ、スレーブ、またはルートの中間点として機能するので、各ノードのこれらの基本機能について、本節で一般的に詳述する。正確なインタフェース詳細は、実施形態にわたり変わることがあり、この記述は、メッセージ・バス・ノード構成要素の機能的概観を提供する。システムの中に至るメッセージ・バス・ノードの一般的インタフェースを図１７に例示する。ＰＥリンクは必要ないので、ノードがＩＯバスでどのように取り付けられるかに変化があるが、基礎となる動作は類似している。
【０１２０】
例示するように、メッセージ・バス・ノード１７０１は、ペイロードおよびルーティング情報を含む第１のメッセージを受信し、ルーティング情報およびマルチ・プロセッサ・アレイの動作情報に基づき複数のメッセージノードのうちの異なるメッセージノードを選択するように構成される。本明細書で使用するとき、動作情報は、マルチ・プロセッサ・アレイの過去または現在の性能に関係がある情報である。たとえば、動作情報は、資源可用性、ネットワーク性能ヒューリスティクス、メッセージバスに関する輻輳情報などを含んでよい。いくつかの事例では、動作情報は、マルチ・プロセッサ・アレイの性能に関する現在の情報であってよく、一方では他の事例では、マルチ・プロセッサ・アレイの性能に関する履歴情報を含んでよい。いくつかの実施形態では、メッセージ・バス・ノードは、動作中にマルチ・プロセッサ・アレイから動作情報を受信してよいことが留意される。
【０１２１】
メッセージ・バス・ノード１７０１は、異なるメッセージノードに基づき第１のメッセージのルーティング情報を修正して、第２のメッセージを生成して、異なるメッセージノードに第２のメッセージを送付するようにさらに構成される。ルーティング情報は、本明細書で使用するとき、メッセージの絶対宛先または相対宛先を指定する情報である。相対宛先を指定するとき、メッセージの宛先を決定するために、開始ノードからノードの数および対応する方向を指定する。あるいは、絶対宛先を指定するとき、特定のノードを特に言及する識別子を宛先として指定する。各メッセージノードは、次いで、指定された絶対宛先にメッセージを伝播するために、メッセージを送付するための最良の可能なノードを決定してよい。以下でより詳細に記述するように、ルーティング情報は、いくつかのメッセージノードを指定するオフセット、およびメッセージをどの方向に送信すべきかを含むことができる。
【０１２２】
本明細書で使用し、記述するとき、メッセージは、ルーティング情報と共に、ペイロード（すなわち、メッセージの内容）を含むデータの集合体である。追加で、メッセージは、動作情報、または動作情報の任意の適切な部分を含むことができる。
【０１２３】
メッセージ・バス・ノード（または単に「メッセージノード」）をさまざまな設計スタイルに従って実装してよい。特定の実施形態を図１８に描く。例示するように、メッセージ・バス・ノード１８００は、ルータ１８０１、ルータ１８０２、ネットワークプロセッサ１８０３、ネットワークプロセッサ１８０４、アービタ１８０５、構成回路１８０６、およびテーブル１８０７を含む。
【０１２４】
メッセージ・バス・ノード１８００は、アービタ１８０５を通してＰＥおよびＤＭＲに取り付けられ、ＩＯバスの場合、アービタ１８０５は、ＩＯバスとメッセージバスの間のブリッジである。ローカルプロセッサからメッセージ・バス・ノード１８００に入るアクセスの目標は３つ存在する、すなわち、構成レジスタ（構成回路１８０６内に配置される）ならびにネットワークプロセッサ１８０３および１８０４である。追加で、ネットワークプロセッサ１８０３および１８０４は、ローカルノードへのアクセスを生成している可能性があり、メッセージ・バス・ノード１８００からＤＭＲまたはＰＥに戻る１つのアクセスパスだけが可能である。ノードの構成、どのタイプのアクセスか、遠隔リクエスト処理、生成されているローカルリクエスト、または記憶されている応答に基づき、アービタ１８０５は、ＰＥおよびＤＭＲインタフェースにネットワークプロセッサ１８０３および１８０４の一方を接続する。
【０１２５】
リクエスト生成だけがネットワーク側からの機能停止を受けやすいので、ＤＭＲまたはＰＥへのすべての書込みを即座に生成することができる。書込リクエストに対するデータを記入するために、または処理されている遠隔アクセスに応答して読出しを要求される場合、アービタ１８０５は、他方のネットワークプロセッサに切り替える前に一方のリクエストが完了するのを待たなければならない。ＤＭＲまたはＰＥがリクエストを機能停止させた場合、そのアクセスがより高い優先度になるように構成される場合には現在のリクエストを取り除いて、他方のネットワークプロセッサに切り替えることが可能である。ＰＥまたはＤＭＲは、アクセスをすでに機能停止させたので、他方のプロセッサにアクセスを切り替えることにより影響を受ける移行中のデータは存在しない。
【０１２６】
アービタ１８０５はまた、要求されたアドレスに基づき、レジスタバスのトラフィックを適切なネットワークプロセッサまたは構成レジスタに向けるように構成される。アービタ１８０５はまた、遠隔アクセスが構成レジスタを現在使用している場合、構成レジスタがローカルノードと遠隔アクセスの間でメッセージ・バス・ノード１８００内の唯一の競合点であるので、レジスタ・バス・インタフェース上に戻って機能停止を生成する。
【０１２７】
ネットワークプロセッサ１８０４および１８０５は、取り付けられたＰＥ／ＤＭＲまたはＩＯバスと、メッセージ・バス・ノードの残りの部分との間の相互作用の責任を負う。ネットワークプロセッサ１８０３および１８０４が満たす責任は３つあり、第１の責任は、ネットワークの中にリクエストメッセージを生成することである。第２の機能は、ネットワークから受信したメッセージを処理し（メッセージのルーティング情報を修正することを含む）、書込みまたは読出しのために、メッセージで要求されたローカルアドレスにアクセスすることである。最後の機能は、リクエストメッセージに応答して、受信した返答メッセージを処理することである。
【０１２８】
ネットワークプロセッサ（たとえば、ネットワークプロセッサ１８０３）の第１の機能は、ネットワークの中に新しいメッセージを生成することである。これは、２つの方法のうち一方で、すなわち第１の方法で達成され、単一ワードメッセージでは、ＰＥは、アクセスすべき遠隔ノードまたは複数のエンドポイントグループに至るノードデルタ、アクセスすべき遠隔ノードのアドレス、および書込みの場合には書き込みデータを書き込むことができる。ネットワークプロセッサは、次いでメッセージ構造を生成し、配送するためにルータにメッセージを送信する。２ワード以上のワードの長さを意味する、より長いメッセージでは、ＰＥは、遠隔ノードに至るノードデルタ、遠隔ノードの開始アドレス、遠隔ノードの終了アドレス、および書込データを見いだすことができるＤＭＲ内のローカルアドレスを、または読出しの場合には、戻りデータを記憶する場所を書き込む。これらの値が構成されると、ネットワークプロセッサは、ルータへのメッセージ構造を生成し、ＤＭＲへの読出リクエストを生成して、必要な書込データをフェッチする。
【０１２９】
ネットワークプロセッサの第２の機能は、ネットワークから受信したメッセージを処理し、応答を提供することである。この場合、到着しているメッセージ構造は分解され、アクセスすべき最初と最後のアドレスは切り離して記憶される。読出しの場合、最初のアドレスで始まり、最後のアドレスに到達するまで継続する、ＤＭＲへの読出リクエストを生成する。アクセスしている領域がセキュリティにより保護されていないかの確認を遂行し、本構成ではアクセスできない読出ワードに関するデータの代わりにエラー値が戻される。書込みの場合、ネットワークプロセッサは、第１のデータワードが到着するまで待ち、次いで、受信したワードごとにＤＭＲへの書込みを生成する。書込みは、アドレスがセキュリティ構成アドレスである場合、受信したメッセージもまたセキュリティメッセージのタイプであることを検証するための追加の確認を遂行させる。
【０１３０】
ネットワークプロセッサの第３の機能は、リクエストに対する応答を受信し、プロセッサが読み出すために応答を戻して記憶することである。このステップには２つのオプションがあり、第１のオプションは、プロセッサがメッセージ・バス・ノード１８００の応答レジスタから応答を直接読み出すことができる単一ワード応答に関するものである。ネットワーク内で複数ワードメッセージが機能停止するのを防止するために、２ワード以上戻されたとき、ネットワークプロセッサは、これらのワードをＤＭＲメモリに戻して記憶する。読出リクエストが生成されたときには、アドレス範囲を記憶する応答もまたメッセージ・バス・ノード１８００内で構成されていた。ネットワークプロセッサは、事前にプログラムされたアドレス範囲を使用して、応答を戻して記憶し、安全手段として、メッセージで戻されていてよい任意の追加データを捨てる。
【０１３１】
単一資源を求めて競合する機能が３つあるので、ネットワークプロセッサはまた、任意の所与の時点にどの活動を行うべきかを判断しなければならない。実際には、応答またはリクエストのサービスだけがネットワークプロセッサのルータ側で活動状態になることができ、かつリクエスト生成はＰＥ／ＤＭＲ側で活動状態になることができるので、３つのうちの２つだけが同時に存在することができる。調停に伴う主要な問題は、デッドロック条件が形成される可能性がないことを保証することであり、デッドロックの回避は、デッドロックの可能性のある動作のもとではシステムの性能よりも重要である。システムは、メッセージがシステム内をどのように流れるかを計画することができるので、調停方式は、３つのオプションのうちの１つから選択される。第１の方式では、最初に入ったものが最初に処理される。このモードでは、ノードは、任意の他のメッセージを考慮する前に、ネットワークまたはプロセッサの側から到着する最初のリクエストを処理し、そのメッセージを完了するまで処理する。これは、ネットワークの性能を完全に維持する最も簡単な方法であるが、しかしながら、デッドロックを受けやすい。第２の方法は、アクセスするために２つのリクエストの間を交互に行うラウンドロビン処理である。不都合なことに、ＤＭＲインタフェースのパイプラインの深さに起因して、第２の方法は、アクセス速度を２／５に落とす可能性がある。事実上起こることは、戻りに関する書込み、もしくは遠隔読出しである、または書込みは、１サイクルを占有し、次のサイクルは、書込データのローカル書込メッセージ読出を処理し、次いで、インタフェースは、これら２つのアクセスが完了するのを待たなければならない。待つことにより、性能が著しくより低くなるという犠牲を払って、ＤＭＲパイプラインと相互作用するネットワーク機能停止は回避される。犠牲と機能停止回避の間には、ＭＢＮに入るメッセージおよびＭＢＮを離れるメッセージが両方とも同じノードの間にあるわけではないことを判断するための手段がある。多重ノードデッドロックの可能性があるが、システムは、ハードウェアが保護しないようなシナリオを積極的に生み出さなければならない。データがどこから来るのかを確認し、データがどこに行こうとしているのかを比較することにより、競合している２つのメッセージがデッドロックを生成する可能性があるかどうかを判断することが可能であり、そのようなシナリオでは、ラウンドロビン動作を選択することができる。さもなければ、フルスピードで走るＦＩＦＳをシステムに及ぶメッセージ配送としてデフォルトにすることができ、メッセージは、ラウンドロビンを実装する場合よりも速やかに完了する。
【０１３２】
ルータ１８０１およびルータ１８０２の各々は、対応するネットワークに連結され、ネットワークからメッセージを受信して、ネットワークプロセッサ１８０３および１８０４により生成されたメッセージをメッセージに対応する次の宛先に送付するように構成される。ルータ１８０１および１８０２は、複数のスイッチ、またはネットワークプロセッサ１８０３および１８０４をそれらの対応するネットワークに連結するように構成された他の適切な回路を含んでよい。
【０１３３】
ルータ１８０１および１８０２は同一であり、それぞれ、ノードを通して渡されるデータに対して２つの主要な動作を遂行する。第１の動作は、ノードに向けることを意図したメッセージを識別することである。これは、配送されたノード・デルタ・アドレスの２バイトを見て、１組のゼロ値を見つけ出すと、メッセージの次の内容を抽出し始め、スレーブプロセッサにその内容を配送することを伴う。
【０１３４】
一致が見つからないとき、第２の主要な動作は、次のノードにメッセージを送付することであり、宛先に向けて進行する。宛先に向けた進行は、潜在的に２つの方向となる可能性があり、宛先までより近く導く２つのオプションに沿ったパスが利用できない場合、第３の方向に迂回するオプションを伴う。後戻りは許されていないので、データが到着する方向はオプションではなく、システム設計の基礎となる要件は、ルーティング規則に従うとき、ルートがＵターンする必要がないように通信すべき２つのノード間でパスを許可することである。
【０１３５】
ルータはまた、ネットワークの中に新しいメッセージを挿入する責任がある。ネットワークの中にメッセージを挿入するためには、宛先デルタオフセットは既知であり、宛先に向かう２つの論理的方向の出力の一方が使用されていない限りメッセージは受け入れられ、メッセージバスの中に配置される。第１のアドレスおよびデータ対の直前に、要求された動作の結果と共に宛先ノードが返答することができるように、メッセージの中に応答デルタスロットを挿入する。応答デルタは、ネットワークを通ってメッセージがとるパスに基づき自動的に更新され、エラー応答の場合には進路に沿った任意のノードが、または宛先ノードが、リクエストメッセージに応答して応答を送信すべき正確な宛先を有することができるようにする。
【０１３６】
メッセージバス内部のアドレスについて論じるとき、メッセージ・バス・ノードのアドレスと、そのノードにルーティングするためにメッセージの中に配置された値を区別することが重要である。ノードのアドレスは事実上、ＩＯノード、ＰＥおよびＤＭＲを包含するコアアレイの場所、およびアレイの右上隅で発生するようにＤＭＲだけを包含するコアノードを含む、アレイ全体の内部にあるノードのＸ、Ｙ座標の場所である。場所（０，０）は、機器の左下隅に見いだされ、ブートプロセッサに接続され、主コアアレイの外側に配置される。コアアレイは、図１９でアレイ全体の上に示すように、これら４隅（１，１）、（１，１７）、（１７，１７）、および（１７，１）により境界を定められ、図のフォーマットは（上部番号、下部番号）であることに留意されたい。
【０１３７】
メッセージ・バス・ノードの場所のアドレスは、メッセージヘッダで使用するためのルーティングデルタ情報を生成する際に使用される。メッセージに必要なルーティングデルタを計算するために、２つの場所の符号付差分を使用して、ソースノードから宛先ノードへ移行するためにメッシュの各方向で横断する必要があるノードの数を識別する。たとえば、（２，２）から（４，７）まで移動するためには、デルタアドレス（＋２，＋５）を使用し、戻りルートは（−２，−５）である。これは、宛先は、現在の場所の２ノード東、かつ５ノード北にあることを示す。これにより、ルーティング情報が相対的であるのでセルの柔軟な配置が可能になり、セルが移動した場合、エンドポイントは同様の距離だけ移動し、２つの場所の間のデルタは変わらないままである。
【０１３８】
いくつかの事例では、テーブル１８０７に記憶した情報を使用して、ルーティングデルタを決定してよい。たとえば、メッセージに含まれる宛先情報をテーブル１８０７へのインデックスとして使用して、データを取り出してよい。そのようなデータは、メッセージが送付されるべき次のメッセージ・バス・ノードを指定してよい。テーブル１８０７を、スタティック・ランダム・アクセス・メモリ（ｓｔａｔｉｃ  ｒａｎｄｏｍ−ａｃｃｅｓｓ  ｍｅｍｏｒｙ、ＳＲＡＭ）、レジスタファイル、または他の適切な記憶回路として実装してよい。さまざまな実施形態では、テーブル１８０７に記憶した情報を、ブートシーケンスの間にロードしてよく、マルチ・プロセッサ・アレイの動作中に更新してよい。
【０１３９】
８ビットの行アドレス値および列アドレス値を前提として、メッセージバスが２５６×２５６のノードアレイに及ぶことが可能であってよい。そのようなノードアレイを実現すること、ならびにメッセージバスが、一定のままで残る、技術ノードが縮小するようにスケール変更する、または複数のダイアレイ構成をサポートすることができるようにすることは、後の世代で行われてよく、いくつかの世代の間に改訂する必要がないアドレスのフォーマットを選択してよい。
【０１４０】
メッセージが宛先ノードに到達すると、アクセスすべき宛先ノードに値を配置するために第２のアドレスが必要である。拡張するのに十分な余地がある行アドレスおよび列アドレスと異なり、ＰＥ／ＤＭＲの宛先ノード・ローカル・アドレス構成要素は、実際にはむしろ空間的に余裕がない。現在規定されているように、１６ｋワードのＤＭＲデータメモリ、８ｋワードのＰＥ命令メモリ、ＤＭＲレジスタバス空間、ＰＥ内部レジスタ、およびメッセージバス内部構成レジスタが存在する。ローカルアドレスは、１６ビットのワードすべてを必要とするわけではなく、かつ読出書込命令は１ビットだけを必要とするので、ビット１５の場所を制御ビットとして利用する。これはまた、書き込む、または読み出すバーストごとにアドレスが反復されるので便利であり、バーストごとに読出しおよび書込みを選択できるようにすることにより、アクセスの制御を適用するための柔軟で効率的手段が提供される。
【０１４１】
ＩＯバス・インタフェース・ノードでは、バスは、３２ビットアドレスで動作する。メッセージフォーマットに基づき、１５ビットだけがバーストごとに転送され、その結果、メッセージにより１７ビットが使途不明である。これらの残りのビットに関しては、ページレジスタが使用され、暗黙の上位ビット０を用い、その結果、ＩＯバスがすべての必要なメモリ空間および周辺空間を配置するのに十分以上の、潜在的に３１ビットのアドレスが利用可能である。ＩＯバスにアクセスするメッセージの一部として、メッセージは、書き込まれた最後の値をページが保持するので、ページレジスタへの書込みから開始すべきであり、別のマスタが、現在のマスタが期待していた値と異なる値にページレジスタを設定した場合、潜在的に意図しないアクセス場所につながる。
【０１４２】
メッセージ・バス・ノードの動作をさらに例示するために、メッセージ・バス・ノードを動作させるための方法のある実施形態を描く流れ図を図２２に例示する。メッセージ・バス・ノード１８００または任意の他の適切なメッセージ・バス・ノードに適用してよい方法は、ブロック２２０１で始まる。
【０１４３】
方法は、マルチ・プロセッサ・アレイに含まれる複数のメッセージノードのうちの特定のメッセージノードにより、ペイロードおよびルーティング情報を含む第１のメッセージを受信するステップ（ブロック２２０２）を含む。上述のように、特定のメッセージノードに連結した複数のメッセージバスの１つを介して第１のメッセージを受信してよい。
【０１４４】
方法はまた、特定のメッセージノードにより、ルーティング情報およびマルチ・プロセッサ・アレイの動作情報に基づき、複数のメッセージノードのうちの異なるメッセージノードを選択するステップ（ブロック２２０３）を含む。上記で指摘したように、異なるメッセージノードは、ルーティング情報に含まれる相対オフセット、および動作情報に含まれる輻輳または他のヒューリスティクスに基づいてよい。
【０１４５】
追加で、方法は、特定のメッセージノードにより、異なるメッセージノードに基づく第２のメッセージを生成するステップ（ブロック２２０４）を含む。さまざまな実施形態では、ネットワークプロセッサ（たとえば、ネットワークプロセッサ１８０３）は、どのメッセージノードが選択されたかに基づき第２のメッセージを生成してよい。いくつかの事例では、第２のメッセージは、後続のメッセージノードの上にメッセージを送付するために、異なるメッセージノードにより使用することができる修正ルーティング情報を含んでよい。
【０１４６】
方法は、特定のメッセージノードにより、異なるメッセージノードに第２のメッセージを送付するステップ（ブロック２２０５）をさらに含む。いくつかの実施形態では、ルータ（たとえば、ルータ１８０１）は、第１のメッセージのルーティング情報に含まれる相対オフセットに基づき第２のメッセージを送付してよい。ルータは、メッセージをどの方向に送信すべきかを判断する際にそのような相対オフセットを使用することができる。方法は、ブロック２２０６で終了する。
【０１４７】
ＨｙｐｅｒＯｐデータパス
図２０を参照すると、ＨｙｐｅｒＯｐデータパスのある実施形態が示されている。例示するように、ＨｙｐｅｒＯｐデータパスは、ＤＰ０およびＤＰ１として識別される２つのデータパスを含む。ＤＰ０およびＤＰ１の各々は、同一であってよく、積算回路、加算回路、シフタ回路だけではなく、データパスを通してオペランドを移動させるための追加回路も含んでよい。マルチ・プロセッサ・アレイ内の所与のＰＥは、図２０に描くＨｙｐｅｒＯｐデータパスを含んでよいことが留意される。
【０１４８】
上記で記述したマルチ・プロセッサ・アーキテクチャを用いて、異なるプログラミングモデルを採用してよい。そのようなプログラミングモデルの例を図２１に描く。例示するように、図２１は、ＡＳＭおよびＨｙｐｅｒＯｐのプログラミングモデルを含む。異なるプログラミングモデルに関する追加の詳細およびコーディング例について、以下で記述する。各例は以下を含む：
●Ｃ―機能動作／アルゴリズムを記述する基準コード。
●ＡＳＭ―６４ビット命令を使用して動作／アルゴリズムをどのように実装するかの１つまたは複数の例。ＡＳＭはまた、二重ＤＰにアクセスするためにベクトル組込関数（ｖｅｃｔｏｒ  ｉｎｔｒｉｎｓｉｃ）（擬似ＡＳＭ命令）を使用する例を含む。ベクトル組込関数は、ＨｙｐｅｒＯｐ命令にマッピングされる、ＡＳＭに似た命令である。
●ＨｙｐｅｒＯｐ―１２８ビット命令を使用して動作／アルゴリズムをどのように実装するかの１つまたは複数の例。
【０１４９】
メモリオペランド
【０１５０】
ＡＳＭコード
ａｄｄ１６ｓ  Ｍ１．Ｈ，Ｍ２．Ｈ，Ｍ３．Ｈ
ａｄｄ１６ｓ  Ｍ１．Ｌ，Ｍ２．Ｌ，Ｍ３．Ｌ
【０１５１】
ＨｙｐｅｒＯｐコード
｜Ａ｜  ｌｄ３２  Ｍ１，％Ａ；  ／／３２ビットのＭ１からＳＩＭＤデータをロードする
｜Ｂ｜  ｌｄ３２  Ｍ２，％Ｂ；  ／／３２ビットのＭ２からＳＩＭＤデータをロードする
｜ＤＰ１｜  ａｄｄ１６ｓ  ％ＡＨ，％ＢＨ，％ＡＣＣ２；  ／／ＡＣＣ２＝Ｍ１［０］＋Ｍ２［０］
｜ＤＰ０｜  ａｄｄ１６ｓ  ％ＡＬ，％ＢＬ，％ＡＣＣ０；  ／／ＡＣＣ０＝Ｍ１［１］＋Ｍ２［１］
｜Ｄ｜  ｄｓｔ１６  ％ＡＣＣ２＿ＡＣＣ０，Ｍ３；  ／／３２ビットのＭ３にＳＩＭＤの結果を記憶する
【０１５２】
即値オペランド
【０１５３】
ＡＳＭコード
ｓｕｂ１６  ％ｒ２，＄１０，％ｒ８
【０１５４】
ＨｙｐｅｒＯｐコード
｛
｜Ａ｜  ｌｄ１６  ％ｒ２，％ＡＬ；  ／／１６ビットのＲ２をロードする
｜Ｃ｜  ｌｄ１６  ＄１０，％ＣＬＨ；  ／／１６ビットの即値１０をロードする
｜ＤＰ１｜  ｓｕｂ１６ｓ  ％ＡＬ，％ＣＬＨ，％Ｄ１；  ／／Ｄ１＝Ｒ２−１０
｜Ｄ｜  ｓｔ１６  ％Ｄ１，％ｒ８；  ／／１６ビットのＲ８に結果を記憶する
｝
ｌｏａｄ  ｉｍｍｅｄは、スロットＣを使用して、％Ｃレジスタの１６ビットセグメントをロードするが、スロットＢを使用して、％Ｂレジスタの１６ビットセグメントをロードすることができるに留意されたい。
【０１５５】
スカラー上での条件付実行
【０１５６】
Ｃコード
ｉｎｔ１６  ａ，ｂ，ｃ，ｄ，ｅ；
ｉｆ（ａ＞ｂ）
ｅ＝ｃ＋ｄ；
【０１５７】
ＡＳＭコード
／／仮定：
／／ａは％Ｒ２の中にある
／／ｂは％Ｒ３の中にある
／／ｃは％Ｒ４の中にある
／／／／ｄは％Ｒ５の中にある
／／ｅは％Ｒ６の中にある
／／％Ｒ７をｔｍｐとして使用する
ｔｃｍｐ１６ｓ  ＧＴ  ％Ｒ２，％Ｒ３，％Ｐ０
ａｄｄ１６ｓ  ％Ｒ４，％Ｒ５，％Ｒ７
ｃｍｏｖ１６  （％Ｐ０）  ％Ｒ７，％Ｒ６
【０１５８】
ＨｙｐｅｒＯｐコード（条件付記憶スロット）―バージョン１
｛
｜Ａ｜  ｌｄ１６ｓ  ％Ｒ２，％ＡＬ；  ／／１６ビットのＲ２をロードする
｜Ｂ｜  ｌｄ１６ｓ  ％Ｒ３，％ＢＬ；  ／／１６ビットのＲ３をロードする
｜ＤＰ０｜  ｔｃｍｐ１６ｓ  ＧＴ  ％ＡＬ，％ＢＬ，％Ｐ０；  ／／Ｒ２＞Ｒ３を試験して、述語Ｐ０を設定する
｝
｛
｜Ａ｜  ｌｄ１６ｓ  ％Ｒ４，％ＡＨ；  ／／１６ビットのＲ４をロードする
｜Ｂ｜  ｌｄ１６ｓ  ％Ｒ５，％ＢＨ；  ／／１６ビットのＲ５をロードする
｜ＤＰ０｜  ａｄｄ１６ｓ  ％ＡＨ，％ＢＨ，％Ｄ０；  ／／Ｄ０＝Ｒ４＋Ｒ５
｜Ｄ｜  ｓｔ１６  （％Ｐ０）  ％Ｄ０，％Ｒ６；  ／／Ｐ０が真であれば、１６ビットのＲ６に結果を記憶する
｝
【０１５９】
ＨｙｐｅｒＯｐコード（条件付記憶スロット）―バージョン２
｛
｜Ａ｜  ｌｄ３２  ％Ｒ２．ｄ，％Ａ；  ／／３２ビットのＲ２：Ｒ３をロードする
｜Ｂ｜  ｌｄ３２  ％Ｒ４．ｄ，％Ｂ；  ／／３２ビットのＲ４：Ｒ５をロードする
｜ＤＰ１｜  ｔｃｍｐ１６ｓ  ＧＴ  ％ＡＨ，％ＡＬ，％Ｐ０；  ／／Ｒ２＞Ｒ３を試験して、述語Ｐ０を設定する
｜ＤＰ０｜  ａｄｄ１６ｓ  ＧＴ  ％ＢＨ，％ＢＬ，％Ｄ０；  ／／Ｄ０＝Ｒ４＋Ｒ５
｝
｛
｜Ｄ｜  ｓｔ１６  （％Ｐ０）  ％Ｄ０，％Ｒ６；  ／／Ｐ０が真であれば、１６ビットのＲ６に結果を記憶する
｝
【０１６０】
注：
●ＡＳＭモデルでの条件付実行は、ＣＭＯＶを用いる場合だけ利用できる
●ｔｅｍｐレジスタに結果を計算することを必要とし、次いで条件付きで宛先に移動させる
●ＨｙｐｅｒＯｐモデルでの条件付実行は、条件がスロットに独立して適用できるようにする
●述語型実行は、同じ命令ではなく前の命令で設定された述語フラグＰｎを使用する
●条件付記憶は、別個の命令のスロットＤで行われる
●後続のＨｙｐｅｒＯｐで条件付記憶を隠すことが可能であってよい
【０１６１】
ベクトル上での条件付実行
【０１６２】
Ｃコード
ｉｎｔ１６  ａ［２］，ｂ［２］，ｃ［２］，ｄ［２］，ｅ［２］；
ｉｆ（ａ［０］＞ｂ［０］）
ｅ［０］＝ｃ［０］＋ｄ［０］；
ｉｆ（ａ［１］＞ｂ［１］）
ｅ［１］＝ｃ［１］＋ｄ［１］；
【０１６３】
ＡＳＭコード
／／仮定：
／／ａ［０］、ａ［１］は％Ｒ２、％Ｒ３の中にある
／／ｂ［０］、ｂ［１］は％Ｒ４、％Ｒ５の中にある
／／ｃ［０］、ｃ［１］は％Ｒ６、％Ｒ７の中にある
／／ｄ［０］、ｄ［１］は％Ｒ８、％Ｒ９の中にある
／／ｅ［０］、ｅ［１］は％Ｒ１０、％Ｒ１１の中にある
／／％Ｒ１２、％Ｒ１３をｔｅｍｐとして使用する
ｔｃｍｐ１６ｓ  ＧＴ  ％Ｒ２，％Ｒ４，％Ｐ１
ｔｃｍｐ１６ｓ  ＧＴ  ％Ｒ３，％Ｒ５，％Ｐ０
ａｄｄ１６ｓ  ％Ｒ６，％Ｒ８，％Ｒ１２
ａｄｄ１６ｓ  ％Ｒ７，％Ｒ９，％Ｒ１３
ｃｍｏｖ１６  （％Ｐ１）  ％Ｒ１２，％Ｒ１０
ｃｍｏｖ１６  （％Ｐ０）  ％Ｒ１３，％Ｒ１１
【０１６４】
ＨｙｐｅｒＯｐコード（二重条件付記憶）
｛
｜Ａ｜  ｌｄ３２  ％Ｒ２．Ｄ，％Ａ；  ／／３２ビットのＲ２：Ｒ３をロードする
|｜Ｂ｜  ｌｄ３２  ％Ｒ４．Ｄ，％Ｂ；  ／／３２ビットのＲ４：Ｒ５をロードする
｜ＤＰ１｜  ｔｃｍｐ１６ｓ  ＧＴ  ％ＡＨ，％ＢＨ，％Ｐ１；  ／／Ｒ２＞Ｒ４を試験して、述語Ｐ１を設定する
｜ＤＰ０｜  ｔｃｍｐ１６ｓ  ＧＴ  ％ＡＬ，％ＢＬ，％Ｐ０；  ／／Ｒ３＞Ｒ５を試験して、述語Ｐ０を設定する
｝
｛
｜Ａ｜  ｌｄ３２  ％Ｒ６．Ｄ，％Ａ；  ／／３２ビットのＲ６：Ｒ７をロードする
｜Ｂ｜  ｌｄ３２  ％Ｒ８．Ｄ，％Ｂ；  ／／３２ビットのＲ８：Ｒ９をロードする
｜ＤＰ１｜  ａｄｄ１６ｓ  ％ＡＨ，％ＢＨ，％Ｄ１；  ／／Ｄ１＝Ｒ６＋Ｒ８
｜ＤＰ０｜  ａｄｄ１６ｓ  ％ＡＬ，％ＢＬ，％Ｄ０；  ／／Ｄ０＝Ｒ７＋Ｒ９
｜Ｄ｜  ｄｓｔ１６  （％Ｐ１  ％Ｐ０）  ％Ｄ１＿Ｄ０，％Ｒ１０．Ｄ；  ／／Ｐ１が真である場合、１６ビットのＲ１０にＤ１を記憶し、Ｐ０が真である場合、
／／１６ビットのＲ１１にＤ０を記憶する
｝
【０１６５】
注：
●条件付実行はスロットＤ命令に適用される
●ＳＩＭＤ述語実行モードを使用する
●ｉｆ（％Ｐ１  ％Ｐ０）  ｛…｝
●％Ｐ１は上位ワードを制御する
●％Ｐ０は下位ワードを制御する
【０１６６】
アレイの非ゼロ要素を検出して、値を保存する
【０１６７】
Ｃコード
ｉｎｔ１６  ａ［Ｎ］，ｂ［Ｎ］；
ｉｎｔ１６  ｉ，ｊ；
ｊ＝０；
ｆｏｒ（ｉ＝０，ｉ＜Ｎ；ｉ＋＋）
｛
ｉｆ（ａ［ｉ］＜＞０）
ｂ［ｊ＋＋］＝ａ［ｉ］；
｝
【０１６８】
ＧＰｎを使用するＡＳＭコード
／／仮定：
／／ｉとして％Ｉ１を使用する
／／ｊとして％Ｉ２を使用する
／／％Ｂ１はａ［］を指す
／／％Ｂ２はｂ［］を指す
／／一時的ＧＲとして％Ｉ０を使用する
ｇｍｏｖｉ  ＄０，％Ｉ２  ／／Ｉ２＝０
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄１，％Ｉ１，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
ｍｏｖ１６  ０［％Ｂ１＋％Ｉ１］，％Ｉ０  ／／Ｉ０＝ａ［ｉ］
／／ＥＸに％Ｉ０をロードして、ＦＤで使用するときに＋４サイクル機能停止する
ｇｔｃｍｐｓ  ＮＥ  ％Ｉ０，＄０，％ＧＰ０  ／／ａ［ｉ］＜＞０を試験し、述語ＧＰ０を設定する
ｃｍｏｖ１６  （％ＧＰ０）  ０［％Ｂ１＋％Ｉ１］，０［％Ｂ２＋％Ｉ２］  ／／ＧＰ０が真である場合、１６ビットのｂ［ｊ］にａ［ｉ］を移動する
ｇａｄｄ  （％ＧＰ０）  ％Ｉ２，＄１，％Ｉ２  ／／ＧＰ０が真であれは、ｊ＋＋する
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
サイクル：２＋Ｎ（１＋４＋３）＝２＋８Ｎ
【０１６９】
Ｐｎを使用するＡＳＭコード
ｇｍｏｖｉ  ＄０，％Ｉ２  ／／Ｉ２＝０
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄１，％Ｉ１，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
ｔｃｍｐ１６ｓ  ＮＥ  ０［％Ｂ１＋％Ｉ１］，＄０，％Ｐ０  ／／ａ［ｉ］＜＞０を試験し、述語Ｐ０を設定する
ｃｍｏｖ１６  （％Ｐ０）  ０［％Ｂ１＋％Ｉ１］，０［％Ｂ２＋％Ｉ２］  ／／Ｐ０が真である場合、１６ビットのｂ［ｊ］にａ［ｉ］を移動する
／／ＥＸの中に％Ｐ０を設定して、ＦＤで使用するときに＋３サイクル機能停止する
ｇａｄｄ  （％Ｐ０）  ％Ｉ２，＄１，％Ｉ２  ／／Ｐ０が真である場合、ｊ＋＋する
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
サイクル：２＋Ｎ（２＋３＋１）＝２＋６Ｎ
【０１７０】
Ｐｎを使用する簡単なＨｙｐｅｒＯｐコード（条件付Ｇスロット実行）
／／仮定：
／／％Ｂ１はａ［］を指し、ｉは％Ｉ１の中にある
／／％Ｂ２はｂ［］を指し、ｊは％Ｉ２の中にある
ｇｍｏｖｉ  ＄０，％Ｉ２  ／／Ｉ２＝０
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄１，％Ｉ１，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
｛
｜Ａ｜  ｌｄ１６  ０［％Ｂ１＋％Ｉ１］，％ＡＬ；  ／／１６ビットのａ［ｉ］をロードする
｜ＤＰ０｜  ｍｏｖ１６ｓ  ％ＡＬ，％Ｄ０；
｜ＤＰ１｜  ｔｃｍｐ１６  ＮＥ  ％ＡＬ，＄０，％Ｐ０；  ／／ａ［ｉ］＜＞０を試験して、述語Ｐ０を設定する
｝
｛
｜Ｄ｜  ｓｔ１６  （％Ｐ０）  ％Ｄ０，０［％Ｂ２＋％Ｉ２］；  ／／Ｐ０が真である場合、１６ビットのｂ［ｊ］にａ［ｉ］を移動する
｝
／／ＥＸの中に％Ｐ０を設定して、ＦＤで使用するときに＋３サイクル機能停止する
｛
｜Ｇ｜  ｇａｄｄ  （％Ｐ０）  ％Ｉ２，＄１，％Ｉ２  ・・Ｐ０が真である場合、ｊ＋＋する
｝
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
サイクル：２＋Ｎ（１＋１＋３＋１）＝２＋６Ｎ
【０１７１】
Ｐｎを使用してパイプライン化されたＨｙｐｅｒＯｐコード（条件付記憶）
／／仮定：
／／％Ｂ１はａ［］を指し、ｉは％Ｉ１の中にある
／／％Ｂ２はｂ［］を指し、ｊは％Ｉ２の中にある
ｇｄｍｏｖｉ  ＄０，＄１，％Ｉ２，％Ｓ２  ／／Ｉ２＝０，Ｓ２＝１
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄４  ％Ｉ１，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
｛｜Ａ｜  ｌｄ１６  ０［％Ｂ１＋％Ｉ１］，％ＡＬ；｜ＤＰ１｜  ｍｏｖ１６  ％ＡＬ，％ＡＣＣ０；｜ＤＰ０｜  ｔｃｍｐ１６  ＮＥ  ％ＡＬ，＄０，％Ｐ０；｝
｛｜Ａ｜  ｌｄ１６  １［％Ｂ１＋％Ｉ１］，％ＡＬ；｜ＤＰ１｜  ｍｏｖ１６  ％ＡＬ，％ＡＣＣ１；｜ＤＰ０｜  ｔｃｍｐ１６  ＮＥ  ％ＡＬ，＄０，％Ｐ１；｝
｛｜Ａ｜  ｌｄ１６  ２［％Ｂ１＋％Ｉ１］，％ＡＬ；｜ＤＰ１｜  ｍｏｖ１６  ％ＡＬ，％ＡＣＣ２；｜ＤＰ０｜  ｔｃｍｐ１６  ＮＥ  ％ＡＬ，＄０，％Ｐ２；｝
｛｜Ａ｜  ｌｄ１６  ３［％Ｂ１＋％Ｉ１］，％ＡＬ；｜ＤＰ１｜  ｍｏｖ１６  ％ＡＬ，％ＡＣＣ３；｜ＤＰ０｜  ｔｃｍｐ１６  ＮＥ  ％ＡＬ，＄０，％Ｐ３；｝
／／ＥＸの中に％Ｐ０を設定して、ＦＤで使用するときに＋１サイクル機能停止する
｛｜Ａ｜  ｉｎｃｒ  （％Ｐ０）  ＄（＿＿ｉ２Ｍａｓｋ）；｜Ｄ｜  ｓｔ１６  （％Ｐ０）  ％ＡＣＣ０，０［％Ｂ２＋％Ｉ２］；｝
｛｜Ａ｜  ｉｎｃｒ  （％Ｐ１）  ＄（＿＿ｉ２Ｍａｓｋ）；｜Ｄ｜  ｓｔ１６  （％Ｐ１）  ％ＡＣＣ１，０［％Ｂ２＋％Ｉ２］；｝
｛｜Ａ｜  ｉｎｃｒ  （％Ｐ２）  ＄（＿＿ｉ２Ｍａｓｋ）；｜Ｄ｜  ｓｔ１６  （％Ｐ２）  ％ＡＣＣ２，０［％Ｂ２＋％Ｉ２］；｝
｛｜Ａ｜  ｉｎｃｒ  （％Ｐ３）  ＄（＿＿ｉ２Ｍａｓｋ）；｜Ｄ｜  ｓｔ１６  （％Ｐ３）  ％ＡＣＣ３，０［％Ｂ２＋％Ｉ２］；｝
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
サイクル：１＋Ｎ／４（４＋１＋４）＝１＋２．２５Ｎ
【０１７２】
２つのＰＥを使用するＨｙｐｅｒＯｐコード
／／ＰＥ０を使用して、入力アレイａ［］上で試験を遂行する：
ｆｏｒ（ｉ＝０；ｉ＜Ｎ；ｉ＋＋）
｛
ｉｆ（ａ［ｉ］＜＞０）
ｓｅｎｄＴｏＰＥ１（ａ［ｉ］）；
｝
／／ＰＥ１を使用して、疎の出力アレイｂ［］を保存する：
ｉｄｘ＝０；
ｗｈｉｌｅ（１）
｛
ｔｍｐ＝ｒｅｃｖＦｒｏｍＰＥ０（）；
ｂ［ｉｄｘ＋＋］＝ｔｍｐ；
｝
【０１７３】
ＰＥ０
／／仮定：
／／％Ｂ１はａ［］を指し、ｉは％Ｉ１の中にある
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄１  ％Ｉ１，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
ｔｃｍｐ１６  ＮＥ  ０［％Ｂ１＋％Ｉ１］，＄０，％Ｐ０；
ｃｍｏｖ１６  （％Ｐ０）  ０［％Ｂ１＋％Ｉ１］，ＰＥ０＿ＰＥ１＿ＱＰＯＲＴ；
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
ＰＥ０サイクル：１＋２Ｎ
【０１７４】
ＰＥ１
／／仮定：
／／％Ｂ２はｂ［］を指し、ｊは％Ｉ２の中にある
ｇｄｍｏｖｉ  ＄０，＄１，％Ｉ２，％Ｓ２  ／／Ｉ２＝０，Ｓ２＝１
Ｌ＿ｌｏｏｐ：
ｊｍｐ  Ｌ＿ｌｏｏｐ；  ／／Ｑポート上で無限ループする
｛
｜Ａ｜  ｉｎｃｒ  ＄（＿＿ｉ２Ｍａｓｋ）；  ／／Ｉ２＋＝Ｓ２；次の命令のために役立つ更新
｜Ｂ｜  ｌｄ１６  ＰＥ０＿ＰＥ１＿ＱＰＯＲＴ，％ＢＬ；
｜ＤＰ０｜  ｍｏｖ１６  ％ＢＬ，％Ｄ０；
｜Ｄ｜  ｓｔ１６  ％Ｄ０，０［％Ｂ２＋％Ｉ２］；  ／／記憶にはＩ２の現在の値（更新されず）を使用する
｝
【０１７５】
注：
●２つのＰＥを使用することにより、ＥＸで％ＧＰ０を設定して、ＦＤで使用するときの機能停止を回避する
【０１７６】
アレイの非ゼロ要素を検出して、インデックスを保存する
【０１７７】
Ｃコード
ｉｎｔ１６  ａ［Ｎ］，ｂ［Ｎ］；
ｉｎｔ１６  ｉ，ｊ；
ｊ＝０；
ｆｏｒ（ｉ＝０；ｉ＜Ｎ；ｉ＋＋）
｛
ｉｆ（ａ［ｉ］＜＞０）  ｛  ｂ［ｊ＋＋］＝ｉ；｝
｝
【０１７８】
ＧＰｎを使用するＡＳＭコード
／／仮定：
／／％Ｂ１はａ［］を指し、ｉは％Ｉ１の中にある
／／％Ｂ２はｂ［］を指し、ｊは％Ｉ２の中にある
ｇｍｏｖ  ＄０，％Ｉ２
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄１  ％Ｉ１，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
ｍｏｖ１６  ０［％Ｂ１＋％Ｉ１］，％Ｉ０  ／／一時的Ｉ０の中にａ［ｉ］をロードする
／／ＥＸに％Ｉ０をロードして、ＦＤで使用するときに＋４サイクル機能停止する
ｇｔｃｍｐｓ  ＮＥ  ％Ｉ０，＄０，％ＧＰ０  ／／ａ［ｉ］＜＞０を試験し、述語ＧＰ０を設定する
ｃｍｏｖ１６  （％ＧＰ０）  ％Ｉ１，０［％Ｂ２＋％Ｉ２］  ／／ＧＰ０が真である場合、１６ビットのｂ［ｊ］にｉを移動する
ｇａｄｄ  （％ＧＰ０）  ％Ｉ２，＄１，％Ｉ２  ／／ＧＰ０が真である場合、増分ｊ＋＋する
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
サイクル：２＋Ｎ（１＋４＋３）＝２＋８Ｎ
【０１７９】
Ｐｎを使用するＡＳＭコード
／／仮定：
／／％Ｂ１はａ［］を指し、ｉは％Ｉ１の中にある
／／％Ｂ２はｂ［］を指し、ｊは％Ｉ２の中にある
ｇｍｏｖ１６  ＄０，％Ｉ２
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄１  ％Ｉ１，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
ｔｃｍｐ１６ｓ  ＮＥ  ０［％Ｂ１＋％Ｉ１］，＄０，％Ｐ０  ／／ａ［ｉ］＜＞０を試験し、述語Ｐ０を設定する
ｃｍｏｖ１６  （％Ｐ０）  ％Ｉ１，０［％Ｂ２＋％Ｉ２］  ／／Ｐ０が真である場合、１６ビットのｂ［ｊ］にｉを移動する
／／ＥＸの中に％Ｐ０を設定して、ＦＤで使用するときに＋３サイクル機能停止する
ｇａｄｄ  （％Ｐ０）  ％Ｉ２，＄１，％Ｉ２  ／／Ｐ０が真である場合、増分ｊ＋＋する
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
サイクル：２＋Ｎ（２＋３＋１）＝２＋６Ｎ
【０１８０】
パイプライン化されたＰｎを使用するＡＳＭコード
／／仮定：
／／％Ｂ１はａ［］を指し、ｉは％Ｉ１の中にある
／／％Ｂ２はｂ［］を指し、ｊは％Ｉ２の中にある
ｇｍｏｖ１６  ＄０，％Ｉ２
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄４  ％Ｉ１，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
ｔｃｍｐ１６ｓ  ＮＥ  ０［％Ｂ１＋％Ｉ１］，＄０，％Ｐ０  ／／ａ［ｉ＋０］＜＞０を試験し、述語Ｐ０を設定する
ｔｃｍｐ１６ｓ  ＮＥ  １［％Ｂ１＋％Ｉ１］，＄０，％Ｐ１  ／／ａ［ｉ＋１］＜＞０を試験し、述語Ｐ１を設定する
ｔｃｍｐ１６ｓ  ＮＥ  ２［％Ｂ１＋％Ｉ１］，＄０，％Ｐ２  ／／ａ［ｉ＋２］＜＞０を試験し、述語Ｐ２を設定する
ｔｃｍｐ１６ｓ  ＮＥ  ３［％Ｂ１＋％Ｉ１］，＄０，％Ｐ３  ／／ａ［ｉ＋３］＜＞０を試験し、述語Ｐ３を設定する
ａｄｄ１６ｓ  （％Ｐ０）％Ｉ１，＄０，０［％Ｂ２＋％Ｉ２］  ／／Ｐ０が真である場合、１６ビットのｂ［ｊ］にｉ＋０を移動する
ｇａｄｄ  （％Ｐ０）  ％Ｉ２，＄１，％Ｉ２  ／／Ｐ０が真である場合、増分ｊ＋＋する
ａｄｄ１６ｓ  （％Ｐ１）  ％Ｉ１，＄１，０［％Ｂ２＋％Ｉ２］  ／／Ｐ１が真である場合、１６ビットのｂ［ｊ］にｉ＋１を移動する
ｇａｄｄ  （％Ｐ１）  ％Ｉ２，＄１，％Ｉ２  ／／Ｐ１が真である場合、増分ｊ＋＋する
ａｄｄ１６ｓ（％Ｐ２）  ％Ｉ１，＄２，０  ［％Ｂ２＋％Ｉ２］／／Ｐ２が真である場合、１６ビットのｂ［ｊ］を移動する
ｇａｄｄ  （％Ｐ２）  ％Ｉ２，＄１，％Ｉ２  ／／Ｐ２が真である場合、増分ｊ＋＋する
ａｄｄ１６ｓ  （％Ｐ３）  ％Ｉ１，＄３，０［％Ｂ２＋％Ｉ２］  ／／Ｐ３が真である場合、１６ビットのｂ［ｊ］にｉ＋３を移動する
ｇａｄｄ  （％Ｐ３）  ％Ｉ２，＄１，％Ｉ２  ／／Ｐ３が真である場合、増分ｊ＋＋する
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
サイクル：２＋Ｎ／４（４＋８）＝２＋３Ｎ
【０１８１】
ＧＰｎを使用する簡単なＨｙｐｅｒＯｐコード（条件付Ｇスロットおよび記憶）
／／仮定：
／／％Ｂ１はａ［］を指し、ｉは％Ｉ１の中にある
／／％Ｂ２はｂ［］を指し、ｊは％Ｉ２の中にある
ｇｄｍｏｖ  ＄０，＄１，％Ｉ２，％Ｓ２
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄１  ％Ｉ１，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
｛
｜Ａ｜  ｌｄ１６  ０［％Ｂ１＋％Ｉ１］，％ＡＬ；  ／／ＡＬの中にａ［ｉ］をロードする
|｜ＤＰ０｜  ｍｏｖ１６  ％ＡＬ，％Ｄ０；  ／／Ｄ０にａ［ｉ］を移動する
｜Ｄ｜  ｓｔ１６  ％Ｄ０，％Ｉ０；  ／／一時的Ｉ０の中にＤ０＝ａ［ｉ］を記憶する
｝
／／ＥＸの中に％Ｉ０を書き込み、ＦＤで使用するときに＋４サイクル機能停止する
｛
｜Ｂ｜  ｌｄ１６  ％Ｉ１，％ＢＨ；  ／／ＢＨの中にｉをロードする
｜ＤＰ０｜  ｍｏｖ１６ｓ  ％ＢＨ，％Ｄ０；  ／／Ｄ０にｉを移動する
｜Ｇ｜  ｇｔｃｍｐｓ  ＮＥ  ％Ｉ０，＄０，＆ＧＰ０；  ／／ａ［ｉ］＜＞０を試験し、述語Ｐ０を設定する
｝
｛
｜Ａ｜  ｉｎｃｒ  （％ＧＰ０）  ＄（＿＿ｉ２Ｍａｓｋ）；  ／／ＧＰ０が真である場合、増分ｊ＋＋する
｜Ｄ｜  ｓｔ１６  （％ＧＰ０）  ％Ｄ０，０［％Ｂ２＋％Ｉ２］；  ／／ＧＰ０が真である場合、１６ビットのｂ［ｊ］にｉを移動する
｝
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
サイクル：２＋Ｎ（１＋４＋２）＝２＋７Ｎ
【０１８２】
Ｐｎを使用する簡単なＨｙｐｅｒＯｐコード
／／仮定：
／／％Ｂ１はａ［］を指し、ｉは％Ｉ１の中にある
／／％Ｂ２はｂ［］を指し、ｊは％Ｉ２の中にある
ｇｄｍｏｖｉ  ＄０，＄１，％Ｉ２，％Ｓ２
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄１  ％Ｉ１，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
｛
｜Ａ｜  ｌｄ１６  ０［％Ｂ１＋％Ｉ１］，％ＡＬ；  ／／ＡＬの中にａ［ｉ］をロードする
｜Ｂ｜  ｌｄ１６  ％Ｉ１，％ＢＬ；  ／／ＢＬの中にｉをロードする
｜ＤＰ１｜  ｔｃｍｐ１６ｓ  ＮＥ  ％ＡＬ，＄０，％Ｐ０；  ／／ａ［ｉ］＜＞０を試験し、述語Ｐ０を設定する
｜ＤＰ０｜  ｍｏｖ  ％ＢＬ，％Ｄ０；  ／／Ｄ０にｉを移動する、記憶するための準備
｝
／／ＥＸの中に％Ｐ０を書き込み、ＦＤで使用するときに＋４サイクル機能停止する
｛
｜Ａ｜  ｉｎｃｒ  （％Ｐ０）  ＄（＿＿ｉ２Ｍａｓｋ）；  ／／Ｐ０が真である場合、増分ｊ＋＋する
｜Ｄ｜  ｓｔ１６  （％Ｐ０）  ％Ｄ０，０［％Ｂ２＋％Ｉ２］；  ／／Ｐ０が真である場合、１６ビットのｂ［ｊ］にｉを移動する
｝
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
サイクル：２＋Ｎ（１＋４＋１）＝２＋６Ｎ
【０１８３】
ＧＰｎを使用するＨｙｐｅｒＯｐコードパイプライン
／／仮定：
／／％Ｂ１はａ［］を指し、ｉは％Ｉ１の中にある
／／％Ｂ２はｂ［］を指し、ｊは％Ｉ２の中にある
ｇｄｍｏｖｉ  ＄０，＄１，％Ｉ２，％Ｓ２
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄５  ％Ｉ１，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
／／一時的ＧＲの中にａ［］から次の５つの値をロードする
｛｜Ａ｜  ｌｄ１６  ０［％Ｂ１＋％Ｉ１］，％ＡＬ；｜ＤＰ０｜  ｍｏｖ１６ｓ  ％ＡＬ，％Ｄ０；｜Ｄ｜  ｓｔ１６  ％Ｄ０，％Ｔ４；｝
｛｜Ａ｜  ｌｄ１６  １［％Ｂ１＋％Ｉ１］，％ＡＬ；｜ＤＰ０｜  ｍｏｖ１６  ％ＡＬ，％Ｄ０；｜Ｄ｜  ｓｔ１６  ％Ｄ０，％Ｔ５；｝
｛｜Ａ｜  ｌｄ１６  ２［％Ｂ１＋％Ｉ１］，％ＡＬ；｜ＤＰ０｜  ｍｏｖ１６  ％ＡＬ，％Ｄ０；｜Ｄ｜  ｓｔ１６  ％Ｄ０，％Ｔ６；｝
｛｜Ａ｜  ｌｄ１６  ３［％Ｂ１＋％Ｉ１］，％ＡＬ；｜ＤＰ０｜  ｍｏｖ１６  ％ＡＬ，％Ｄ０；｜Ｄ｜  ｓｔ１６  ％Ｄ０，％Ｔ７；｝
｛｜Ａ｜  ｌｄ１６  ４［％Ｂ１＋％Ｉ１］，％ＡＬ；｜ＤＰ０｜  ｍｏｖ１６  ％ＡＬ，％Ｄ０；｜Ｄ｜  ｓｔ１６  ％Ｄ０，％Ｉ０；｝
／／ｉｆ（ａ［ｉ］＜＞０）  ｛  ｂ［ｊ＋＋］＝ｉ；｝  ／／ａ［ｉ＋０］を試験する
｛｜Ａ｜  ｌｄ１６  ％Ｉ１，％ＡＨ；｜Ｇ｜  ｇｔｃｍｐｉ１６  ＮＥ  ％Ｔ４，＄０，％ＧＰ０；｜ＤＰ０｜  ａｄｄ１６ｓ  ％ＡＨ，＄０，％Ｄ０；｝
｛｜Ａ｜  ｉｎｃｒ  （％ＧＰ０）  ＄（＿＿ｉ２Ｍａｓｋ）；｜Ｄ｜  ｓｔ１６  （％ＧＰ０）  ％Ｄ０，０［％Ｂ２＋％Ｉ２］；｝
／／ｉｆ（ａ［ｉ＋１］＜＞０）  ｛  ｂ［ｊ＋＋］＝ｉ＋１；｝  ／／ａ［ｉ＋１］を試験する
｛｜Ｇ｜  ｇｔｃｍｐｉ１６  ＮＥ  ％Ｔ５，＄０，％ＧＰ０；｜ＤＰ０｜  ａｄｄ１６ｓ  ％ＡＨ，＄１，％Ｄ０；｝
｛｜Ａ｜  ｉｎｃｒ  （％ＧＰ０）  ＄（＿＿ｉ２Ｍａｓｋ）；｜Ｄ｜  ｓｔ１６  （％ＧＰ０）  ％Ｄ０，０［％Ｂ２＋％Ｉ２］；｝
／／ｉｆ（ａ［ｉ＋２］＜＞０）  ｛  ｂ［ｊ＋＋］＝ｉ＋２；｝  ／／ａ［ｉ＋２］を試験する
｛｜Ｇ｜  ｇｔｃｍｐｉ１６  ％Ｔ６，＄０，％ＧＰ０；｜ＤＰ０｜  ａｄｄ１６ｓ  ％ＡＨ，＄２，％Ｄ０；｝
｛｜Ａ｜  ｉｎｃｒ  （％ＧＰ０）  ＄（＿＿ｉ２Ｍａｓｋ）；｜Ｄ｜  ｓｔ１６  （％ＧＰ０）  ％Ｄ０，０［％Ｂ２＋％Ｉ２］；｝
／／ｉｆ（ａ［ｉ＋３］＜＞０）  ｛  ｂ［ｊ＋＋］＝ｉ＋３；｝  ／／ａ［ｉ＋３］を試験する
｛｜Ｇ｜  ｇｔｃｍｐｉ１６  ＮＥ  ％Ｔ７，＄０，％ＧＰ０；｜ＤＰ０｜  ａｄｄ１６ｓ  ％ＡＨ，＄３，％Ｄ０；｝
｛｜Ａ｜  ｉｎｃｒ  （％ＧＰ０）  ＄（＿＿ｉ２Ｍａｓｋ）；｜Ｄ｜  ｓｔ１６  （％ＧＰ０）  ％Ｄ０，０［％Ｂ２＋％Ｉ２］；｝
／／ｉｆ（ａ［ｉ＋４］＜＞０）  ｛  ｂ［ｊ＋＋］＝ｉ＋４；｝  ／／ａ［ｉ＋４］を試験する
｛｜Ｇ｜  ｇｔｃｍｐｉ１６  ＮＥ  ％Ｉ０，＄０，％ＧＰ０；｜ＤＰ０｜  ａｄｄ１６ｓ  ％ＡＨ，＄４，％Ｄ０；｝
｛｜Ａ｜  ｉｎｃｒ  （％ＧＰ０）  ＄（＿＿ｉ２Ｍａｓｋ）；｜Ｄ｜  ｓｔ１６  （％ＧＰ０）  ％Ｄ０，０［％Ｂ２＋％Ｉ２］；｝
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
サイクル：２＋Ｎ／５（５＋５（２））＝２＋３Ｎ
注：
●５つのＧＲの中にロードすることによりすべての機能停止を隠すことができる
【０１８４】
Ｐｎを使用してパイプライン化されたＨｙｐｅｒＯｐコード
／／仮定：
／／％Ｂ１はａ［］を指し、ｉは％Ｉ１の中にある
／／％Ｂ２はｂ［］を指し、ｊは％Ｉ２の中にある
ｇｄｍｏｖｉ  ＄０，＄１，％Ｉ２，％Ｓ２
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄４  ％Ｉ１，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
／／ａ［］の次の５つの値を試験して、Ｐ０〜Ｐ３に入れる
｛｜Ａ｜  ｌｄ３２  ０［％Ｂ１＋％Ｉ１］，％Ａ；
｜Ｃ｜  ｌｄ１６  ％Ｉ１，％ＣＬＬ；  ／／ＣＬＬ＝Ｉ１
｜ＤＰ１｜  ｔｃｍｐ１６ｓ  ＮＥ  ％ＡＨ，＄０，％Ｐ０；
｜ＤＰ０｜  ｔｃｍｐ１６ｓ  ＮＥ  ％ＡＬ，＄０，％Ｐ１；
｝
｛｜Ｂ｜  ｌｄ３２  ２［％Ｂ１＋％Ｉ１］，％Ｂ；
｜ＤＰ１｜  ｔｃｍｐ１６ｓ  ＮＥ  ％ＢＨ，＄０，％Ｐ２；
｜ＤＰ０｜  ｔｃｍｐ１６ｓ  ＮＥ  ％ＢＬ，＄０，％Ｐ３；
｝
／／ＥＸの中に％Ｐ０を設定して、ＦＤで使用するときに＋３サイクル機能停止する
／／ｉｆ（ａ［ｉ］＜＞０）  ｛  ｂ［ｊ＋＋］＝ｉ；｝  ／／Ｐ０を使用する
｛｜Ａ｜  ｉｎｃｒ  （％Ｐ０）  ＄（＿＿ｉ２Ｍａｓｋ）；
｜ＤＰ０｜  ａｄｄ１６ｓ  ％ＣＬＬ，＄０，％Ｄ０；
｜Ｄ｜  ｓｔ１６  （％Ｐ０）  ％Ｄ０，０［％Ｂ２＋％Ｉ２］；
｝
／／ｉｆ（ａ［ｉ＋１］＜＞０）  ｛  ｂ［ｊ＋＋］＝ｉ＋１；｝  ／／Ｐ１を使用する
｛｜Ａ｜  ｉｎｃｒ  （％Ｐ１）  ＄（＿＿ｉ２Ｍａｓｋ）；
｜ＤＰ０｜  ａｄｄ１６ｓ  ％ＣＬＬ，＄１，％Ｄ０；
｜Ｄ｜  ｓｔ１６  （％Ｐ１）  ％Ｄ０，０［％Ｂ２＋％Ｉ２］；
｝
／／ｉｆ（ａ［ｉ＋２］＜＞０）  ｛  ｂ［ｊ＋＋］＝ｉ＋２；｝  ／／Ｐ２を使用する
｛｜Ａ｜  ｉｎｃｒ  （％Ｐ２）  ＄（＿＿ｉ２Ｍａｓｋ）；
｜ＤＰ０｜  ａｄｄ１６ｓ  ％ＣＬＬ，＄２，％Ｄ０；
｜Ｄ｜  ｓｔ１６  （％Ｐ２）  ％Ｄ０，０［％Ｂ２＋％Ｉ２］；
｝
／／ｉｆ（ａ［ｉ＋３］＜＞０）  ｛  ｂ［ｊ＋＋］＝ｉ＋３；｝  ／／Ｐ３を使用する
｛｜Ａ｜  ｉｎｃｒ  （％Ｐ３）  ＄（＿＿ｉ２Ｍａｓｋ）；
｜ＤＰ０｜  ａｄｄ１６ｓ  ％ＣＬＬ，＄３，％Ｄ０；
｜Ｄ｜  ｓｔ１６  （％Ｐ３）  ％Ｄ０，０［％Ｂ２＋％Ｉ２］；
｝
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
サイクル：２＋Ｎ／４（２＋３＋４）＝２＋２．２５Ｎ
注：
●４つのＰｎを用いてすべての機能停止を隠すことができるわけではない
【０１８５】
タグ付データを使用するＨｙｐｅｒＯｐコード
／／仮定：
／／％Ｂ１はａ［］を指し、ｉは％Ｉ１の中にある
／／％Ｂ２はｂ［］を指し、ｊは％Ｉ２の中にある
ｇｄｍｏｖｉ  ＄０，＄１，％Ｉ２，％Ｓ２
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄４  ％Ｉ１，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
／／ａ［］の次の４つの値を試験して、Ｐ０〜Ｐ３に入れる
｛
｜Ａ｜  ｌｄ３２  ０［％Ｂ１＋％Ｉ１］，％Ａ；  ／／ロードする、ＡＨ＝ａ［ｉ＋０］、ＡＬ＝ａ［ｉ＋１］
｜Ｃ｜  ｌｄ１６  ＄ａ，％ＣＬＬ；  ／／ＣＬＬ＝＆ａ［０］
｜ＤＰ１｜  ｔｃｍｐ１６ｓ  ＮＥ  ％ＡＨ，＄０，％Ｐ０；  ／／ａ［ｉ＋０］＜＞０を試験して、述語Ｐ０を設定する
｜ＤＰ０｜  ｔｃｍｐ１６ｓ  ＮＥ  ％ＡＬ，＄０，％Ｐ１；  ／／ａ［ｉ＋１］＜＞０を試験して、述語Ｐ１を設定する
｝
｛
｜Ｂ｜  ｌｄ３２  ２［％Ｂ１＋％Ｉ１］，％Ｂ；  ／／ロードする、ＢＨ＝ａ［ｉ＋２］、ＢＬ＝ａ［ｉ＋３］
｜ＤＰ１｜  ｔｃｍｐ１６ｓ  ＮＥ  ％ＢＨ，＄０，％Ｐ２；  ／／ａ［ｉ＋２］＜＞０を試験して、述語Ｐ２を設定する
｜ＤＰ０｜  ｔｃｍｐ１６ｓ  ＮＥ  ％ＢＬ，＄０，％Ｐ３；  ／／ａ［ｉ＋３］＜＞０を試験して、述語Ｐ３を設定する
｝
／／ＥＸの中に％Ｐ０を設定して、ＦＤで使用するときに＋３サイクル機能停止する（ＩＮＣＲ命令）
／／ｉｆ（ａ［ｉ］＜＞０）  ｛  ｂ［ｊ＋＋］＝ｉ；｝
｛
｜Ａ｜  ｉｎｃｒ  （％Ｐ０）  ＄（＿＿ｉ２Ｍａｓｋ）；  ／／Ｐ０が真である場合、増分ｊ＋＋する
｜Ｂ｜  ｌｄ１６ｔ  ０［％Ｂ１＋％Ｉ１］，％Ｂ；  ／／タグ付データをロードするＢ＝｛＆ａ［ｉ］：ａ［ｉ］｝
｜ＤＰ０｜  ｓｕｂ１６ｓ  ％ＢＨ，％ＣＬＬ，％Ｄ０；  ／／Ｄ０＝＆ａ［ｉ］−＆ａ［０］＝ｉ
｜Ｄ｜  ｓｔ１６  （％Ｐ０）  ％Ｄ０，０［％Ｂ２＋％Ｉ２］；  ／／Ｐ０が真である場合、１６ビットのｂ［ｊ］にｉを記憶する
｝
／／ｉｆ（ａ［ｉ＋１］＜＞０）  ｛  ｂ［ｊ＋＋］＝ｉ＋１；｝
｛
｜Ａ｜  ｉｎｃｒ  （％Ｐ１）  ＄（＿＿ｉ２Ｍａｓｋ）；  ／／Ｐ１が真である場合、増分ｊ＋＋する
｜Ｂ｜  ｌｄ１６ｔ  １［＆Ｂ１＋％Ｉ１］，％Ｂ；  ／／タグ付データをロードするＢ＝｛＆ａ［ｉ＋１］：ａ［ｉ＋１］｝
｜ＤＰ０｜  ｓｕｂ１６ｓ  ％ＢＨ，％ＣＬＬ，％Ｄ０；  ／／Ｄ０＝＆ａ［ｉ＋１］−＆ａ［０］＝ｉ＋１
｜Ｄ｜  ｓｔ１６  （％Ｐ１）  ％Ｄ０，０［％Ｂ２＋％Ｉ２］；  ／／Ｐ１が真である場合、１６ビットのｂ［ｊ］にｉ＋１を記憶する
｝
／／ｉｆ（ａ［ｉ＋２］＜＞０）  ｛  ｂ［ｊ＋＋］＝ｉ＋２；｝
｛
｜Ａ｜  ｉｎｃｒ  （％Ｐ２）  ＄（＿＿ｉ２Ｍａｓｋ）；  ／／Ｐ２が真である場合、増分ｊ＋＋する
｜Ｂ｜  ｌｄ１６ｔ  ２［＆Ｂ１＋％Ｉ１］，％Ｂ；  ／／タグ付データをロードするＢ＝｛＆ａ［ｉ＋２］：ａ［ｉ＋２］｝
｜ＤＰ０｜  ｓｕｂ１６ｓ  ％ＢＨ，％ＣＬＬ，％Ｄ０；  ／／Ｄ０＝＆ａ［ｉ＋２］−＆ａ［０］＝ｉ＋２
｜Ｄ｜  ｓｔ１６  （％Ｐ２）  ％Ｄ０，０［％Ｂ２＋％Ｉ２］；  ／／Ｐ２が真である場合、１６ビットのｂ［ｊ］にｉ＋２を記憶する
｝
／／ｉｆ（ａ［ｉ＋３］＜＞０）  ｛  ｂ［ｊ＋＋］＝ｉ＋３；｝
｛
｜Ａ｜  ｉｎｃｒ  （％Ｐ３）  ＄（＿＿ｉ２Ｍａｓｋ）；  ／／Ｐ３が真である場合、増分ｊ＋＋する
｜Ｂ｜  ｌｄ１６ｔ  ３［＆Ｂ１＋％Ｉ１］，％Ｂ；  ／／タグ付データをロードするＢ＝｛＆ａ［ｉ＋３］：ａ［ｉ＋３］｝
｜ＤＰ０｜  ｓｕｂ１６ｓ  ％ＢＨ，％ＣＬＬ，％Ｄ０；  ／／Ｄ０＝＆ａ［ｉ＋３］−＆ａ［０］＝ｉ＋３
｜Ｄ｜  ｓｔ１６  （％Ｐ３）  ％Ｄ０，０［％Ｂ２＋％Ｉ２］；  ／／Ｐ３が真である場合、１６ビットのｂ［ｊ］にｉ＋３を記憶する
｝
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
サイクル：２＋Ｎ／４（２＋３＋４）＝２＋２．２５Ｎ
【０１８６】
注：
●タグ付ロードＬＤ１６Ｔは、１６ビットデータ（下位１６ビットに）およびそのアドレスを（上位１６ビットに）パックされたデータとしてロードする
●データインデックスは、データアドレス（またはタグ）であり、すなわち、アレイの開始である
【０１８７】
間接的処理を使用してアレイにアクセスする
【０１８８】
Ｃコード
ｉｎｔ１６  ａ［Ｎ］，ｂ［Ｎ］，ｃ［Ｎ］；
ｉｎｔ１６  ｉ，ｊ；
ｆｏｒ（ｉ＝０；ｉ＜Ｎ；ｉ＋＋）
｛
ｊ＝ｂ［ｉ］；
ａ［ｉ］＝ｃ［ｊ］；
｝
【０１８９】
ＡＳＭコード
／／％Ｂ１はａ［］を指し、ｉは％Ｉ１の中にあると仮定する
／／％Ｂ２はｂ［］を指し、ｉは％Ｉ１の中にあると仮定する
／／％Ｂ４はｃ［］を指し、ｊは％Ｉ２の中にあると仮定する
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄１  ％Ｉ１，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
ｍｏｖ１６  ０［％Ｂ２＋％Ｉ１］，％Ｉ２
／／ＥＸの中に％Ｉ２を設定して、ＦＤで使用するときに＋４サイクル機能停止する
ｍｏｖ１６  ０［％Ｂ４＋％Ｉ２］，０［％Ｂ１＋％Ｉ１］
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
サイクル：１＋Ｎ（１＋４＋１）＝１＋６Ｎ
【０１９０】
簡単なＨｙｐｅｒＯｐコード
／／％Ｂ１はａ［］を指し、ｉは％Ｉ１の中にあると仮定する
／／％Ｂ２はｂ［］を指し、ｉは％Ｉ１の中にあると仮定する
／／％Ｂ４はｃ［］を指し、ｊは％Ｉ２の中にあると仮定する
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄１  ％Ｉ１，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
｛｜Ａ｜  ｌｄ１６  ０［％Ｂ２＋％Ｉ１］，％ＡＬ；｜ＤＰ０｜  ｍｏｖ  ％ＡＬ，％Ｄ０；｜Ｄ｜  ｓｔ１６  ％Ｄ０，％Ｉ２｝
／／ＥＸの中に％Ｉ２を設定して、ＦＤで使用するときに＋４サイクル機能停止する
｛｜Ｂ｜  ｌｄ１６  ０［％Ｂ４＋％Ｉ２］，％ＢＬ；｜ＤＰ０｜  ｍｏｖ  ％ＢＬ，％Ｄ０；｜Ｄ｜  ｓｔ１６  ％Ｄ０，０［％Ｂ１＋％Ｉ１］｝；
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
サイクル：１＋Ｎ（１＋４＋１）＝１＋６Ｎ
【０１９１】
パイプライン化されたＨｙｐｅｒＯｐコード
／／％Ｂ１はａ［］を指し、ｉは％Ｉ１の中にあると仮定する
／／％Ｂ２はｂ［］を指し、ｉは％Ｉ１の中にあると仮定する
／／％Ｂ４はｃ［］を指し、ｊは％Ｉ２〜％Ｉ７の中にあると仮定する
／／ｊ０＝ｂ［０］；ｊ１＝ｂ［１］；
｛｜Ａ｜  ｌｄ３２  ０［％Ｂ２］，％Ａ；｜ＤＰ０｜  ｍｏｖ３２  ％Ａ，％Ｄ０；｜Ｄ｜  ｓｔ３２  ％Ｄ０，％Ｉ２Ｉ３；｝
／／ｊ２＝ｂ［２］；  ｊ３＝ｂ［３］；
｛｜Ａ｜  ｌｄ３２  ２［％Ｂ２］，％Ａ；｜ＤＰ０｜  ｍｏｖ３２  ％Ａ，％Ｄ０；｜Ｄ｜  ｓｔ３２  ％Ｄ０，％Ｉ４Ｉ５；｝
／／ｊ４＝ｂ［４］；  ｊ５＝ｂ［５］；
｛｜Ａ｜  ｌｄ３２  ４［％Ｂ２］，％Ａ；｜ＤＰ０｜  ｍｏｖ３２  ％Ａ，％Ｄ０；｜Ｄ｜  ｓｔ３２  ％Ｄ０，％Ｉ６Ｉ７；｝
／／ＥＸの中に％Ｉ２、％Ｉ３を設定して、ＦＤで使用するときに＋１サイクル機能停止する
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄６  ％Ｉ１，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
／／ａ［ｉ＋０］＝ｃ［ｊ０］；ａ［ｉ＋１］＝ｃ［ｊ１］；ｊ０＝ｂ［ｉ＋６］；ｊ１＝ｂ［ｉ＋７］；
｛｜Ａ｜  ｌｄ１６  ０［％Ｂ４＋％Ｉ２］，％ＡＬ；｜Ｂ｜  ｌｄ１６  ０［％Ｂ４＋％Ｉ３］，％ＢＬ；
｜ＤＰ１｜  ｍｏｖ１６  ％ＡＬ，％Ｄ１；｜ＤＰ０｜  ｍｏｖ１６  ％ＢＬ，％Ｄ０；｜Ｄ｜  ｄｓｔ１６  ％Ｄ１＿Ｄ０，０［％Ｂ１＋％Ｉ１］；｝
｛｜Ａ｜  ｌｄ３２  ６［％Ｂ２＋％Ｉ１］，％Ａ；｜ＤＰ０｜  ｍｏｖ３２  ％Ａ，％Ｄ０；｜Ｄ｜  ｓｔ３２  ％Ｄ０，％Ｉ２Ｉ３；｝
／／ａ［ｉ＋２］＝ｃ［ｊ２］；ａ［ｉ＋３］＝ｃ［ｊ３］；ｊ２＝ｂ［ｉ＋８］；ｊ３＝ｂ［ｉ＋９］；
｛｜Ａ｜  ｌｄ１６  ０［％Ｂ４＋％Ｉ４］，％ＡＬ；｜Ｂ｜  ｌｄ１６  ０［％Ｂ４＋％Ｉ５］，％ＢＬ；
｜ＤＰ１｜  ｍｏｖ１６  ％ＡＬ，％Ｄ１；｜ＤＰ０｜  ｍｏｖ１６  ％ＢＬ，％Ｄ０；｜Ｄ｜  ｄｓｔ１６  ％Ｄ１＿Ｄ０，２［％Ｂ１＋％Ｉ１］；｝
｛｜Ａ｜  ｌｄ３２  ８［％Ｂ２＋％Ｉ１］，％Ａ；｜ＤＰ０｜  ｍｏｖ３２  ％Ａ，％Ｄ０；｜Ｄ｜  ｓｔ３２  ％Ｄ０，％Ｉ４Ｉ５；｝
／／ａ［ｉ＋４］＝ｃ［ｊ４］；ａ［ｉ＋５］＝ｃ［ｊ５］；ｊ４＝ｂ［ｉ＋１０］；ｊ５＝ｂ［ｉ＋１１］；
｛｜Ａ｜  ｌｄ１６  ０［％Ｂ４＋％Ｉ６］，％ＡＬ；｜Ｂ｜  ｌｄ１６  ０［％Ｂ４＋％Ｉ７］，％ＢＬ；
｜ＤＰ１｜  ｍｏｖ１６  ％ＡＬ，％Ｄ１；｜ＤＰ０｜  ｍｏｖ１６  ％ＢＬ，％Ｄ０；｜Ｄ｜  ｄｓｔ１６  ％Ｄ１＿Ｄ０，４［％Ｂ１＋％Ｉ１］；｝
｛｜Ａ｜  ｌｄ３２  １０［％Ｂ２＋％Ｉ１］，％Ａ；｜ＤＰ０｜  ｍｏｖ３２  ％Ａ，％Ｄ０；｜Ｄ｜  ｓｔ３２  ％ＡＣＣ０，％Ｉ６Ｉ７；｝
／／Ｉ１〜Ｉ７の中にロードされた最終値を無視する
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
サイクル：３＋１＋１＋Ｎ／６（６）＝５＋Ｎ
【０１９２】
注：
●インデックスｊは、１サイクルでｂ［ｉ］から対でロードされる
●２つのｃ［ｊ］は、１サイクルで対としてロードされ、ａ［ｉ］に記憶される
●６つのインデックスレジスタを使用することにより、ＥＸでのインデックスの設定およびＦＤでのインデックスの使用というパイプラインバブルを回避する
【０１９３】
二重ＤＰを使用する条件付累積
【０１９４】
以下は、２つの述語を伴う条件付ＨｙｐｅｒＯｐをどこで使用することができるかのある例である。
【０１９５】
Ｃコード
ｉｎｔ１６  ａ［Ｎ］，ｂ［Ｎ］，ｃ［Ｎ］；
ｉｎｔ１６  ｉ；
ｉｎｔ３２  ｓｕｍ＝０；
ｆｏｒ（ｉｎｔ  ｉ＝０；ｉ＜Ｎ；ｉ＋＋）  ｛
ｉｆ（ａ［ｉ］＞ｂ［ｉ］）
ｓｕｍ＋＝ａ［ｉ］＊ｃ［ｉ］；
｝
【０１９６】
ＡＳＭコード
【０１９７】
この例は、ベクトル固有関数（擬似ＡＳＭ命令）を使用して、二重ＤＰにアクセスする。
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄２，ＩＤＸ＿ｉ，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
ｍｏｖｘ１６ｓ  ＄０，％ＡＣＣ２
ｍｏｖｘ１６ｓ  ＄０，％ＡＣＣ０
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
ｖｔｃｍｐ１６ｓ  ＧＴ  ０［ＢＰ＿ａ＋ＩＤＸ＿ｉ］，０［ＢＰ＿ｂ＋ＩＤＸ＿ｉ］，％Ｐ１Ｐ０；
ｃｍｏｖ１６  （％Ｐ１）  ０［ＢＰ＿ａ＋ＩＤＸ＿ｉ］，＄０，％Ｒ０
ｃｍｏｖ１６  （％Ｐ０）  １［ＢＰ＿１＋ＩＤＸ＿ｉ］，＄０，％Ｒ１
ｖｍｕｌａａ１６ｓ  ％Ｒ０．Ｄ，０［ＢＰ＿ｃ＋ＩＤＸ＿ｉ］，％ＡＣＣ２＿ＡＣＣ０
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
ａｃｃａｄｄ  ％ＡＣＣ０，＄０，％ＡＣＣ２
サイクル：３＋Ｎ／２（４）＋１＝４＋２Ｎ
【０１９８】
ＨｙｐｅｒＯｐコード（条件付ＤＰスロット実行−両方のスロット）
＃ｄｅｆｉｎｅ  ＢＰ＿ａ  ％Ｂ１
＃ｄｅｆｉｎｅ  ＢＰ＿ｂ  ％Ｂ２
＃ｄｅｆｉｎｅ  ＢＰ＿ｃ  ％Ｂ３
＃ｄｅｆｉｎｅ  ＩＤＸ＿ｉ  ％Ｉ１
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄２，ＩＤＸ＿ｉ，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
｛｜ＤＰ１｜  ｍｏｖｘ１６ｓ  ＄０，％ＡＣＣ２；｜ＤＰ０｜  ｍｏｖｘ１６ｓ  ＄０，％ＡＣＣ０；｝
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
｛｜Ａ｜  ｌｄ３２  ０［ＢＰ＿ａ＋ＩＤＸ＿ｉ］，％Ａ；｜Ｂ｜  ｌｄ３２  ０［ＢＰ＿ｂ＋ＩＤＸ＿ｉ］，％Ｂ；
｜ＤＰ１｜  ｔｃｍｐ１６ｓ  ＧＴ  ％ＡＨ，％ＢＨ，％Ｐ１；｜ＤＰ０｜  ｔｃｍｐ１６ｓ  ＧＴ  ％ＡＬ，％ＢＬ，％Ｐ０；｝
｛｜Ｃ｜  ｌｄ３２  ０［ＢＰ＿ｃ＋ＩＤＸ＿ｉ］，％Ｂ；
｜ＤＰ１｜  ｍｕｌａａ１６ｓ  （％Ｐ１）  ％ＡＨ，％ＢＨ，％ＡＣＣ２；｜ＤＰ０｜  ｍｕｌａａ１６ｓ  （％Ｐ０）  ％ＡＬ，％ＢＬ，％ＡＣＣ０；｝
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
ａｃｃａｄｄ  ％ＡＣＣ０，＄０，％ＡＣＣ２
サイクル：１＋Ｎ／２（２）＋１＝２＋Ｎ
【０１９９】
注：
●ＤＰ１およびＤＰ０を使用して、繰返しｉおよびｉ＋１を並列に処理する
●合計を％ＡＣＣ０および％ＡＣＣ２の中に分割し、次いで最後に組み合わせる
●述語フラグ％Ｐ１および％Ｐ０を使用して、累積を％ＡＣＣ２および％ＡＣＣ０の中で独立に制御する
【０２００】
二重ＭＵＬをそれぞれ使用して二重ＤＰを使用する条件付累積
【０２０１】
以下は、４つの述語を伴う条件付ＨｙｐｅｒＯｐをどこで使用することができるかのある例である。
Ｃコード
ｉｎｔ１６  ａ［Ｎ］，ｂ［Ｎ］，ｃ［Ｎ］；
ｉｎｔ１６  ｉ；
ｉｎｔ３２  ｓｕｍ＝０；
ｆｏｒ（ｉｎｔ  ｉ＝０；ｉ＜Ｎ；ｉ＋＋）  ｛
ｉｆ（ａ［ｉ］＞ｂ［ｉ］）
ｓｕｍ＋＝ａ［ｉ］＊ｃ［ｉ］；
｝
【０２０２】
ＨｙｐｅｒＯｐコード（４重の条件付きで両方のＤＰを使用する）
＃ｄｅｆｉｎｅ  ＢＰ＿ａ  ％Ｂ１
＃ｄｅｆｉｎｅ  ＢＰ＿ｂ  ％Ｂ２
＃ｄｅｆｉｎｅ  ＢＰ＿ｃ  ％Ｂ３
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄４，ＩＤＸ＿ｉ，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
｛｜ＤＰ１｜  ｍｏｖｘ１６ｓ  ＄０，％ＡＣＣ２；｜ＤＰ０｜  ｍｏｖｘ１６ｓ  ＄０，％ＡＣＣ０；｝
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
｛｜Ａ｜  ｌｄ６４  ０［ＢＰ＿ａ＋ＩＤＸ＿ｉ］，％ＡＢ；｜Ｃ｜  ｌｄ６４  ０［ＢＰ＿ｂ＋ＩＤＸ＿ｉ］，％Ｃ；
｜ＤＰ１｜  ｄｔｃｍｐ１６ｓ  ＧＴ  ％Ａ，％ＣＨ，％Ｐ３Ｐ２；
｜ＤＰ０｜  ｄｔｃｍｐ１６ｓ  ＧＴ  ％Ｂ，％ＣＬ，％Ｐ１Ｐ０；｝
｛｜Ｃ｜  ｌｄ６４  ０［ＢＰ＿ｃ＋ＩＤＸ＿ｉ］，％Ｃ；
｜ＤＰ１｜  ｄｍｕｌａａ１６ｓ  （％Ｐ３Ｐ２）  ％Ａ，％ＣＨ，％ＡＣＣ２；
｜ＤＰ０｜  ｄｍｕｌａａ１６ｓ  （％Ｐ１Ｐ０）  ％Ｂ，％ＣＬ，％ＡＣＣ０；｝
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
ａｃｃａｄｄ  ％ＡＣＣ０，＄０，％ＡＣＣ２
サイクル：２＋Ｎ／４（２）＋１＝３＋０．５Ｎ
【０２０３】
注：
●繰返しｉ〜ｉ＋３を並列に処理する：
●ｉおよびｉ＋１をＤＰ１で
●ｉ＋２およびｉ＋３をＤＰ０で
●ＤＰ０は二重動作を遂行し、ＤＰ１は二重動作を遂行する
●合計を％ＡＣＣ０および％ＡＣＣ２の中に分割し、次いで最後に組み合わせる
●述語フラグ％Ｐ０〜Ｐ３使用して、積の累積を％ＡＣＣ０および％ＡＣＣ２の中で独立に制御する
●ｂ［］およびｃ［］は、６４ビットアクセスが作動するために、ａ［］と異なるＤＭＲでなければならない
【０２０４】
二重ＤＰを使用する条件付記憶
【０２０５】
以下のＣコードは、条件付ＨｙｐｅｒＯｐを使用して、条件付記憶をどこで遂行することができるかのある例である。
【０２０６】
Ｃコード
ｉｎｔ１６  ａ［Ｎ］，ｂ［Ｎ］，ｃ［Ｎ］，ｄ［Ｎ］；
ｉｎｔ１６  ｉ；
ｆｏｒ（ｉｎｔ  ｉ＝０；ｉ＜Ｎ；ｉ＋＋）  ｛
ｉｆ（ａ［ｉ］＞ｂ［ｉ］）
ｄ［ｉ］＝ａ［ｉ］＊ｃ［ｉ］；
｝
【０２０７】
ＡＳＭコード
【０２０８】
この例は、ベクトル固有関数（擬似ＡＭ命令）を使用して、二重ＤＰにアクセスする。
＃ｄｅｆｉｎｅ  ＢＰ＿ａ  ％Ｂ１
＃ｄｅｆｉｎｅ  ＢＰ＿ｂ  ％Ｂ２
＃ｄｅｆｉｎｅ  ＢＰ＿ｃ  ％Ｂ３
＃ｄｅｆｉｎｅ  ＢＰ＿ｄ  ％Ｂ４
＃ｄｅｆｉｎｅ  ＩＤＸ＿ｉ  ％Ｉ１
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄２，ＩＤＸ＿ｉ，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
ｖｔｃｍｐ１６ｓ  ＧＴ  ［ＢＰ＿ａ＋ＩＤＸ＿ｉ］，［ＢＰ＿ｂ＋ＩＤＸ＿ｉ］，％Ｐ１Ｐ０
ｖｍｕｌ１６ｓ  （％Ｐ１Ｐ０）  ［ＢＰ＿ａ＋ＩＤＸ＿ｉ］，［ＢＰ＿ｃ＋ＩＤＸ＿ｉ］，［ＢＰ＿ｄ＋ＩＤＸ＿ｉ］
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
【０２０９】
ＨｙｐｅｒＯｐコード（二重条件付記憶）
＃ｄｅｆｉｎｅ  ＢＰ＿ａ  ％Ｂ１
＃ｄｅｆｉｎｅ  ＢＰ＿ｂ  ％Ｂ２
＃ｄｅｆｉｎｅ  ＢＰ＿ｃ  ％Ｂ３
＃ｄｅｆｉｎｅ  ＢＰ＿ｄ  ％Ｂ４
＃ｄｅｆｉｎｅ  ＩＤＸ＿ｉ  ％Ｉ１
ｒｅｐｅａｔ  ＄０，＄Ｎ−１，＄２，ＩＤＸ＿ｉ，Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ，Ｌ＿ｌｏｏｐ＿ｅｎｄ
Ｌ＿ｌｏｏｐ＿ｓｔａｒｔ：
｛｜Ａ｜  ｌｄ３２  ０［ＢＰ＿ａ＋ＩＤＸ＿ｉ］，％Ａ；｜Ｂ｜  ｌｄ３２  ０［ＢＰ＿ｂ＋ＩＤＸ＿ｉ］，％Ｂ；
｜ＤＰ１｜  ｔｃｍｐ１６ｓ  ＧＴ  ％ＡＨ，％ＢＨ，％Ｐ１；｜ＤＰ０｜  ｔｃｍｐ１６ｓ  ＧＴ  ％ＡＬ，％ＢＬ，％Ｐ０；｝
｛｜Ｃ｜  ｌｄ３２  ０［ＢＰ＿ｃ＋ＩＤＸ＿ｉ］，％Ｃ；
｜ＤＰ１｜  ｍｕｌ１６ｓ  ％ＡＨ，％ＣＬＨ，％Ｄ１；｜ＤＰ０｜  ｍｕｌ１６ｓ  ％ＡＬ，％ＣＬＬ，％Ｄ０；
｜Ｄ｜  ｄｓｔ１６  （％Ｐ１Ｐ０）  ％Ｄ１＿Ｄ０，０［ＢＰ＿ｄ＋ＩＤＸ＿ｉ］；｝
Ｌ＿ｌｏｏｐ＿ｅｎｄ：
【０２１０】
注：
●ＤＰ１およびＤＰ０を使用して、繰返しｉおよびｉ＋１を並列に処理する
●述語フラグ％Ｐ１および％Ｐ０を使用して、１６ビット：１６ビットの記憶を独立に制御する（ＳＩＭＤモード）
【０２１１】
条件付飛越しを使用する条件付ｉｆ−ｅｌｓｅ−ｉｆの例
【０２１２】
Ｃコード
ａｂｓｑ＝ａｂｓ（ｑ）；
ｉｆ（ａｂｓｑ＜ｑｍｉｎ）  ｛
ｑｍｉｎ２＝ｑｍｉｎ；
ｑｍｉｎ＝ａｂｓｑ；
ｉｍｉｎ＝ｉ；
｝
ｅｌｓｅ  ｉｆ（ａｂｓｑ＜ｑｍｉｎ２）  ｛
ｑｍｉｎ２＝ａｂｓｑ；
｝
【０２１３】
ＡＳＭコード
／／ｉｍｉｎおよびｑｍｉｎはパックされたデータｉｍｉｎ＿ｑｍｉｎとして記憶されている（偶数アドレス）と仮定する
ａｂｓ１６ｓ  ｑ，ａｂｓｑ  ／／ａｂｓｑ＝ａｂｓ（ｑ）
ｔｃｍｐ１６  ＬＴ  ａｂｓｑ，ｑｍｉｎ，％Ｐ１  ／／Ｐ１＝（ａｂｓｑ＜ｑｍｉｎ）
ｊｍｐ  （！％Ｐ１）  Ｌ＿ｅｌｓｅ  ＰＮＴ  ／／！Ｐ１が真である場合、ｑｍｉｎ更新をスキップする
ｔｃｍｐ１６  ＬＴ  ａｂｓｑ，ｑｍｉｎ２，％Ｐ０  ／／Ｐ０＝（ａｂｓｑ＜ｑｍｉｎ２）―スロットを遅延する
Ｌ＿ｉｆ：  ／／ｑｍｉｎおよびｑｍｉｎ２を更新する：
ｍｏｖ１６  ｑｍｉｎ，ｑｍｉｎ２  ／／ｑｍｉｎ２＝ｑｍｉｎ
ｊｍｐ  Ｌ＿ｅｎｄ
ｄｍｏｖ１６  ｉ，ａｂｓｑ，ｉｍｉｎ＿ｑｍｉｎ  ／／ｑｍｉｎ＝ａｂｓｑ，ｉｍｉｎ＝ｉ−スロットを遅延させる
Ｌ＿ｅｌｓｅ：
ｊｍｐ  （！％Ｐ０）  Ｌ＿ｅｎｄ  ＰＮＴ  ＤＬＹ
ｎｏｐ  ／／スロットを遅延させる
ｍｏｖ１６  ａｂｓｑ，ｑｍｉｎ２  ／／ｑｍｉｎ２だけを更新する
Ｌ＿ｅｎｄ：
【０２１４】
ＤＬＹ最適化を用いるＡＳＭコード
ａｂｓ１６ｓ  ｑ，ａｂｓｑ
ｔｃｍｐ１６  ＬＴ  ａｂｓｑ，ｑｍｉｎ，％Ｐ１
ｊｍｐ  （！％Ｐ１）  Ｌ＿ｅｌｓｅ  ＰＮＴ
ｔｃｍｐ１６  ＬＴ  ａｂｓｑ，ｑｍｉｎ２，％Ｐ０  ／／遅延スロットで実行される
Ｌ＿ｉｆ：
ｍｏｖ１６  ｑｍｉｎ，ｑｍｉｎ２
ｊｍｐ  Ｌ＿ｅｎｄ
ｄｍｏｖ１６  ｉ，ａｂｓｑ，ｉｍｉｎ＿ｑｍｉｎ  ／／遅延スロットで実行される
Ｌ＿ｅｌｓｅ：
ｊｍｐ  （！％Ｐ０）  Ｌ＿ｅｎｄ  ＰＮＴ  ＤＬＹ
ｍｏｖ１６  ａｂｓｑ，ｑｍｉｎ２  ／／ＪＭＰの後に実行され、遅延スロットでは実行されない
Ｌ＿ｅｎｄ： 
【０２１５】
条件付移動を使用する条件付ｉｆ−ｅｌｓｅ−ｉｆの例
【０２１６】
Ｃコード
ａｂｓｑ＝ａｂｓ（ｑ）；
ｉｆ（ａｂｓｑ＜ｑｍｉｎ）  ｛
ｑｍｉｎ２＝ｑｍｉｎ；
ｑｍｉｎ＝ａｂｓｑ；
ｉｍｉｎ＝ｉ；
｝
ｅｌｓｅ  ｉｆ（ａｂｓｑ＜ｑｍｉｎ２）  ｛
ｑｍｉｎ２＝ａｂｓｑ；
｝
【０２１７】
ＡＳＭコード
／／ｉｍｉｎおよびｑｍｉｎはパックされたデータｉｍｉｎ＿ｑｍｉｎとして記憶されている（偶数アドレス）と仮定する
ａｂｓ１６ｓ  ｑ，ａｂｓｑ  ／／ａｂｓｑ＝ａｂｓ（ｑ）
ｔｃｍｐ１６ｓ  ＬＴ  ａｂｓｑ，ｑｍｉｎ，％Ｐ１  ／／Ｐ１＝（ａｂｓｑ＜ｑｍｉｎ）
ｔｃｍｐ１６ｓ  ＬＴ  ａｂｓｑ，ｑｍｉｎ２，％Ｐ０  ／／Ｐ０＝（ａｂｓｑ＜ｑｍｉｎ２）
ｃｍｏｖ１６  （％Ｐ１）  ｑｍｉｎ，ｑｍｉｎ２  ／／Ｐ１が真である場合、ｑｍｉｎ２＝ｑｍｉｎ
ｃｍｏｖ１６  （％Ｐ１）  ａｂｓｑ，ｑｍｉｎ  ／／Ｐ１が真である場合、ｑｍｉｎ＝ａｂｓｑ
ｃｍｏｖ１６  （％Ｐ１）  ｉ，ｉｍｉｎ  ／／Ｐ１が真である場合、ｉｍｉｎ＝ｉ
ｃｍｏｖ１６  （！％Ｐ１＆％Ｐ０）  ａｂｓｑ，ｑｍｉｎ２  ／／他にＰ０が真である場合、ｑｍｉｎ２＝ａｂｓｑ
サイクル：７
【０２１８】
ＨｙｐｅｒＯｐコード
｛｜Ａ｜  ｌｄ１６  ｑ、ＡＬ；
｜Ｂ｜  ｌｄ１６  ｉ，％ＢＬ；
｜ＤＰ１｜  ｍｏｖ１６  ％ＢＬ，％ＡＣＣ３；  ／／ＡＣＣ３＝ｉ
｜ＤＰ１｜  ａｂｓ１６ｓ  ％ＡＬ，％ＡＣＣ１；  ／／ＡＣＣ１Ｌ＝ａｂｓｑ
｜Ｄ｜  ｄｓｔ１６  ％ＡＣＣ３＿ＡＣＣ１，％ＡＣＣ３；｝  ／／ＡＣＣ３Ｈ＝ｉ，ＡＣＣ３Ｌ＝ａｂｓｑ
｛｜Ａ｜  ｌｄ３２  ｉｍｉｎ＿ｑｍｉｎ，％Ａ；  ／／ＡＨ＝ｉｍｉｎ，ＡＬ＝ｑｍｉｎ
｜Ｂ｜  ｌｄ１６  ｑｍｉｎ２，％ＢＬ；  ／／ＢＬ＝ｑｍｉｎ２
｜ＤＰ１｜  ｔｃｍｐ１６  ＬＴ  ％ＡＣＣ３Ｌ，％ＡＬ，％Ｐ１；  ／／Ｐ１＝（ａｂｓｑ＜ｑｍｉｎ）
｜ＤＰ０｜  ｔｃｍｐ１６  ＬＴ  ％ＡＣＣ１Ｌ，％ＢＬ，％Ｐ０；｝  ／／Ｐ０＝（ａｂｓｑ＜ｑｍｉｎ２）
｛｜ＤＰ１｜  ｉｆ（％Ｐ１）  ｃｍｏｖ３２  ％ＡＣＣ３，％Ａ，％ＡＣＣ２；  ／／Ｐ１が真である場合、｛ＡＣＣ２Ｈ＝ｉ，ＡＣＣ２Ｌ＝ａｂｓｑ｝
／／そうではない場合、｛ＡＣＣ２Ｈ＝ｉｍｉｎ，ＡＣＣ２Ｌ＝ｑｍｉｎ｝
｜ＤＰ０｜  ｉｆ（％Ｐ１）  ｃｍｏｖ１６  ％ＡＬ，％ＢＬ，％ＡＣＣ０；  ／／ＡＣＣ０＝（Ｐ１）  ？  ｑｍｉｎ２：ｑｍｉｎ
｜Ｄ｜  ｓｔ３２  ％ＡＣＣ２，ｉｍｉｎ＿ｑｍｉｎ；｝  ／／ｉｍｉｎ：ｑｍｉｎ＝ＡＣＣ２Ｈ：ＡＣＣ２Ｌに更新する
｛｜ＤＰ０｜  ｉｆ（！％Ｐ１＆％Ｐ０）  ｃｍｏｖ１６  ％ＡＣＣ３Ｌ，％ＡＣＣ０Ｌ，％ＡＣＣ０；  ／／そうではない場合、ＡＣＣ０Ｌ＝（Ｐ０）  ？  ａｂｓｑ：ｑｍｉｎ
｜Ｄ｜  ｓｔ１６  ％ＡＣＣ０，ｑｍｉｎ２；｝  ／／ｑｍｉｎ２＝ＡＣＣ０Ｌに更新する
サイクル：４
【０２１９】
注：
●Ｐ１および％Ｐ０を使用して、ＩＦ試験およびＥＬＳＥ  ＩＦ試験のブール代数の結果を保持する
●ｉｍｉｎおよびｑｍｉｎは、パックされた１６：１６としてメモリに記憶されていると仮定する
●ＣＳＥＬと共に％Ｐ１および％Ｐ０を使用して、可能である場合には対で状態変数を条件付きで更新する
【０２２０】
述語フラグを使用して試験を組み合わせる
【０２２１】
Ｃコード
ｉｎｔ１６  ａ，ｂ，ｃ，ｄ，ｅ；
ｖｏｉｄ  ｔｅｓｔ（）  ｛
ａ＝（ｂ＜ｃ）＆＆（ｄ＜ｅ）；
｝
【０２２２】
ＡＳＭコード
ｔｃｍｐ１６ｓ  ＬＴ  ｂ，ｃ  ％Ｐ０  ／／Ｐ０＝（ｂ＜ｃ）
ｔｃｍｐ１６ｓ  ＬＴ  ｄ，ｅ，％Ｐ１  ／／Ｐ１＝（ｄ＜ｅ）
ｃｍｏｖ１６  （％Ｐ０＆％Ｐ１）  ＄１，＄０，ａ  ／／ａ＝（Ｐ０＆Ｐ１）１：０
【０２２３】
注：
●コンパイラは、＆＆演算子を＆演算子と置換する：
●ａ＝（ｂ＜ｃ）＆（ｄ＜ｅ）
【０２２４】
レジスタファイル使用して試験を組み合わせる
【０２２５】
Ｃコード
ｉｎｔ１６  ａ，ｂ，ｃ，ｄ，ｅ；
ｖｏｉｄ  ｔｅｓｔ（）  ｛
ａ＝（ｂ＜ｃ）＆＆（ｄ＜ｅ）；
｝
【０２２６】
ＡＳＭコード
ｔｃｍｐ１６ｓ  ＬＴ  ｂ，ｃ，％Ｒ０  ／／Ｒ０＝（ｂ＜ｃ）
ｔｃｍｐ１６ｓ  ＬＴ  ｄ，ｅ，％Ｒ１  ／／Ｒ１＝（ｄ＜ｅ）
ａｎｄ１６  ％Ｒ０，％Ｒ１，ａ  ／／ａ＝Ｒ０＆Ｒ１
【０２２７】
注：
●コンパイラは、＆＆演算子を＆演算子に置換する：
●ａ＝（ｂ＜ｃ）＆（ｄ＜ｅ）
【０２２８】
サブルーチンへの条件付飛越し
【０２２９】
Ｃコード
ｉｎｔ１６  ａ，ｂ，ｃ，ｄ，ｅ，ｆ；
ｉｆ（（ａ＜ｂ）＆（ｃ＜ｅ）｜（ｄ＞ｆ））
ｆｏｏ（）；
【０２３０】
ＡＳＭコード
ｔｃｍｐ１６ｓ  ＬＴ  ａ，ｂ，％Ｒ１  ／／Ｒ１＝（ａ＜ｂ）
ｔｃｍｐ１６ｓ  ＬＴ  ｃ，ｅ，％Ｒ２  ／／Ｒ２＝（ｃ＜ｅ）
ｔａｎｄ１６  ＮＺ  ％Ｒ１，％Ｒ２，％Ｐ０  ／／Ｐ０＝（ａ＜ｂ）＆（ｃ＜ｅ）
ｔｃｍｐ１６ｓ  ＧＴ  ｄ，ｆ，％Ｐ１  ／／Ｐ１＝（ｄ＞ｆ）
ｊｓｒ  （％Ｐ０｜％Ｐ１）  ｆｏｏ  ／／Ｐ０｜Ｐ１が真であれば、ｆｏｏ（）を実行する
【０２３１】
注：
●ＡＮＤ１６ではなくＴＡＮＤ１６を使用する
●Ｐｎは、ＴＥＳＴ以外、ＡＬＵ動作ではｄｓｔＤになることはできないことに留意されたい
【０２３２】
論理／試験動作結果の割当て
【０２３３】
Ｃコード
ｉｎｔ１６  ａ，ｂ，ｃ，ｄ，ｅ，ｆ，ｒｅｓｕｌｔ；
ｒｅｓｕｌｔ＝（（ａ＜ｂ）＆（ｃ＜ｅ）｜（ｄ＞ｆ））；
【０２３４】
ＡＳＭコード
ｔｃｍｐ１６ｓ  ＬＴ  ａ，ｂ，％Ｒ１  ／／Ｒ１＝（ａ＜ｂ）
ｔｃｍｐ１６ｓ  ＬＴ  ｃ，ｅ，％Ｒ２  ／／Ｒ２＝（ｃ＜ｅ）
ａｎｄ１６  ％Ｒ１，％Ｒ２，％Ｒ３  ／／Ｐ３＝（ａ＜ｂ）＆（ｃ＜ｅ）
ｔｃｍｐ１６ｓ  ＧＴ  ｄ，ｆ，％Ｒ４  ／／Ｒ４＝（ｄ＞ｆ）
ｏｒ１６  ％Ｒ３，％Ｒ４，ｒｅｓｕｌｔ  ／／ｒｅｓｕｌｔ＝（Ｒ３｜Ｒ４）
【０２３５】
本明細書で記述するさまざまな形態のいずれも、たとえば、コンピュータ実装方法として、コンピュータ可読記憶媒体として、コンピュータシステムとしてなど、さまざまな形態のいずれでも実現されてよい。システムは、特定用途向け集積回路（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ、ＡＳＩＣ）などの１つまたは複数のカスタム設計ハードウェア機器により、ＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）などの１つまたは複数のプログラム可能ハードウェア素子により、プログラム記憶式命令を実行する１つまたは複数のプロセッサにより、または前述の任意の組合せにより実現されてよい。
【０２３６】
いくつかの実施形態では、非一時的コンピュータ可読記憶媒体は、プログラム命令および／またはデータを記憶するように構成されてもよく、この場合、プログラム命令は、コンピュータシステムにより実行された場合、方法を、たとえば、本明細書に記述する方法の実施形態のいずれか、または本明細書に記述する方法の実施形態の任意の組合せ、または本明細書に記述する方法の実施形態のいずれかからなる任意のサブセット、またはそのようなサブセットの任意の組合せを、コンピュータシステムに遂行させる。
【０２３７】
いくつかの実施形態では、コンピュータシステムは、プロセッサ（または１組のプロセッサ）および記憶媒体を含むように構成されてよく、この場合、記憶媒体は、プログラム命令を記憶し、この場合、プロセッサは、記憶媒体からプログラム命令を読み出し、実行するように構成され、この場合、プログラム命令は、本明細書に記述するさまざまな方法の実施形態のいずれか（または本明細書に記述する方法の実施形態の任意の組合せ、または本明細書に記述する方法の実施形態のいずれかからなる任意のサブセット、またはそのようなサブセットの任意の組合せ）を実装するように実行可能である。コンピュータシステムは、さまざまな形態のいずれかで実現されてよい。たとえば、コンピュータシステムは、パーソナルコンピュータ（パーソナルコンピュータのさまざまな実現形態のいずれかの形をとる）、ワークステーション、カード上のコンピュータ、ボックスの中の特定用途向けコンピュータ、サーバコンピュータ、クライアントコンピュータ、ハンドヘルド機器、移動体機器、ウェアラブルコンピュータ、検出機器、テレビ、ビデオ取込機器、生体の中に埋め込まれたコンピュータなどであってよい。コンピュータシステムは、１つまたは複数の表示機器を含んでよい。本明細書で開示するさまざまな計算結果のいずれも、表示機器を介して表示されてよい、または他の方法でユーザインタフェース機器を介して出力として提示されてよい。
【０２３８】
装置は、複数のプロセッサと、散在した配列で複数のプロセッサに連結した複数のデータ・メモリ・ルータとを備え、特定のデータ・メモリ・ルータは、複数のデータ・メモリ・ルータのうちの少なくとも１つの他のデータ・メモリ・ルータに受信したメッセージを中継するように構成され、複数のプロセッサのうちの特定のプロセッサは、複数の述語フラグのうちの少なくとも１つの述語フラグを設定して、複数の述語フラグを使用して命令を条件付きで実行するように構成される。
【０２３９】
前述の装置では、複数の述語フラグは、特定のプロセッサに含まれるデータパスに関連する少なくとも第１組の述語フラグ、および特定のプロセッサに含まれるアドレス生成器ユニットに関連する第２組の述語フラグを含む。
【０２４０】
前述の装置では、複数の述語フラグのうちの少なくとも１つの述語フラグを設定するために、特定のプロセッサは、試験命令の実行に応答して、第１の値と第２の値を比較し、結果を生成し、結果に基づき少なくとも１つの述語フラグを設定するようにさらに構成される。
【０２４１】
前述の装置では、第１の値と第２の値を比較するために、特定のプロセッサは、第１の値および第２の値を使用して論理動作を遂行して、結果を生成するようにさらに構成される。
【０２４２】
前述の装置では、複数の述語フラグのうちの少なくとも１つの述語フラグを設定するために、特定のプロセッサは、特定のプロセッサに含まれるデータパスのタイミング動作を示す情報に少なくとも一部は基づき、少なくとも１つの述語フラグを設定するようにさらに構成される。
【０２４３】
前述の装置では、複数の述語フラグのうちの少なくとも１つの述語フラグを設定するために、特定のプロセッサは、特定のプロセッサに含まれるアドレス生成器ユニットのタイミング動作を示す情報に少なくとも一部は基づき、少なくとも１つの述語フラグを設定するようにさらに構成される。
【０２４４】
前述の装置では、命令を条件付きで実行するために、特定のプロセッサは、複数の述語フラグを使用して、特定のプロセッサに含まれるデータパスに含まれる１つまたは複数のデータパススロットを条件付きで実行するようにさらに構成される。
【０２４５】
方法は、複数のプロセッサのうちの特定のプロセッサにより、複数の述語フラグのうちの少なくとも１つの述語フラグを設定するステップであって、複数のプロセッサは、散在した配列で複数のデータ・メモリ・ルータに連結されるステップと、複数のプロセッサのうちの特定のプロセッサにより、複数の述語フラグを使用して命令を条件付きで実行するステップとを備える。
【０２４６】
前述の方法では、複数の述語フラグは、特定のプロセッサに含まれるデータパスに関連する少なくとも第１組の述語フラグ、および特定のプロセッサに含まれるアドレス生成器ユニットに関連する第２組の述語フラグを含む。
【０２４７】
前述の方法では、複数の述語フラグのうちの少なくとも１つの述語フラグを設定するステップは、特定のプロセッサにより試験命令を実行することに応答して、第１の値と第２の値を比較して、結果を生成するステップと、結果に基づき、少なくとも１つの述語フラグを設定するステップとを含む。
【０２４８】
前述の方法では、第１の値と第２の値を比較するステップは、第１の値および第２の値を使用して論理動作を遂行して、結果を生成するステップを含む。
【０２４９】
前述の方法では、複数の述語フラグのうちの少なくとも１つの述語フラグを設定するステップは、特定のプロセッサにより、特定のプロセッサに含まれるデータパスのタイミング動作を示す情報に少なくとも一部は基づき、少なくとも１つの述語フラグを設定するステップを含む。
【０２５０】
前述の方法では、複数の述語フラグのうちの少なくとも１つの述語フラグを設定するステップは、特定のプロセッサにより、特定のプロセッサに含まれるアドレス生成器ユニットのタイミング動作を示す情報に少なくとも一部は基づき、少なくとも１つの述語フラグを設定するステップを含む。
【０２５１】
請求項２２に記載の前述の方法では、特定のプロセッサにより、命令を条件付きで実行するステップは、複数の述語フラグを使用して、特定のプロセッサに含まれるデータパスに含まれる１つまたは複数のデータパススロットを条件付きで実行するステップを含む。
【０２５２】
装置は、複数のプロセッサと、散在した配列で複数のプロセッサに連結した複数のデータ・メモリ・ルータとを備え、特定のデータ・メモリ・ルータは、複数のデータ・メモリ・ルータのうちの少なくとも１つの他のデータ・メモリ・ルータに受信したメッセージを中継するように構成され、複数のプロセッサのうちの特定のプロセッサは、受信した命令に基づき、特定のプロセッサに含まれる複数のデータパスのうちの特定のデータパスに含まれる複数の算術論理回路のサブセットを選択的に活動化し、複数の算術論理回路のサブセットを使用して、受信した命令を実行するように構成される。
【０２５３】
前述の装置では、複数の算術論理回路のサブセットを選択的に活動化するために、特定のプロセッサは、命令を復号して、復号された命令を生成し、復号された命令を使用して、複数の算術論理回路のサブセットを選択的に活動化するようにさらに構成される。
【０２５４】
前述の装置では、複数のプロセッサのうちの特定のプロセッサは、命令に基づき、複数の算術論理回路のサブセットに含まれる個々の算術論理回路の間でデータをルーティングするようにさらに構成される。
【０２５５】
前述の装置では、複数の算術論理回路のサブセットに含まれる個々の算術論理回路の間でデータをルーティングするために、特定のプロセッサは、特定のデータパスに含まれる複数の多重化回路のうちの少なくとも１つの多重化回路の状態を選択的に変更するようにさらに構成される。
【０２５６】
前述の装置では、複数の論理回路のうちの特定の算術論理回路は、少なくとも加算器回路を含む。
【０２５７】
前述の装置では、複数の論理回路のうちの特定の算術論理回路は、命令を実行する際に使用するオフセットを記憶するように構成されたルックアップテーブルを含む。
【０２５８】
前述の装置では、命令は、対数確率動作を指定する。
【０２５９】
方法は、複数のプロセッサのうちの特定のプロセッサに含まれる複数のデータパスのうちの特定のデータパスに含まれる複数の算術論理回路のサブセットを選択的に活動化するステップであって、複数のプロセッサは、散在した配列で複数のデータ・メモリ・ルータに連結されるステップと、複数のプロセッサのうちの特定のプロセッサにより、複数の算術論理回路のサブセットを使用して命令を実行するステップとを備える。
【０２６０】
前述の方法では、複数の算術論理回路のサブセットを選択的に活動化するステップは、命令を復号して、復号された命令を生成するステップと、復号された命令を使用して複数の算術論理回路のサブセットを選択的に活動化するステップとを含む。
【０２６１】
前述の方法は、命令に基づき、複数の算術論理回路のサブセットに含まれる個々の算術論理回路の間でデータをルーティングするステップをさらに備える。
【０２６２】
前述の方法では、複数の算術論理回路のサブセットに含まれる個々の算術論理回路の間でデータをルーティングするステップは、特定のプロセッサにより、特定のデータパスに含まれる複数の多重化回路のうちの少なくとも１つの多重化回路の状態を選択的に変更するステップを含む。
【０２６３】
前述の方法では、複数の論理回路のうちの特定の算術論理回路は、少なくとも加算器回路を含む。
【０２６４】
前述の方法では、複数の論理回路のうちの特定の算術論理回路は、ルックアップテーブルを含み、命令を実行する際に使用するオフセットをルックアップテーブルに記憶するステップをさらに備える。
【０２６５】
前述の方法では、命令は、対数確率動作を指定する。
【０２６６】
好ましい実施形態に関連して上記の実施形態について記述してきたが、本明細書で示す特有の形態に限定することを意図するのではなく、それどころか、そのような代替形態、修正形態、および均等物を、添付の特許請求の範囲により規定される本発明の実施形態の精神および範囲の中に合理的に含むことができるとして含むことが意図される。
【図１】
2021501947.tif 000010
【図２】
2021501947.tif 000011
【図３】
2021501947.tif 000012
【図４】
2021501947.tif 000013
【図５】
2021501947.tif 000014
【図６】
2021501947.tif 000015
【図７】
2021501947.tif 000016
【図８】
2021501947.tif 000017
【図９】
2021501947.tif 000018
【図１０】
2021501947.tif 000019
【図１１】
2021501947.tif 000020
【図１２】
2021501947.tif 000021
【図１３】
2021501947.tif 000022
【図１４】
2021501947.tif 000023
【図１５】
2021501947.tif 000024
【図１６】
2021501947.tif 000025
【図１７】
2021501947.tif 000026
【図１８】
2021501947.tif 000027
【図１９】
2021501947.tif 000028
【図２０】
2021501947.tif 000029
【図２１】
2021501947.tif 000030
【図２２】
2021501947.tif 000031
【手続補正書】
【提出日】令和2年2月7日(2020.2.7)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
装置であって、
複数のプロセッサを含むマルチプロセッサ（１０）と、
散在した配列で前記複数のプロセッサに連結した複数のメッセージノード（１７０１；１８００）であって、前記複数のメッセージノード（１７０１；１８００）のうちの特定のメッセージノード（１７０１；１８００）は、
ペイロード、ルーティング情報、および前記マルチプロセッサ（１０）の過去および／または現在の性能に関係がある情報を備える前記マルチプロセッサ（１０）の動作情報を含む第１のメッセージを受信し、
前記ルーティング情報および前記動作情報に基づき、前記複数のメッセージノード（１７０１；１８００）のうちの異なるメッセージノード（１７０１；１８００）を選択し、
前記異なるメッセージノード（１７０１；１８００）に基づき、前記第１のメッセージの前記ルーティング情報を修正して、第２のメッセージを生成し、
前記異なるメッセージノード（１７０１；１８００）に前記第２のメッセージを送付する
ように構成された複数のメッセージノード（１７０１；１８００）と
を備える装置。
【請求項２】
前記ルーティング情報は、前記第１のメッセージに関する絶対宛先を示す情報を含む、請求項１に記載の装置。
【請求項３】
前記ルーティング情報は、前記特定のメッセージノード（１７０１；１８００）から、前記第１のメッセージの宛先として指定された、前記複数のメッセージノード（１７０１；１８００）のうちの別のメッセージノード（１７０１；１８００）に至る相対オフセットを示す情報を含む、請求項１に記載の装置。
【請求項４】
前記特定のメッセージノード（１７０１；１８００）は、
前記第１のメッセージがブロードキャストメッセージであるという判断に応答することに基づく複数の第３のメッセージを生成し、
前記複数のメッセージノード（１７０１；１８００）の対応する１つに前記複数の第３のメッセージの各々を送付する
ようにさらに構成される、請求項１に記載の装置。
【請求項５】
前記動作情報は、輻輳情報を含む、請求項１に記載の装置。
【請求項６】
前記異なるメッセージノード（１７０１；１８００）を選択するために、前記特定のメッセージノード（１７０１；１８００）は、宛先を指定する前記第１のメッセージに含まれる情報を使用して、前記特定のメッセージノード（１７０１；１８００）に含まれるテーブルから次の宛先を取り出すようにさらに構成される、請求項１に記載の装置。
【請求項７】
方法であって、
マルチ・プロセッサ・アレイ（１０）に含まれる複数のメッセージノード（１７０１；１８００）のうちの特定のメッセージノード（１７０１；１８００）により、ペイロード、ルーティング情報、および前記マルチ・プロセッサ・アレイ（１０）の過去および／または現在の性能に関係がある情報を備える前記マルチ・プロセッサ・アレイ（１０）の動作情報を含む第１のメッセージを受信するステップと、
前記特定のメッセージノード（１７０１；１８００）により、前記ルーティング情報および前記動作情報に基づき、前記複数のメッセージノード（１７０１；１８００）のうちの異なるメッセージノード（１７０１；１８００）を選択するステップと、
前記特定のメッセージノード（１７０１；１８００）により、前記異なるメッセージノード（１７０１；１８００）に基づき第２のメッセージを生成するステップと、
前記特定のメッセージノード（１７０１；１８００）により、前記異なるメッセージノード（１７０１；１８００）に前記第２のメッセージを送付するステップと
を備える方法。
【請求項８】
前記第２のメッセージを生成する前記ステップは、前記第１のメッセージの前記ルーティング情報を修正して、前記第２のメッセージに含まれる修正ルーティング情報を生成するステップを含む、請求項７に記載の方法。
【請求項９】
前記ルーティング情報は、前記第１のメッセージに関する絶対宛先を示す情報を含む、請求項７に記載の方法。
【請求項１０】
前記ルーティング情報は、前記特定のメッセージノード（１７００；１８００）から、前記第１のメッセージの宛先として指定された、前記複数のメッセージノード（１７００；１８００）のうちの別のメッセージノード（１７００；１８００）に至る相対オフセットを示す情報を含む、請求項７に記載の方法。
【請求項１１】
前記特定のメッセージノード（１７０１；１８００）により、前記マルチ・プロセッサ・アレイ（１０）に含まれる処理要素からリクエストを受信するステップと、
前記特定のメッセージノード（１７０１；１８００）により、前記リクエストに基づき第３のメッセージを生成するステップと
をさらに備える、請求項７に記載の方法。
【請求項１２】
前記第１のメッセージがブロードキャストメッセージであるという判断に応答することに基づく複数の第３のメッセージを生成するステップと、
前記複数のメッセージノード（１７０１；１８００）のうちの対応する１つに前記複数の第３のメッセージの各々を送付するステップと
をさらに備える、請求項７に記載の方法。
【請求項１３】
テーブルから、前記特定のメッセージノード（１７０１；１８００）により、前記ルーティング情報の少なくとも一部を使用して、前記第１のメッセージに関する次の宛先を示す情報を取り出すステップをさらに備える、請求項７に記載の方法。
【請求項１４】
装置であって、
ペイロード、ルーティング情報、およびマルチ・プロセッサ・アレイ（１０）の過去および／または現在の性能に関係がある情報を備える前記マルチ・プロセッサ・アレイ（１０）の動作情報を含む第１のメッセージを受信するように構成された、メッセージバスに連結されたルータ回路（１８０１；１８０２）と、
ネットワークプロセッサ回路であって、
前記ルーティング情報および前記動作情報に基づき、前記メッセージバスを介して一緒に連結された、複数のメッセージノード（１７０１；１８００）のうちの特定のメッセージノード（１７０１；１８００）を選択し、
前記特定のメッセージノード（１７０１；１８００）に基づき、前記第１のメッセージの前記ルーティング情報を修正して、第２のメッセージを生成する
ように構成されたネットワークプロセッサ回路と
を備え、
前記ルータ回路は、前記特定のメッセージノード（１７０１；１８００）に前記第２のメッセージを送付するようにさらに構成される装置。
【請求項１５】
前記ルーティング情報は、前記第１のメッセージに関する絶対宛先を示す情報を含む、請求項１４に記載の装置。
【請求項１６】
前記ルーティング情報は、前記第１のメッセージの宛先として指定された、前記複数のメッセージノード（１７０１；１８００）のうちの所与のメッセージノード（１７０１；１８００）に至る相対オフセットを示す情報を含む、請求項１４に記載の装置。
【請求項１７】
前記動作情報を記憶するように構成された構成回路をさらに備える、請求項１４に記載の装置。
【請求項１８】
前記第１のメッセージは、前記動作情報の少なくとも一部分を含む、請求項１４に記載の装置。
【請求項１９】
前記ネットワークプロセッサ回路は、前記マルチ・プロセッサ・アレイ（１０）に含まれる処理要素からリクエストを受信し、前記リクエストに基づき第３のメッセージを生成するように構成され、前記ルータ回路は、前記第３のメッセージに含まれる情報に基づき、前記複数のメッセージノード（１７０１；１８００）のうちの異なるメッセージノード（１７０１；１８００）に前記第３のメッセージを送付するようにさらに構成される、請求項１４に記載の装置。
【請求項２０】
複数のエントリを記憶するように構成されたテーブルをさらに備え、前記ネットワークプロセッサ回路は、前記第１のメッセージに含まれる情報を使用して前記テーブルから次の宛先を取り出すようにさらに構成される、請求項１４に記載の装置。
【国際調査報告】
2021501947.tif 000032
2021501947.tif 000033