(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-06-12
(45)【発行日】2023-06-20
(54)【発明の名称】メモリ・ネットワーク・プロセッサ
(51)【国際特許分類】
G06F 15/173 20060101AFI20230613BHJP
【FI】
G06F15/173 660B
(21)【出願番号】P 2020524772
(86)(22)【出願日】2018-11-02
(86)【国際出願番号】 US2018058873
(87)【国際公開番号】W WO2019090032
(87)【国際公開日】2019-05-09
【審査請求日】2021-09-22
(32)【優先日】2017-11-03
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】505000815
【氏名又は名称】コーヒレント・ロジックス・インコーポレーテッド
(74)【代理人】
【識別番号】100098394
【氏名又は名称】山川 茂樹
(74)【代理人】
【識別番号】100064621
【氏名又は名称】山川 政樹
(72)【発明者】
【氏名】ドブス,カール・エス
(72)【発明者】
【氏名】ビンドロス,キース・エム
(72)【発明者】
【氏名】フォークナー,ケネス・アール
(72)【発明者】
【氏名】イカザ,アレックス・イー
(72)【発明者】
【氏名】ラッシュ,フレデリック・エイ
(72)【発明者】
【氏名】サイード,ファイサル・エイ
(72)【発明者】
【氏名】トロチーノ,マイケル・アール
【審査官】三坂 敏夫
(56)【参考文献】
【文献】国際公開第2013/098993(WO,A1)
【文献】特開2006-277635(JP,A)
【文献】特開2012-146201(JP,A)
【文献】特開2017-123197(JP,A)
【文献】特開平07-028763(JP,A)
【文献】特開昭62-109451(JP,A)
【文献】澤村 徹,「無線LANのセッティングは難しい」は昔の話 手間いらずの簡単セッティング機能を検証,月刊ウィンドウズ スタート 6月号 ,株式会社毎日コミュニケーションズ,2006年04月29日,No.132.2006.JUN,第66頁-第67頁
(58)【調査した分野】(Int.Cl.,DB名)
G06F 15/16-15/173
(57)【特許請求の範囲】
【請求項1】
装置であって、
複数のプロセッサと、
散在した配列で前記複数のプロセッサに連結した複数のデー
タ・メモリ・ルータであって、各前記複数のデータ・メモリ・ルータは前記複数のプロセッサ間の一次相互接続ネットワーク内のノードである、前記複数のデータ・メモリ・ルータと、を含むマルチプロセッサ(10)と、
散在した配列で前記複数のプロセッサに連結した複数のメッセージノード(1701;1800)であって、
前記複数のメッセージノード(1701;1800)は互いに連結されて二次相互接続ネットワークを形成し、前記複数のメッセージノード(1701;1800)のうちの特定のメッセージノード(1701;1800)は、
ペイロード、ルーティング情報、および前記マルチプロセッサ(10)
の動作情報を含む第1のメッセージを受信し、
前記動作情報は、輻輳情報を含み、
前記ルーティング情報および前記動作情報
の前記輻輳情報に基づき、前記複数のメッセージノード(1701;1800)のうちの異なるメッセージノード(1701;1800)を選択し、
前記異なるメッセージノード(1701;1800)に基づき、前記第1のメッセージの前記ルーティング情報を修正して、第2のメッセージを生成し、
前記異なるメッセージノード(1701;1800)に前記第2のメッセージを送付する
ように構成された複数のメッセージノード(1701;1800)と
を備える装置。
【請求項2】
前記ルーティング情報は、前記第1のメッセージに関する絶対宛先を示す情報を含む、請求項1に記載の装置。
【請求項3】
前記ルーティング情報は、前記特定のメッセージノード(1701;1800)から、前記第1のメッセージの宛先として指定された、前記複数のメッセージノード(1701;1800)のうちの別のメッセージノード(1701;1800)に至る相対オフセットを示す情報を含む、請求項1に記載の装置。
【請求項4】
前記特定のメッセージノード(1701;1800)は、
前記第1のメッセージがブロードキャストメッセージであるという判断に応答することに基づく複数の第3のメッセージを生成し、
前記複数のメッセージノード(1701;1800)の対応する1つに前記複数の第3のメッセージの各々を送付する
ようにさらに構成される、請求項1に記載の装置。
【請求項5】
前記異なるメッセージノード(1701;1800)を選択するために、前記特定のメッセージノード(1701;1800)は、宛先を指定する前記第1のメッセージに含まれる情報を使用して、前記特定のメッセージノード(1701;1800)に含まれるテーブルから次の宛先を取り出すようにさらに構成される、請求項1に記載の装置。
【請求項6】
方法であって、
マルチ・プロセッサ・アレイ(10)に含まれる複数のメッセージノード(1701;1800)のうちの特定のメッセージノード(1701;1800)により、ペイロード、ルーティング情報、および
前記マルチ・プロセッサ・アレイ(10)の動作情報を含む第1のメッセージを受信するステップ
であって、前記動作情報は輻輳情報を含み、前記マルチ・プロセッサ・アレイ(10)は、複数のプロセッサと、散在した配列で前記複数のプロセッサに連結した複数のデータ・メモリ・ルータであって、各前記複数のデータ・メモリ・ルータは前記複数のプロセッサ間の一次相互接続ネットワーク内のノードである、前記複数のデータ・メモリ・ルータと、を含み、前記複数のメッセージノード(1701;1800)は互いに接続されて二次相互接続ネットワークを形成する、前記受信するステップと、
前記特定のメッセージノード(1701;1800)により、前記ルーティング情報および前記動作情報
の前記輻輳情報に基づき、前記複数のメッセージノード(1701;1800)のうちの異なるメッセージノード(1701;1800)を選択するステップと、
前記特定のメッセージノード(1701;1800)により、前記異なるメッセージノード(1701;1800)に基づき第2のメッセージを生成するステップと、
前記特定のメッセージノード(1701;1800)により、前記異なるメッセージノード(1701;1800)に前記第2のメッセージを送付するステップと
を備える方法。
【請求項7】
前記第2のメッセージを生成する前記ステップは、前記第1のメッセージの前記ルーティング情報を修正して、前記第2のメッセージに含まれる修正ルーティング情報を生成するステップを含む、請求項
6に記載の方法。
【請求項8】
前記ルーティング情報は、前記第1のメッセージに関する絶対宛先を示す情報を含む、請求項
6に記載の方法。
【請求項9】
前記ルーティング情報は、前記特定のメッセージノード(1700;1800)から、前記第1のメッセージの宛先として指定された、前記複数のメッセージノード(1700;1800)のうちの別のメッセージノード(1700;1800)に至る相対オフセットを示す情報を含む、請求項
6に記載の方法。
【請求項10】
前記特定のメッセージノード(1701;1800)により、前記マルチ・プロセッサ・アレイ(10)に含まれる処理要素からリクエストを受信するステップと、
前記特定のメッセージノード(1701;1800)により、前記リクエストに基づき第3のメッセージを生成するステップと
をさらに備える、請求項
6に記載の方法。
【請求項11】
前記第1のメッセージがブロードキャストメッセージであるという判断に応答することに基づく複数の第3のメッセージを生成するステップと、
前記複数のメッセージノード(1701;1800)のうちの対応する1つに前記複数の第3のメッセージの各々を送付するステップと
をさらに備える、請求項
6に記載の方法。
【請求項12】
テーブルから、前記特定のメッセージノード(1701;1800)により、前記ルーティング情報の少なくとも一部を使用して、前記第1のメッセージに関する次の宛先を示す情報を取り出すステップをさらに備える、請求項
6に記載の方法。
【請求項13】
メッセージノード(1701;1800)として使用する装置であって、
ペイロード、ルーティング情報、および
マルチ・プロセッサ・アレイ(10)の動作情報を含む第1のメッセージを受信するように構成された、メッセージバスに連結されたルータ回路(1801;1802)
であって、前記動作情報は、輻輳情報を含み、前記マルチ・プロセッサ・アレイ(10)は、複数のプロセッサと、散在した配列で前記複数のプロセッサに連結した複数のデータ・メモリ・ルータであって、各前記複数のデータ・メモリ・ルータは前記複数のプロセッサ間の一次相互接続ネットワーク内のノードである、前記複数のデータ・メモリ・ルータと、を含む、前記ルータ回路(1801;1802)と、
ネットワークプロセッサ回路であって、
前記ルーティング情報および前記動作情報
の前記輻輳情報に基づき、前記メッセージバスを介して一緒に連結され
て二次相互接続ネットワークを形成する、複数の
前記メッセージノード(1701;1800)のうちの特定のメッセージノード(1701;1800)を選択し、
前記特定のメッセージノード(1701;1800)に基づき、前記第1のメッセージの前記ルーティング情報を修正して、第2のメッセージを生成する
ように構成されたネットワークプロセッサ回路と
を備え、
前記ルータ回路は、前記特定のメッセージノード(1701;1800)に前記第2のメッセージを送付するようにさらに構成される装置。
【請求項14】
前記ルーティング情報は、前記第1のメッセージに関する絶対宛先を示す情報を含む、請求項
13に記載の装置。
【請求項15】
前記ルーティング情報は、前記第1のメッセージの宛先として指定された、前記複数のメッセージノード(1701;1800)のうちの所与のメッセージノード(1701;1800)に至る相対オフセットを示す情報を含む、請求項
13に記載の装置。
【請求項16】
前記動作情報を記憶するように構成された構成回路をさらに備える、請求項
13に記載の装置。
【請求項17】
前記第1のメッセージは、前記動作情報の少なくとも一部分を含む、請求項
13に記載の装置。
【請求項18】
前記ネットワークプロセッサ回路は、前記マルチ・プロセッサ・アレイ(10)に含まれる処理要素からリクエストを受信し、前記リクエストに基づき第3のメッセージを生成するように構成され、前記ルータ回路は、前記第3のメッセージに含まれる情報に基づき、前記複数のメッセージノード(1701;1800)のうちの異なるメッセージノード(1701;1800)に前記第3のメッセージを送付するようにさらに構成される、請求項
13に記載の装置。
【請求項19】
複数のエントリを記憶するように構成されたテーブルをさらに備え、前記ネットワークプロセッサ回路は、前記第1のメッセージに含まれる情報を使用して前記テーブルから次の宛先を取り出すようにさらに構成される、請求項
13に記載の装置。
【発明の詳細な説明】
【技術分野】
【0001】
(関連出願の相互参照)
発明者がMichael B. Doerr、Carl S. Dobbs、Michael B. Solka、Michael R. Trocino、Kenneth R. Faulkner、Keith M. Bindloss、Sumeer Arya、John Mark Beardslee、およびDavid A. Gibsonである、「Memory-Network Processor with Programmable Optimizations(プログラム可能な最適化を有するメモリ・ネットワーク・プロセッサ)」と題する米国特許第9,430,369号明細書は、あらゆる点で完全に本明細書に示されているように全体が参照により本明細書に組み入れられる。
【0002】
発明者がMichael B. Doerr、Carl S. Dobbs、Michael B. Solka、Michael R. Trocino、およびDavid A. Gibsonである、「Multiprocessor fabric having configurable communication that is selectively disabled for secure processing(安全な処理のために選択的に無効化されるマルチプロセッサ構成)」と題する米国特許第9,424,441号明細書は、あらゆる点で完全に本明細書に示されているように全体が参照により本明細書に組み入れられる。
【0003】
本発明は、マルチ・プロセッサ・システムに関し、より詳細にはプロセッサの動作および実行の改善に関する。
【背景技術】
【0004】
一般的ハードウェアシステムの主要な目的は、完全なプログラム可能性を維持しながら、特定用途向け(プログラム可能ではない)ハードウェア性能を達成することである。歴史的に、これら2つの概念は、両極端にある。特定用途向けハードウェアは、可能な最も効率的方法で特有の機能を遂行する固定したハードウェア解決手段である。この解決手段は、通常は機能あたりのエネルギー、または1つもしくは複数の動作あたりのエネルギーに関して、ならびに製品の部分的費用に関係がある可能性がある(回路)面積あたりの機能に関して測定される。チップ製品の費用は、ダイ面積および最終パッケージを含む多くの要因からなる。費用はまた、製品を開発するためのエコシステム全体を考慮すべきである。このエコシステム費用は、特有のアプリケーションを特有のハードウェア解決手段に変換するための時間、システム全体を構成するのに必要な特有のハードウェア解決手段の数、およびカスタム化した通信およびメモリの構造によって特有のハードウェア解決手段のすべてを一体化するのにかかる時間などからなる。したがって、完全に一体化された解決手段は、カスタムな相互接続を伴う数多くの特有のハードウェア解決手段のすべてをサポートする必要があり、その結果、単一チップダイ上に非常に大きな面積要件をもたらす。歴史的に、この過程は、面積、エネルギー、および市場に出るまでの時間に関して非効率的な解決手段をもたらしてきた。
【0005】
プログラム可能性の世界、および対象とするハードウェアの概念について考えるとき、ハードウェアアーキテクチャおよびソフトウェア開発様式の観点から見た市場または状況は、Intel、AMD、およびARMが提供する汎用プロセッサ(General Purpose Processor、GPP)、NVIDIAおよびAMDから得られるグラフィカル処理ユニット(Graphical Processing Unit、GPU)、Texas InstrumentsおよびAnalog Devicesから得られるデジタル・シグナル・プロセッサ(Digital Signal Processor、DSP)、Xilinx、Alteraなどから得られるFPGA(Field Programmable Gate Array)、CaviumおよびTileraから得られるマルチ・コア・アーキテクチャ/メニー・コア・プロセッサ、ならびに特定用途向け集積回路(Application Specific Integrated Circuit、ASIC)またはシステム・オン・チップ(System On Chip、SoC)により代表される。
【0006】
GPPは、汎用処理のためにある、すなわち、古いが検証済みの、40年以上にわたって考えられているハードウェアアーキテクチャに基づき、何でも屋になろうとしている。GPPの一般的目的は、サポートするオペレーティングシステム(たとえば、WindowsおよびLinux(登録商標))を用いて、ユーザインタフェース(user interface、UI)、およびMSWord、Excel、電子メールなどのような高度な対話型UIを集約的に用いるアプリケーションを走らせることである。電力散逸に影響を及ぼすハードウェア特性は、マルチ・レベル・キャッシュ、複雑なハードウェアメモリ管理ユニット、大規模バス、および大規模クロック制御構造である。要するに、GPPは、これらのタスクを遂行するために大量の電力を散逸する。ソフトウェア開発の観点から、目標とするのは、最も簡単なソフトウェア・プログラミング・モデルであると考えられる。このモデルは、ユーザが連続的または直列に実行する単一スレッドを開発しているという観点から得られる。並列処理、または複数のハードウェアスレッド(約4つより多くのスレッド)を導入するとき、スレッドを効率的にプログラムする能力は、はるかに難解になる。これは、基本的に、並列スレッド動作をサポートするためのアーキテクチャが開発されなかったという事実、およびその結果、ハードウェアアーキテクチャは、管理するために途方もない量のオーバーヘッドとなる複雑性を必要とするという事実に起因する。ソフトウェア・プログラミング・モデルは、複数のソフトウェアスレッドの規定をサポートするために、APIまたは言語の拡張を導入する必要がある。この拡張は、複雑である必要はないが、不都合なことに現在のGPPハードウェアアーキテクチャは、そのような複雑性を必要とする。
【0007】
高い水準では、世界のあらゆるスーパーコンピュータで長年の間C、C++、Fortranなどと共に広範囲にわたって使用されてきたAPIは、1990年代初頭以来の業界標準であるMPI(message passing interface、メッセージ受渡インタフェース)APIである。このMPIは、非常に簡単で、よく理解されている、ハードウェア実装を制限しないAPIである。MPI APIは、ハードウェアとは無関係な手法でソフトウェアスレッドおよび通信の規定を可能にする。このMPI APIは、OpenMP、Coarray Fortran、OpenCLなど、ならびに想定される基盤となるハードウェアモデルを本来規定する他の言語/APIと異なり、したがってそれにより、解釈の柔軟性を制限し、前方互換性の問題を引き起こす。換言すれば、これらの他の言語/APIを用いる場合、プログラマは、対象となるあらゆる新しいハードウェアプラットフォーム用プログラムを書き直す必要がある。
【0008】
GPUは、歴史的にデータ表示を処理し、対象とするために開発された。GPUは、GPUのコア外(外部)メモリモデル要件および内部コアメモリモデル要件によりアーキテクチャ上制約されるハードウェアである。コア外メモリは、GPPに対してGPUメモリ空間内にデータを配置するように要求する。GPUは、次いでデータを得て、パイプライン方式でデータに対して動作し、次いでデータをGPUの外部メモリ空間に戻して配置する。ここから表示装置にデータを送信することができる、またはGPPは、一般的処理を受ける動作でさらに使用/記憶するために、GPUメモリ空間の外にデータを移動させる必要がある。ハードウェアが非効率なのは、(1)コア外ハードウェア制約をサポートするためにデータをあちこち移動させるために必要なサポート、ならびに(2)能率化されたパイプラインでデータを処理するように制約される、深くパイプライン化されたSIMD機械に類似する限定的内部コアメモリ構造に起因する。その結果、データを処理するためのハードウェアが非効率であることに起因して電力利用が高い。使用するソフトウェア・プログラミング・モデルは、極度にハードウェア中心のOpenCL、CUDAなどであり、したがって、効率を達成するには複雑であり、それほど移植可能ではなく、新しいハードウェア対象プラットフォームに移行しようとするとき、コードを書き換えて、再構成しなければならない。
【0009】
DSPは、一般的信号処理用に縮小され、かつその処理を対象とした命令セットを用いるGPPと考えることができる。DSPは、その兄貴分/姉貴分であるGPPと同じキャッシュ、MMU、およびバスの悩みを欠点として持つ。追加で、Viterbi/Turbo復号または動き推定などの、実際に高スループットの任意の処理機能は、通常は商業市場での限定的な1組の特有の標準だけをサポートしている、限定的能力を伴うASICアクセラレータになっている。プログラミングモデルは、単一のハードウェアスレッドを対象とするときにはGPPに類似するが、実行ユニットのハードウェアでは信号処理命令の取り組み方法であるので、任意の高効率を達成するには、関数のハンドアセンブリを必要とする、または所有権のあるソフトウェアライブラリを使用する必要がある。上記で論じた並列GPPに類似する多重並列DSPアーキテクチャを作成するとき、問題はさらに悪化する。
【0010】
FPGAは、機能の規定をビットレベルで行うことができ、プログラム可能な有線構造によって論理機能間の通信が行われる、完全に異なるハードウェア取り組み方法である。このハードウェア取り組み方法は、途方もないオーバーヘッドおよび複雑性を導入する。これに起因して、VerilogまたはVHDLなどのハードウェアプログラミング言語で効率的プログラミングを遂行する。プログラム可能な配線およびプログラム可能論理が、ASIC/SOCで必要とされるものに類似するが構造化された有線構成を伴うタイミング収束障害を導入することに起因して、コンパイル処理は、はるかにより複雑である。特有の機能に関する電力散逸および性能スループットは、FPGAが、プログラムされたことだけを正確に遂行し、他に何も遂行しないことに起因して、一度に1つの機能だけを比較するとき、GPPまたはGPUよりもはるかに良好であることは明らかである。しかしながら、GPPの能力のすべてをFPGA内に実装しようとする場合、FPGAは、GPPよりもはるかに劣ることは明らかである。ハードウェアレベルでプログラムすることの困難さは明らかである(たとえば、タイミング収束)。FPGAのプログラミングは、実際には「プログラミング」ではなく、むしろ、論理/ハードウェア設計であり、VHDL/Verilogは、論理/ハードウェア設計言語であり、プログラミング言語ではない。
【0011】
マルチ・コア・アーキテクチャ/メニー・コア・アーキテクチャのほとんどすべては、ハードウェアの観点から、コアプロセッサ、キャッシュ、MMU、バス、およびすべての関連する論理を採用しており、これらをダイ上でこれらの周囲の通信バス/構成と共に複製している。マルチ・コア・アーキテクチャの例は、IBMのCell、IntelおよびAMDのクアッドコアおよびNマルチコア、CaviumおよびTileraの製品、いくつかのカスタムSoCなどである。追加で、マルチ・コア・アーキテクチャで達成される電力低減は、大部分は微々たるものである。この結果は、マルチコアの取り組み方法がGPUの取り組み方法を単に置換しているにすぎないという事実から導出される。マルチ・コア・アーキテクチャで唯一実際に電力節約するのは、いくつかのIOドライバの低減であり、これらのドライバは、コアが以前は別個のチップ上にあったのに対して、チップ上の通信バスにより接続されるので、今では必要ない。したがって、マルチコアの取り組み方法は、エネルギーをそれほど節約しない。第2に、ソフトウェア・プログラミング・モデルは、上記で論じたGPPから改善されていない。
【0012】
その他の取り組み方法で識別される問題のリストは、特有の市場では、システム開発者が、特有のGPP、DSP、およびASICアクセラレータを有するカスタムチップに任せて、システム・オン・チップ(SoC)を形成する理由から生じる。SoCは、電力散逸および費用のバランスをとるために、必要な場合にプログラム可能性を、および特有の機能のためにASIC性能を提供する。しかしながら、今ではソフトウェア・プログラミング・モデルは、上記のプログラム可能なハードウェア解決手段のもとで論じたよりもさらにより複雑である。追加で、SoCは、完全にプログラム可能な解決手段に関連する柔軟性を失う結果となることがある。
【0013】
これらのプログラム可能な解決手段すべての間で共通なことは、今日市場を代表するソフトウェア・プログラミング・モデルが、多くの場合、実行モデルおよび基盤となるハードウェアアーキテクチャを、ハードウェア非依存になるのではなく、より多くのアプリケーションをより効率的にサポートするように外挿することに焦点を当てていることである。
【0014】
OpenCLは、いくつかの制限事項および追加事項と共にANSI Cプログラミング言語を使用してカーネルを書くことをサポートする。OpenCLは、関数ポインタ、再帰、ビットフィールド、可変長アレイ、および標準ヘッダフィールドの使用を許可しない。言語は、ベクトル型およびベクトル動作を伴う並列処理、同期、ならびに作業項目/グループを用いて作業するための関数をサポートするように拡張されている。アプリケーション・プログラミング・インタフェース(application programming interface、API)を使用して、プラットフォームを規定し、次いでプラットフォームを制御する。OpenCLは、コースレベルでタスクに基づく並列処理およびデータに基づく並列処理を使用して並列コンピューティングをサポートする。
【0015】
マルチ・プロセッサ・システム上で並列実行するためのソフトウェアアプリケーションを開発するための従来技術の取り組み方法は、一般に開発しやすさと並列実行の効率の間のトレードオフを必要とする。換言すれば、一般に、プログラマにとって開発過程が容易であるほど、それだけ結果として得られる実行可能プログラムは、ハードウェア上でより非効率に実行され、逆に、より効率的に実行するには、一般にプログラマがさらにかなり努力する必要がある、すなわち、非効率な処理を回避するために、プログラムをより詳細に設計して、対象とするハードウェアの、効率を高める特徴を使用する必要があるというのが事実であった。
【先行技術文献】
【特許文献】
【0016】
【文献】米国特許第9,430,369号
【文献】米国特許第9,424,441号
【発明の概要】
【発明が解決しようとする課題】
【0017】
したがって、アプリケーションおよびシステムレベルの視点からソフトウェア記述を容易にして、実行モデルおよび基盤となるハードウェアアーキテクチャを対象とするソフトウェア・プログラミング・モデルおよびその後ソフトウェア・プログラミング・モデルの使用を推進するための、改善されたシステムおよび方法が望まれる。この過程を通して、アプリケーションの効率的でプログラム可能な実装を可能にする仕組みを提供する改善もまた望まれる。MPI(Message Passing Interface)は、標準化され言語に依存しない、拡張可能で移植可能なメッセージ受渡通信プロトコルAPIである。MPI APIは、言語特有構文法(結合)を用いて、言語独立な方法で(ノード/サーバ/コンピュータインスタンスにマッピングされた)1組の処理間で、不可欠の仮想トポロジ、同期、および通信機能性を提供することを意図する。MPI API標準は、さまざまな挙動を規定可能なポイント間通信および集合通信/ブロードキャスト通信の送信動作/受信動作ならびに処理の同期のためのサポートを含むが、それらのサポートに限定されないライブラリルーチンのコアの構文法および意味論を規定する。MPIは今日、高性能コンピューティングで使用される支配的モデルである。システムレベルで電力散逸のワットあたり、より高い性能を得るためのさらに大きな進展は、密な通信状態にある多くの処理要素、分散高速メモリ、およびシステムをモジュールの階層に分割する、より洗練されたソフトウェア開発ツールを用いるならば可能である。階層の最下部には、処理要素に割り付けられたタスク、サポートするメモリ、および動的に構成可能な相互接続ネットワークにわたる柔軟な通信経路が存在する。
【課題を解決するための手段】
【0018】
複数のメッセージノードを含むマルチプロセッサ集積回路のためのさまざまな実施形態を開示する。大まかに言えば、複数のメッセージノードは、マルチプロセッサに含まれる複数のプロセッサに散在した配列で連結される。複数のメッセージノードのうちの特定のメッセージノードは、ペイロードおよびルーティング情報を含む第1のメッセージを受信して、ルーティング情報およびマルチプロセッサの動作情報に基づき、複数のメッセージノードのうちの異なるメッセージノードを選択するように構成される。特定のメッセージノードはまた、異なるメッセージノードに基づき第1のメッセージのルーティング情報を修正して、第2のメッセージを生成して、異なるメッセージノードに第2のメッセージを送付するように構成される。
【図面の簡単な説明】
【0019】
【
図1】マルチ・プロセッサ・アレイのある実施形態を描く。
【
図3】命令デコーダのある実施形態の構成図である。
【
図4】アドレス生成器のある実施形態を例示する構成図である。
【
図5】プログラミングモデルを比較する構成図である。
【
図6】述語(predicate)フラグの試験を描く表を例示する。
【
図7】異なる条件付命令を描く3つの表を例示する。
【
図10】ターボ命令用の、活動状態にある論理回路を例示する構成図である。
【
図11】ハーフターボ命令用の、活動状態にある論理回路を例示する構成図である。
【
図12】ボックスプラス(box plus)命令用の、活動状態にある論理回路を例示する構成図である。
【
図13】Max*命令用の、活動状態にある論理回路を例示する構成図である。
【
図14】別のMax*命令用の、活動状態にある論理回路を例示する構成図である。
【
図15】マルチ・プロセッサ・アレイに含まれるメッセージバスの論理的概観を描く。
【
図16】メッセージバス上でメッセージを送信する一部としてプログラムすべき情報を描く表である。
【
図17】メッセージ・バス・ノードの一般的インタフェースを描く構成図である。
【
図18】メッセージ・バス・ノードの内部構成要素を例示する構成図である。
【
図19】メッセージ・バス・ネットワークのある実施形態を描く構成図である。
【
図20】HyperOpデータパスを描く構成図である。
【
図21】プログラミングモデルを描く構成図である。
【
図22】メッセージノードを動作させるための方法のある実施形態を例示する流れ図を描く。
【発明を実施するための形態】
【0020】
本開示は、さまざまな修正形態および代替形態が可能であるが、それらの具体的実施形態について、図面で例として示し、本明細書で詳細に記述する。しかしながら、それらの実施形態に対する図面および詳細な記述は、例示する特定の形態に本開示を限定することを意図するものではなく、それどころか、本発明は、添付の特許請求の範囲により規定されるような本開示の精神および範囲に入るすべての修正形態、均等物、および代替形態を包含するためにあることを理解されたい。本明細書で使用する見出しは、編成するためだけにあり、本明細書の範囲を限定するために使用するものではない。本出願全体を通して使用するとき、単語「may(してよい、することがある)」は、義務的な意味(すなわち、しなければならない(must)を意味する)ではなく、許可する意味(すなわち、する可能性を有することを意味する)で使用される。同様に、単語「include(含む)」、「including」、および「includes」は、含むが、限定されるわけではないことを意味する。
【0021】
流れ図は、代表的実施形態を例示するために提供され、例示する特定のステップに本開示を限定することを意図するものではない。さまざまな実施形態では、図示する方法の要素のいくつかは、同時に遂行されてよい、示すのと異なる順序で遂行されてよい、または省略されてよい。追加の方法の要素はまた、望み通りに遂行されてよい。
【0022】
さまざまなユニット、回路、または他の構成要素について、1つまたは複数のタスクを遂行する「ように構成される」として記述することがある。そのような文脈では、「ように構成される」は、動作中に1つまたは複数のタスクを遂行する「回路を有すること」を一般に意味する構造についての包括的な詳述である。したがって、ユニット/回路/構成要素は、現在作動していないときでさえ、タスクを遂行するように構成することができる。一般に、「ように構成される」に対応する構造を形成する回路は、ハードウェアの回路を含んでもよい。同様に、さまざまなユニット/回路/構成要素について、説明の便宜上、1つまたは複数のタスクを遂行するとして記述することがある。そのような記述は、「ように構成される」という語句を含むと解釈されるべきである。1つまたは複数のタスクを遂行するように構成されたユニット/回路/構成要素について記載することは、そのユニット/回路/構成要素に関して米国特許法第112条段落6の解釈を引用することを明示的に意図するものではない。より一般的には、任意の要素の記載は、用語「ための手段(means for)」または「ためのステップ(step for)」が具体的に記載されない限り、その要素に関して米国特許法第112条段落6の解釈を引用することを明示的に意図するものではない。
【0023】
実施形態の詳細な記述
図1を参照すると、マルチ・プロセッサ・システム(MPS)の一実施形態を例示する構成図が描かれている。例示する実施形態では、MPS10は、複数のプロセッサ要素(processor element、PE)と、データおよび命令を互いに通信するように連結された、動的に構成可能なコミュニケータまたは動的に構成可能な通信要素と呼ばれることもある複数のデータ・メモリ・ルータ(data memory router、DMR)とを含む。本明細書で使用するとき、PEはまた、PEノードと呼ばれることもあり、DMRはまた、DMRノードと呼ばれることもある。
【0024】
デュアル/クアッド処理要素(PE)およびそのデータ用ローカル補助メモリ(supporting memory、SM)のある実施形態に関するデータパス図を
図2に示す。
図2の左上隅は、データ用SM(データRAM)のためのアドレス生成器を示し、右上は、レジスタファイル、およびデータ・メモリ・ルータ(DMR)用のいくつかの制御レジスタを示す。DMRは、PE間の一次相互接続ネットワーク(Primary interconnection network、PIN)内のノードである。大規模MUX(多重通信)を使用して、異なるデータソースを主要な入力オペランドレジスタA、B、およびCの中に切り替える。別の大規模MUXは、オペランドデータを算術パイプラインDP1およびDP0のXおよびYの入力に切り替える。第3の大規模MUXは、算術パイプライン出力Z1およびZ0をデータパスDに切り替えて、レジスタファイルまたはデータRAMに戻す。データRAMは近接するPEと共有され、アクセス衝突はハードウェアにより調停される。パイプラインの制御は、
図3の命令復号ブロックから得られる。
【0025】
図4のアドレス生成器を参照すると、プログラム可能算術ユニットは、アドレスを実際に使用する前にいくつかの動作を開始してよい洗練されたアドレス計算をサポートするために含まれている。
図4に示すアドレス生成器は、3つの整数加算ユニット(AGU0、AGU1、およびAGU2)、汎用整数ALU(GALU)、および「反復H/W(ハードウェア)および自動インクリメンタ(Auto Incrementer)」用ボックスを含む。レジスタは、独立した基底値およびストライド値を伴う最大8つまでのインデックスを用いて入れ子ループをサポートする。追加汎用レジスタは、GALUおよび反復ユニットをサポートする。出力マルチプレクサは、任意の計算されたアドレスをデータRAMのA、B、またはDのアドレスポートにルーティングするのをサポートする。
【0026】
図2の中心に示す実行レジスタおよび述語フラグにより、命令の条件付実行をサポートする。命令の実行は、実行状態に依存し、述語は従来技術である。毎回すべての命令が特有のクロックサイクル数後に終了する場合、条件付実行は、利益にならない可能性が高い。しかし多くの事例では、重要な命令は、より少ないクロックサイクル内に終了することができ、次の命令が必要とする、または複数の命令が必要とする結果を提供する。これらの次の命令は、状態ビットを待つように条件付けられている場合、上記の事例ではより速やかに開始されてよい。述語は、ただ待つためではなく、さらにまた選択および分岐するために、より一般的に条件付命令により使用されてよい数ビットである。また、いくつかの命令を使用して、述語値を設定/クリアする。
【0027】
さまざまな実施形態では、PEは、2つのタイプの命令を、すなわち64ビットおよび128ビットを混合するプログラムをサポートしてよい。より短い命令は、以下で
図5の左側に示すように、アセンブリ言語プログラミングモデルをサポートする。これは、旧来のコードおよびより簡単なコンパイラをサポートするのに有用である。より長い128ビット命令は、
図5の右側に示す「HyperOp」プログラミングモデルをサポートする。より長い命令は、二重データパスハードウェアをより正確に制御して、二重データパスハードウェアを信号処理のためにより効率的にするために必要であり、その結果、所与の電力散逸(Pdiss)に関する性能を高めるが、しかしながら、プログラミングは、より洗練される必要がある。
【0028】
PEアーキテクチャの
図2では、(他のアーキテクチャでのハードウェア支援スケジューリングとは対照的に)各パイプライン内部の動作の詳細なスケジューリングをプログラムコンパイルにより規定する。しかしながら、PE命令は、条件付実行用に設計されており、実行するための条件は、実行状態および述語の登録値に依存する。いくつかの事例では、6つの述語が対で、すなわち、データパスで2対が、アドレス生成器で1対が出現する。単一の条件付命令は、単一対の述語にアクセスすることができるが、より多くの命令にわたり、すべての述語にアクセスすることができる。いくつかの実施形態では、条件付実行を使用して、二重パイプラインまたは多プロセッサICの状況でPEの性能を最適化してよい。条件付実行は、さまざまな実施形態では、各アプリケーションのアルゴリズムの流れ構造詳細に基づき、平均速度/電力比(「速度/Pdiss比」とも呼ばれる)を改善することがある。
【0029】
さまざまな実施形態では、
図1の実施形態に含まれるPEは、以下の特徴を含んでよい:
●2つのデータパス、それぞれ(サイクルあたり)以下が可能:
○1つ/2つの16×16の積算、または1つの32×16の積算
○1つ/2つの16ビット加算/減算、または1つの32ビット加算/減算
○40ビットのバレルシフト
○32ビットの論理動作
●40ビットの累積、2つの40ビットアキュムレータ
○(サイクルあたり)データパスを一緒に遂行することができる:
○1つの32×32積算または積和演算
●1つの32ビット浮動小数点加算/減算/積算
○3つのアドレス生成ユニット(Address Generation Unit、AGU)
○3つのロード:srcA(ソースA)、srcB(ソースB)、srcC(ソースC)
○2つのロードおよび1つの記憶:srcA、srcB、dstD(宛先D)
○8つの基底レジスタおよび8つのインデックスレジスタ
●GPレジスタファイル
○16×32ビットレジスタまたは8×64ビットレジスタとしてアクセス可能な32×16ビットレジスタ
●命令復号:
○64ビットの従来型アセンブリ命令
○128ビットのHyperOp命令
○IMは任意の64ビット整列で128ビット/サイクルを提供する
●反復ループハードウェア
○ゼロ・オーバーヘッド・ルーピング
○3つの一次インデックスレジスタを使用して、3つのレベルの入れ子をサポートする
○4つの二次基底レジスタ/インデックスレジスタの自動増分
●ループバッファ
○1つまたは複数の内部ループ中に命令フェッチ電力を低減する
【0030】
コードの小規模セクションの繰返しを提供するために設計の中に組み込まれた反復ループハードウェアが存在する。このハードウェアは、インデックスカウンタ、増分/減分論理、完了試験、およびこれらの「オーバーヘッド」機能を行うソフトウェア命令の実行よりも効率的な分岐機能を含んでよい。適切に行われると、これらのハードウェアは、オーバーヘッド機能を遂行するための命令サイクルを除去する。オーバーヘッド機能のためのソフトウェア命令なしにルーピングを実行するハードウェア状態機械を直接プログラムするREPEAT(反復)命令を使用して、最大3レベルまでのネスティングのゼロ・オーバーヘッド・ルーピングを提供してよい。オペランドのアドレス計算を管理するためにループ内部で追加の命令を通常は必要としないように、インデックス付けを自動的に管理する。これにより、複数のアレイは、ループ内で追加命令のオーバーヘッドなしにアクセスし、管理することができるようになり、電力を節約し、よりよい性能を提供する。さまざまな実施形態では、反復ループハードウェアは、以下を含んでよい:
●8つのベースレジスタB0~B7
○B0は、アドレス指定モードで値ゼロをもたらす
○B0は、スタックポインタ(SP相対アドレス指定モード)として使用される
●8つのインデックスレジスタI0~I7
○I0は、アドレス指定モードで値ゼロをもたらす
○I0は、他のAGU算術用一時レジスタとして使用することができる(このレジスタは、レジスタマップでは、I0ではなくGR0と呼ばれる)
●7つのストライドレジスタS1~S7
○Snは、InまたはBnと共に使用される
●3レベルの反復ループ用ハードウェアサポート
○一次ループインデックスは、I1、I2、I3である
●二次インデックスまたは基底レジスタ用の4つの追加増分
○インデックスレジスタI4~I7
○基底レジスタB4~B7
○ストライドレジスタS4~S7による増分
○開始アドレス/一時レジスタT4~T7
【0031】
反復ループはREPEAT命令により制御される:
●REPEATは、先行するHyperX世代に類似し、以下の改善を伴う:
●一次ループインデックスI1、I2、I3
●ループの終わりに増分される、最大4つまでのベースレジスタ/インデックスレジスタ、すなわちI4/B4、I5/B5、I6/B6、I7/B7を選択するオプション。
●反復ループ情報は、ループ命令を規定するラベルの前でループレジスタの中にロードされる。
【0032】
反復バッファは、反復ループを備える命令を保持するための命令FIFOである。その目的は、コードの最も時間のかかるセクションの間に命令フェッチ電力消費を低減することである。バッファへの命令の配分は、HyperXツールによりコンパイル時に決定され、ユーザに決定させない。本明細書では、ユーザに基本的理解を提供することだけについて記述する。反復バッファの主要な特徴は、以下を含んでよい:
●REPEAT命令およびそのラベルにより、命令のグループを決定する。
●反復バッファ使用法は、コンパイル時に決定され、フラグによりREPEAT命令の中で示される。
●あらゆる反復ループの最初の命令は、性能および電力の理由で、反復バッファの中に常にロードされる。
●バッファは、64ビットまたは128ビットの命令を保持することができる。
●最大12個の64ビットエントリを利用可能である。128ビット命令用に、2つのエントリを使用する。
●ループの最初の命令をバッファに入れる以外のどんなことのためにもバッファを使用するために、ループ全体は、バッファに収まらなければならない。
【0033】
反復ハードウェアは、一次インデックス(I1~I3)および関連する他の制御レジスタを使用して、ループ動作を制御する。一次ハードウェアに加えて、AGUによる追加アドレス計算のために、反復ハードウェアにより自動的に管理することができる別の1組のレジスタが存在する。これらの特別のレジスタは、以下である:
●B4~B7―4つの追加基底レジスタ。
●I4~I7―4つの追加インデックスレジスタ。
●S4~S7―4つの追加ストライドレジスタ。
●T4~T7―基底レジスタまたはインデックスレジスタを初期化するために使用する4つの追加レジスタ。
【0034】
これらのレジスタ上で加算を遂行するために利用可能な追加加算器が4つ存在する。これらの加算器は、命令(INITおよびINCR)により、またはREPEAT命令およびハードウェアの自動増分特徴により、制御することができる。本明細書の他の箇所で記述するAUTOINCレジスタを使用して、各一次REPEAT動作を結びつけて、さらにまた、1つまたは複数のインデックスレジスタまたは基底レジスタ上でアドレス加算を遂行することができる。
【0035】
各加算器を使用して、任意の一次インデックス(I1~I3)に対するループによる各繰返しに対して、所与のストライド(S4~D7)を同じ番号の基底(B4~B7)または同じ番号のインデックス(I4~I7)に加算することができる。追加で、ループ指示の最初で、一次インデックスに開始値をロードさせるときはいつでも、指示されたAUTOINC BASEまたはINDEXに、同じ番号のTレジスタ(T4~T7)をロードする。これにより、複数のアレイは、ループ内で追加命令のオーバーヘッドなしにアクセスし、管理することができるようになり、電力を節約し、よりよい性能を提供する。
【0036】
さまざまな実施形態では、条件付実行は、述語フラグに基づいてよい。そのようなフラグは、以下を含んでよい:
●P0~P3:
○DP試験命令により設定される
○DPのタイミングに従って設定される
●GP0およびGP1
○AGU試験命令により設定される(
図6に例を示す)
○AGUのタイミングに従って設定される
【0037】
述語フラグは、以下を遂行するTESTクラスの命令を使用して設定される:
●TEST動作を実行する
●結果として得られる条件を確認する
●選択された述語フラグを設定する
【0038】
【0039】
条件付命令は、1対の述語フラグに対する試験を指定する。たとえば:
●GP0、GP1―AGU命令により使用される
●P0、P1―DP命令により、典型的にはDP0で使用される
●P2、P3―DP命令により、典型的にはDP1で使用される
【0040】
述語フラグを試験するある例を
図6に例示する。追加で、DPの条件付命令、AGUの条件付命令、およびプログラムの流れの命令を
図7に例示する。
【0041】
条件付ブロック命令を
図8に例示する。
図8に例示する命令の説明は、実際の動作の簡略版である。STARTIF、ELSE、ENDIFの命令は入れ子可能であるので、入れ子された条件状態を保持する条件スタックが存在する。STARTIFは、条件スタックの上に新しい条件をプッシュし、ELSEは、現在の条件状態(スタックの最上部)をトグルし、ENDIFは、条件スタックをポップする。現在の条件状態は、STARTIF、ELSE、およびENDIFの動作を禁止してよい。
【0042】
さまざまな方法でHyper-Opを実行してよい。Hyper-Op実行のある例を表3に例示する。
【0043】
【0044】
GPnは、次のサイクルで準備が整い、したがって、GTEST命令を使用して、GPnビットを設定する場合、分岐予測はまったく必要ない。しかしながら、GPnビットがMOVにより汎用レジスタから書き込まれている場合、分岐予測は遅延させられ、正常な分岐予測が遂行される。Pnは、5サイクル後に準備が整い、したがって、分岐予測を必要とする。nが試験命令と分岐の間にある命令サイクルの数である場合、予測ミスによる犠牲は、5-nサイクルである。試験命令をコード内で前方へ移動させることができる場合、nを増大させることができ、予測ミスによる犠牲は、おそらくはゼロ(0)サイクルまで低減することができる。
【0045】
述語は、述語を設定するために明示的命令を使用して計算され、かつ他の命令により修正されないので、多くの場合、コードをスケジュールして、予測ミスによる分岐に関連するどんな犠牲も大きく低減することが可能である。分岐予測は、静的に行われ、分岐確率に関する業界標準のヒューリスティクスに基づき、コンパイル時に決定されてよい。
【0046】
Hyper-Opモードは、命令を符号化できるようにしてよく、この場合、データパスの分離した各部分は、命令符号化の一部により制御される。これにより、ハードウェアの並列処理をより直接的に制御できるようになる。128ビットHyper-Opフォーマットは、表4に描く並列処理を可能にする。
【0047】
【0048】
HyperOp命令がDP0およびDP1で並列に実行することができる制約事項が存在する。2つのHyperOp命令は、同じ待ち時間を有する場合、並列に実行することができる。定義によれば、DP0およびDP1のスロットは、常に同一命令を並列に実行することができる(SIMDに等価)。数少ない例外が存在する。単一のFP命令だけは、両方のDPスロットの計算で両方のデータパスからのハードウェアを使用するとき、両方のDPスロットで走らせることができる。同じ命令を実行するSIMD形態をサポートするが、一方では、使用モデルは、待ち時間が同じの任意の2つの命令を並列に実行できるようにするという点ではるかにより柔軟性があることに留意されたい。
【0049】
アドレス命令は、FDパイプライン段階中に発生し、1サイクルかかり、結果は、次のサイクルで、すべてのロード/記憶命令が使用するために利用可能である。さまざまな実施形態では、自動増分および反復は、オーバーヘッドを低減するためのリロードを含む。
【0050】
各DMRは、マルチ・ポイント・ソースおよびマルチポイント宛先を同時にサポートするための直接メモリアクセス(direct memory access、DMA)エンジンを有してよい。さらに、各DMAエンジンの完全な状態を取り込んで、メモリの中に保存してよく、この状態情報を後で取り出して、DMA動作が中断した場合にDMA動作を再開してよい。DMA構成の状態を保存する能力は、PEがDMAの全体の状態を得るために最大11までのDMレジスタを読み出すように要求する。これらのレジスタの多くは、状態を取り込む目的で外部からのアクセスにさらされる内部DMAレジスタであった。
【0051】
レジスタ空間を節約するために、DMAは、その状態を記述子と呼ばれるコンパクトな形態でメモリに保存することができる。PEは、この記述子の開始場所を指定し、DMAおよび修正されたプッシュエンジンは、指定されたメモリアドレスから始まるメモリにレジスタデータを書き込むことができる。プッシュエンジンは、ルーティングされるメッセージを一方の宛先DMRから第2の宛先DMRに拡張するために使用する、DMAエンジンの一部である。
【0052】
プッシュエンジンは、DMAをプログラムするためにDMA内の各レジスタを通してステップを進める状態機械をすでに有する。この同じ機械をさらにまた使用して、レジスタを読み出すことができる。読み出したデータは、次いで近接するポート内モジュールの中に向けられる必要がある。重要な部分は、任意のDMA書込機能停止をプッシュエンジンの中に結びつけることである。これは、プッシュエンジンのビジー入力信号上でDMA機能停止をゲート制御することにより行われてよい。
【0053】
DMAウェイクアップを使用して、記述子を保存したPEに信号を送ることができる。その時点で、PEは、タスクを自由にスワップできる。新しいタスクが完了すると、PEは、保存した記述子を指し示すことができ、DMAの処理は再開する。ポート内またはポート外のルータは、タスクスワップの間に適切に構成される必要があることが留意される。
【0054】
アキュムレータの記憶は、所定のシフト量だけ、任意選択の右へのポストシフト(post-shift)を有する。さまざまな実施形態では、以下のシフト量が存在する:
●1:平均をとるため
●8:
●16:ACCH=ACC[31:16]を記憶するため
●15:
【0055】
これらの値は、間接シフト量として使用する3つのシフトフィールドに記憶される。3つのフィールドは、HyperOp構文法でSHR1、SHR2、およびSHR3として示され、PE_CONFIGレジスタ内のシフト値フィールドSHIFT_CTL1~3を指す。
【0056】
2つのタイプのアキュムレータ対、すなわち、各DPから1つのアキュムレータ(ACC2_ACC0、ACC2_ACC1、ACC3_ACC0、ACC3_ACC1)、およびSIMDの16ビットデータとして取り扱われるアキュムレータの2等分(ACC0H_ACC0L、ACC1H_ACC1L、ACC2H_ACC2L、ACC3H_ACC3L)が存在する。アキュムレータ対のポストシフトを伴う記憶は、ビット位置の番号は同じであるが、アキュムレータ対の各部分に対して独立したシフトを遂行する。以下の記述では、「tmp(一時的)」指定は、意味論を明確にしようと試みるために使用され、実際のハードウェアレジスタではない。
【0057】
【0058】
シフトはまた、分割記憶および分割ロードで行われてよい。より多くのシフト動作は、一般にハードウェア電力散逸(Pdiss)を増大させる。さまざまな実施形態では、シフトハードウェア設計は、所与のPdiss予算のために最も必要とされるシフトオプションを選択することにより進められてよい。アプリケーションコードおよびPEアーキテクチャを分析することにより、最も必要とされるシフトオプションを決定してよい。いくつかの実施形態では、たとえばメモリがバイトでアドレス指定される代わりにワードでアドレス指定される場合、最も必要なことは、ワード境界に/ワード境界からバイトを整列させるシフトのためにあってよい。
【0059】
いくつかの実施形態では、性能を増大させるために、追加補助計算ユニットを採用してよい。考えられる補助計算ユニットのリストを表6に描く。
【0060】
【0061】
HyperOp命令―プログラムコンパイル処理で静的スケジューリングを使用して、二重データパスの個々の制御を可能にする。実行スレッドをコンパイラにかけて、コンパイラにすべての動作を静的にスケジュールさせる。比較すると、現代のGPPアーキテクチャ用コンパイラは、関係のある命令を機械コードの中に一緒に配置するが、動作スケジューリングの細かな詳細は、(電力を消費する)ハードウェアにより行われる。静的スケジューリングは、実行時のPdissをかなり節約する。
【0062】
データ伝送中、システム内の欠陥は、伝送信号の歪みまたは劣化をもたらす可能性がある。伝送信号のそのような歪みまたは劣化は、受信側回路でデータビットの値が正しくない結果をもたらすことがある。そのような影響を除去するために、いくつかの実施形態では、前方誤り訂正(Forward Error Correction、FEC)符号化および復号をサポートするための命令を含んでいる。FECは、すべての種類のデジタル通信、ならびに記憶媒体からのデジタル記録および再生などの他の分野に応用されている。基本的考え方は、任意の入力データのブロックを取り出して、受信側または再生電子回路でビット誤り訂正を可能にするような方法で、追加パリティビットを用いてブロックを符号化することである。データおよびパリティビットからなる符号化されたブロックをFECフレームと呼ぶ。変調器によりFECフレームをさらに処理し、次いで媒体(有線、無線、または記憶媒体)の中に伝送してよい。
【0063】
受信側では、アンテナまたはトランスデューサにより信号を拾い上げ、増幅し、復調し、AD変換器(A to D converter、ADC)によりサンプリングする。媒体内の信号は、干渉、フェージング、およびエコーを受けたことがあり、受信側により雑音を加えられたことがある。ADCの出力は、デジタルサンプルのシーケンスである。サンプルのシーケンスを取り上げて、同期を得て、FECフレームの中にフォーマットするための方法はさまざま存在するが、これらの方法は、FEC計算にほとんど無関係であり、これらの方法についてここでは記述しない。フォーマットされたFECフレーム内の各ビット位置は、ソフトビットと呼ばれることがあるデジタル値を有し、デジタルシステムで整数の実際のビットにより表される。
【0064】
FEC復号は、フォーマットされたFECフレーム内のソフトビットを取り出し、ビット誤り訂正を計算し、ビット誤り訂正を適用し、訂正されたFECフレームを出力する処理である。FEC復号アルゴリズムの目的は、パリティビットを生成した方法の知識を前提として、最も可能性の高い正しいデータフレームを出力することである。FECが正しく作動するためには、特定のFEC復号方式(誤り訂正のためのパリティビット使用)をFEC符号化方式(パリティビット生成)と調和させなければならない。
【0065】
ハミング符号、BCH符号、およびリード-ソロモン符号を用いて、FECの初期の成功は達成された。畳込み符号、および畳込み符号と他の符号の直列連結を用いて、さらに成功を得た。復号側では、目的は、雑音によって誘発された誤りを伴う受信ソフトビットを前提として、正しい可能性が最も高いデータのブロックを見つけ出すことである。これは、単一パスアルゴリズム(Viterbiなど)または繰返アルゴリズム(Turboなど)で達成することができる。
【0066】
FECの計算は、サンプラから得られる、観察された値のシーケンスに応じて、バイナリビットの値に対する2つの選択の、予測される正しさを計算することを伴う。絶えず変化する値のシーケンスをランダム変数として取り扱ってよいので、確率の数学的処理を適用してよい。主要な関心事は、FECフレーム内のソフトビットの値を前提として、特定の伝送データビットが1であったか、-1であったかということである。伝送データに関する硬判定を行う前に、多数の軟判定を計算することができる。これらの軟判定は、確率を比較することにより計算してよく、パリティビットを含む、確率を比較するする方法は、尤度比(likelihood ratio、LR)と呼ばれる条件付確率の比を計算することである。LRの対数(logarithm of LR、LLR)は、積算および除算が加算および減算に変換されるので、特に興味があり、加算および減算は、PEでは、より迅速に計算され、オーバーフローおよびアンダーフローを起こすことはほとんどない。その結果として、整数で記憶されたLLRの値を用いて、FEC復号を計算することができる。
【0067】
対数確率の積和は、MAX*演算子とも呼ばれる。さまざまな実施形態では、オフセット命令を用いて加算-比較-選択(add-compare-select、ACS)に類似する方式でMAX*演算子を遂行してよい。MAX*演算子は、指数確率上で対数領域の数学的処理に関する積和タイプの動作を提供する。多くの場合、記号形式をMax*(x0+y0,x1+y1)と書く。
【0068】
さまざまな実施形態では、PEは、以下のような関数を実装する:
Z[15:0]=MAX((X[15:0]+Y[15:0]),(X[31:16]+Y[31:16]))+TLUオフセット
【0069】
オペランド使用法を少し修正して、ターボ動作に有用なより高いスループット形態を提供することにより、二重対数確率積和命令を達成してよい。この1つは、Max*(x1+y0、x0+y1):Max*(x0+y0,x1+y1)という形態の単一データパスで2つの結果をもたらす。
【0070】
さまざまな実施形態では、PEは、以下のような関数を実装する:
Z[31:16]=MAX((X[31:16]+Y[15:0]),(X[15:0]+Y[31:16]))+TLUオフセット
Z[15:0]=MAX((X[15:0]+Y[15:0]),(X[31:16]+Y[31:16]))+TLUオフセット
【0071】
別の形態のMAX*動作は、以下の形態でデータパスあたり32ビットを作り出す:
Max*(0,x1+y1)-Max*(x1,y1):Max*(0,x0+y0)-Max*(x0,y0)
【0072】
さまざまな実施形態では、PEは、以下のような関数を実装する:
Z[31:16]=MAX(0,(X[31:16]+Y[31:16]))+TLUオフセット-(MAX(X[31:16],Y[31:16]))+TLUオフセット)
Z[15:0]=MAX(0,(X[15:0]+Y[15:0]))+TLUオフセット-(MAX(X[15:0],Y[15:0])+TLUオフセット)
【0073】
別の命令は、2つのオペランドに対する二重MAX*動作に各データパス内にある2つのアキュムレータ内の値を提供してよい。別の命令は、MAXAC命令が行うのと同じように、アキュムレータを使用することにより、大きなグループの数値に対してMAX*の結果を得る高速な方法を提供する。2つの16ビットの結果は、2つのアキュムレータの中に移行する。両方のデータパスを使用する場合、入力データが全部そろったとき、4つのアキュムレータは、それらの入力データに対してMAX*動作を走らせて、最終結果を得る必要がある。記号的に、等式は、以下のように見える:
ACCn+1=Max*(ACCn+1,Max*(x1,y1)):ACCn=Max*(ACCn,Max*(x0,y0))
【0074】
次式を使用して、対数確率積和のための二重の累積形態を達成してよい:
ACCn+1=Max*(ACCn+1,x0+y0):ACCn=Max*(ACCn,x1+y)
【0075】
LP命令用の特別なハードウェアの当然の結果は、「0」インデックスデータを上位ACCに、「1」インデックスデータを下位ACCにスワップすることが留意される。これは、このデータがデータパス内で容易にスワップされる場合、好ましい。さまざまな実施形態では、PEは、以下のような関数を実装する:
ACCn+1=MAX(ACCn+1,(X[15:0]+Y[15:+1]))+TLUオフセット
ACCn=MAX(ACCn,(X[31:16]+Y[31:+16]))+TLUオフセット
【0076】
また、対数領域で商の二重和を生成することも可能である。すでに示したものに類似する方式で、加算の代わりに減算を使用して、以下を提供する:
ACCn+1=Max*(ACCn+1,x0-y0):ACCn=Max*(ACCn,x1-y1)
【0077】
さまざまな実施形態では、PEは、以下のような関数を実装する:
ACCn+1=MAX(ACCn+1,(X[15:0]-Y[15:0]))+TLUオフセット
ACCn=MAX(ACCn,(X[31:16]-Y[31:16]))+TLUオフセット
【0078】
上記で参照した命令を実装するために、
図9~
図14に描くような専用論理回路を採用してよい。いくつかの事例では、命令のタイプに基づき論理回路を選択的に有効にしてよく、それにより、最小量の論理回路を使用して、複数の命令を遂行できるようになる。
【0079】
PE上で走る、チップI/Oポートと通信するアプリケーション内部で、またはそれらのアプリケーション間で、広帯域で待ち時間の短いデータ転送のために、MPSの一次相互接続ネットワーク(primary interconnection network、PIN)を設計する。相互接続ネットワーク(interconnection network、IN)は、1組のノード間を接続するリンクを伴う1組のノードとして一般に記述されてよい。大部分のPINは、はるかに多くの配線を必要とするので、1段階で完全にポイント・ツー・ポイントの能力があるであるわけではない。むしろ、大部分のPINは、ネットワークの各ノードでルータを用いる多段式であり、ノードは、リンクにより互いに接続される。PINを通してメッセージをルーティングすることができ、PINは、ソースノードから宛先ノードへメッセージを開始し、一時停止し、配送するための規則を強制する。メッセージは、開いたままである場合、データパイプとして不定に使用されてよい。しかしながら、多段式であるので、現存するメッセージは、新しいメッセージにより指定されるリンクまたは宛先を占有することにより新しいメッセージのセットアップを遮断する可能性があり、その結果、メッセージ配送は、保証されない。これを軽減するいくつかのものは、動的カットスルーおよび輻輳を「飛び越える」ための長距離ルートなど、文献に見られるようになった。しかしながら、本発明者らの取り組み方法は、相互接続の層を追加することであり、各層は、別の1組のリンクを有する。追加の各層を用いて、PINノードルータを拡張して、メッセージが一方の層から別の層へ横断できるようにする。
【0080】
大規模MPSでは、PINの動作効率に影響を及ぼすことなくシステムを管理する必要がある。このことは、いくつかの実施形態では、PINよりも低い帯域幅を有してよいが、メッセージ配送を保証してよい二次相互接続ネットワーク(secondary interconnection network、SIN)の開発につながった。そのような相互接続ネットワークを
図15に示す。例示するように、メッセージバス1500は、固定接続性方式で互いに連結された複数のメッセージ・バス・ノードを含む。メッセージバスは、PEとDMRの両方の場所を含む、チップ内部のアクセス可能なあらゆるレジスタおよびメモリの場所に到達する、適度な帯域幅、変数待ち時間、および保証された配送法だけではなく、I/Oコントローラ1502などのI/Oコントローラも提供する。
【0081】
コアアレイ構造の外側にあるデータをブートし、デバッグし、ロードするだけではなく、MPS機器を通して実質的にすべてのアドレス可能な場所にアクセスできるようにするためにメッセージバスを使用してよい。たとえば、メッセージバスは、すべてのPE/DMRのデータおよび命令のメモリの場所、内部PEレジスタ、DMRレジスタ(レジスタバスの場所を含む)、ならびにI/Oバスに取り付けられたI/O周辺機器にアクセスしてよい。
【0082】
メッセージバスは、いくつかの実施形態では、PE、開発アクセスポート(development access port、DAP)1503、ブート制御1504、およびI/Oプロセッサなどの、多重同時マスタのためのサポートを提供してよい。メッセージは、ソースおよび宛先の相対的位置決めに基づき、自動ルーティングを使用してメッセージバス上でルーティングされる。返答は、相対的場所を使用して、リクエストに類似する手法で自動的にルーティングされる。エラー返答ルートは、メッセージ内に維持されたソースに至る引き続く場所を利用する。
【0083】
いくつかの実施形態では、メッセージバスは、2つ以上の独立したメッセージ構成を備えてよい。独立した構成上のメッセージが、自動調停が有用な同じ宛先にアクセスしようとする場合が生じる。調停の結果は、優先度構造などの簡単な方式により決定されてよい。メッセージバス優先度構造は、DMRアドレスにアクセスするために確立された2つの固有の優先度、すなわち最低または最高を考慮してよく、すべてのPEアドレスへのアクセスは、PEでは最低の優先度にある。
【0084】
メッセージバスは、複数のエンドポイント・メッセージ・グループをサポートして、アレイのサブセットが単一メッセージに応答可能にする。複数のグループメンバーシップを単一ノード上に設定してよい。さまざまな実施形態では、ブロードキャスト能力を使用して、すべてのノードに到達してよく、配分するために、多くの独立したグループが利用可能であってよい。
【0085】
さまざまな実施形態では、メッセージバスは、複数のチップ動作を可能にしてよい。複数のダイ構造を実装する場合、チップ間で宛先の相対アドレスをブリッジしてよい。いくつかの事例では、メッセージフォーマットは、X方向およびY方向に最大256個までのMBNノードを許可してよい。他の実施形態では、追加ノードをサポートするようにメッセージを拡張することができる。テーブル(たとえば、テーブル1807)を使用する中継技法を採用することにより、任意の適切な数のメッセージノードをサポートしてよい。
【0086】
メッセージバスは、機器内部のプロセッサが機器内のあらゆるアドレス可能な場所に到達できるようにする能力を有する。この能力により、プロセッサ間でメッセージを渡すこと、アルゴリズムが進行するにつれ値のテーブルを更新すること、遠隔I/Oコントローラの挙動を管理すること、動作時の統計情報を収集すること、セルのセキュリティを管理すること、およびプロセッサ間で時間を重要視すべきではない情報の一般的通信を含む、さまざまな実現性を可能にする。
【0087】
メッセージバスは、PINルーティング構成の特別な層として使用することを望ましくなくする、ある種の特徴を欠くことがあることが留意される。第一に、帯域幅は、はるかにより低い。たとえば、いくつかの実装形態では、メッセージバスは、PINよりも10倍ほども遅いことがあり、一方では、他の実装形態では、PINよりも2倍だけ遅いことがある。第二に、データ配送の待ち時間は、同じソースと宛先の対の間のメッセージに対してさえ大きく変わる。プログラムされたルートセットアップおよび解体の概念はなく、この場合、構成内では、メッセージのために既知の長さのルートをセットアップし、ルートを使用するたびに同じ配線を横断して、2つのエンドポイントを接続し、その結果、データ配送に関して予測可能な待ち時間がもたらされる。メッセージバスを用いる場合、構成ハードウェアにより決定されるルートを用いてソースから宛先へ比較的短いメッセージを誘導する。メッセージは、進路に沿ったある地点で遮断される場合、メッセージを遮断しているその他のメッセージが完了するのを待ち、次いで継続する。構成上で一度に1つのメッセージだけを用いる場合(宛先で優先順の遅延はない)、メッセージによるデータ配送は、予測可能な待ち時間を示してよい。しかしながら、構成上の追加メッセージトラフィックは、データ配送を混乱させることがあり、その後の各メッセージがとるルートを変更することがある。その結果、到達時間は保証されないので、メッセージバスは、同期メッセージを分配するのに適さないことがある。
【0088】
メッセージバスは、MPS内の任意の宛先との間で、より低帯域の短いメッセージを高い電力効率で配送するのを保証するのに有用である。これらのメッセージは、PIN構成内の資源をかなり消費し、延長された時間の間リンクを潜在的に拘束し、データはほとんど通過しない、またはリンクがシステムを遮断できないようにするために、リンクの絶え間ないセットアップおよび解体を必要とする。メッセージバスはまた、チップI/Oの遠隔プロセッサ管理を簡略化し、MPSでは、この場合、I/Oポートの近くにあるこれらのプロセッサだけが、ポート、およびポートに取り付けられた任意の周辺機器を制御してよい。
【0089】
タイミングが重要な用途に好適ではないが、メッセージバスは、かなりの性能を依然として利用可能にする。バス自体は、クロックあたり1ワードを移動させ、クロックは、1500MHzの目標周波数を有してよい機能コアクロックと同じであってよい。このクロックは、ノード間で実効的に1500MHzワード/秒の移動をもたらす。メッセージバスは、レジスタに配送されるワードごとに、バス全体にわたってデータおよびアドレスをプッシュし、次いで、できるだけ迅速に他のメッセージにバスを解放するように設計されるので、ルートを規定して、どこからワードを読み出す、または書き込むかを識別し、リクエストを行っているノードにデータまたは状態をどのように戻すかを識別するために必要な、固有のオーバーヘッドが存在する。これらの非データワードは、単一トランザクションではバスのスループットを低減する。メッセージ構造のオーバーヘッドの影響を制限するために、任意の数のワードを1つのメッセージで転送することができ、唯一の制限は、それらのワードが単一開始アドレスから連続していなければならないことである。
【0090】
正常な条件のもとでは、MPS機器内部にある任意の通常アクセス可能な場所へのアクセスを利用可能である。これは、任意のレジスタ、メモリの場所、または正常モードのアドレスを有する周辺機器を、特有のアドレスにアクセスしているパラメータの中で書き込む、または読み出すことができることを意味する。いくつかのPE内部レジスタでは、PEが動作している間にPEの内容を読み出すことができ、しかしながら、包含する値は、読出しが行われたときのスナップショットを表し、値が要求されたときだけ更新される。追加で、リクエストが生成されたときと、メッセージバスによりPEまたはDMRから値を読み出したときと、要求元に結果を戻して配送するときとの間に時間間隔が存在し、この時間間隔は、システムおよびメッセージバスの負荷に応じて、結果を待つ時間がかなりあることを表す。ほとんどすべてのクロックで、動作に必要なある種のPE内部レジスタにアクセスするために過大に待つ可能性があり、PEがブレークポイントで停止するまで、事実上リクエストを機能停止させる。コードの中にギャップが出現し、これらのレジスタを読み出すことでできるようになる可能性があるが、PEは、いくつかのレジスタを動作させる必要があり、メッセージバスのメッセージがこれらのレジスタをデフォルトの低優先度で読み出そうと試みることにより、一般にメッセージの機能停止を引き延ばす結果となる。DMR内部では、アクセスの優先度はプログラム可能であるので、そのアドレス領域に対して他のリクエストがまったく保留されなくなるまでリクエストを待たせることができる、またはそのアドレスに即座にアクセスして、リクエストに同じ領域へのアクセスを試みる他のリクエストすべてを遮断することができる。
【0091】
正常モードのアドレスの場所は、以下を含んでよい:
●任意のDMRデータメモリの場所への読出し/書込みのアクセス
●任意のDMRメモリ・マップド・レジスタへの読出し/書込みのアクセス
●任意のPE命令メモリの場所への読出し/書込みのアクセス
●PE状態および制御レジスタへの読出し/書込みのアクセス
●クロック制御レジスタへの読出し/書込みのアクセス
●ハードウェアブレーク挿入を除くブレークポイント制御
●PEウェイクアップ制御
●パリティ制御
●PEメッセージ受渡し
●PEプログラマ・レジスタ・アクセス
●IOバス上のメモリおよび周辺機器
【0092】
プログラムを実行している間、命令メモリ上で動作しているときに、大いに配慮しなければならない。命令のブロックをメモリに書き込むことが可能であり、現在走らせているプログラムを実行していることに起因して、新しいコードの一部分は、コードのブロックを最初に完全に置換することなく実行されることがあり、その結果、予測できない動作を引き起こす。MPSは、メモリへの各書込みに対してパリティビットを含み、かつあらゆる読出し動作でパリティを検査するように構成可能であってよく、エラーを検出する場合、故障状態に分岐する。しかしながら、パリティ検査は、それを行わないときよりも多くの電力を消費する。MPSでのパリティ検査は、パリティありおよびなしがメモリの別個の動作モードであることを意味する極端な環境で使用すべき動作モードであると考えてよく、そのメモリを使用するアプリケーションを走らせている間、これらのモードの間を移行することは、賢明ではない。
【0093】
クロック制御へのアクセスは、すべての条件のもとで可能であるが、しかしながら、クロックレジスタの状態を変えることは、いつも賢明であるというわけではない。システムが動作している間、特に複数のプロセッサ間で共有されるデータセットに対して動作しているとき、クロック制御の変更は、他のノードに関係なくローカルに行われ、他のノードはまた、それらの場所でクロック制御を更新するためにさらにまたアクセスされてよい。アルゴリズムを走らせている間にクロック構成を変えようとする場合、データにアクセスするタイミングが失われる可能性が高い。
【0094】
PEがブレークポイントで停止したとき、メッセージバスへの追加アクセスが利用可能である。PEが中断したとき、プログラムカウンタは停止し、ハードウェアブレークポイントの更新が可能である。正常モードの能力のすべては利用可能であり、ハードウェアブレークポイント挿入能力が追加で利用可能である。
【0095】
ブレークポイントを実装したことに起因して、システムが動作中に値を変更することは、中断見落としおよび意図しない中断を含む、予測できない結果につながる可能性がある。したがって、ブレークポイントの変更は、最も信頼できることには、プログラム実行が停止している間に効果的になる。
【0096】
PEがブレークポイントで停止したとき、内部レジスタアクセス時間は改善され、停止したプロセッサに向けた戻り値は依然として正確なままである。PEレジスタアクセスに関する調停は、変わりない間は、活動状態の、より高い優先度の要求元を有せず、デバッグシステムがPEの内部状態レジスタに、より高速にアクセス可能にする。同様に、DMR上では、DMA動作の完了後、アドレスを求めて競合するアクセスが他に存在せず、最低の優先度のリクエストさえ、即座に満たされる。
【0097】
ブート中に、メッセージバスを利用して、初めてプロセッサをロードし、クロックおよびセキュリティを構成し、PEをリセットから解放して、動作を開始させてよい。ブート動作では、メッセージバス上のトランザクションの大部分は、機器全体にわたる宛先を用いてブートプロセッサから生じることが期待される。長いバースト動作が優勢であり、アドレスに起因するプログラムロードのオーバーヘッドを低減することが期待される。
【0098】
その後、ブートコントローラの1つの用途は、動的セルを実装することであり、この場合、すでに作動しているシステムの中に新しいセルをロードさせることが可能である。本明細書で使用し、規定するとき、セルは、1つまたは複数のPEおよび1つまたは複数のDMRに割り当てられたアプリケーションの一部分である。セルに含まれる、関連するPE用命令メモリの役割を果たすために、少なくとも1つのDMRがセルに含まれることが留意される。この場合、メッセージバス上に、より多くの活動が存在する可能性が高いが、この場合も、すでに機器の周囲にあるので、調停を簡略化して、アレイの中に新しいセルを伝送する。より大規模なブロック転送を利用することにより、動的セルをロードする時間を最小にすることができる。最初のロードとは異なり、置換セルをロードする間に、何らかの時点で競合が存在する可能性が高い。動的セルのロードは、潜在的に長時間パスを消費し、他のメッセージを配送する際の遅延につながるので、動的セルのロードを実装するとき、バーストの全長を考慮すべきである。
【0099】
システム内デバッガに共通する1つの問題は、デバッグ設備とシステムの機能動作に相互作用がある可能性があることである。ある種の事例では、相互作用の可能性は、デバッグに従事しているときに機能システムの挙動の変化を、またはさらに問題があることには、デバッグが動作しているときに誤りの訂正または変更をもたらすことがある。調停されなければならない任意のアクセスは、機能システムと並列デバッグ設備の間の相互作用を完全に取り除くことは決してできないが、デバッグ動作を別個のメッセージ・バス・インスタンスの中にマッピングする場合、このマッピングは、最終データアクセス調停を除き、すべての相互作用を取り除くことができる。最低の優先度になるようにデバッグを注意深く選択することによって、デバッグは、他の方法で使用されない間、システムとだけ相互作用し、機能システムから発生する機能上のアクセスを混乱させない。さまざまな実施形態では、優先度を高低の間で変更してよい。
【0100】
プロセッサがブレークポイントにあるとき、DMRに配送されるリクエストを発生させるPEはまったくない。これは、PEが停止している間、DMAリクエストを連続して処理することができるので、DMR内にリクエストがまったく存在しないことを意味するのではない。これは、データを求める他のリクエストがまったく存在しないので、PEのリクエストが即座に満たされる分割状態と、DMAトランザクションがデバッグリクエストの前にあり続けるDMR状態をもたらす。論理的には、これは、ブレークポイントのないプロセッサではデバッグが動作と干渉すべきではないという考えを支持する。
【0101】
バス自体の詳細を探る前に、メッセージバスに関連して、メッセージが何を意味するかを最初に理解することは役に立つ。最も一般的な意味では、メッセージは、意図する宛先にメッセージを配送するための手段、配送すべきデータ、および開始点に応答を戻すための手段を必要とする。詳細には、メッセージバスがそのネットワークを通して渡す、固有に異なるメッセージはいくつかあり、次にそれについて取り扱う。
【0102】
メッセージ・バス・ノード内部の構成レジスタをプログラムすることによりメッセージを構築し、送信する。メッセージバスの2つのチャネル(AおよびB)用にこれらのレジスタが2組存在する。これらのレジスタのプログラミングについて以下で論じる。利用可能なメッセージフォーマットがいくつか存在する。これらは、以下のようにカテゴリ分類することができる:
●ポイント・ツー・ポイント・メッセージ―任意の他の単一ノードから情報を読み出す、または書き込むことができるようにする。
●マルチ・ポイント・メッセージ―単一メッセージを用いてエンド・ポイント・ノードのグループに読み出す、または書き込むことができるようにする。
●応答メッセージ―ユーザが直接生成しない。他のメッセージの肯定応答を提供するために、メッセージバスが使用する。
●安全な構成メッセージ―チップ用のセキュリティを構成するために使用するメッセージの形態。
【0103】
メッセージを送信するために、プログラムは、メッセージの基本構成要素を構成レジスタの中に、次いで送信すべきメッセージ用に信号をプログラムしなければならない。プログラミング構成要素を
図16に列挙する。
【0104】
STATUS(状態)レジスタを使用して、送信したメッセージの状態を観察する。送信されているメッセージを直接制御するこれらのレジスタに加えて、メッセージ・バス・システムの他の側面を制御するために使用する、後で記述する他の構成レジスタがいくつか存在する。新しいメッセージを規定するために修正する必要があるレジスタだけは、次のメッセージを送信する前に更新される必要があることに留意されたい。たとえば、同じメッセージを5つの場所に送信するために、DELTA_OFFSET内のルート情報を単に更新し、GEN_MSGを使用してメッセージを再送する。メッセージフォーマットについて以下でより完全に記述する。
【0105】
チップ内の任意の場所に到達するために任意のマスタにより使用することができる最も基本的メッセージは、ポイント・ツー・ポイント・メッセージである。その名称が意味するように、このメッセージは、単一の場所を対象とし、単一の場所から発行される。中間にあるすべての場所には、通過するデータをスヌープする(snoop)ための手段がまったくないので、2つのノード間で渡される情報は、2つのノードによりメッセージバスの外部だけで見られ、この点では、すべてのポイント・ツー・ポイント・メッセージは安全である。このメッセージタイプに関する能力およびオーバーヘッドの釣り合いをとるさまざまなオプションが、メッセージを構築するために利用可能である。
【0106】
スレーブは、一度に1つのメッセージだけを受信し、処理することができるので、どのノードがデータアクセスを要求しているかを知る必要がなく、マスタに戻るルートだけが必要であり、その結果、応答を届けることができる。リクエストメッセージの一部は、ポイント・ツー・ポイント・メッセージの往復を完了するために必要な、応答用の戻りパスを含む。
【0107】
ポイント・ツー・ポイント・メッセージは、読出リクエストまたは書込リクエストとすることができ、読出リクエストは、要求した読出しデータを包含する応答メッセージを生成し、書込リクエストは、書込み遂行の成功または失敗を示す応答を生成する。読出リクエストまたは書込リクエストのメッセージが能力と性能の釣り合いをとるのとよく類似して、応答メッセージはまた、マスタで柔軟性を多少失うという犠牲を払ってオーバーヘッドを最小にする。
【0108】
各ポイント・ツー・ポイント読出リクエストまたは書込リクエストに対して1つの応答メッセージが存在し、複数のデータワードが含まれる場合、複数の応答ワードが含まれ、その結果、送出されるあらゆるアドレスは、書込みの状態または読み出すためのデータという応答を戻される。メッセージ本体内のデータは、リクエストが送信されたときと同じ順序で戻される。要求しているノードに戻されて到着したときにデータがバスからすばやく取り除かれることを確実にするために、応答を切り離して記憶すべきアドレスをMBN内にプログラムする。応答場所を一度に1つだけ記憶することができるので、戻りで2ワード以上期待され、かつ自動メモリローディングの仕組みを使用する場合、各MBNは、一度に1つの未処理のトランザクションを有する可能性がある。プロセッサがノードからすべてのデータを抽出する場合、プロセッサが望むだけ多くのリクエストが未処理になる可能性がある。
【0109】
複数のエンドポイント応答すべてのために同じ応答メッセージフォーマットを使用するが、しかしながら、これら複数のエンドポイント応答では、単一の応答ワードをペイロードの中に挿入する。たとえば、読出メッセージでは、応答は、要求されたアドレスの値を、または安全な領域に対して有効ではない読出しを試みる場合にはセキュリティエラー制御ワードを含んでよい。あるいは、書込メッセージでは、応答は、リクエストによる書込みを遂行したかしなかったかを示す、成功または失敗の値を含んでよい。
【0110】
2つ以上の活動状態のノードは、複数のエンドポイント書込メッセージを受信する。このメッセージは、セル内部の通信用に有用であり、この場合、セルは、メッセージバス構成アドレス書込みを通してどのメッセージに反応すべきかを命令されることができる。セキュリティにより、書込みの発生を防止されることがあり、個々のワード状態が潜在的に妨害を生じさせるので、個々のワード状態ではなく、メッセージ全体に対して単一の書込状態が戻される。マルチ・キャスト・メッセージは、アレイを通して分配されるので、応答アドレスは、計算された、要求しているノードからのデルタオフセットとして記録される。これは、マスタへ応答メッセージを戻すために多くのパスを使用する結果となり、多くは、期待される、リクエストと同じパスに従わない。複数のエンドポイントメッセージの事例は、すべてのノードを一度にアドレスするブロードキャストメッセージである。
【0111】
また、メッセージ・バス・ノードの収集物から同じアドレスを読み出すことができることが有用であるときがあってよい。これらの事例では、複数のエンドポイント読出しが利用可能である。動作は、マルチ・ノード・アドレスに適合するノードだけが応答するように機能する。その他の複数のエンドポイントメッセージと同様に、応答パスは、応答するノードに至る途中に計算されたデルタオフセットにより決定される。応答は、いくつかのルートに従い、要求しているノードに戻り、ルートの多くは、ソースから宛先までとったパスと異なる。また、すべてのノードが応答し、1つのワードを戻す場合もある。
【0112】
各ノードで、ノードで許可される動作について記述するセキュリティ構成を維持する。この構成の設定は、安全な活動でなければならず、ブート動作の一部として選択されたIOプロセッサを通して実装される。このメッセージを使用して、セキュリティ構成を更新し、システム内の選択されたプロセッサによりセキュリティ構成を生成することができる。このメッセージのフォーマットは、固有であり、データ書込みにより構築することができず、したがって、識別されたセキュリティプロセッサだけが、このメッセージを生成することができる。唯一の考慮事項がメッセージの配送であるので、セキュリティ構成メッセージの生成につながる、基礎となるセキュリティ判定は、メッセージバスの範囲外である。機能ネットワークからデバッグを強制的に分離することを実装するためにマスタを無効にすることができるのとよく似て、セキュリティマスタに選択されないノードは、セキュリティメッセージを送信できないようになるが、この場合、ネットワーク隔離の場合のようにすべてのメッセージではなく、あるタイプのメッセージだけが制約される。
【0113】
メッセージバスを、
図15に示すように2次元メッシュネットワークとして実装してよい。追加で、2つの同一ネットワークが並列に動作しており、再結合点は、各ノード内部に位置する。図示する各リンクは、両方のネットワーク用に複製された入力ポートと出力ポートの両方を備え、両方のネットワークは、ノードの任意の側で有効な、総計で最大4つまでのメッセージのためにノードの同じ側で伝送および受信を同時に可能にする。ネットワークの一方の最大使用事例では、4つの入力ポートおよび4つの出力ポートすべてを利用して、ノード全体にわたりメッセージを転送することができる。最大使用事例で動作するとき、ルーティングの唯一の制約は、Uターンルートがまったく許可されないことであるが、他の3つの出力に至るルートの任意の他の組合せは、受入可能である。あらゆるノードで2つのネットワークが存在するが、2つのネットワークは、互いに完全に独立して動作し、2つのネットワーク間のルーティングは不可能であり、一方のネットワークで遮断を発生させる可能性があるが、他方のネットワークはアイドルである。
【0114】
他のトポロジと比較してメッシュネットワークとして実装する利点はいくつかあり、最大の利点は、障害物を迂回してルーティングする能力である。メッセージバスは、ノード間を動的にルーティングするネットワークであるので、他のメッセージによりすでに使用中のノードから、チップ全体の電力消費を低減するために電源が切られたノードまで、2つのノード間の直接パス上で障害物に遭遇する可能性が常に存在する。メッシュ構造は、宛先に到達するためのオプションを提供し、大部分の事例では、エンドポイントのより近くにメッセージを移動させる論理的方向が2つ存在し、端部により近くなる一方の方向が遮断された場合でさえ、別の方向が一般に存在することを意味する。ルーティングできないメッセージを有する可能性が依然としてあるが、これは、メッセージをルーティングするための障害では必ずしもないシステムの障害である電源を切った領域に位置するエンドポイントなど、要求されたエンドポイント間のパスがまったく存在しないことに起因する。
【0115】
メッシュネットワークの別の利点は、メッセージの移動距離が低減することである。多数のノードに対して、直列チェーン、複数のループ、行または列指向バス、およびメッシュといった、可能な接続法がいくつか存在する。直列チェーンでは、主要な欠点は、メッセージが2つの地点間を移動しなければならないことがある距離が長いことである。追加で、典型的にはチップを通して利用可能なパスが1つだけ存在するので、ネットワークで共存することができるメッセージの数は、一般に低減される。直列チェーンのアクセスタイミングは、可変であってよく、適切なタイミングマージンを求めて設計することが困難であることがある。
【0116】
大規模直列チェーンに伴う別の問題は、電力、およびノードのいずれかが、関係のないノードにアクセスする必要があるパスの一部である場合に任意の領域の電力を切ることができないことである。単一の直列バスに対する改善は、いくつかのより小さいループであるが、これは、ループ間を移動する必要があるという集中化問題、およびループ間の接続点で衝突が発生する場合に著しく遅延する可能性につながる。複数のループにはまた、ループ全体が、かなり大きな電力ステップをもたらす電力の入り切りを必要とするので、電力最適化に伴う問題があり続ける。同時アクセス数は、増大するが、独立したループ間でデータが移動しなければならない地点で依然として制限される。
【0117】
多重バス指向配列は、複数のループ構成に似た問題を有する、すなわち、さまざまなバスセグメント間で移動する必要がある地点は、最終的に相互接続ネットワーク全体の隘路になる。バス配列は、一度に複数のメッセージを送信するためのより容易な手段を実際に可能にするが、しかしながら、一方のバスセグメント上でメッセージを得る容易さは、異なるバスセグメント間で調停する必要があるという複雑さにより低減される。これにより、バス間相互接続の場所に応じて、バスセグメント間でデータを移動させることができるという理由だけで、機器の一定の領域がオンのままでなければならないことがある。機器の周囲にIOを散在させた状態で、データは、機器のどちらの側にも潜在的に親和性があるので、バス間コネクタを配置する理想的場所はない。これは、いくつかのレイアウトは比較的電力効率がよいという結果をもたらすが、一方では、他のバスセグメントと相互接続することができる、本来なら未使用の多数のノードをオンの状態で必要とするために、他のレイアウトを性能が劣ったレイアウトのままにする。
【0118】
メッシュはまた、多くのメッセージが並列に作動するのをサポートする。ルートには共通の隘路は存在しないので、多くのメッセージは、ネットワークを同時に通って移動できる。かなりの障害物を通ってルートが合併して、単一ノードを通過するように制約されない限り、各メッセージは、多くの場合、メッセージがいつ送信されたかにかかわらず別のメッセージに決して遭遇することなく進行することができる。各プロセッサが一度に1つのメッセージをサポートする場合、継続期間の長い同時発生メッセージの上限は、システム内にあるプロセッサの数に等しい。しかしながら、並列メッセージを配送して、メッセージに対する応答を戻すために必要なルートに応じて、輻輳は、実際の上限を低減することがある。
【0119】
メッセージバス構造内部のノードはすべて、マスタ、スレーブ、またはルートの中間点として機能するので、各ノードのこれらの基本機能について、本節で一般的に詳述する。正確なインタフェース詳細は、実施形態にわたり変わることがあり、この記述は、メッセージ・バス・ノード構成要素の機能的概観を提供する。システムの中に至るメッセージ・バス・ノードの一般的インタフェースを
図17に例示する。PEリンクは必要ないので、ノードがIOバスでどのように取り付けられるかに変化があるが、基礎となる動作は類似している。
【0120】
例示するように、メッセージ・バス・ノード1701は、ペイロードおよびルーティング情報を含む第1のメッセージを受信し、ルーティング情報およびマルチ・プロセッサ・アレイの動作情報に基づき複数のメッセージノードのうちの異なるメッセージノードを選択するように構成される。本明細書で使用するとき、動作情報は、マルチ・プロセッサ・アレイの過去または現在の性能に関係がある情報である。たとえば、動作情報は、資源可用性、ネットワーク性能ヒューリスティクス、メッセージバスに関する輻輳情報などを含んでよい。いくつかの事例では、動作情報は、マルチ・プロセッサ・アレイの性能に関する現在の情報であってよく、一方では他の事例では、マルチ・プロセッサ・アレイの性能に関する履歴情報を含んでよい。いくつかの実施形態では、メッセージ・バス・ノードは、動作中にマルチ・プロセッサ・アレイから動作情報を受信してよいことが留意される。
【0121】
メッセージ・バス・ノード1701は、異なるメッセージノードに基づき第1のメッセージのルーティング情報を修正して、第2のメッセージを生成して、異なるメッセージノードに第2のメッセージを送付するようにさらに構成される。ルーティング情報は、本明細書で使用するとき、メッセージの絶対宛先または相対宛先を指定する情報である。相対宛先を指定するとき、メッセージの宛先を決定するために、開始ノードからノードの数および対応する方向を指定する。あるいは、絶対宛先を指定するとき、特定のノードを特に言及する識別子を宛先として指定する。各メッセージノードは、次いで、指定された絶対宛先にメッセージを伝播するために、メッセージを送付するための最良の可能なノードを決定してよい。以下でより詳細に記述するように、ルーティング情報は、いくつかのメッセージノードを指定するオフセット、およびメッセージをどの方向に送信すべきかを含むことができる。
【0122】
本明細書で使用し、記述するとき、メッセージは、ルーティング情報と共に、ペイロード(すなわち、メッセージの内容)を含むデータの集合体である。追加で、メッセージは、動作情報、または動作情報の任意の適切な部分を含むことができる。
【0123】
メッセージ・バス・ノード(または単に「メッセージノード」)をさまざまな設計スタイルに従って実装してよい。特定の実施形態を
図18に描く。例示するように、メッセージ・バス・ノード1800は、ルータ1801、ルータ1802、ネットワークプロセッサ1803、ネットワークプロセッサ1804、アービタ1805、構成回路1806、およびテーブル1807を含む。
【0124】
メッセージ・バス・ノード1800は、アービタ1805を通してPEおよびDMRに取り付けられ、IOバスの場合、アービタ1805は、IOバスとメッセージバスの間のブリッジである。ローカルプロセッサからメッセージ・バス・ノード1800に入るアクセスの目標は3つ存在する、すなわち、構成レジスタ(構成回路1806内に配置される)ならびにネットワークプロセッサ1803および1804である。追加で、ネットワークプロセッサ1803および1804は、ローカルノードへのアクセスを生成している可能性があり、メッセージ・バス・ノード1800からDMRまたはPEに戻る1つのアクセスパスだけが可能である。ノードの構成、どのタイプのアクセスか、遠隔リクエスト処理、生成されているローカルリクエスト、または記憶されている応答に基づき、アービタ1805は、PEおよびDMRインタフェースにネットワークプロセッサ1803および1804の一方を接続する。
【0125】
リクエスト生成だけがネットワーク側からの機能停止を受けやすいので、DMRまたはPEへのすべての書込みを即座に生成することができる。書込リクエストに対するデータを記入するために、または処理されている遠隔アクセスに応答して読出しを要求される場合、アービタ1805は、他方のネットワークプロセッサに切り替える前に一方のリクエストが完了するのを待たなければならない。DMRまたはPEがリクエストを機能停止させた場合、そのアクセスがより高い優先度になるように構成される場合には現在のリクエストを取り除いて、他方のネットワークプロセッサに切り替えることが可能である。PEまたはDMRは、アクセスをすでに機能停止させたので、他方のプロセッサにアクセスを切り替えることにより影響を受ける移行中のデータは存在しない。
【0126】
アービタ1805はまた、要求されたアドレスに基づき、レジスタバスのトラフィックを適切なネットワークプロセッサまたは構成レジスタに向けるように構成される。アービタ1805はまた、遠隔アクセスが構成レジスタを現在使用している場合、構成レジスタがローカルノードと遠隔アクセスの間でメッセージ・バス・ノード1800内の唯一の競合点であるので、レジスタ・バス・インタフェース上に戻って機能停止を生成する。
【0127】
ネットワークプロセッサ1804および1805は、取り付けられたPE/DMRまたはIOバスと、メッセージ・バス・ノードの残りの部分との間の相互作用の責任を負う。ネットワークプロセッサ1803および1804が満たす責任は3つあり、第1の責任は、ネットワークの中にリクエストメッセージを生成することである。第2の機能は、ネットワークから受信したメッセージを処理し(メッセージのルーティング情報を修正することを含む)、書込みまたは読出しのために、メッセージで要求されたローカルアドレスにアクセスすることである。最後の機能は、リクエストメッセージに応答して、受信した返答メッセージを処理することである。
【0128】
ネットワークプロセッサ(たとえば、ネットワークプロセッサ1803)の第1の機能は、ネットワークの中に新しいメッセージを生成することである。これは、2つの方法のうち一方で、すなわち第1の方法で達成され、単一ワードメッセージでは、PEは、アクセスすべき遠隔ノードまたは複数のエンドポイントグループに至るノードデルタ、アクセスすべき遠隔ノードのアドレス、および書込みの場合には書き込みデータを書き込むことができる。ネットワークプロセッサは、次いでメッセージ構造を生成し、配送するためにルータにメッセージを送信する。2ワード以上のワードの長さを意味する、より長いメッセージでは、PEは、遠隔ノードに至るノードデルタ、遠隔ノードの開始アドレス、遠隔ノードの終了アドレス、および書込データを見いだすことができるDMR内のローカルアドレスを、または読出しの場合には、戻りデータを記憶する場所を書き込む。これらの値が構成されると、ネットワークプロセッサは、ルータへのメッセージ構造を生成し、DMRへの読出リクエストを生成して、必要な書込データをフェッチする。
【0129】
ネットワークプロセッサの第2の機能は、ネットワークから受信したメッセージを処理し、応答を提供することである。この場合、到着しているメッセージ構造は分解され、アクセスすべき最初と最後のアドレスは切り離して記憶される。読出しの場合、最初のアドレスで始まり、最後のアドレスに到達するまで継続する、DMRへの読出リクエストを生成する。アクセスしている領域がセキュリティにより保護されていないかの確認を遂行し、本構成ではアクセスできない読出ワードに関するデータの代わりにエラー値が戻される。書込みの場合、ネットワークプロセッサは、第1のデータワードが到着するまで待ち、次いで、受信したワードごとにDMRへの書込みを生成する。書込みは、アドレスがセキュリティ構成アドレスである場合、受信したメッセージもまたセキュリティメッセージのタイプであることを検証するための追加の確認を遂行させる。
【0130】
ネットワークプロセッサの第3の機能は、リクエストに対する応答を受信し、プロセッサが読み出すために応答を戻して記憶することである。このステップには2つのオプションがあり、第1のオプションは、プロセッサがメッセージ・バス・ノード1800の応答レジスタから応答を直接読み出すことができる単一ワード応答に関するものである。ネットワーク内で複数ワードメッセージが機能停止するのを防止するために、2ワード以上戻されたとき、ネットワークプロセッサは、これらのワードをDMRメモリに戻して記憶する。読出リクエストが生成されたときには、アドレス範囲を記憶する応答もまたメッセージ・バス・ノード1800内で構成されていた。ネットワークプロセッサは、事前にプログラムされたアドレス範囲を使用して、応答を戻して記憶し、安全手段として、メッセージで戻されていてよい任意の追加データを捨てる。
【0131】
単一資源を求めて競合する機能が3つあるので、ネットワークプロセッサはまた、任意の所与の時点にどの活動を行うべきかを判断しなければならない。実際には、応答またはリクエストのサービスだけがネットワークプロセッサのルータ側で活動状態になることができ、かつリクエスト生成はPE/DMR側で活動状態になることができるので、3つのうちの2つだけが同時に存在することができる。調停に伴う主要な問題は、デッドロック条件が形成される可能性がないことを保証することであり、デッドロックの回避は、デッドロックの可能性のある動作のもとではシステムの性能よりも重要である。システムは、メッセージがシステム内をどのように流れるかを計画することができるので、調停方式は、3つのオプションのうちの1つから選択される。第1の方式では、最初に入ったものが最初に処理される。このモードでは、ノードは、任意の他のメッセージを考慮する前に、ネットワークまたはプロセッサの側から到着する最初のリクエストを処理し、そのメッセージを完了するまで処理する。これは、ネットワークの性能を完全に維持する最も簡単な方法であるが、しかしながら、デッドロックを受けやすい。第2の方法は、アクセスするために2つのリクエストの間を交互に行うラウンドロビン処理である。不都合なことに、DMRインタフェースのパイプラインの深さに起因して、第2の方法は、アクセス速度を2/5に落とす可能性がある。事実上起こることは、戻りに関する書込み、もしくは遠隔読出しである、または書込みは、1サイクルを占有し、次のサイクルは、書込データのローカル書込メッセージ読出を処理し、次いで、インタフェースは、これら2つのアクセスが完了するのを待たなければならない。待つことにより、性能が著しくより低くなるという犠牲を払って、DMRパイプラインと相互作用するネットワーク機能停止は回避される。犠牲と機能停止回避の間には、MBNに入るメッセージおよびMBNを離れるメッセージが両方とも同じノードの間にあるわけではないことを判断するための手段がある。多重ノードデッドロックの可能性があるが、システムは、ハードウェアが保護しないようなシナリオを積極的に生み出さなければならない。データがどこから来るのかを確認し、データがどこに行こうとしているのかを比較することにより、競合している2つのメッセージがデッドロックを生成する可能性があるかどうかを判断することが可能であり、そのようなシナリオでは、ラウンドロビン動作を選択することができる。さもなければ、フルスピードで走るFIFSをシステムに及ぶメッセージ配送としてデフォルトにすることができ、メッセージは、ラウンドロビンを実装する場合よりも速やかに完了する。
【0132】
ルータ1801およびルータ1802の各々は、対応するネットワークに連結され、ネットワークからメッセージを受信して、ネットワークプロセッサ1803および1804により生成されたメッセージをメッセージに対応する次の宛先に送付するように構成される。ルータ1801および1802は、複数のスイッチ、またはネットワークプロセッサ1803および1804をそれらの対応するネットワークに連結するように構成された他の適切な回路を含んでよい。
【0133】
ルータ1801および1802は同一であり、それぞれ、ノードを通して渡されるデータに対して2つの主要な動作を遂行する。第1の動作は、ノードに向けることを意図したメッセージを識別することである。これは、配送されたノード・デルタ・アドレスの2バイトを見て、1組のゼロ値を見つけ出すと、メッセージの次の内容を抽出し始め、スレーブプロセッサにその内容を配送することを伴う。
【0134】
一致が見つからないとき、第2の主要な動作は、次のノードにメッセージを送付することであり、宛先に向けて進行する。宛先に向けた進行は、潜在的に2つの方向となる可能性があり、宛先までより近く導く2つのオプションに沿ったパスが利用できない場合、第3の方向に迂回するオプションを伴う。後戻りは許されていないので、データが到着する方向はオプションではなく、システム設計の基礎となる要件は、ルーティング規則に従うとき、ルートがUターンする必要がないように通信すべき2つのノード間でパスを許可することである。
【0135】
ルータはまた、ネットワークの中に新しいメッセージを挿入する責任がある。ネットワークの中にメッセージを挿入するためには、宛先デルタオフセットは既知であり、宛先に向かう2つの論理的方向の出力の一方が使用されていない限りメッセージは受け入れられ、メッセージバスの中に配置される。第1のアドレスおよびデータ対の直前に、要求された動作の結果と共に宛先ノードが返答することができるように、メッセージの中に応答デルタスロットを挿入する。応答デルタは、ネットワークを通ってメッセージがとるパスに基づき自動的に更新され、エラー応答の場合には進路に沿った任意のノードが、または宛先ノードが、リクエストメッセージに応答して応答を送信すべき正確な宛先を有することができるようにする。
【0136】
メッセージバス内部のアドレスについて論じるとき、メッセージ・バス・ノードのアドレスと、そのノードにルーティングするためにメッセージの中に配置された値を区別することが重要である。ノードのアドレスは事実上、IOノード、PEおよびDMRを包含するコアアレイの場所、およびアレイの右上隅で発生するようにDMRだけを包含するコアノードを含む、アレイ全体の内部にあるノードのX、Y座標の場所である。場所(0,0)は、機器の左下隅に見いだされ、ブートプロセッサに接続され、主コアアレイの外側に配置される。コアアレイは、
図19でアレイ全体の上に示すように、これら4隅(1,1)、(1,17)、(17,17)、および(17,1)により境界を定められ、図のフォーマットは(上部番号、下部番号)であることに留意されたい。
【0137】
メッセージ・バス・ノードの場所のアドレスは、メッセージヘッダで使用するためのルーティングデルタ情報を生成する際に使用される。メッセージに必要なルーティングデルタを計算するために、2つの場所の符号付差分を使用して、ソースノードから宛先ノードへ移行するためにメッシュの各方向で横断する必要があるノードの数を識別する。たとえば、(2,2)から(4,7)まで移動するためには、デルタアドレス(+2,+5)を使用し、戻りルートは(-2,-5)である。これは、宛先は、現在の場所の2ノード東、かつ5ノード北にあることを示す。これにより、ルーティング情報が相対的であるのでセルの柔軟な配置が可能になり、セルが移動した場合、エンドポイントは同様の距離だけ移動し、2つの場所の間のデルタは変わらないままである。
【0138】
いくつかの事例では、テーブル1807に記憶した情報を使用して、ルーティングデルタを決定してよい。たとえば、メッセージに含まれる宛先情報をテーブル1807へのインデックスとして使用して、データを取り出してよい。そのようなデータは、メッセージが送付されるべき次のメッセージ・バス・ノードを指定してよい。テーブル1807を、スタティック・ランダム・アクセス・メモリ(static random-access memory、SRAM)、レジスタファイル、または他の適切な記憶回路として実装してよい。さまざまな実施形態では、テーブル1807に記憶した情報を、ブートシーケンスの間にロードしてよく、マルチ・プロセッサ・アレイの動作中に更新してよい。
【0139】
8ビットの行アドレス値および列アドレス値を前提として、メッセージバスが256×256のノードアレイに及ぶことが可能であってよい。そのようなノードアレイを実現すること、ならびにメッセージバスが、一定のままで残る、技術ノードが縮小するようにスケール変更する、または複数のダイアレイ構成をサポートすることができるようにすることは、後の世代で行われてよく、いくつかの世代の間に改訂する必要がないアドレスのフォーマットを選択してよい。
【0140】
メッセージが宛先ノードに到達すると、アクセスすべき宛先ノードに値を配置するために第2のアドレスが必要である。拡張するのに十分な余地がある行アドレスおよび列アドレスと異なり、PE/DMRの宛先ノード・ローカル・アドレス構成要素は、実際にはむしろ空間的に余裕がない。現在規定されているように、16kワードのDMRデータメモリ、8kワードのPE命令メモリ、DMRレジスタバス空間、PE内部レジスタ、およびメッセージバス内部構成レジスタが存在する。ローカルアドレスは、16ビットのワードすべてを必要とするわけではなく、かつ読出書込命令は1ビットだけを必要とするので、ビット15の場所を制御ビットとして利用する。これはまた、書き込む、または読み出すバーストごとにアドレスが反復されるので便利であり、バーストごとに読出しおよび書込みを選択できるようにすることにより、アクセスの制御を適用するための柔軟で効率的手段が提供される。
【0141】
IOバス・インタフェース・ノードでは、バスは、32ビットアドレスで動作する。メッセージフォーマットに基づき、15ビットだけがバーストごとに転送され、その結果、メッセージにより17ビットが使途不明である。これらの残りのビットに関しては、ページレジスタが使用され、暗黙の上位ビット0を用い、その結果、IOバスがすべての必要なメモリ空間および周辺空間を配置するのに十分以上の、潜在的に31ビットのアドレスが利用可能である。IOバスにアクセスするメッセージの一部として、メッセージは、書き込まれた最後の値をページが保持するので、ページレジスタへの書込みから開始すべきであり、別のマスタが、現在のマスタが期待していた値と異なる値にページレジスタを設定した場合、潜在的に意図しないアクセス場所につながる。
【0142】
メッセージ・バス・ノードの動作をさらに例示するために、メッセージ・バス・ノードを動作させるための方法のある実施形態を描く流れ図を
図22に例示する。メッセージ・バス・ノード1800または任意の他の適切なメッセージ・バス・ノードに適用してよい方法は、ブロック2201で始まる。
【0143】
方法は、マルチ・プロセッサ・アレイに含まれる複数のメッセージノードのうちの特定のメッセージノードにより、ペイロードおよびルーティング情報を含む第1のメッセージを受信するステップ(ブロック2202)を含む。上述のように、特定のメッセージノードに連結した複数のメッセージバスの1つを介して第1のメッセージを受信してよい。
【0144】
方法はまた、特定のメッセージノードにより、ルーティング情報およびマルチ・プロセッサ・アレイの動作情報に基づき、複数のメッセージノードのうちの異なるメッセージノードを選択するステップ(ブロック2203)を含む。上記で指摘したように、異なるメッセージノードは、ルーティング情報に含まれる相対オフセット、および動作情報に含まれる輻輳または他のヒューリスティクスに基づいてよい。
【0145】
追加で、方法は、特定のメッセージノードにより、異なるメッセージノードに基づく第2のメッセージを生成するステップ(ブロック2204)を含む。さまざまな実施形態では、ネットワークプロセッサ(たとえば、ネットワークプロセッサ1803)は、どのメッセージノードが選択されたかに基づき第2のメッセージを生成してよい。いくつかの事例では、第2のメッセージは、後続のメッセージノードの上にメッセージを送付するために、異なるメッセージノードにより使用することができる修正ルーティング情報を含んでよい。
【0146】
方法は、特定のメッセージノードにより、異なるメッセージノードに第2のメッセージを送付するステップ(ブロック2205)をさらに含む。いくつかの実施形態では、ルータ(たとえば、ルータ1801)は、第1のメッセージのルーティング情報に含まれる相対オフセットに基づき第2のメッセージを送付してよい。ルータは、メッセージをどの方向に送信すべきかを判断する際にそのような相対オフセットを使用することができる。方法は、ブロック2206で終了する。
【0147】
HyperOpデータパス
図20を参照すると、HyperOpデータパスのある実施形態が示されている。例示するように、HyperOpデータパスは、DP0およびDP1として識別される2つのデータパスを含む。DP0およびDP1の各々は、同一であってよく、積算回路、加算回路、シフタ回路だけではなく、データパスを通してオペランドを移動させるための追加回路も含んでよい。マルチ・プロセッサ・アレイ内の所与のPEは、
図20に描くHyperOpデータパスを含んでよいことが留意される。
【0148】
上記で記述したマルチ・プロセッサ・アーキテクチャを用いて、異なるプログラミングモデルを採用してよい。そのようなプログラミングモデルの例を
図21に描く。例示するように、
図21は、ASMおよびHyperOpのプログラミングモデルを含む。異なるプログラミングモデルに関する追加の詳細およびコーディング例について、以下で記述する。各例は以下を含む:
●C―機能動作/アルゴリズムを記述する基準コード。
●ASM―64ビット命令を使用して動作/アルゴリズムをどのように実装するかの1つまたは複数の例。ASMはまた、二重DPにアクセスするためにベクトル組込関数(vector intrinsic)(擬似ASM命令)を使用する例を含む。ベクトル組込関数は、HyperOp命令にマッピングされる、ASMに似た命令である。
●HyperOp―128ビット命令を使用して動作/アルゴリズムをどのように実装するかの1つまたは複数の例。
【0149】
メモリオペランド
【0150】
ASMコード
add16s M1.H,M2.H,M3.H
add16s M1.L,M2.L,M3.L
【0151】
HyperOpコード
|A| ld32 M1,%A; //32ビットのM1からSIMDデータをロードする
|B| ld32 M2,%B; //32ビットのM2からSIMDデータをロードする
|DP1| add16s %AH,%BH,%ACC2; //ACC2=M1[0]+M2[0]
|DP0| add16s %AL,%BL,%ACC0; //ACC0=M1[1]+M2[1]
|D| dst16 %ACC2_ACC0,M3; //32ビットのM3にSIMDの結果を記憶する
【0152】
即値オペランド
【0153】
ASMコード
sub16 %r2,$10,%r8
【0154】
HyperOpコード
{
|A| ld16 %r2,%AL; //16ビットのR2をロードする
|C| ld16 $10,%CLH; //16ビットの即値10をロードする
|DP1| sub16s %AL,%CLH,%D1; //D1=R2-10
|D| st16 %D1,%r8; //16ビットのR8に結果を記憶する
}
load immedは、スロットCを使用して、%Cレジスタの16ビットセグメントをロードするが、スロットBを使用して、%Bレジスタの16ビットセグメントをロードすることができるに留意されたい。
【0155】
スカラー上での条件付実行
【0156】
Cコード
int16 a,b,c,d,e;
if(a>b)
e=c+d;
【0157】
ASMコード
//仮定:
//aは%R2の中にある
//bは%R3の中にある
//cは%R4の中にある
////dは%R5の中にある
//eは%R6の中にある
//%R7をtmpとして使用する
tcmp16s GT %R2,%R3,%P0
add16s %R4,%R5,%R7
cmov16 (%P0) %R7,%R6
【0158】
HyperOpコード(条件付記憶スロット)―バージョン1
{
|A| ld16s %R2,%AL; //16ビットのR2をロードする
|B| ld16s %R3,%BL; //16ビットのR3をロードする
|DP0| tcmp16s GT %AL,%BL,%P0; //R2>R3を試験して、述語P0を設定する
}
{
|A| ld16s %R4,%AH; //16ビットのR4をロードする
|B| ld16s %R5,%BH; //16ビットのR5をロードする
|DP0| add16s %AH,%BH,%D0; //D0=R4+R5
|D| st16 (%P0) %D0,%R6; //P0が真であれば、16ビットのR6に結果を記憶する
}
【0159】
HyperOpコード(条件付記憶スロット)―バージョン2
{
|A| ld32 %R2.d,%A; //32ビットのR2:R3をロードする
|B| ld32 %R4.d,%B; //32ビットのR4:R5をロードする
|DP1| tcmp16s GT %AH,%AL,%P0; //R2>R3を試験して、述語P0を設定する
|DP0| add16s GT %BH,%BL,%D0; //D0=R4+R5
}
{
|D| st16 (%P0) %D0,%R6; //P0が真であれば、16ビットのR6に結果を記憶する
}
【0160】
注:
●ASMモデルでの条件付実行は、CMOVを用いる場合だけ利用できる
●tempレジスタに結果を計算することを必要とし、次いで条件付きで宛先に移動させる
●HyperOpモデルでの条件付実行は、条件がスロットに独立して適用できるようにする
●述語型実行は、同じ命令ではなく前の命令で設定された述語フラグPnを使用する
●条件付記憶は、別個の命令のスロットDで行われる
●後続のHyperOpで条件付記憶を隠すことが可能であってよい
【0161】
ベクトル上での条件付実行
【0162】
Cコード
int16 a[2],b[2],c[2],d[2],e[2];
if(a[0]>b[0])
e[0]=c[0]+d[0];
if(a[1]>b[1])
e[1]=c[1]+d[1];
【0163】
ASMコード
//仮定:
//a[0]、a[1]は%R2、%R3の中にある
//b[0]、b[1]は%R4、%R5の中にある
//c[0]、c[1]は%R6、%R7の中にある
//d[0]、d[1]は%R8、%R9の中にある
//e[0]、e[1]は%R10、%R11の中にある
//%R12、%R13をtempとして使用する
tcmp16s GT %R2,%R4,%P1
tcmp16s GT %R3,%R5,%P0
add16s %R6,%R8,%R12
add16s %R7,%R9,%R13
cmov16 (%P1) %R12,%R10
cmov16 (%P0) %R13,%R11
【0164】
HyperOpコード(二重条件付記憶)
{
|A| ld32 %R2.D,%A; //32ビットのR2:R3をロードする
||B| ld32 %R4.D,%B; //32ビットのR4:R5をロードする
|DP1| tcmp16s GT %AH,%BH,%P1; //R2>R4を試験して、述語P1を設定する
|DP0| tcmp16s GT %AL,%BL,%P0; //R3>R5を試験して、述語P0を設定する
}
{
|A| ld32 %R6.D,%A; //32ビットのR6:R7をロードする
|B| ld32 %R8.D,%B; //32ビットのR8:R9をロードする
|DP1| add16s %AH,%BH,%D1; //D1=R6+R8
|DP0| add16s %AL,%BL,%D0; //D0=R7+R9
|D| dst16 (%P1 %P0) %D1_D0,%R10.D; //P1が真である場合、16ビットのR10にD1を記憶し、P0が真である場合、
//16ビットのR11にD0を記憶する
}
【0165】
注:
●条件付実行はスロットD命令に適用される
●SIMD述語実行モードを使用する
●if(%P1 %P0) {…}
●%P1は上位ワードを制御する
●%P0は下位ワードを制御する
【0166】
アレイの非ゼロ要素を検出して、値を保存する
【0167】
Cコード
int16 a[N],b[N];
int16 i,j;
j=0;
for(i=0,i<N;i++)
{
if(a[i]<>0)
b[j++]=a[i];
}
【0168】
GPnを使用するASMコード
//仮定:
//iとして%I1を使用する
//jとして%I2を使用する
//%B1はa[]を指す
//%B2はb[]を指す
//一時的GRとして%I0を使用する
gmovi $0,%I2 //I2=0
repeat $0,$N-1,$1,%I1,L_loop_start,L_loop_end
L_loop_start:
mov16 0[%B1+%I1],%I0 //I0=a[i]
//EXに%I0をロードして、FDで使用するときに+4サイクル機能停止する
gtcmps NE %I0,$0,%GP0 //a[i]<>0を試験し、述語GP0を設定する
cmov16 (%GP0) 0[%B1+%I1],0[%B2+%I2] //GP0が真である場合、16ビットのb[j]にa[i]を移動する
gadd (%GP0) %I2,$1,%I2 //GP0が真であれは、j++する
L_loop_end:
サイクル:2+N(1+4+3)=2+8N
【0169】
Pnを使用するASMコード
gmovi $0,%I2 //I2=0
repeat $0,$N-1,$1,%I1,L_loop_start,L_loop_end
L_loop_start:
tcmp16s NE 0[%B1+%I1],$0,%P0 //a[i]<>0を試験し、述語P0を設定する
cmov16 (%P0) 0[%B1+%I1],0[%B2+%I2] //P0が真である場合、16ビットのb[j]にa[i]を移動する
//EXの中に%P0を設定して、FDで使用するときに+3サイクル機能停止する
gadd (%P0) %I2,$1,%I2 //P0が真である場合、j++する
L_loop_end:
サイクル:2+N(2+3+1)=2+6N
【0170】
Pnを使用する簡単なHyperOpコード(条件付Gスロット実行)
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gmovi $0,%I2 //I2=0
repeat $0,$N-1,$1,%I1,L_loop_start,L_loop_end
L_loop_start:
{
|A| ld16 0[%B1+%I1],%AL; //16ビットのa[i]をロードする
|DP0| mov16s %AL,%D0;
|DP1| tcmp16 NE %AL,$0,%P0; //a[i]<>0を試験して、述語P0を設定する
}
{
|D| st16 (%P0) %D0,0[%B2+%I2]; //P0が真である場合、16ビットのb[j]にa[i]を移動する
}
//EXの中に%P0を設定して、FDで使用するときに+3サイクル機能停止する
{
|G| gadd (%P0) %I2,$1,%I2 ・・P0が真である場合、j++する
}
L_loop_end:
サイクル:2+N(1+1+3+1)=2+6N
【0171】
Pnを使用してパイプライン化されたHyperOpコード(条件付記憶)
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gdmovi $0,$1,%I2,%S2 //I2=0,S2=1
repeat $0,$N-1,$4 %I1,L_loop_start,L_loop_end
L_loop_start:
{|A| ld16 0[%B1+%I1],%AL;|DP1| mov16 %AL,%ACC0;|DP0| tcmp16 NE %AL,$0,%P0;}
{|A| ld16 1[%B1+%I1],%AL;|DP1| mov16 %AL,%ACC1;|DP0| tcmp16 NE %AL,$0,%P1;}
{|A| ld16 2[%B1+%I1],%AL;|DP1| mov16 %AL,%ACC2;|DP0| tcmp16 NE %AL,$0,%P2;}
{|A| ld16 3[%B1+%I1],%AL;|DP1| mov16 %AL,%ACC3;|DP0| tcmp16 NE %AL,$0,%P3;}
//EXの中に%P0を設定して、FDで使用するときに+1サイクル機能停止する
{|A| incr (%P0) $(__i2Mask);|D| st16 (%P0) %ACC0,0[%B2+%I2];}
{|A| incr (%P1) $(__i2Mask);|D| st16 (%P1) %ACC1,0[%B2+%I2];}
{|A| incr (%P2) $(__i2Mask);|D| st16 (%P2) %ACC2,0[%B2+%I2];}
{|A| incr (%P3) $(__i2Mask);|D| st16 (%P3) %ACC3,0[%B2+%I2];}
L_loop_end:
サイクル:1+N/4(4+1+4)=1+2.25N
【0172】
2つのPEを使用するHyperOpコード
//PE0を使用して、入力アレイa[]上で試験を遂行する:
for(i=0;i<N;i++)
{
if(a[i]<>0)
sendToPE1(a[i]);
}
//PE1を使用して、疎の出力アレイb[]を保存する:
idx=0;
while(1)
{
tmp=recvFromPE0();
b[idx++]=tmp;
}
【0173】
PE0
//仮定:
//%B1はa[]を指し、iは%I1の中にある
repeat $0,$N-1,$1 %I1,L_loop_start,L_loop_end
L_loop_start:
tcmp16 NE 0[%B1+%I1],$0,%P0;
cmov16 (%P0) 0[%B1+%I1],PE0_PE1_QPORT;
L_loop_end:
PE0サイクル:1+2N
【0174】
PE1
//仮定:
//%B2はb[]を指し、jは%I2の中にある
gdmovi $0,$1,%I2,%S2 //I2=0,S2=1
L_loop:
jmp L_loop; //Qポート上で無限ループする
{
|A| incr $(__i2Mask); //I2+=S2;次の命令のために役立つ更新
|B| ld16 PE0_PE1_QPORT,%BL;
|DP0| mov16 %BL,%D0;
|D| st16 %D0,0[%B2+%I2]; //記憶にはI2の現在の値(更新されず)を使用する
}
【0175】
注:
●2つのPEを使用することにより、EXで%GP0を設定して、FDで使用するときの機能停止を回避する
【0176】
アレイの非ゼロ要素を検出して、インデックスを保存する
【0177】
Cコード
int16 a[N],b[N];
int16 i,j;
j=0;
for(i=0;i<N;i++)
{
if(a[i]<>0) { b[j++]=i;}
}
【0178】
GPnを使用するASMコード
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gmov $0,%I2
repeat $0,$N-1,$1 %I1,L_loop_start,L_loop_end
L_loop_start:
mov16 0[%B1+%I1],%I0 //一時的I0の中にa[i]をロードする
//EXに%I0をロードして、FDで使用するときに+4サイクル機能停止する
gtcmps NE %I0,$0,%GP0 //a[i]<>0を試験し、述語GP0を設定する
cmov16 (%GP0) %I1,0[%B2+%I2] //GP0が真である場合、16ビットのb[j]にiを移動する
gadd (%GP0) %I2,$1,%I2 //GP0が真である場合、増分j++する
L_loop_end:
サイクル:2+N(1+4+3)=2+8N
【0179】
Pnを使用するASMコード
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gmov16 $0,%I2
repeat $0,$N-1,$1 %I1,L_loop_start,L_loop_end
L_loop_start:
tcmp16s NE 0[%B1+%I1],$0,%P0 //a[i]<>0を試験し、述語P0を設定する
cmov16 (%P0) %I1,0[%B2+%I2] //P0が真である場合、16ビットのb[j]にiを移動する
//EXの中に%P0を設定して、FDで使用するときに+3サイクル機能停止する
gadd (%P0) %I2,$1,%I2 //P0が真である場合、増分j++する
L_loop_end:
サイクル:2+N(2+3+1)=2+6N
【0180】
パイプライン化されたPnを使用するASMコード
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gmov16 $0,%I2
repeat $0,$N-1,$4 %I1,L_loop_start,L_loop_end
L_loop_start:
tcmp16s NE 0[%B1+%I1],$0,%P0 //a[i+0]<>0を試験し、述語P0を設定する
tcmp16s NE 1[%B1+%I1],$0,%P1 //a[i+1]<>0を試験し、述語P1を設定する
tcmp16s NE 2[%B1+%I1],$0,%P2 //a[i+2]<>0を試験し、述語P2を設定する
tcmp16s NE 3[%B1+%I1],$0,%P3 //a[i+3]<>0を試験し、述語P3を設定する
add16s (%P0)%I1,$0,0[%B2+%I2] //P0が真である場合、16ビットのb[j]にi+0を移動する
gadd (%P0) %I2,$1,%I2 //P0が真である場合、増分j++する
add16s (%P1) %I1,$1,0[%B2+%I2] //P1が真である場合、16ビットのb[j]にi+1を移動する
gadd (%P1) %I2,$1,%I2 //P1が真である場合、増分j++する
add16s(%P2) %I1,$2,0 [%B2+%I2]//P2が真である場合、16ビットのb[j]を移動する
gadd (%P2) %I2,$1,%I2 //P2が真である場合、増分j++する
add16s (%P3) %I1,$3,0[%B2+%I2] //P3が真である場合、16ビットのb[j]にi+3を移動する
gadd (%P3) %I2,$1,%I2 //P3が真である場合、増分j++する
L_loop_end:
サイクル:2+N/4(4+8)=2+3N
【0181】
GPnを使用する簡単なHyperOpコード(条件付Gスロットおよび記憶)
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gdmov $0,$1,%I2,%S2
repeat $0,$N-1,$1 %I1,L_loop_start,L_loop_end
L_loop_start:
{
|A| ld16 0[%B1+%I1],%AL; //ALの中にa[i]をロードする
||DP0| mov16 %AL,%D0; //D0にa[i]を移動する
|D| st16 %D0,%I0; //一時的I0の中にD0=a[i]を記憶する
}
//EXの中に%I0を書き込み、FDで使用するときに+4サイクル機能停止する
{
|B| ld16 %I1,%BH; //BHの中にiをロードする
|DP0| mov16s %BH,%D0; //D0にiを移動する
|G| gtcmps NE %I0,$0,&GP0; //a[i]<>0を試験し、述語P0を設定する
}
{
|A| incr (%GP0) $(__i2Mask); //GP0が真である場合、増分j++する
|D| st16 (%GP0) %D0,0[%B2+%I2]; //GP0が真である場合、16ビットのb[j]にiを移動する
}
L_loop_end:
サイクル:2+N(1+4+2)=2+7N
【0182】
Pnを使用する簡単なHyperOpコード
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gdmovi $0,$1,%I2,%S2
repeat $0,$N-1,$1 %I1,L_loop_start,L_loop_end
L_loop_start:
{
|A| ld16 0[%B1+%I1],%AL; //ALの中にa[i]をロードする
|B| ld16 %I1,%BL; //BLの中にiをロードする
|DP1| tcmp16s NE %AL,$0,%P0; //a[i]<>0を試験し、述語P0を設定する
|DP0| mov %BL,%D0; //D0にiを移動する、記憶するための準備
}
//EXの中に%P0を書き込み、FDで使用するときに+4サイクル機能停止する
{
|A| incr (%P0) $(__i2Mask); //P0が真である場合、増分j++する
|D| st16 (%P0) %D0,0[%B2+%I2]; //P0が真である場合、16ビットのb[j]にiを移動する
}
L_loop_end:
サイクル:2+N(1+4+1)=2+6N
【0183】
GPnを使用するHyperOpコードパイプライン
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gdmovi $0,$1,%I2,%S2
repeat $0,$N-1,$5 %I1,L_loop_start,L_loop_end
L_loop_start:
//一時的GRの中にa[]から次の5つの値をロードする
{|A| ld16 0[%B1+%I1],%AL;|DP0| mov16s %AL,%D0;|D| st16 %D0,%T4;}
{|A| ld16 1[%B1+%I1],%AL;|DP0| mov16 %AL,%D0;|D| st16 %D0,%T5;}
{|A| ld16 2[%B1+%I1],%AL;|DP0| mov16 %AL,%D0;|D| st16 %D0,%T6;}
{|A| ld16 3[%B1+%I1],%AL;|DP0| mov16 %AL,%D0;|D| st16 %D0,%T7;}
{|A| ld16 4[%B1+%I1],%AL;|DP0| mov16 %AL,%D0;|D| st16 %D0,%I0;}
//if(a[i]<>0) { b[j++]=i;} //a[i+0]を試験する
{|A| ld16 %I1,%AH;|G| gtcmpi16 NE %T4,$0,%GP0;|DP0| add16s %AH,$0,%D0;}
{|A| incr (%GP0) $(__i2Mask);|D| st16 (%GP0) %D0,0[%B2+%I2];}
//if(a[i+1]<>0) { b[j++]=i+1;} //a[i+1]を試験する
{|G| gtcmpi16 NE %T5,$0,%GP0;|DP0| add16s %AH,$1,%D0;}
{|A| incr (%GP0) $(__i2Mask);|D| st16 (%GP0) %D0,0[%B2+%I2];}
//if(a[i+2]<>0) { b[j++]=i+2;} //a[i+2]を試験する
{|G| gtcmpi16 %T6,$0,%GP0;|DP0| add16s %AH,$2,%D0;}
{|A| incr (%GP0) $(__i2Mask);|D| st16 (%GP0) %D0,0[%B2+%I2];}
//if(a[i+3]<>0) { b[j++]=i+3;} //a[i+3]を試験する
{|G| gtcmpi16 NE %T7,$0,%GP0;|DP0| add16s %AH,$3,%D0;}
{|A| incr (%GP0) $(__i2Mask);|D| st16 (%GP0) %D0,0[%B2+%I2];}
//if(a[i+4]<>0) { b[j++]=i+4;} //a[i+4]を試験する
{|G| gtcmpi16 NE %I0,$0,%GP0;|DP0| add16s %AH,$4,%D0;}
{|A| incr (%GP0) $(__i2Mask);|D| st16 (%GP0) %D0,0[%B2+%I2];}
L_loop_end:
サイクル:2+N/5(5+5(2))=2+3N
注:
●5つのGRの中にロードすることによりすべての機能停止を隠すことができる
【0184】
Pnを使用してパイプライン化されたHyperOpコード
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gdmovi $0,$1,%I2,%S2
repeat $0,$N-1,$4 %I1,L_loop_start,L_loop_end
L_loop_start:
//a[]の次の5つの値を試験して、P0~P3に入れる
{|A| ld32 0[%B1+%I1],%A;
|C| ld16 %I1,%CLL; //CLL=I1
|DP1| tcmp16s NE %AH,$0,%P0;
|DP0| tcmp16s NE %AL,$0,%P1;
}
{|B| ld32 2[%B1+%I1],%B;
|DP1| tcmp16s NE %BH,$0,%P2;
|DP0| tcmp16s NE %BL,$0,%P3;
}
//EXの中に%P0を設定して、FDで使用するときに+3サイクル機能停止する
//if(a[i]<>0) { b[j++]=i;} //P0を使用する
{|A| incr (%P0) $(__i2Mask);
|DP0| add16s %CLL,$0,%D0;
|D| st16 (%P0) %D0,0[%B2+%I2];
}
//if(a[i+1]<>0) { b[j++]=i+1;} //P1を使用する
{|A| incr (%P1) $(__i2Mask);
|DP0| add16s %CLL,$1,%D0;
|D| st16 (%P1) %D0,0[%B2+%I2];
}
//if(a[i+2]<>0) { b[j++]=i+2;} //P2を使用する
{|A| incr (%P2) $(__i2Mask);
|DP0| add16s %CLL,$2,%D0;
|D| st16 (%P2) %D0,0[%B2+%I2];
}
//if(a[i+3]<>0) { b[j++]=i+3;} //P3を使用する
{|A| incr (%P3) $(__i2Mask);
|DP0| add16s %CLL,$3,%D0;
|D| st16 (%P3) %D0,0[%B2+%I2];
}
L_loop_end:
サイクル:2+N/4(2+3+4)=2+2.25N
注:
●4つのPnを用いてすべての機能停止を隠すことができるわけではない
【0185】
タグ付データを使用するHyperOpコード
//仮定:
//%B1はa[]を指し、iは%I1の中にある
//%B2はb[]を指し、jは%I2の中にある
gdmovi $0,$1,%I2,%S2
repeat $0,$N-1,$4 %I1,L_loop_start,L_loop_end
L_loop_start:
//a[]の次の4つの値を試験して、P0~P3に入れる
{
|A| ld32 0[%B1+%I1],%A; //ロードする、AH=a[i+0]、AL=a[i+1]
|C| ld16 $a,%CLL; //CLL=&a[0]
|DP1| tcmp16s NE %AH,$0,%P0; //a[i+0]<>0を試験して、述語P0を設定する
|DP0| tcmp16s NE %AL,$0,%P1; //a[i+1]<>0を試験して、述語P1を設定する
}
{
|B| ld32 2[%B1+%I1],%B; //ロードする、BH=a[i+2]、BL=a[i+3]
|DP1| tcmp16s NE %BH,$0,%P2; //a[i+2]<>0を試験して、述語P2を設定する
|DP0| tcmp16s NE %BL,$0,%P3; //a[i+3]<>0を試験して、述語P3を設定する
}
//EXの中に%P0を設定して、FDで使用するときに+3サイクル機能停止する(INCR命令)
//if(a[i]<>0) { b[j++]=i;}
{
|A| incr (%P0) $(__i2Mask); //P0が真である場合、増分j++する
|B| ld16t 0[%B1+%I1],%B; //タグ付データをロードするB={&a[i]:a[i]}
|DP0| sub16s %BH,%CLL,%D0; //D0=&a[i]-&a[0]=i
|D| st16 (%P0) %D0,0[%B2+%I2]; //P0が真である場合、16ビットのb[j]にiを記憶する
}
//if(a[i+1]<>0) { b[j++]=i+1;}
{
|A| incr (%P1) $(__i2Mask); //P1が真である場合、増分j++する
|B| ld16t 1[&B1+%I1],%B; //タグ付データをロードするB={&a[i+1]:a[i+1]}
|DP0| sub16s %BH,%CLL,%D0; //D0=&a[i+1]-&a[0]=i+1
|D| st16 (%P1) %D0,0[%B2+%I2]; //P1が真である場合、16ビットのb[j]にi+1を記憶する
}
//if(a[i+2]<>0) { b[j++]=i+2;}
{
|A| incr (%P2) $(__i2Mask); //P2が真である場合、増分j++する
|B| ld16t 2[&B1+%I1],%B; //タグ付データをロードするB={&a[i+2]:a[i+2]}
|DP0| sub16s %BH,%CLL,%D0; //D0=&a[i+2]-&a[0]=i+2
|D| st16 (%P2) %D0,0[%B2+%I2]; //P2が真である場合、16ビットのb[j]にi+2を記憶する
}
//if(a[i+3]<>0) { b[j++]=i+3;}
{
|A| incr (%P3) $(__i2Mask); //P3が真である場合、増分j++する
|B| ld16t 3[&B1+%I1],%B; //タグ付データをロードするB={&a[i+3]:a[i+3]}
|DP0| sub16s %BH,%CLL,%D0; //D0=&a[i+3]-&a[0]=i+3
|D| st16 (%P3) %D0,0[%B2+%I2]; //P3が真である場合、16ビットのb[j]にi+3を記憶する
}
L_loop_end:
サイクル:2+N/4(2+3+4)=2+2.25N
【0186】
注:
●タグ付ロードLD16Tは、16ビットデータ(下位16ビットに)およびそのアドレスを(上位16ビットに)パックされたデータとしてロードする
●データインデックスは、データアドレス(またはタグ)であり、すなわち、アレイの開始である
【0187】
間接的処理を使用してアレイにアクセスする
【0188】
Cコード
int16 a[N],b[N],c[N];
int16 i,j;
for(i=0;i<N;i++)
{
j=b[i];
a[i]=c[j];
}
【0189】
ASMコード
//%B1はa[]を指し、iは%I1の中にあると仮定する
//%B2はb[]を指し、iは%I1の中にあると仮定する
//%B4はc[]を指し、jは%I2の中にあると仮定する
repeat $0,$N-1,$1 %I1,L_loop_start,L_loop_end
L_loop_start:
mov16 0[%B2+%I1],%I2
//EXの中に%I2を設定して、FDで使用するときに+4サイクル機能停止する
mov16 0[%B4+%I2],0[%B1+%I1]
L_loop_end:
サイクル:1+N(1+4+1)=1+6N
【0190】
簡単なHyperOpコード
//%B1はa[]を指し、iは%I1の中にあると仮定する
//%B2はb[]を指し、iは%I1の中にあると仮定する
//%B4はc[]を指し、jは%I2の中にあると仮定する
repeat $0,$N-1,$1 %I1,L_loop_start,L_loop_end
L_loop_start:
{|A| ld16 0[%B2+%I1],%AL;|DP0| mov %AL,%D0;|D| st16 %D0,%I2}
//EXの中に%I2を設定して、FDで使用するときに+4サイクル機能停止する
{|B| ld16 0[%B4+%I2],%BL;|DP0| mov %BL,%D0;|D| st16 %D0,0[%B1+%I1]};
L_loop_end:
サイクル:1+N(1+4+1)=1+6N
【0191】
パイプライン化されたHyperOpコード
//%B1はa[]を指し、iは%I1の中にあると仮定する
//%B2はb[]を指し、iは%I1の中にあると仮定する
//%B4はc[]を指し、jは%I2~%I7の中にあると仮定する
//j0=b[0];j1=b[1];
{|A| ld32 0[%B2],%A;|DP0| mov32 %A,%D0;|D| st32 %D0,%I2I3;}
//j2=b[2]; j3=b[3];
{|A| ld32 2[%B2],%A;|DP0| mov32 %A,%D0;|D| st32 %D0,%I4I5;}
//j4=b[4]; j5=b[5];
{|A| ld32 4[%B2],%A;|DP0| mov32 %A,%D0;|D| st32 %D0,%I6I7;}
//EXの中に%I2、%I3を設定して、FDで使用するときに+1サイクル機能停止する
repeat $0,$N-1,$6 %I1,L_loop_start,L_loop_end
L_loop_start:
//a[i+0]=c[j0];a[i+1]=c[j1];j0=b[i+6];j1=b[i+7];
{|A| ld16 0[%B4+%I2],%AL;|B| ld16 0[%B4+%I3],%BL;
|DP1| mov16 %AL,%D1;|DP0| mov16 %BL,%D0;|D| dst16 %D1_D0,0[%B1+%I1];}
{|A| ld32 6[%B2+%I1],%A;|DP0| mov32 %A,%D0;|D| st32 %D0,%I2I3;}
//a[i+2]=c[j2];a[i+3]=c[j3];j2=b[i+8];j3=b[i+9];
{|A| ld16 0[%B4+%I4],%AL;|B| ld16 0[%B4+%I5],%BL;
|DP1| mov16 %AL,%D1;|DP0| mov16 %BL,%D0;|D| dst16 %D1_D0,2[%B1+%I1];}
{|A| ld32 8[%B2+%I1],%A;|DP0| mov32 %A,%D0;|D| st32 %D0,%I4I5;}
//a[i+4]=c[j4];a[i+5]=c[j5];j4=b[i+10];j5=b[i+11];
{|A| ld16 0[%B4+%I6],%AL;|B| ld16 0[%B4+%I7],%BL;
|DP1| mov16 %AL,%D1;|DP0| mov16 %BL,%D0;|D| dst16 %D1_D0,4[%B1+%I1];}
{|A| ld32 10[%B2+%I1],%A;|DP0| mov32 %A,%D0;|D| st32 %ACC0,%I6I7;}
//I1~I7の中にロードされた最終値を無視する
L_loop_end:
サイクル:3+1+1+N/6(6)=5+N
【0192】
注:
●インデックスjは、1サイクルでb[i]から対でロードされる
●2つのc[j]は、1サイクルで対としてロードされ、a[i]に記憶される
●6つのインデックスレジスタを使用することにより、EXでのインデックスの設定およびFDでのインデックスの使用というパイプラインバブルを回避する
【0193】
二重DPを使用する条件付累積
【0194】
以下は、2つの述語を伴う条件付HyperOpをどこで使用することができるかのある例である。
【0195】
Cコード
int16 a[N],b[N],c[N];
int16 i;
int32 sum=0;
for(int i=0;i<N;i++) {
if(a[i]>b[i])
sum+=a[i]*c[i];
}
【0196】
ASMコード
【0197】
この例は、ベクトル固有関数(擬似ASM命令)を使用して、二重DPにアクセスする。
repeat $0,$N-1,$2,IDX_i,L_loop_start,L_loop_end
movx16s $0,%ACC2
movx16s $0,%ACC0
L_loop_start:
vtcmp16s GT 0[BP_a+IDX_i],0[BP_b+IDX_i],%P1P0;
cmov16 (%P1) 0[BP_a+IDX_i],$0,%R0
cmov16 (%P0) 1[BP_1+IDX_i],$0,%R1
vmulaa16s %R0.D,0[BP_c+IDX_i],%ACC2_ACC0
L_loop_end:
accadd %ACC0,$0,%ACC2
サイクル:3+N/2(4)+1=4+2N
【0198】
HyperOpコード(条件付DPスロット実行-両方のスロット)
#define BP_a %B1
#define BP_b %B2
#define BP_c %B3
#define IDX_i %I1
repeat $0,$N-1,$2,IDX_i,L_loop_start,L_loop_end
{|DP1| movx16s $0,%ACC2;|DP0| movx16s $0,%ACC0;}
L_loop_start:
{|A| ld32 0[BP_a+IDX_i],%A;|B| ld32 0[BP_b+IDX_i],%B;
|DP1| tcmp16s GT %AH,%BH,%P1;|DP0| tcmp16s GT %AL,%BL,%P0;}
{|C| ld32 0[BP_c+IDX_i],%B;
|DP1| mulaa16s (%P1) %AH,%BH,%ACC2;|DP0| mulaa16s (%P0) %AL,%BL,%ACC0;}
L_loop_end:
accadd %ACC0,$0,%ACC2
サイクル:1+N/2(2)+1=2+N
【0199】
注:
●DP1およびDP0を使用して、繰返しiおよびi+1を並列に処理する
●合計を%ACC0および%ACC2の中に分割し、次いで最後に組み合わせる
●述語フラグ%P1および%P0を使用して、累積を%ACC2および%ACC0の中で独立に制御する
【0200】
二重MULをそれぞれ使用して二重DPを使用する条件付累積
【0201】
以下は、4つの述語を伴う条件付HyperOpをどこで使用することができるかのある例である。
Cコード
int16 a[N],b[N],c[N];
int16 i;
int32 sum=0;
for(int i=0;i<N;i++) {
if(a[i]>b[i])
sum+=a[i]*c[i];
}
【0202】
HyperOpコード(4重の条件付きで両方のDPを使用する)
#define BP_a %B1
#define BP_b %B2
#define BP_c %B3
repeat $0,$N-1,$4,IDX_i,L_loop_start,L_loop_end
{|DP1| movx16s $0,%ACC2;|DP0| movx16s $0,%ACC0;}
L_loop_start:
{|A| ld64 0[BP_a+IDX_i],%AB;|C| ld64 0[BP_b+IDX_i],%C;
|DP1| dtcmp16s GT %A,%CH,%P3P2;
|DP0| dtcmp16s GT %B,%CL,%P1P0;}
{|C| ld64 0[BP_c+IDX_i],%C;
|DP1| dmulaa16s (%P3P2) %A,%CH,%ACC2;
|DP0| dmulaa16s (%P1P0) %B,%CL,%ACC0;}
L_loop_end:
accadd %ACC0,$0,%ACC2
サイクル:2+N/4(2)+1=3+0.5N
【0203】
注:
●繰返しi~i+3を並列に処理する:
●iおよびi+1をDP1で
●i+2およびi+3をDP0で
●DP0は二重動作を遂行し、DP1は二重動作を遂行する
●合計を%ACC0および%ACC2の中に分割し、次いで最後に組み合わせる
●述語フラグ%P0~P3使用して、積の累積を%ACC0および%ACC2の中で独立に制御する
●b[]およびc[]は、64ビットアクセスが作動するために、a[]と異なるDMRでなければならない
【0204】
二重DPを使用する条件付記憶
【0205】
以下のCコードは、条件付HyperOpを使用して、条件付記憶をどこで遂行することができるかのある例である。
【0206】
Cコード
int16 a[N],b[N],c[N],d[N];
int16 i;
for(int i=0;i<N;i++) {
if(a[i]>b[i])
d[i]=a[i]*c[i];
}
【0207】
ASMコード
【0208】
この例は、ベクトル固有関数(擬似AM命令)を使用して、二重DPにアクセスする。
#define BP_a %B1
#define BP_b %B2
#define BP_c %B3
#define BP_d %B4
#define IDX_i %I1
repeat $0,$N-1,$2,IDX_i,L_loop_start,L_loop_end
L_loop_start:
vtcmp16s GT [BP_a+IDX_i],[BP_b+IDX_i],%P1P0
vmul16s (%P1P0) [BP_a+IDX_i],[BP_c+IDX_i],[BP_d+IDX_i]
L_loop_end:
【0209】
HyperOpコード(二重条件付記憶)
#define BP_a %B1
#define BP_b %B2
#define BP_c %B3
#define BP_d %B4
#define IDX_i %I1
repeat $0,$N-1,$2,IDX_i,L_loop_start,L_loop_end
L_loop_start:
{|A| ld32 0[BP_a+IDX_i],%A;|B| ld32 0[BP_b+IDX_i],%B;
|DP1| tcmp16s GT %AH,%BH,%P1;|DP0| tcmp16s GT %AL,%BL,%P0;}
{|C| ld32 0[BP_c+IDX_i],%C;
|DP1| mul16s %AH,%CLH,%D1;|DP0| mul16s %AL,%CLL,%D0;
|D| dst16 (%P1P0) %D1_D0,0[BP_d+IDX_i];}
L_loop_end:
【0210】
注:
●DP1およびDP0を使用して、繰返しiおよびi+1を並列に処理する
●述語フラグ%P1および%P0を使用して、16ビット:16ビットの記憶を独立に制御する(SIMDモード)
【0211】
条件付飛越しを使用する条件付if-else-ifの例
【0212】
Cコード
absq=abs(q);
if(absq<qmin) {
qmin2=qmin;
qmin=absq;
imin=i;
}
else if(absq<qmin2) {
qmin2=absq;
}
【0213】
ASMコード
//iminおよびqminはパックされたデータimin_qminとして記憶されている(偶数アドレス)と仮定する
abs16s q,absq //absq=abs(q)
tcmp16 LT absq,qmin,%P1 //P1=(absq<qmin)
jmp (!%P1) L_else PNT //!P1が真である場合、qmin更新をスキップする
tcmp16 LT absq,qmin2,%P0 //P0=(absq<qmin2)―スロットを遅延する
L_if: //qminおよびqmin2を更新する:
mov16 qmin,qmin2 //qmin2=qmin
jmp L_end
dmov16 i,absq,imin_qmin //qmin=absq,imin=i-スロットを遅延させる
L_else:
jmp (!%P0) L_end PNT DLY
nop //スロットを遅延させる
mov16 absq,qmin2 //qmin2だけを更新する
L_end:
【0214】
DLY最適化を用いるASMコード
abs16s q,absq
tcmp16 LT absq,qmin,%P1
jmp (!%P1) L_else PNT
tcmp16 LT absq,qmin2,%P0 //遅延スロットで実行される
L_if:
mov16 qmin,qmin2
jmp L_end
dmov16 i,absq,imin_qmin //遅延スロットで実行される
L_else:
jmp (!%P0) L_end PNT DLY
mov16 absq,qmin2 //JMPの後に実行され、遅延スロットでは実行されない
L_end:
【0215】
条件付移動を使用する条件付if-else-ifの例
【0216】
Cコード
absq=abs(q);
if(absq<qmin) {
qmin2=qmin;
qmin=absq;
imin=i;
}
else if(absq<qmin2) {
qmin2=absq;
}
【0217】
ASMコード
//iminおよびqminはパックされたデータimin_qminとして記憶されている(偶数アドレス)と仮定する
abs16s q,absq //absq=abs(q)
tcmp16s LT absq,qmin,%P1 //P1=(absq<qmin)
tcmp16s LT absq,qmin2,%P0 //P0=(absq<qmin2)
cmov16 (%P1) qmin,qmin2 //P1が真である場合、qmin2=qmin
cmov16 (%P1) absq,qmin //P1が真である場合、qmin=absq
cmov16 (%P1) i,imin //P1が真である場合、imin=i
cmov16 (!%P1&%P0) absq,qmin2 //他にP0が真である場合、qmin2=absq
サイクル:7
【0218】
HyperOpコード
{|A| ld16 q、AL;
|B| ld16 i,%BL;
|DP1| mov16 %BL,%ACC3; //ACC3=i
|DP1| abs16s %AL,%ACC1; //ACC1L=absq
|D| dst16 %ACC3_ACC1,%ACC3;} //ACC3H=i,ACC3L=absq
{|A| ld32 imin_qmin,%A; //AH=imin,AL=qmin
|B| ld16 qmin2,%BL; //BL=qmin2
|DP1| tcmp16 LT %ACC3L,%AL,%P1; //P1=(absq<qmin)
|DP0| tcmp16 LT %ACC1L,%BL,%P0;} //P0=(absq<qmin2)
{|DP1| if(%P1) cmov32 %ACC3,%A,%ACC2; //P1が真である場合、{ACC2H=i,ACC2L=absq}
//そうではない場合、{ACC2H=imin,ACC2L=qmin}
|DP0| if(%P1) cmov16 %AL,%BL,%ACC0; //ACC0=(P1) ? qmin2:qmin
|D| st32 %ACC2,imin_qmin;} //imin:qmin=ACC2H:ACC2Lに更新する
{|DP0| if(!%P1&%P0) cmov16 %ACC3L,%ACC0L,%ACC0; //そうではない場合、ACC0L=(P0) ? absq:qmin
|D| st16 %ACC0,qmin2;} //qmin2=ACC0Lに更新する
サイクル:4
【0219】
注:
●P1および%P0を使用して、IF試験およびELSE IF試験のブール代数の結果を保持する
●iminおよびqminは、パックされた16:16としてメモリに記憶されていると仮定する
●CSELと共に%P1および%P0を使用して、可能である場合には対で状態変数を条件付きで更新する
【0220】
述語フラグを使用して試験を組み合わせる
【0221】
Cコード
int16 a,b,c,d,e;
void test() {
a=(b<c)&&(d<e);
}
【0222】
ASMコード
tcmp16s LT b,c %P0 //P0=(b<c)
tcmp16s LT d,e,%P1 //P1=(d<e)
cmov16 (%P0&%P1) $1,$0,a //a=(P0&P1)1:0
【0223】
注:
●コンパイラは、&&演算子を&演算子と置換する:
●a=(b<c)&(d<e)
【0224】
レジスタファイル使用して試験を組み合わせる
【0225】
Cコード
int16 a,b,c,d,e;
void test() {
a=(b<c)&&(d<e);
}
【0226】
ASMコード
tcmp16s LT b,c,%R0 //R0=(b<c)
tcmp16s LT d,e,%R1 //R1=(d<e)
and16 %R0,%R1,a //a=R0&R1
【0227】
注:
●コンパイラは、&&演算子を&演算子に置換する:
●a=(b<c)&(d<e)
【0228】
サブルーチンへの条件付飛越し
【0229】
Cコード
int16 a,b,c,d,e,f;
if((a<b)&(c<e)|(d>f))
foo();
【0230】
ASMコード
tcmp16s LT a,b,%R1 //R1=(a<b)
tcmp16s LT c,e,%R2 //R2=(c<e)
tand16 NZ %R1,%R2,%P0 //P0=(a<b)&(c<e)
tcmp16s GT d,f,%P1 //P1=(d>f)
jsr (%P0|%P1) foo //P0|P1が真であれば、foo()を実行する
【0231】
注:
●AND16ではなくTAND16を使用する
●Pnは、TEST以外、ALU動作ではdstDになることはできないことに留意されたい
【0232】
論理/試験動作結果の割当て
【0233】
Cコード
int16 a,b,c,d,e,f,result;
result=((a<b)&(c<e)|(d>f));
【0234】
ASMコード
tcmp16s LT a,b,%R1 //R1=(a<b)
tcmp16s LT c,e,%R2 //R2=(c<e)
and16 %R1,%R2,%R3 //P3=(a<b)&(c<e)
tcmp16s GT d,f,%R4 //R4=(d>f)
or16 %R3,%R4,result //result=(R3|R4)
【0235】
本明細書で記述するさまざまな形態のいずれも、たとえば、コンピュータ実装方法として、コンピュータ可読記憶媒体として、コンピュータシステムとしてなど、さまざまな形態のいずれでも実現されてよい。システムは、特定用途向け集積回路(Application Specific Integrated Circuit、ASIC)などの1つまたは複数のカスタム設計ハードウェア機器により、FPGA(Field Programmable Gate Array)などの1つまたは複数のプログラム可能ハードウェア素子により、プログラム記憶式命令を実行する1つまたは複数のプロセッサにより、または前述の任意の組合せにより実現されてよい。
【0236】
いくつかの実施形態では、非一時的コンピュータ可読記憶媒体は、プログラム命令および/またはデータを記憶するように構成されてもよく、この場合、プログラム命令は、コンピュータシステムにより実行された場合、方法を、たとえば、本明細書に記述する方法の実施形態のいずれか、または本明細書に記述する方法の実施形態の任意の組合せ、または本明細書に記述する方法の実施形態のいずれかからなる任意のサブセット、またはそのようなサブセットの任意の組合せを、コンピュータシステムに遂行させる。
【0237】
いくつかの実施形態では、コンピュータシステムは、プロセッサ(または1組のプロセッサ)および記憶媒体を含むように構成されてよく、この場合、記憶媒体は、プログラム命令を記憶し、この場合、プロセッサは、記憶媒体からプログラム命令を読み出し、実行するように構成され、この場合、プログラム命令は、本明細書に記述するさまざまな方法の実施形態のいずれか(または本明細書に記述する方法の実施形態の任意の組合せ、または本明細書に記述する方法の実施形態のいずれかからなる任意のサブセット、またはそのようなサブセットの任意の組合せ)を実装するように実行可能である。コンピュータシステムは、さまざまな形態のいずれかで実現されてよい。たとえば、コンピュータシステムは、パーソナルコンピュータ(パーソナルコンピュータのさまざまな実現形態のいずれかの形をとる)、ワークステーション、カード上のコンピュータ、ボックスの中の特定用途向けコンピュータ、サーバコンピュータ、クライアントコンピュータ、ハンドヘルド機器、移動体機器、ウェアラブルコンピュータ、検出機器、テレビ、ビデオ取込機器、生体の中に埋め込まれたコンピュータなどであってよい。コンピュータシステムは、1つまたは複数の表示機器を含んでよい。本明細書で開示するさまざまな計算結果のいずれも、表示機器を介して表示されてよい、または他の方法でユーザインタフェース機器を介して出力として提示されてよい。
【0238】
装置は、複数のプロセッサと、散在した配列で複数のプロセッサに連結した複数のデータ・メモリ・ルータとを備え、特定のデータ・メモリ・ルータは、複数のデータ・メモリ・ルータのうちの少なくとも1つの他のデータ・メモリ・ルータに受信したメッセージを中継するように構成され、複数のプロセッサのうちの特定のプロセッサは、複数の述語フラグのうちの少なくとも1つの述語フラグを設定して、複数の述語フラグを使用して命令を条件付きで実行するように構成される。
【0239】
前述の装置では、複数の述語フラグは、特定のプロセッサに含まれるデータパスに関連する少なくとも第1組の述語フラグ、および特定のプロセッサに含まれるアドレス生成器ユニットに関連する第2組の述語フラグを含む。
【0240】
前述の装置では、複数の述語フラグのうちの少なくとも1つの述語フラグを設定するために、特定のプロセッサは、試験命令の実行に応答して、第1の値と第2の値を比較し、結果を生成し、結果に基づき少なくとも1つの述語フラグを設定するようにさらに構成される。
【0241】
前述の装置では、第1の値と第2の値を比較するために、特定のプロセッサは、第1の値および第2の値を使用して論理動作を遂行して、結果を生成するようにさらに構成される。
【0242】
前述の装置では、複数の述語フラグのうちの少なくとも1つの述語フラグを設定するために、特定のプロセッサは、特定のプロセッサに含まれるデータパスのタイミング動作を示す情報に少なくとも一部は基づき、少なくとも1つの述語フラグを設定するようにさらに構成される。
【0243】
前述の装置では、複数の述語フラグのうちの少なくとも1つの述語フラグを設定するために、特定のプロセッサは、特定のプロセッサに含まれるアドレス生成器ユニットのタイミング動作を示す情報に少なくとも一部は基づき、少なくとも1つの述語フラグを設定するようにさらに構成される。
【0244】
前述の装置では、命令を条件付きで実行するために、特定のプロセッサは、複数の述語フラグを使用して、特定のプロセッサに含まれるデータパスに含まれる1つまたは複数のデータパススロットを条件付きで実行するようにさらに構成される。
【0245】
方法は、複数のプロセッサのうちの特定のプロセッサにより、複数の述語フラグのうちの少なくとも1つの述語フラグを設定するステップであって、複数のプロセッサは、散在した配列で複数のデータ・メモリ・ルータに連結されるステップと、複数のプロセッサのうちの特定のプロセッサにより、複数の述語フラグを使用して命令を条件付きで実行するステップとを備える。
【0246】
前述の方法では、複数の述語フラグは、特定のプロセッサに含まれるデータパスに関連する少なくとも第1組の述語フラグ、および特定のプロセッサに含まれるアドレス生成器ユニットに関連する第2組の述語フラグを含む。
【0247】
前述の方法では、複数の述語フラグのうちの少なくとも1つの述語フラグを設定するステップは、特定のプロセッサにより試験命令を実行することに応答して、第1の値と第2の値を比較して、結果を生成するステップと、結果に基づき、少なくとも1つの述語フラグを設定するステップとを含む。
【0248】
前述の方法では、第1の値と第2の値を比較するステップは、第1の値および第2の値を使用して論理動作を遂行して、結果を生成するステップを含む。
【0249】
前述の方法では、複数の述語フラグのうちの少なくとも1つの述語フラグを設定するステップは、特定のプロセッサにより、特定のプロセッサに含まれるデータパスのタイミング動作を示す情報に少なくとも一部は基づき、少なくとも1つの述語フラグを設定するステップを含む。
【0250】
前述の方法では、複数の述語フラグのうちの少なくとも1つの述語フラグを設定するステップは、特定のプロセッサにより、特定のプロセッサに含まれるアドレス生成器ユニットのタイミング動作を示す情報に少なくとも一部は基づき、少なくとも1つの述語フラグを設定するステップを含む。
【0251】
請求項22に記載の前述の方法では、特定のプロセッサにより、命令を条件付きで実行するステップは、複数の述語フラグを使用して、特定のプロセッサに含まれるデータパスに含まれる1つまたは複数のデータパススロットを条件付きで実行するステップを含む。
【0252】
装置は、複数のプロセッサと、散在した配列で複数のプロセッサに連結した複数のデータ・メモリ・ルータとを備え、特定のデータ・メモリ・ルータは、複数のデータ・メモリ・ルータのうちの少なくとも1つの他のデータ・メモリ・ルータに受信したメッセージを中継するように構成され、複数のプロセッサのうちの特定のプロセッサは、受信した命令に基づき、特定のプロセッサに含まれる複数のデータパスのうちの特定のデータパスに含まれる複数の算術論理回路のサブセットを選択的に活動化し、複数の算術論理回路のサブセットを使用して、受信した命令を実行するように構成される。
【0253】
前述の装置では、複数の算術論理回路のサブセットを選択的に活動化するために、特定のプロセッサは、命令を復号して、復号された命令を生成し、復号された命令を使用して、複数の算術論理回路のサブセットを選択的に活動化するようにさらに構成される。
【0254】
前述の装置では、複数のプロセッサのうちの特定のプロセッサは、命令に基づき、複数の算術論理回路のサブセットに含まれる個々の算術論理回路の間でデータをルーティングするようにさらに構成される。
【0255】
前述の装置では、複数の算術論理回路のサブセットに含まれる個々の算術論理回路の間でデータをルーティングするために、特定のプロセッサは、特定のデータパスに含まれる複数の多重化回路のうちの少なくとも1つの多重化回路の状態を選択的に変更するようにさらに構成される。
【0256】
前述の装置では、複数の論理回路のうちの特定の算術論理回路は、少なくとも加算器回路を含む。
【0257】
前述の装置では、複数の論理回路のうちの特定の算術論理回路は、命令を実行する際に使用するオフセットを記憶するように構成されたルックアップテーブルを含む。
【0258】
前述の装置では、命令は、対数確率動作を指定する。
【0259】
方法は、複数のプロセッサのうちの特定のプロセッサに含まれる複数のデータパスのうちの特定のデータパスに含まれる複数の算術論理回路のサブセットを選択的に活動化するステップであって、複数のプロセッサは、散在した配列で複数のデータ・メモリ・ルータに連結されるステップと、複数のプロセッサのうちの特定のプロセッサにより、複数の算術論理回路のサブセットを使用して命令を実行するステップとを備える。
【0260】
前述の方法では、複数の算術論理回路のサブセットを選択的に活動化するステップは、命令を復号して、復号された命令を生成するステップと、復号された命令を使用して複数の算術論理回路のサブセットを選択的に活動化するステップとを含む。
【0261】
前述の方法は、命令に基づき、複数の算術論理回路のサブセットに含まれる個々の算術論理回路の間でデータをルーティングするステップをさらに備える。
【0262】
前述の方法では、複数の算術論理回路のサブセットに含まれる個々の算術論理回路の間でデータをルーティングするステップは、特定のプロセッサにより、特定のデータパスに含まれる複数の多重化回路のうちの少なくとも1つの多重化回路の状態を選択的に変更するステップを含む。
【0263】
前述の方法では、複数の論理回路のうちの特定の算術論理回路は、少なくとも加算器回路を含む。
【0264】
前述の方法では、複数の論理回路のうちの特定の算術論理回路は、ルックアップテーブルを含み、命令を実行する際に使用するオフセットをルックアップテーブルに記憶するステップをさらに備える。
【0265】
前述の方法では、命令は、対数確率動作を指定する。
【0266】
好ましい実施形態に関連して上記の実施形態について記述してきたが、本明細書で示す特有の形態に限定することを意図するのではなく、それどころか、そのような代替形態、修正形態、および均等物を、添付の特許請求の範囲により規定される本発明の実施形態の精神および範囲の中に合理的に含むことができるとして含むことが意図される。