(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-03-06
(45)【発行日】2024-03-14
(54)【発明の名称】ヘテロジニアス処理システムのためのデータフローグラフプログラミング環境
(51)【国際特許分類】
G06F 15/82 20060101AFI20240307BHJP
G06F 15/80 20060101ALI20240307BHJP
G06F 15/78 20060101ALI20240307BHJP
G06F 15/173 20060101ALI20240307BHJP
G06F 8/41 20180101ALI20240307BHJP
G06F 8/34 20180101ALI20240307BHJP
【FI】
G06F15/82 630Z
G06F15/80
G06F15/78 530
G06F15/78 560
G06F15/173 665D
G06F15/173 680
G06F8/41
G06F8/34
(21)【出願番号】P 2021569564
(86)(22)【出願日】2020-03-31
(86)【国際出願番号】 US2020026031
(87)【国際公開番号】W WO2020236318
(87)【国際公開日】2020-11-26
【審査請求日】2023-03-06
(32)【優先日】2019-05-23
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】591025439
【氏名又は名称】ザイリンクス インコーポレイテッド
【氏名又は名称原語表記】XILINX INCORPORATED
(74)【代理人】
【識別番号】110001195
【氏名又は名称】弁理士法人深見特許事務所
(72)【発明者】
【氏名】グプタ,シャイル・アディティア
(72)【発明者】
【氏名】ベイリス,サミュエル・アール
(72)【発明者】
【氏名】カタイル,ビノッド・ケイ
(72)【発明者】
【氏名】ウィッティヒ,ラルフ・デー
(72)【発明者】
【氏名】ジェイムズ-ロックスビー,フィリップ・ビィ
(72)【発明者】
【氏名】サストリー,アケッラ
【審査官】坂庭 剛史
(56)【参考文献】
【文献】特表2018-507449(JP,A)
【文献】特開2012-248114(JP,A)
【文献】国際公開第2011/096016(WO,A1)
【文献】DUBACH, Christophe et al.,Compiling a High-level Language for GPUs,PLDI'12: Proceedings of the 33rd ACM SIGPLAN Conference on Programming Language Design and Implementation,米国,ACM [online],2012年06月11日,Volume 47, Issue 6,pp.1-11,https://dl.acm.org/doi/pdf/10.1145/2345156.2254066
(58)【調査した分野】(Int.Cl.,DB名)
G06F 15/82
G06F 15/80
G06F 15/78
G06F 15/173
G06F 8/41
G06F 8/34
(57)【特許請求の範囲】
【請求項1】
コンピュータによって実行される方法であって、
オブジェクト指向ソースコードとしてデータフローグラフを定義するためのヘテロジニアスなプログラミング環境を提供するステップと、
前記ヘテロジニアスなプログラミング環境において生成されたグラフソースコードを受信するステップであって、前記グラフソースコードは、複数のカーネルおよび複数の通信リンクを定義し、前記複数の通信リンクの各々は、前記データフローグラフを形成するために前記複数のカーネルのそれぞれの対を結合する、受信するステップと、
ヘテロジニアス処理システムにおいて前記データフローグラフを実施するために前記グラフソースコードをコンパイルするステップであって、前記グラフソースコードをコンパイルするステップは、
前記グラフソースコードにおける前記複数のカーネルの前記定義に基づいて前記複数のカーネルを前記ヘテロジニアス処理システムに割り当てるステップと、
前記グラフソースコードで定義された前記複数の通信リンクに通信タイプを割り当てるステップと、
前記複数の通信リンクを使用して前記複数のカーネル間でデータを転送するための同期技術を選択するステップと、を含
み、
前記複数のカーネルを前記ヘテロジニアス処理システムに割り当てるステップは、
第1のカーネルおよび第2のカーネルが、前記グラフソースコードによって定義された前記複数の通信リンクのうちの第1の通信リンクによって通信可能に結合されていることを識別するステップと、
前記第1のカーネルを前記ヘテロジニアス処理システム内の第1のデータ処理エンジン(DPE)に割り当てるステップと、
前記第2のカーネルを、前記ヘテロジニアス処理システム内の第2のDPEに割り当てるステップと、を含む、方法。
【請求項2】
前記第2のDPEは、前記第1のDPEに直接隣接する、請求項1に記載の方法。
【請求項3】
前記第1のDPEおよび第2のDPEは両方とも共有メモリモジュールへの直接接続を有し、前記方法は、
前記第1のカーネルと前記第2のカーネルとの間でデータを転送するために、前記共有メモリモジュール内にダブルバッファを割り当てるステップを含む、請求項2に記載の方法。
【請求項4】
前記複数のカーネルを前記ヘテロジニアス処理システムに割り当てるステップは、
第1のカーネルおよび第2のカーネルが、前記グラフソースコードによって定義された前記複数の通信リンクのうちの第1の通信リンクによって通信可能に結合されていることを識別するステップと、
前記第1のカーネルを前記ヘテロジニアス処理システム内の第1のDPEに割り当てるステップと、
前記第2のカーネルを前記ヘテロジニアス処理システム内のプログラマブルロジックに割り当てるステップと、
前記第1のカーネルにデータを転送するために相互接続を使用して直接メモリアクセス(DMA)を実行するように前記第2のカーネルを構成するステップと、を含み、
前記相互接続は、前記第1のDPEを含むDPEのアレイを互いにおよびプログラマブルロジックに相互接続する、請求項1に記載の方法。
【請求項5】
前記複数のカーネルを前記ヘテロジニアス処理システムに割り当てるステップは、
第1のカーネルおよび第2のカーネルが、前記グラフソースコードによって定義された前記複数の通信リンクのうちの第1の通信リンクによって通信可能に結合されていることを識別するステップと、
第1および第2のカーネルが第1のコアのサイクルバジェット以下の結合サイクル数を有すると決定したことに応答して、前記第1および第2のカーネルを前記ヘテロジニアス処理システム内のDPEのアレイ内の前記第1のコアにクラスタリングするステップと、
前記第1のカーネルと第2のカーネルとの間でデータを転送するためにメモリモジュール内にバッファを割り当てるステップと、を含み、
前記メモリモジュールは前記第1のコアへの直接接続を有する、請求項1に記載の方法。
【請求項6】
前記通信タイプを前記複数の通信リンクに割り当てるステップは、前記グラフソースコードにおける前記複数の通信リンクの前記定義に基づいて、前記複数の通信リンクの各々についてデータを送信するためにストリーミングおよびウィンドウ処理のうちの1つを使用するかどうかを選択するステップを含む、請求項1に記載の方法。
【請求項7】
ウィンドウ処理は、受信したデータを事前定義されたまたはパラメータ化されたブロックサイズを有する個々のウィンドウに分割するステップであって、前記個々のウィンドウを受信するように構成された前記複数のカーネルの各々は、前記受信したウィンドウを処理する前に、呼び出しごとにウィンドウを受信するまで待機する、分割するステップを含み、
ウィンドウ処理を実行する前記通信リンクの少なくとも1つについて、前記個々のウィンドウは、前記個々のウィンドウを受信する前記複数のカーネルの受信カーネルがその状態を維持するように、最初に以前に送信されたウィンドウの端部と重複するデータを有する、請求項6に記載の方法。
【請求項8】
前記同期技術を選択するステップは、
前記複数の通信リンクのうちの第1の通信リンクに割り当てられたダブルバッファを識別するステップと、
前記複数の通信リンクのうちの前記第1の通信リンクに対応する第1のカーネルおよび第2のカーネルが前記ダブルバッファに並列にアクセスできるようにロックプロトコルを構成するステップと、を含む、請求項1に記載の方法。
【請求項9】
前記データフローグラフを実行するように前記ヘテロジニアス処理システムを構成する前記グラフソースコードをコンパイルすることに基づいてビットストリームおよびバイナリコードを送信するステップと、
制御プログラムを使用して前記ヘテロジニアス処理システムにおける前記データフローグラフの実行を制御するステップと、をさらに含む、
請求項1に記載の方法。
【請求項10】
前記ヘテロジニアス処理システムは、第1のチップおよび第2のチップを含み、前記複数のカーネルは前記第1のチップに割り当てられ、前記グラフソースコードは第2の複数のカーネルを定義し、前記グラフソースコードをコンパイルするステップは、
前記第2の複数のカーネルを前記第2のチップに割り当てるステップを含み、前記第2のチップに割り当てられた前記第2の複数のカーネルは、前記第1のチップに割り当てられた前記複数のカーネルと通信するように構成される、請求項1に記載の方法。
【請求項11】
前記グラフソースコードは、前記ヘテロジニアス処理システムを形成するSoCのハードウェア設計から独立しており、各々が異なるハードウェア設計を有する複数の異なるタイプのSoC上
にコンパイラによって実装することができる、請求項1に記載の方法。
【請求項12】
前記ヘテロジニアス処理システムは、プログラマブルロジックおよびデータ処理エンジン(DPE)のアレイを備え、前記複数のカーネルのうちの少なくとも1つは前記プログラマブルロジックに割り当てられ、前記複数のカーネルのうちの少なくとも1つは前記DPEのうちの1つに割り当てられる、請求項1に記載の方法。
【請求項13】
サブグラフを前記データフローグラフにカプセル化するステップであって、前記サブグラフは前記グラフソースコードとは別個のグラフクラスによって定義される、カプセル化するステップと、
前記データフローグラフおよび前記サブグラフに制約を追加する制約付きグラフを生成するステップであって、前記制約付きグラフは前記データフローグラフのためのラッパーとして機能する、生成するステップと、をさらに含む、請求項1に記載の方法。
【請求項14】
前記複数のカーネルの各々は、前記複数のカーネルの各々が前記データフローグラフ内の別のカーネルと通信することを可能にするための少なくとも1つのポートを含み、前記データフローグラフにおいて、前記複数の通信リンクの各々は、第1のカーネル上の第1のポートを第2のカーネル上の第2のポートに結合する、請求項1に記載の方法。
【請求項15】
ホストであって、
プロセッサと、
メモリとを備え、前記メモリは、
オブジェクト指向ソースコードとしてデータフローグラフを定義するためのヘテロジニアスなプログラミング環境と、
前記ヘテロジニアスなプログラミング環境において生成されたグラフソースコードであって、前記グラフソースコードは、複数のカーネルおよび複数の通信リンクを定義し、前記複数の通信リンクの各々は、前記データフローグラフを形成するために前記複数のカーネルのそれぞれの対を結合する、グラフソースコードと、
ヘテロジニアス処理システムにおいて前記データフローグラフを実施するために前記グラフソースコードをコンパイルするように構成された、
前記プロセッサ上で動作するコンパイラであって、前記グラフソースコードをコンパイルするステップは、
前記グラフソースコードにおける前記複数のカーネルの前記定義に基づいて前記複数のカーネルを前記ヘテロジニアス処理システムに割り当てるステップと、
前記グラフソースコードで定義された前記複数の通信リンクに通信タイプを割り当てるステップと、
前記複数の通信リンクを使用して前記複数のカーネル間でデータを転送するための同期技術を選択するステップと、を含む、コンパイラと、を
格納し、
前記複数のカーネルを前記ヘテロジニアス処理システムに割り当てるステップは、
第1のカーネルおよび第2のカーネルが、前記グラフソースコードによって定義された前記複数の通信リンクのうちの第1の通信リンクによって通信可能に結合されていることを識別するステップと、
前記第1のカーネルを前記ヘテロジニアス処理システム内の第1のデータ処理エンジン(DPE)に割り当てるステップと、
前記第2のカーネルを、前記ヘテロジニアス処理システム内の第2のDPEに割り当てるステップと、を含む、ホスト。
【発明の詳細な説明】
【技術分野】
【0001】
技術分野
本開示の例は、一般に、プログラマブルかつソフトウェア構成可能にハード化されたハードウェア要素の混合を含むシステムにおいてデータフローグラフを生成するためにオブジェクト指向プログラミングコードを使用することに関する。
【背景技術】
【0002】
背景技術
システムオンチップ(SoC)は、プログラマブルロジック(例えば、プログラマブルファブリック)と、処理コアまたはエンジンなどのソフトウェア構成可能なハードウェア化ロジックとの混合を含むことができる。典型的には、ユーザは、ユーザ機能を実行するためのソフトウェア構成可能なハードウェア化ロジックを構成するためのプログラマブルなバイナリコードを構成するためのビットストリームにコンパイルすることができるプログラムを書き込むために、プログラマブルかつソフトウェア構成可能なハードウェア化ロジック(およびそれらが通信する方法)を詳細に理解しなければならない。しかし、プログラマブルロジックとハードウェア化ロジックとが混在するSoC用のプログラムを記述するためにハードウェア記述言語(HDL)またはオープンコンピューティング言語(OpenCL)を使用することは面倒であり、並列化することは困難である。データ並列度およびスレッド並列度はまた、プロセッサのアレイ上での計算を表現するために使用されるが、これらの技法は、異なるインターフェースを有するヘテロジニアス計算を表現する必要があるプログラマブルロジックに自然には拡張されない。
【発明の概要】
【課題を解決するための手段】
【0003】
発明の概要
ヘテロジニアス処理システム上でデータフローグラフを実装するための技術を説明する。一例は、グラフソースコードを受信するステップを含む方法であり、グラフソースコードは、複数のカーネルおよび複数の通信リンクを定義し、複数の通信リンクの各々は、複数のカーネルのそれぞれの対を結合してデータフローグラフを形成する。方法はまた、ヘテロジニアス処理システム内のシステム上でデータフローグラフを実装するためにグラフソースコードをコンパイルするステップを含む。グラフソースコードをコンパイルするステップは、複数のカーネルをヘテロジニアス処理システム内のプログラマブルロジックおよびデータ処理エンジン(DPE)のアレイに割り当てるステップと、通信タイプを複数の通信リンクに割り当てるステップと、複数の通信リンクを使用して複数のカーネル間でデータを転送するための同期技術を選択するステップとを含む。
【0004】
いくつかの実施形態では、複数のカーネルをヘテロジニアス処理システムに割り当てるステップは、第1のカーネルおよび第2のカーネルが、グラフソースコードによって定義された複数の通信リンクのうちの第1の通信リンクによって通信可能に結合されていることを識別するステップと、第1のカーネルをヘテロジニアス処理システム内の第1のデータ処理エンジン(DPE)に割り当てるステップと、第2のカーネルを、第1のDPEに直接隣接するヘテロジニアス処理システム内の第2のDPEに割り当てるステップとを含む。
【0005】
いくつかの実施形態では、第1のDPEおよび第2のDPEは両方とも共有メモリモジュールへの直接接続を有し、方法は、第1のカーネルと第2のカーネルとの間でデータを転送するために、共有メモリモジュール内にダブルバッファを割り当てるステップを含む。
【0006】
いくつかの実施形態では、複数のカーネルをヘテロジニアス処理システムに割り当てるステップは、第1のカーネルおよび第2のカーネルが、グラフソースコードによって定義された複数の通信リンクのうちの第1の通信リンクによって通信可能に結合されていることを識別するステップと、第1のカーネルをヘテロジニアス処理システム内の第1のDPEに割り当てるステップと、第2のカーネルをヘテロジニアス処理システム内のプログラマブルロジックに割り当てるステップと、第1のカーネルにデータを転送するために相互接続を使用して直接メモリアクセス(DMA)を実行するように第2のカーネルを構成するステップと、を含み、相互接続は、第1のDPEを含むDPEのアレイを互いにおよびプログラマブルロジックに相互接続する。
【0007】
いくつかの実施形態では、複数のカーネルをヘテロジニアス処理システムに割り当てるステップは、第1のカーネルおよび第2のカーネルが、グラフソースコードによって定義された複数の通信リンクのうちの第1の通信リンクによって通信可能に結合されていることを識別するステップと、第1および第2のカーネルが第1のコアのサイクルバジェット以下の結合サイクル数を有すると決定したことに応答して、第1および第2のカーネルをヘテロジニアス処理システム内のDPEのアレイ内の第1のコアにクラスタリングするステップと、第1のカーネルと第2のカーネルとの間でデータを転送するためにメモリモジュール内にバッファを割り当てるステップとを含み、メモリモジュールは第1のコアへの直接接続を有する。
【0008】
いくつかの実施形態では、通信タイプを複数の通信リンクに割り当てるステップは、グラフソースコードにおける複数の通信リンクの定義に基づいて、複数の通信リンクの各々についてデータを送信するためにストリーミングおよびウィンドウ処理のうちの1つを使用するかどうかを選択するステップを含む。
【0009】
いくつかの実施形態では、ウィンドウ処理は、受信したデータを事前定義されたまたはパラメータ化されたブロックサイズを有する個々のウィンドウに分割することを含み、個々のウィンドウを受信するように構成された複数のカーネルの各々は、受信したウィンドウを処理する前に、呼び出しごとにウィンドウを受信するまで待機する。さらに、ウィンドウ処理を実行する通信リンクの少なくとも1つについて、個々のウィンドウは、個々のウィンドウを受信する複数のカーネルの受信カーネルがその状態を維持するように、最初に以前に送信されたウィンドウの端部と重複するデータを有する。
【0010】
いくつかの実施形態では、同期技術を選択するステップは、複数の通信リンクのうちの第1の通信リンクに割り当てられたダブルバッファを識別するステップと、複数の通信リンクのうちの第1の通信リンクに対応する第1のカーネルおよび第2のカーネルがダブルバッファに並列にアクセスできるようにロックプロトコルを構成するステップとを含む。
【0011】
いくつかの実施形態では、方法は、データフローグラフを実行するようにヘテロジニアス処理システムを構成するグラフソースコードをコンパイルすることに基づいてビットストリームおよびバイナリコードを送信するステップと、制御プログラムを使用してヘテロジニアス処理システムにおけるデータフローグラフの実行を制御するステップとを含む。
【0012】
いくつかの実施形態において、ヘテロジニアス処理システムは、第1のチップおよび第2のチップを含み、複数のカーネルは第1のチップに割り当てられ、グラフソースコードは第2の複数のカーネルを定義し、グラフソースコードをコンパイルするステップは、第2の複数のカーネルを第2のチップに割り当てるステップを含み、第2のチップに割り当てられた第2の複数のカーネルは、第1のチップに割り当てられた複数のカーネルと通信するように構成される。
【0013】
いくつかの実施形態では、グラフソースコードは、ヘテロジニアス処理システムを形成するSoCのハードウェア設計から独立しており、各々が異なるハードウェア設計を有する複数の異なるタイプのSoC上にコンパイラによって実装することができる。
【0014】
いくつかの実施形態では、ヘテロジニアス処理システムは、プログラマブルロジックおよびDPEのアレイを備え、複数のカーネルのうちの少なくとも1つはプログラマブルロジックに割り当てられ、複数のカーネルのうちの少なくとも1つはDPEのうちの1つに割り当てられる。
【0015】
いくつかの実施形態では、方法は、サブグラフをデータフローグラフにカプセル化するステップであって、サブグラフはグラフソースコードとは別個のグラフクラスによって定義される、カプセル化するステップと、データフローグラフおよびサブグラフに制約を追加する制約付きグラフを生成するステップであって、制約付きグラフはデータフローグラフのためのラッパーとして機能する、生成するステップと、を含む。
【0016】
いくつかの実施形態では、複数のカーネルの各々は、複数のカーネルの各々がデータフローグラフ内の別のカーネルと通信することを可能にするための少なくとも1つのポートを含み、データフローグラフにおいて、複数の通信リンクの各々は、第1のカーネル上の第1のポートを第2のカーネル上の第2のポートに結合する。
【0017】
本明細書で説明される一例は、プロセッサと、複数のカーネルおよび複数の通信リンクを定義するグラフソースコードであって、複数の通信リンクの各々は複数のカーネルのそれぞれの対を結合してデータフローグラフを形成する、グラフソースコードと、ヘテロジニアス処理システムにおいてデータフローグラフを実装するためにグラフソースコードをコンパイルするように構成されたコンパイラとを含むホストである。グラフソースコードをコンパイルするステップは、複数のカーネルをヘテロジニアス処理システム内のプログラマブルロジックおよびDPEのアレイに割り当てるステップと、通信タイプを複数の通信リンクに割り当てるステップと、複数の通信リンクを使用して複数のカーネル間でデータを転送するための同期技術を選択するステップとを含む。
【0018】
図面の簡単な説明
上記の特徴が詳細に理解され得るように、上記で簡潔に要約したものより具体的な説明は、例示的な実装を参照することによって得ることができ、そのいくつかは添付の図面に示されている。しかしながら、添付の図面は、典型的な例示的な実装のみを示しており、したがってその範囲を限定するものと見なされるべきではないことに留意されたい。
【図面の簡単な説明】
【0019】
【
図1】一例による、データ処理エンジンアレイを含むSoCのブロック図である。
【
図2】一例による、データ処理エンジンアレイ内のデータ処理エンジンのブロック図である。
【
図3A】一例による、DPEアレイ内の複数のDPEによって共有されるメモリモジュールを示す。
【
図3B】一例による、DPEアレイ内の複数のDPEによって共有されるメモリモジュールを示す。
【
図4】一例による、
図1に示すSoC上でデータフローグラフを実装するためのコンピューティングシステムのブロック図である。
【
図5】一例による、プログラマブルおよび非プログラマブルロジックを有するSoC上でデータフローグラフを実装するためにソースコードをコンパイルするためのフローチャートである。
【
図6】一例による、データフローグラフを定義するためのグラフソースコードである。
【
図7】一例による、
図6のソースコードによって定義されたデータフローグラフを示す。
【
図8】一例による、データフローグラフにおいてカーネルを定義するためのカーネルソースコードである。
【
図9】一例による、
図7のデータフローグラフを実装する概略図である。
【
図10】一例による、
図7のデータフローグラフを実装するハードウェア図である。
【
図11】一例による、カーネル間でデータを送信するときに使用されるオーバーラップウィンドウを示す。
【
図12】一例による、データフローグラフのための制御プログラムを定義する制御ソースコードである。
【
図13】一例による、制約を使用してデータフローグラフを実装するためにソースコードをコンパイルするためのフローチャートである。
【
図14】一例による、ユーザ定義の制約を使用して実装されたグラフオブジェクトを有するDPEアレイである。
【
図15】一例による、継承可能な抽象インターフェース1505である。
【
図16】一例による、複数のサブグラフを有するデータフローグラフである。
【
図17】一例による、制約付きデータフローグラフである。
【
図18】一例による、複数のソースからの制約をマージするための制約処理フローである。
【
図19】一例による、SoC上でデータフローグラフを実装するためのコンピューティングシステムのブロック図である。
【
図20A】例による、SoC上のデータフローグラフの実行を制御するための制御アプリケーションプログラムインターフェースを示す。
【
図20B】例による、SoC上のデータフローグラフの実行を制御するための制御アプリケーションプログラムインターフェースを示す。
【
図21】一例による、データ処理エンジンアレイを異なる領域に論理的に分割することを示す。
【
図22A】一例による、データフローグラフの実行を動的に変更することを示す。
【
図22B】一例による、データフローグラフの実行を動的に変更することを示す。
【
図23A】例によるトリガされたパラメータを示す。
【発明を実施するための形態】
【0020】
理解を容易にするために、可能であれば、図に共通する同一の要素を示すために同一の参照番号が使用されている。一例の要素は、他の例に有益に組み込むことができると考えられる。
【0021】
発明を実施するための形態
様々な特徴を、図面を参照して以下に説明する。図面は縮尺通りに描かれていてもいなくてもよく、同様の構造または機能の要素は図面全体を通して同様の参照番号で表されていることに留意されたい。図面は、特徴の説明を容易にすることのみを意図していることに留意されたい。それらは、網羅的な説明として、または特許請求の範囲に対する限定として意図されていない。さらに、図示された例は、示されたすべての態様または利点を有する必要はない。特定の例に関連して説明される態様または利点は、必ずしもその例に限定されず、そのように示されていなくても、またはそのように明示的に説明されていなくても、任意の他の例で実施することができる。
【0022】
本明細書の例は、カーネルおよびそれらのカーネル間の通信リンクを定義するためのソースコードを使用してデータフローグラフを生成するための技術を説明する。一実施形態では、グラフは、エッジ(例えば、カーネル間の通信リンク)によって通信可能に結合されたノード(例えば、カーネル)を使用して形成される。コンパイラは、ソースコードをビットストリームおよびバイナリコードに変換し、これは、グラフを実行するためにSoCのヘテロジニアス処理システムにおいてプログラマブルロジックおよびソフトウェア構成可能なハードウェア化ロジックを構成する。ヘテロジニアス処理システム内のプログラマブルかつソフトウェア構成可能にハード化されたハードウェアを詳細に理解することをプログラマに要求するのではなく、コンパイラは、ソースコードで表されたグラフを使用して、どのカーネルをプログラマブルロジックブロックに割り当て、どのカーネルをハードウェア化ロジックブロックに割り当てるかを決定することができる。さらに、コンパイラは、グラフソースコードで提供されるパラメータを使用して、カーネル間の通信リンクを確立するための特定の通信技法(例えば、共有メモリ、ウィンドウ処理、ダイレクトメモリアクセス(DMA)など)を選択することができる。さらに、コンパイラは、同期が通信リンクで使用されるべきかどうかを自動的に判定し、プログラマからの入力なしに、すなわちプログラマがグラフソースコード内で同期の詳細を提供することなく、その同期をセットアップすることができる。したがって、プログラマは、SoCのプログラマブルかつハード化されたハードウェアを使用してデータフローグラフを実装する方法を理解することなく、(ソースコードを使用して)データフローグラフを高レベルで表現することができる。結果として、グラフソースコードは、特定のSoCのハードウェア設計から独立しており、各々が異なるハードウェア設計を有する複数の異なるタイプのSoC上に(コンパイラを使用して)実装することができる。
【0023】
図1は、一例による、データ処理エンジン(DPE)アレイ105を含むSoC100のブロック図である。DPEアレイ105は、SoC100内にグリッド、クラスタ、または市松模様で配置され得る複数のDPE110を含む。
図1は、DPE110を行および列を有する2Dアレイに配置することを示しているが、実施形態はこの配置に限定されない。さらに、アレイ105は、任意のサイズとすることができ、DPE110によって形成された任意の数の行および列を有することができる。
【0024】
一実施形態では、DPE110は同一である。すなわち、DPE110(タイルまたはブロックとも呼ばれる)の各々は、同じハードウェア構成要素または回路を有することができる。さらに、本明細書の実施形態は、DPE110に限定されない。代わりに、SoC100は、任意の種類の処理要素のアレイを含むことができ、例えば、DPE110は、デジタル信号処理エンジン、暗号化エンジン、前方誤り訂正(FEC)エンジン、または1つまたは複数の特殊なタスクを実行するための他の特殊なハードウェアであり得る。
【0025】
図1では、アレイ105は、すべて同じタイプ(例えば、均一アレイ)のDPE110を含む。しかしながら、別の実施形態では、アレイ105は、異なるタイプのエンジンを含むことができる。例えば、アレイ105は、デジタル信号処理エンジン、暗号化エンジン、グラフィック処理エンジンなどを含むことができる。アレイ105が同種であるかヘテロジニアスであるかにかかわらず、DPE110は、以下でより詳細に説明するように、DPE110がデータを直接転送することを可能にするDPE110間の直接接続を含むことができる。
【0026】
一実施形態では、DPE110は、ソフトウェア構成可能にハードウェア化されたロジックから形成、すなわちハード化される。そうすることの利点の1つは、DPE110内にハードウェア要素を形成するためにプログラマブルロジックを使用することと比較して、DPE110がSoC100内で占有するスペースが少なくなり得ることである。すなわち、プログラムメモリ、命令フェッチ/デコードユニット、固定小数点ベクトルユニット、浮動小数点ベクトルユニット、算術論理演算ユニット(ALU)、乗算アキュムレータ(MAC)などのDPE110内のハードウェア要素を形成するためにハードウェア化ロジック回路を使用することにより、SoC100内のアレイ105のフットプリントを大幅に削減することができる。DPE110はハード化されてもよいが、これはDPE110がプログラマブルでないことを意味しない。すなわち、DPE110は、SoC100の電源投入時または再起動時に、異なる機能またはタスクを実行するように構成することができる。
【0027】
DPEアレイ105はまた、DPE110とSoC100内の他のハードウェア構成要素との間の通信インターフェースとして機能するSoCインターフェースブロック115(シムとも呼ばれる)を含む。この例では、SoC100は、SoCインターフェースブロック115に通信可能に結合されたネットワークオンチップ(NoC)120を含む。図示されていないが、NoC120は、SoC100内の様々な構成要素が互いに通信することを可能にするために、SoC100全体にわたって延在し得る。例えば、一物理的実装では、DPEアレイ105は、SoC100を形成する集積回路の右上部分に配置されてもよい。しかしそれにもかかわらず、アレイ105は、NoC120を使用して、例えば、SoC100全体の異なる位置に配置され得るプログラマブルロジック(PL)125、プロセッササブシステム(PS)130、または入力/出力(I/O)135と通信することができる。
【0028】
DPE110とNoC120との間のインターフェースを提供することに加えて、SoCインターフェースブロック115は、PL125内の通信ファブリックに直接接続を提供することもできる。この例では、データフローグラフ内のカーネルの一部が実行のためにDPE110に割り当てられ、他のカーネルがPL125に割り当てられるため、PL125およびDPE110はヘテロジニアス処理システムを形成する。
図1はSoC内のヘテロジニアス処理システムを示しているが、他の例では、ヘテロジニアス処理システムは複数のデバイスまたはチップを含むことができる。例えば、ヘテロジニアス処理システムは、同じタイプまたは異なるタイプの2つのFPGAまたは他の特殊化されたアクセラレータチップを含むことができる。さらに、ヘテロジニアス処理システムは、2つの通信可能に結合されたSoCを含むことができる。
【0029】
これはプログラマにとって管理が困難であり得るが、それは、ヘテロジニアスまたは異なる処理コアに配置されたカーネル間の通信は、NoC120、SoCインターフェースブロック115、ならびにアレイ105内のDPE110間の通信リンク(
図2に示す)などの
図1に示す様々な通信インターフェースを使用することを含むことができるからである。
【0030】
一実施形態では、SoCインターフェースブロック115は、DPE110をNoC120およびSoC100内のアレイ105の近くに配置されたPL125に通信可能に結合するための別個のハードウェア構成要素を含む。一実施形態では、SoCインターフェースブロック115は、PL125用のファブリックに直接データをストリーミングすることができる。例えば、PL125は、SoCインターフェースブロック115がNoC120を使用せずにデータをストリーミングし、そこからデータを受信することができるFPGAファブリックを含むことができる。すなわち、本明細書で説明される回路スイッチングおよびパケットスイッチングは、DPE110をSoCインターフェースブロック115に、またSoC100内の他のハードウェア化ブロックに通信可能に結合するために使用することができる。別の例では、SoCインターフェースブロック115は、DPE110とは異なるダイに実装されてもよい。さらに別の例では、DPEアレイ105および少なくとも1つのサブシステムは同じダイに実装されてもよく、他のサブシステムおよび/または他のDPEアレイは他のダイに実装される。さらに、DPEアレイ105内のDPE110に関して本明細書で説明されるストリーミング相互接続およびルーティングは、SoCインターフェースブロック115を介してルーティングされるデータにも適用することができる。
【0031】
図1はPL125の1つのブロックを示しているが、SoC100は、SoC100内の異なる位置に配置することができるPL125の複数のブロック(構成ロジックブロックとも呼ばれる)を含むことができる。例えば、SoC100は、フィールドプログラマブルゲートアレイ(FPGA)を形成するハードウェア要素を含み得る。しかしながら、他の実施形態では、SoC100は、いかなるPL125も含まなくてもよく、例えば、SoC100はASICである。
【0032】
図2は、一例による、
図1に示すDPEアレイ105内のDPE110のブロック図である。DPE110は、相互接続205、コア210、およびメモリモジュール230を含む。相互接続205は、コア210およびメモリモジュール230からアレイ105内の異なるコアへのデータの転送を可能にする。すなわち、各DPE110内の相互接続205は、データをDPE110のアレイ内の北および南(例えば、上下)ならびに東および西(例えば、左右)に転送できるように互いに接続することができる。
【0033】
図1に戻って参照すると、一実施形態では、アレイ105の上段のDPE110は、下段のDPE110の相互接続205に依存して、SoCインターフェースブロック115と通信する。例えば、SoCインターフェースブロック115にデータを送信するために、上段のDPE110内のコア210は、その相互接続205にデータを送信し、その相互接続は、下段のDPE110内の相互接続205に通信可能に結合されている。下段の相互接続205は、SoCインターフェースブロック115に接続されている。上段のDPE110を対象としたデータが最初にSoCインターフェースブロック115から下段の相互接続205に送信され、次にターゲットDPE110である上段の相互接続205に送信される場合、プロセスは逆にされてもよい。このようにして、上段のDPE110は、下段のDPE110内の相互接続205に依存して、SoCインターフェースブロック115との間でデータを送受信することができる。
【0034】
一実施形態では、相互接続205は、相互接続205を介してデータがどのようにルーティングされるかをユーザが決定することを可能にする構成可能なスイッチングネットワークを含む。一実施形態では、パケットルーティングネットワークとは異なり、相互接続205は、ストリーミングポイントツーポイント接続を形成することができる。すなわち、相互接続205内のストリーミング接続およびストリーミング相互接続(
図2には図示せず)は、コア210およびメモリモジュール230から隣接DPE110またはSoCインターフェースブロック115へのルートを形成することができる。構成されると、コア210およびメモリモジュール230は、これらのルートに沿ってストリーミングデータを送受信することができる。一実施形態では、相互接続205は、高度拡張インターフェース(AXI)4ストリーミングプロトコルを使用して構成される。
【0035】
ストリーミングネットワークを形成することに加えて、相互接続205は、DPE110内のハードウェア要素をプログラミングまたは構成するための別個のネットワークを含むことができる。図示されていないが、相互接続205は、ストリーミングネットワーク、コア210、およびメモリモジュール230の機能を変更または設定するDPE110内の構成レジスタの値を設定するために使用される異なる接続およびスイッチ要素を含むメモリマップド相互接続を含むことができる。
【0036】
一実施形態では、相互接続205内のストリーミング相互接続(またはネットワーク)は、本明細書では回路スイッチングおよびパケットスイッチングと呼ばれる2つの異なる動作モードをサポートする。一実施形態では、これらのモードの両方は、同じストリーミングプロトコル、例えばAXIストリーミングプロトコルの一部であるか、またはそれと互換性がある。回路スイッチングは、ソースDPE110と1つまたは複数の宛先DPE110との間の予約されたポイントツーポイント通信経路に依存する。一実施形態では、相互接続205内で回路スイッチングを行うときに使用されるポイントツーポイント通信経路は、(それらのストリームが回路スイッチングされるかパケットスイッチングされるかにかかわらず)他のストリームと共有されない。しかしながら、パケットスイッチングを使用して2つ以上のDPE110間でストリーミングデータを送信する場合、同一の物理的な配線を他のロジックストリームと共有することができる。
【0037】
コア210は、デジタル信号を処理するためのハードウェア要素を含むことができる。例えば、コア210は、無線通信、レーダ、ベクトル演算、機械学習アプリケーションなどに関連する信号を処理するために使用することができる。このように、コア210は、プログラムメモリ、命令フェッチ/復号ユニット、固定小数点ベクトルユニット、浮動小数点ベクトルユニット、算術論理演算ユニット(ALU)、乗算アキュムレータ(MAC)などを含むことができる。しかしながら、上述したように、本開示はDPE110に限定されない。コア210内のハードウェア要素は、エンジンタイプに応じて変化し得る。すなわち、デジタル信号処理エンジン、暗号化エンジン、またはFECのコアは異なっていてもよい。
【0038】
メモリモジュール230は、ダイレクトメモリアクセス(DMA)エンジン215、メモリバンク220、およびハードウェア同期回路(HSC)225または他のタイプのハードウェア同期ブロックを含む。一実施形態では、DMAエンジン215は、相互接続205によるデータの受信および相互接続205へのデータの送信を可能にする。すなわち、DMAエンジン215を使用して、SoCインターフェースブロックまたはアレイ内の他のDPE110から相互接続205を介して受信されたデータを使用して、メモリバンク220に対するDMA読み出しおよび書き込みを実行することができる。
【0039】
メモリバンク220は、任意の数の物理メモリ要素(例えば、SRAM)を含むことができる。例えば、メモリモジュール230は、4、8、16、32個などの異なるメモリバンク220を含むことができる。この実施形態では、コア210は、メモリバンク220への直接接続235を有する。言い換えれば、コア210は、相互接続205を使用せずに、メモリバンク220にデータを書き込み、またはメモリバンク220からデータを読み出すことができる。すなわち、直接接続235は、相互接続205とは別個であってもよい。一実施形態では、直接接続235内の1つまたは複数のワイヤは、コア210を、メモリバンク220に結合されるメモリモジュール230内のメモリインターフェースに通信可能に結合する。
【0040】
一実施形態では、メモリモジュール230はまた、隣接DPE110内のコアへの直接接続240を有する。言い換えると、アレイ内の隣接DPEは、それらの相互接続または
図2に示す相互接続205に依存することなく、直接隣接接続240を使用してメモリバンク220からデータを読み出し、またはメモリバンク220にデータを書き込むことができる。HSC225は、メモリバンク220へのアクセスを管理または保護するために使用することができる。一実施形態では、コア210または隣接DPE内のコアがメモリバンク220からデータを読み出し、またはメモリバンク220にデータを書き込むことができる前に、HSC225は、メモリバンク220の割り当てられた部分(「バッファ」と呼ばれる)にロックを提供する。すなわち、コア210がデータを書き込みたいとき、HSC225は、メモリバンク220(または複数のメモリバンク220)の一部をコア210に割り当てるロックをコア210に提供する。書き込みが完了すると、HSC225はロックを解除することができ、これにより隣接DPE内のコアがデータを読み出すことができる。
【0041】
コア210および隣接DPE110内のコアはメモリモジュール230に直接アクセスすることができるので、メモリバンク220は、DPE110間の共有メモリと見なすことができる。すなわち、隣接DPEは、メモリバンク220と同じDPE110内にあるコア210と同様の方法でメモリバンク220に直接アクセスすることができる。したがって、コア210が隣接DPE内のコアにデータを送信したい場合、コア210はメモリバンク220にデータを書き込むことができる。次いで、隣接DPEは、メモリバンク220からデータを取り出し、データの処理を開始することができる。このようにして、隣接DPE110内のコアは、相互接続205を使用するときに導入される余分なレイテンシを回避しながら、HSC225を使用してデータを転送することができる。対照的に、コア210がアレイ内の非隣接DPE(すなわち、メモリモジュール230への直接接続240のないDPE)にデータを転送したい場合、コア210は、相互接続205を使用してターゲットDPEのメモリモジュールにデータをルーティングするが、これは、相互接続205を使用するレイテンシが追加されるため、およびデータが共有メモリモジュールから読み取られるのではなくターゲットDPEのメモリモジュールにコピーされるため、完了するのに時間がかかる場合がある。
【0042】
メモリモジュール230を共有することに加えて、コア210は、コア間通信リンク(図示せず)を使用して隣接DPE110内のコア210に直接接続することができる。すなわち、共有メモリモジュール230または相互接続205のいずれかを使用する代わりに、コア210は、メモリモジュール230にデータを記憶することなく、または相互接続205(バッファまたは他のキューを有することができる)を使用することなく、アレイ内の別のコアにデータを直接送信することができる。例えば、コア間通信リンクを使用した通信は、相互接続205または共有メモリを使用してデータを送信する(データを書き込むためにコアを必要とし、次いでデータを読み取るために別のコアを必要とする)よりも少ないレイテンシを使用する(または高帯域幅を有する)ことができ、これにより、より費用効果の高い通信を提供することができる。一実施形態では、コア間通信リンクは、1つのクロックサイクルで2つのコア210間でデータを送信することができる。一実施形態では、データは、コア210の外部のいかなるメモリ要素にも記憶されることなく、リンク上のコア間で送信される。一実施形態では、コア210は、クロックサイクルごとにリンクを使用して隣接コアにデータワードまたはベクトルを送信することができるが、これは要件ではない。
【0043】
一実施形態では、通信リンクは、コア210が隣接コアにデータをストリーミングすることを可能にするストリーミングデータリンクである。さらに、コア210は、アレイ内の異なるコアに拡張することができる任意の数の通信リンクを含むことができる。この例では、DPE110は、コア210の左右(東および西)および上下(北または南)にあるアレイ内のDPEに位置するコアへのそれぞれのコア間通信リンクを有する。しかしながら、他の実施形態では、
図2に示すDPE110内のコア210はまた、コア210から対角線上に配置されたコアへのコア間通信リンクを有してもよい。さらに、コア210がアレイの底部周辺または縁部に配置されている場合、コアは、コア210の左、右、および底部のコアのみへのコア間通信リンクを有することができる。
【0044】
しかしながら、コア210によって生成されたデータの宛先が隣接コアまたはDPEである場合、メモリモジュール230内の共有メモリまたはコア間通信リンクを使用することが可能であり得る。例えば、データが非隣接DPE(すなわち、DPE110が直接隣接接続240またはコア間通信リンクを有しない任意のDPE)に向けられている場合、コア210は、DPE内の相互接続205を使用してデータを適切な宛先にルーティングする。上述したように、DPE110内の相互接続205は、SoCが起動されて、動作中にコア210がデータを送信する非隣接DPEへのポイントツーポイントストリーミング接続を確立するときに構成することができる。
【0045】
図3A~
図3Bは、一例による、DPEアレイ内の複数のDPE110によって共有されるメモリモジュール230Aを示す。図示のように、メモリモジュール230Aは、4つのコア、すなわちコア210A~210Dへの直接接続を有する。メモリモジュール230Aは、コア210Aと同じDPE(すなわち、DPE110A)内にある。したがって、直接接続235はエンジン内接続である。ただし、メモリモジュール230Aは、コア210B~210Dとは異なるDPE内にある。このように、直接隣接接続240A~240Cはエンジン間接続であり、これは、これらの接続240がアレイ内のDPE110間のインターフェースにまたがるためである。明確にするために、各DPE110内の相互接続は省略されている。
【0046】
図3Aにおいて、DPE110A内のメモリモジュール230Aは、コア210Aの右に配置されている。DPE110Aの右に位置する(すなわち、DPE110Aの東にある)DPE110Dについても同様である。したがって、DPE110D内のコア210Dは、メモリモジュール230Aに直接隣接し、これにより、メモリモジュール230Dがコア210Dの左に配置された場合、すなわちメモリモジュール230Dがメモリモジュール230Aとコア210Dとの間に配置された場合よりも、メモリモジュール230Aとコア210Dとの間に直接隣接接続240Bを確立することが容易になる。
【0047】
DPE110Aおよび110Dと異なり、DPE110Bおよび110C内では、メモリモジュール230Bおよび230Cの右にコア210Bおよび210Cが配置されている。これにより、コア210Bおよび210Cは、メモリモジュール230Aの真上および真下に配置される(すなわち、コア210Bおよび210Cは、メモリモジュール230Aの北および南である)。これにより、コア210Bおよび210Cをメモリモジュール230Bおよび230Cの左に配置した場合よりも、共有メモリモジュール230Aとコア210Bおよび210Cとの直接隣接接続240Aおよび240Cを容易に確立することができる。
図3Aに示す構成を使用して、メモリモジュール230Aは、同じDPEおよび隣接DPEに位置するコア210A~210Dへの直接接続235および240を有し、これは、メモリモジュール230AがDPE110A~110Dのための共有メモリであることを意味する。
図3Aは、4つのコア210間でメモリモジュール230Aを共有することを示しているが、他の実施形態では、メモリモジュール230Aは、より多いまたはより少ないコアによって共有されてもよい。例えば、メモリモジュール230Aはまた、DPE110Aに対して対角線上に配置された隣接DPEへの直接接続を有してもよい。
【0048】
図3Aに示すDPE110の配置は、隣接コア210からメモリモジュール230Aへの直接接続を提供するためのDPE110の適切な配置の一例にすぎない。
図3Bでは、異なる行のDPE110が互い違いになっている。すなわち、同一列のDPE110を整列させる代わりに、DPE110をオフセットさせる。この構成では、コア210Bおよび210Cは、(
図3Aに示されているものとは異なり)メモリモジュール230Bおよび230Cの左に配置され、DPE110Bおよび110CをDPE110Aに対して右にシフトすることによって、依然として共有メモリモジュール230Aの真上および真下にある。したがって、メモリモジュール230Aがコア210A~210Dによって共有されることを可能にするために、直接接続240A~240CをSoCに形成することができる。
【0049】
さらに、
図3Aおよび
図3Bには示されていないが、メモリモジュール230B~230Dはまた、共有メモリモジュールであってもよい。例えば、メモリモジュール230Dは、DPE110Dの上、下、および右(すなわち、北、南、および東)に配置されたDPE内のコアへの直接接続を有することができる。このように、メモリモジュール230Dは、隣接DPEのコアと共有することができる。しかしながら、アレイの縁部または周辺に配置されたDPE内のメモリモジュール230は、より少ない数のコアによって共有されてもよい(または全く共有されなくてもよい)。
【0050】
図4は、一例による、
図1に示すSoC100上でデータフローグラフ440を実装するためのコンピューティングシステム400のブロック図である。システム400は、プロセッサ410およびメモリ415を含むホスト405(例えば、ホストコンピューティングシステム)を含む。プロセッサ410は、各々が任意の数の処理コアを含むことができる任意の数の処理要素を表す。メモリ415は、揮発性および不揮発性メモリ要素を含むことができる。さらに、メモリ415は、同じ装置(例えば、サーバ)内に配置することができ、またはコンピューティングシステム400(例えば、クラウドコンピューティング環境)にわたって分散させることができる。
【0051】
メモリ415は、グラフソースコード420、カーネルソースコード425、制御ソースコード430を生成するためのヘテロジニアスプログラミング環境417を含む。メモリ415はまた、コンパイラ435を含む。グラフソースコード420は、様々な種類のオブジェクト指向プログラミング言語(例えば、C++、Python、Javascript(登録商標)、Swift、Go、LabView、またはSimulink)で記述することができる。一般に、グラフソースコード420は、通信リンク(例えば、エッジ)を介して接続されるカーネル(例えば、ノード)を定義する。カーネルと通信リンクとの組み合わせは、グラフ440を形成する。
【0052】
ソースコード420を使用してデータフローグラフ440を定義するためのヘテロジニアスプログラミング環境417を提供することの1つの利点は、ヘテロジニアス処理システム上でデータフローグラフをコンパイルする異なる態様を、ヘテロジニアスプログラミング環境417で直接表現および制御できることである。プログラマは、並列定義(例えば、グラフ)から始めることができ、次にこれをコンパイラ435がSoC100のハードウェアに実装する。グラフ440は、データがノード(例えば、カーネル)間で連続的なパイプライン方式で流れることを可能にする。ノードは、その入力におけるデータが利用可能になるとすぐに処理を開始し、そうでなければストールする。さらに、グラフ440は、計算およびデータフローをSoC100内のDPE110およびプログラマブルロジック125にマッピングするための大きな自由度をプログラマに提供する。
【0053】
様々なタイプのデータフローグラフを使用することができるが、一実施形態では、グラフソースコード420によって確立されるグラフ440のセマンティクスは、SoC100のヘテロジニアスアーキテクチャ(プログラマブルブロックとハードウェア化ブロックの両方を含む)に適用される決定論的並列計算のための計算モデルを提供するカーンプロセスネットワークの一般理論に基づいている。さらに、グラフソースコード420は、グラフ440内のノード間の通信レイテンシに対して耐性があり、結果として、複数のスーパーロジック領域および複数のSoCデバイス(例えば、複数のFPGA)にマッピングするグラフに自然に拡張する。例えば、グラフソースコード420は、コンパイラが第1のチップ(例えば、SoC、FPGAなど)に割り当てる第1の複数のカーネルと、コンパイラが第2のチップに割り当てる第2の複数のカーネルとを含むことができる。第1および第2の複数のカーネルは、同じデータフローグラフの一部とすることができ、したがって、第1および第2のチップ上で実行されるときに互いに通信することができる。
【0054】
ソースコード420を使用してデータフローグラフを定義することの別の利点は、対照的に、シーケンシャルプログラムが制御フローおよび計算の順序を固定することである。データフローグラフを使用する場合、入力に対する予測可能かつ再現可能な応答が競合状態なしで得られる。デッドロックのリスクがあるが、これは、各ノードまたはカーネルに割り当てられた記憶装置を管理することによって解決または緩和することができる。
【0055】
カーネルソースコード425は、様々なタイプのオブジェクト指向プログラミング言語で記述することができる。カーネルソースコード425は、データフローグラフ440内の特定のカーネルまたはノードの属性を定義する。一実施形態では、カーネルソースコード425は、グラフソースコード420内の各カーネルの動作を定義する。
【0056】
制御ソースコード430は、様々なタイプのオブジェクト指向プログラミング言語で記述することができる。一実施形態では、制御ソースコード430は制御プログラムを定義し、これは実行されると、SoC100上に実装されるときにグラフ440の実行を制御する。例えば、制御ソースコード430は、グラフ440をいつ実行するか、グラフ440を実行する反復回数、およびグラフ440の実行をいつ停止するかを制御することができる。制御ソースコード430から生成された制御プログラムは、ホスト405上(例えば、データセンタのソリューション)またはSoC100内(例えば、PS130)で実行することができる。
【0057】
コンパイラ435は、ソースコード420、425、430をコンパイルすることができるソフトウェアアプリケーションである。例えば、グラフソースコード420(および
図4に示されていない他のライブラリ)を使用して、コンパイラ435は、以下でより詳細に説明するSoC100上に実装することができるグラフ440を生成することができる。一実施形態では、グラフ440は、SoC100内のプログラマブルロジックを構成するビットストリーム445(例えば、PL125、NoC120、SoCインターフェースブロック115、およびI/O135)と、SoC100内のソフトウェア構成可能なハードウェア化ロジック(例えば、DPE110およびPS130)を構成するバイナリコード447(多くのターゲットコマンドを含むことができる)とを含む。ビットストリーム445およびバイナリコード447は、メモリバスを介してSoC100に送信され、グラフ440を実行するようにSoC100を構成することができる。
【0058】
図5は、一例による、プログラマブルロジックおよびソフトウェア構成可能なハードウェア化ロジックを有するSoC上でデータフローグラフを実装するためにソースコードをコンパイルするための方法500のフローチャートである。ブロック501において、ホストは、データフローグラフをオブジェクト指向ソースコード(例えば、C++、Python、Javascript(登録商標)、Swift、Go、LabView、またはSimulink)として定義するためのヘテロジニアスなプログラミング環境を提供する。すなわち、プログラマは、ヘテロジニアスプログラミング環境(
図6でより詳細に説明されている)を使用して、データフローグラフを定義するソースコードを生成する。ブロック505において、コンパイラは、カーネルおよびカーネル間の通信リンクを定義するデータフローグラフを確立するソースコードを受信する。一実施形態では、コンパイラによって受信されたソースコードは、グラフソースコードを含む。
【0059】
明確にするために、
図6~
図11は、方法500で説明したブロックと併せて説明される。
【0060】
図6は、一例による、データフローグラフを定義するためのグラフソースコード420である。すなわち、
図6は、プログラマがデータフローグラフを確立するための複数のカーネルおよび通信リンクを定義することを可能にするヘテロジニアスプログラミング環境で生成されたグラフソースコード420の一例である。ソースコード420は、ソースコード420内にデータフローグラフを定義するために使用することができる1つまたは複数のライブラリを参照することができる名前空間「Namespace A」を使用する。一実施形態では、グラフソースコード420は、プログラマがカーネル605および通信リンク620を使用して構築するヘテロジニアスプログラミング環境においてデータ構造を確立することを考えることができる。
【0061】
この例では、グラフソースコード420は、a、b、c、d、e、fの6つのカーネル605を含む。カーネル605は、クラス「radio」内で定義される。
図6は、無線機能を実行するためのソースコード420を示しているが、上述したように、本明細書に記載の技術は、レーダ、ベクトル演算、機械学習アプリケーションなどの複数の異なる機能に使用することができる。
【0062】
ソースコード420は、カーネル605の各々によって実行される機能または動作を定義するラッパー610A~610Fを含む。ラッパー610は、対応するC++関数(例えば、polarclip、feedback、equalizer、fir_tap11、fir_tap7、およびscale)を呼び出す機構を作成する。すなわち、ラッパー610は、プログラマが別のC++ライブラリの一部であり得る例示的な関数を使用してカーネルを定義することを可能にする。この例では、カーネル605は単一の命令ではなく複数の関数呼び出しである。一実施形態では、カーネル605は、カーネル605がそのすべてのトリガ入力からデータを受信したときにのみ実行し、非ブロッキング方式で実行して、下流のカーネル605に送信することができる出力を生成する。カーネルはまた、アクセスされたときにストリームデータが存在しない場合、ストリーム入力に対する実行中にブロックすることができる。
【0063】
ラッパー610を使用して関数呼び出しとしてカーネルを抽象化することの1つの利点は、そうすることが、プログラマがDPEまたはプログラマブルロジック上で実行されるべきカーネルを同じ均一なフレームワークで表現できることを意味することである。プログラマはカーネル605を様々に記述するが、カーネル605は同じ方法でパッケージ化され、同じフレームワークで表現することができる。プログラマは、DPEに割り当てられたカーネルをPLファブリックに割り当てられたカーネルと統合することを気にする必要がない。ここで、プログラマは、グラフソースコード420内の通信リンク620のタイプを選択または指示し、それらのタイプの通信リンク620を使用するカーネル605間のすべての同期は、コンパイラによって処理される。
【0064】
ソースコード420はまた、コンパイラがソースコード420で定義されたオブジェクト(例えば、カーネル605および通信リンク620)をSoC内のハードウェアにどのようにマッピングするかを制限する命令を含む制約615を含む。この例では、制約615は、カーネルaおよびカーネルfをDPEに割り当てるのではなく、SoC内のファブリック(例えば、プログラマブルロジック)に割り当てるようにコンパイラに命令する。以下に説明する理由から、カーネルaおよびカーネルfをDPEではなくファブリックに割り当てることにより、性能を向上させることができる。したがって、グラフソースコード420は、プログラマがカーネル605をSoC内のハードウェアに割り当てることを必要としない(したがって、プログラマはSoCの基礎となるハードウェアアーキテクチャを理解する必要がない)が、プログラマに提供される名前空間は、プログラマがそうすることが性能を向上させることを知っている場合、制約615を使用してコンパイラにカーネル605のうちの1つまたはすべてを割り当てる方法を命令することを可能にする。
【0065】
通信リンク620は、カーネル605間でデータがどのように通信されるかを定義する。例えば、通信リンク620Aは、ストリーミングデータを64バイト長のウィンドウデータに変換することを示す。さらに、各ウィンドウは、8バイトのオーバーラップを伴って送信される。しかしながら、通信リンク620Bの場合、長さ32バイトのウィンドウ処理データは、いかなるオーバーラップデータもなしにカーネルbとカーネルcとの間で送信される。ウィンドウ処理データ(およびウィンドウの重ね合わせ)の詳細については、以下でより詳細に説明する。
【0066】
さらに、各通信リンク620は、アップストリームカーネル上のどのポートがダウンストリームカーネル上のどのポートに接続されるかを定義する。例えば、リンク620Aにおいて、カーネルaの出力ポートa.out[0]は、カーネルbの入力ポートb.in[0]に結合される。各カーネルは、複数の入力ポートおよび複数の出力ポートを有することができる。例えば、通信リンク620Dでは、カーネルdの第1の出力ポートd.out[1]が入力ポートe.in[0]に結合される。また、通信リンク620Fでは、カーネルdの第2の出力ポートd.out[0]が入力ポートf.in[0]に結合される。
【0067】
グラフソースコード420がカーネル605を同じ均一なフレームワークで表現できるように抽象化する方法と同様に、ソースコード420は、通信リンク620上の同期をプログラマから抽象化(または非表示化)することができる。以下でより詳細に説明するように、コンパイラは、カーネル605がファブリック内にあるかDPEアレイ内にあるか、またはカーネル605がDPEアレイ内で隣接しているかどうかに基づいて、カーネル605間でデータを送信するための最適な通信技術を選択することができる。
【0068】
一実施形態では、グラフソースコード420内にカーネル605、ラッパー610、制約615、および通信リンク620を定義する能力は、プログラマがデータフローグラフを実装するオブジェクト指向ソースコードを生成することを可能にするヘテロジニアスプログラミング環境によって提供される(および名前空間内のライブラリによってサポートされる)ツールである。
【0069】
図7は、一例による、
図6のソースコード420によって定義されたデータフローグラフ440を示す。すなわち、グラフ440は、グラフソースコード420によって定義されたグラフのグラフィック表現である。図示のように、グラフ440は、通信リンク620A~620Eを使用して通信可能に結合された6つのカーネルa~fを含む。さらに、グラフ440は、カーネルaにデータを転送する入力705と、カーネルfの出力からデータを受信する出力710とを含む。入力705で受信されたデータは、例えば、ホスト上で実行されているアプリケーション、無線送受信機、カメラによって、またはファイルもしくはデータベースから提供することができる。出力710は、グラフ440によって処理されたデータをホストまたはファイルもしくはデータベースに送信することができる。
【0070】
図7は、カーネル(例えば、ノード)がそれぞれの入力ポートおよび出力ポートにおいてリンク620によって結合されているグラフ440の概略図である。すなわち、
図7は、リンク620A~620Fを使用したカーネルa~f間のデータフローを示しているが、カーネルが実行されるハードウェア実装または使用されている特定のタイプの通信リンク620、例えば、共有メモリ、NoC、DMAなどを示していない。それにもかかわらず、プログラマは、
図7に示す抽象図でグラフ440を設計することができ、次いで、コンパイラは、SoCのハードウェアにカーネルa~fおよび通信リンク620を実装することができる。
【0071】
図8は、一例による、データフローグラフにおいてカーネルを定義するためのカーネルソースコード425である。一実施形態では、
図6のソースコード内のラッパー610は、カーネルによって定義された関数の引数がポートとしてアクセスされることを可能にする。
図8において、カーネルソースコード425は、入力データへのポインタ(すなわち、*inputw)および出力データへのポインタ(*outputw)を指定する引数805を含む。上記のように2つのカーネルがリンクによって通信可能に結合される場合、コンパイラは、カーネルが呼び出されるときにカーネル(またはカーネルによって呼び出される関数)に供給されるデータメモリを割り当てることができる。一実施形態では、カーネルは、アプリケーションプログラミングインターフェース(API)を使用して引数805によって提供される入力データに対して動作する。
【0072】
図8において、カーネルソースコード425は、入力データが出力される前に入力データを処理するためのウィンドウAPIを含む。例えば、window_readincrは、ポインタinputwを使用して次のウィンドウを読み出すAPIである。ここでは一般にsbuffを使用して数学的演算を実行するものとして示されている動作が実行されると、別のAPIを使用して、処理されたデータ、例えばwindow_writeincrを出力することができる。
【0073】
一実施形態では、プログラマは、グラフソースコードで定義された各カーネルについてカーネルソースコードを生成する。しかしながら、グラフソースコードが同じカーネルの複数のインスタンスを有する場合、これらの複数のインスタンスは、同じカーネルソースコードを使用して定義することができる。
【0074】
方法500に戻ると、ブロック510において、コンパイラはソースコード(例えば、グラフ、カーネル、および制御ソースコード)をコンパイルする。説明を容易にするために、このコンパイルは少なくとも3つのサブブロックに分割される。ブロック515において、コンパイラは、SoC内のDPEおよびプログラマブルロジックにカーネルを割り当てる。コンパイラは、ソースコードにおいてプログラマによって提供される制約(例えば、
図6の制約615)を使用することができるが、制約がない場合、グラフソースコード内のカーネルをSoC内のDPEおよびプログラマブルロジックに割り当てることができる。
【0075】
一実施形態では、コンパイラは、グラフを評価して、SoC内のハードウェアにカーネルをどのように割り当てるかを決定する。例えば、2つのカーネルがグラフ内で互いに通信可能に結合されている場合、コンパイラは、DPE間の共有メモリなどのより高速な通信プロトコルを利用するために、DPEアレイ内の隣接DPEにカーネルを割り当てることができる。さらに、コンパイラは、複数のカーネルを同じDPEに割り当てることができるかどうかを判定するために、各カーネルによって使用されるサイクル数および時間の割合を決定することができる。
【0076】
図9は、一例による、
図7のデータフローグラフ440を実装する概略図である。
図9は、カーネルa~fならびに通信リンク620を示す。さらに、
図9は、SoCにおいてカーネルが割り当てられるハードウェアを示す。図示のように、カーネルaおよびカーネルfはPL125に配置され、カーネルbおよびカーネルcはDPE110Aに実装され、カーネルdおよびカーネルeはDPE110Bに実装される。
【0077】
一実施形態では、コンパイラは、グラフソースコードに提供された制約に基づいて、カーネルaおよびカーネルfをPL125に配置することを選択した。しかしながら、別の実施形態では、コンパイラは、これらのカーネルを入力/出力カーネルとして認識している可能性があり、これはDPEではなくプログラマブルロジックに実装するのにより適している可能性がある。
【0078】
コンパイラは、各カーネルのサイクル数の推定された割合を使用して、またはプログラマからの制約に応答して、カーネルbおよびカーネルcを同じDPE110Aに割り当てることができる。これは、一般にクラスタリングと呼ばれる。例えば、カーネルbがDPE110Aのサイクル数の40%のみを使用し、カーネルcがサイクル数の55%のみを使用する場合、コンパイラはそれらを同じDPE110Aに配置することができる。別の例では、プログラマは、制約を使用して、カーネルbおよびカーネルcを同じDPE110Aに配置するようにコンパイラに命令することができる。そのようにして、プログラマはグラフを並列化されたデータ構造として記述するが、プログラマはカーネルの推定サイクル数を使用して、カーネルのいくつかを強制的にシーケンシャルにする、すなわち同じDPEに割り当てることができる。すなわち、各DPEは一度に1つのタスクのみを実行することができる(すなわち、平行化されていない)ので、2つの異なるカーネルを同じDPEに配置することは、カーネルがそれら自体のDPEに割り当てられるシナリオではなく、カーネルのうちの1つのみが一度に実行することができることを意味する。しかしながら、このクラスタリングは、依然として全体のサイクル数を満たす。
【0079】
方法500に戻ると、ブロック520において、コンパイラは、カーネル間の接続をストリーミングまたはウィンドウ処理に割り当てる。一実施形態では、これらの接続は、グラフソースコードに定義された通信リンクによって制御される。すなわち、プログラマは、各カーネル対の間でデータをどのように渡すべきかを示すことができる。別の例では、コンパイラは、相互接続205を介してメモリバンク220から別のDPE110にウィンドウデータを転送するために、あるDPE110のメモリモジュール230内のDMAエンジン215を割り当てる。さらに別の例では、コンパイラは、相互接続205上のストリームチャネルおよび受信コア210または受信DMAエンジン215上のストリームチャネルを割り当てる。
【0080】
ブロック525において、コンパイラは、カーネル間でデータを転送するための同期技術を選択する。これは
図9に示されており、通信リンク620A~620F(この例では、ウィンドウ処理を使用する)は、カーネル間でデータを送信するためにダブルバッファ905またはシングルバッファ910のいずれかを含む。カーネルaとカーネルbとの間のリンク620Aおよびカーネルdとカーネルfとの間のリンク620Fの場合のように、カーネルが異なる(またはヘテロジニアスの)処理コア(例えば、DPE110に対するPL125)上にある場合、コンパイラはダブルバッファ905を割り当てる。さらに、カーネルcとカーネルdとの間のリンク620Cおよびカーネルeとカーネルbとの間のリンク620Eの場合のように、カーネルが異なるDPE上にある場合、コンパイラは再びダブルバッファ905を使用する。しかしながら、カーネルbとカーネルcとの間のリンク620Bおよびカーネルdとカーネルeとの間のリンク620Dの場合のように、同じDPE上のカーネル間でデータを転送するために、コンパイラはシングルバッファ910を割り当てることができる。後述するように、シングルバッファリングは、ダブルバッファリングよりも低いレイテンシを提供することができる。
【0081】
コンパイラはまた、ダブルまたはシングルバッファリングを実行するときにカーネル間の同期を処理する。例えば、ダブルバッファリングを実行するとき、コンパイラは、シングルバッファリングを実行するときに必要とされない可能性があるダブルバッファ905にアクセスするためのロックプロトコルを確立することができる(例えば、カーネルが同じDPE110上にある場合)。別の例では、コンパイラは、ダブルバッファ905に対してピンポン同期技術を選択することができる。いずれの場合でも、プログラマによってソースコード内に提供されたパラメータを使用して、コンパイラによって同期を確立することができる。
【0082】
方法500に戻ると、ブロック510において、コンパイラは、コンパイルされたソースコードを使用してデータフローグラフを実行するようにSoCを構成するためのビットストリームおよび/またはバイナリコード(例えば、一連のメモリマップドストアトランザクション)を送信する。すなわち、SoCは、ビットストリーム/バイナリコードを受信し、次いで、コンパイラによって規定されたハードウェア要素を使用してグラフを実行することができる。コンパイラは、各カーネルがSoC内のどこに配置されるべきか、それらのカーネル間の通信リンクのタイプ、および通信リンクによって使用される同期を決定することができる。
【0083】
図10は、一例による、SoCにおいて
図7のデータフローグラフを実装するハードウェア
図1000である。すなわち、ハードウェア
図1000は、
図7に示すデータフローグラフを実装するために使用されるSoCの一部を示す。この例では、
図7は、PL125と、5つのコア210および5つのメモリモジュール230を含むDPEアレイ内のDPEの少なくとも一部とを含むSoCの一部を示す。
【0084】
カーネルaおよびカーネルfは、PL125内の構成可能ロジックブロック(CLB)を使用して形成される。カーネルaは、相互接続205を介してメモリモジュール230Aに通信可能に結合される。図示されていないが、カーネルaとメモリモジュール230Aとの間のこの通信リンクはまた、DPEアレイ内のコア210がSoC内の他のハードウェアモジュール(例えば、PL125)と通信することを可能にするNoCおよびSoCインターフェースブロックを含むことができる。この実施形態では、カーネルaは、メモリモジュール230A内のDMAエンジン215Aにデータを送信し、メモリモジュール230Aは、受信したデータをメモリバンク220A内のダブルバッファ905Aに格納する。したがって、コンパイラは、メモリバンク220Aにダブルバッファ905Aを割り当てることによって、
図9に示す通信リンク620Aを実装することを決定した。DMA書き込みを使用して、カーネルaは、コア210Bにホストされるカーネルbによってアクセスされ得るデータをダブルバッファ905Aに格納することができる。
【0085】
この例では、ダブルバッファ905Aには、メモリバンク220A内の4つのバンクが割り当てられている。一実施形態では、各メモリバンクは128バイトを保持し、これはダブルバッファ905Aの合計サイズが512バイトであることを意味する。しかしながら、コンパイラは、カーネルaおよびカーネルbの予想される必要性に応じて、より多くのメモリバンクまたはより少ないメモリバンクをダブルバッファ905Aに割り当てることができる。カーネルaは、カーネルbがバッファ905A内の他の2つのメモリバンク220Aからデータを読み出している間に、ダブルバッファ905A内の2つのメモリバンク220Aにデータを書き込むことができる。一実施形態では、コンパイラは、カーネルが同じメモリバンク対にアクセスしようとしないように、カーネルaとカーネルbとの間にピンポン同期プロトコルを確立する。上述したように、コンパイラは、グラフソースコード内のこれらのカーネル間で行われるべき通信のタイプ(例えば、ウィンドウ処理またはストリーミング)をプログラマが示すだけで、PL125上のカーネルaがコア210B上のカーネルbと通信できるように同期プロトコルを処理することができる。
【0086】
一実施形態では、カーネルbをホストするコア210Bがメモリモジュール230Aに直接隣接するため、カーネルbは、(カーネルaとは異なり)相互接続205を使用する必要なく、ダブルバッファ905Aに直接アクセスすることができる。したがって、ダブルバッファ905Aおよびカーネルbをハードウェア要素に割り当てるとき、コンパイラは、互いに直接隣接するメモリモジュール230Aおよびコア210Bを選択し、その結果、カーネルbは、コア210Bとメモリモジュール230Aとの間の直接接続を使用することができ、これは相互接続205を使用するよりも高いスループットを有する。
【0087】
カーネルbおよびcは、
図9に示すように同じコア210Bにホストされるまたは割り当てられるため、コンパイラは、シングルバッファ910Aを隣接するメモリモジュール230に割り当てることを試みる。この場合、コンパイラはシングルバッファ910Aをメモリモジュール230Cに割り当てたが、隣接するメモリモジュール、例えばモジュール230Aまたは230Bのいずれかを使用することができた。コンパイラは、モジュール230Aまたは230Bではなくメモリモジュール230Cを選択していてもよく、その場合、これらのメモリモジュールは、アレイ内のさらに北のコアによって使用される、より多くの利用可能な空間を有する(図示せず)。理由にかかわらず、カーネルbおよびcは、コア210Bとメモリモジュール230Cとの間の直接接続を使用して、シングルバッファ910Aとの間でデータを転送することができる。カーネルbおよびcは同じコア210Bに割り当てられ、その結果、並列ではなく順次実行されるため、カーネルのうちの1つのみが任意の所与の時間にコア210Bによって実行されているため、ダブルバッファではなくシングルバッファ910Aで十分である。この例では、シングルバッファ910Aは、メモリバンク220Cの2つのバンクを含むが、コンパイラは、カーネルbおよびcの予想される必要性に応じて、より多くのバンクまたはより少ないバンクを割り当てることができる。
【0088】
カーネルcとカーネルdとの間のコア間通信リンク(
図9では通信リンク620Cとして示されている)の場合、コンパイラは、メモリモジュール230B内のメモリバンク220Bにダブルバッファ905Bを割り当てる。上記のように、コンパイラは、カーネルcおよびdのためのピンポン同期プロトコルを確立して、ダブルバッファ905B内のメモリバンク220Bの2つのそれぞれの対を同時に書き込みおよび読み出すことができる。さらに、カーネルcをホストするコア210Bとカーネルdをホストするコア210Cの両方に隣接するメモリモジュール230Bを使用することにより、コンパイラは、ダブルバッファ905B内のデータを読み出して格納するために、これらのコア210B~210Cがメモリモジュール230Bに対して有する直接接続を利用する。
【0089】
カーネルdとカーネルeとの間のコア内通信リンク(
図9では通信リンク620Dとして示されている)の場合、コンパイラはシングルバッファ910Bをメモリモジュール230Cに割り当てる。カーネルbとカーネルcとの間の通信リンクと同様に、カーネルdおよびeがコア210C上で順次実行されるため、シングルバッファ910Bで十分である。
【0090】
カーネルeとカーネルbとの間のコア間通信リンク(
図9では通信リンク620Eとして示されている)の場合、コンパイラは、シングルバッファ910Aおよび910Bによって使用されていないメモリモジュール230C内の残りの4つのメモリバンク220Cにダブルバッファ905Dを割り当てる。コンパイラは、ダブルバッファ905Dにアクセスするためのカーネルbとeとの間の同期プロトコルを再び確立することができる。
【0091】
カーネルが異なるタイプの処理コア(例えば、PL125およびコア210Cを含むDPE)にホストされるカーネルdとfとの間のヘテロジニアス通信リンク(
図9では通信リンク620Fとして示されている)の場合、コンパイラは、メモリモジュール230D内のメモリバンク220Dにダブルバッファ905Cを割り当てる。カーネルdは、コア210Cとメモリモジュール230Dとの間の直接接続を使用して、ダブルバッファ905Cにアクセスすることができる。しかしながら、カーネルfはコア210のうちの1つではなくPL125にホストされるので、カーネルfは、DMAエンジン215Dおよび相互接続(ならびに図示されていないNoCおよびSoCインターフェースバッファ)を使用してダブルバッファ905Cにアクセスすることができる。コンパイラは、カーネルdとカーネルfとの間に同期プロトコルを再度確立して、カーネルがダブルバッファ905Cに並列にアクセスすることを可能にすることができる。
【0092】
図10は、同じコア210内または同じメモリモジュールへの直接接続を有するコア210内のいずれかで互いに通信するDPEアレイ内にカーネルを配置することを示しているが、他の実施形態では、コンパイラは、同じメモリモジュール230への直接接続を有さないコアに2つのカーネルを配置することができる。すなわち、コンパイラは、グラフ内で直接通信する2つのカーネルを2つの非隣接コア210に割り当てることができる。その場合、コンパイラは、カーネル間で通信するために、共有メモリを使用するのではなく、(PL125に位置するカーネルと同様に)相互接続205を使用してDMA読み出し/書き込みまたはストリーミング接続を実行するようにカーネルを構成することができる。
【0093】
このようにして、コンパイラは、ヘテロジニアスシステム内のどこにカーネルを配置するかを決定し、カーネル間の通信リンクのタイプ(ダブルバッファ、シングルバッファ、ウィンドウ処理、またはストリーミング)を決定し、ソースコード内でプログラマによって定義されたパラメータ(例えば、通信リンクを定義するパラメータ)を使用してカーネル間の同期プロトコルを確立することができる。しかしながら、上述したように、プログラマがSoC上のソースコードで定義されたグラフを実装するための最適解を事前に知っている場合、プログラマは制約を使用して最適化命令をコンパイラに提供することができる。
【0094】
図11は、一例による、カーネル間でデータを送信するときに使用されるオーバーラップウィンドウ1100を示す。一実施形態では、オーバーラップウィンドウ1100は、1つのカーネル(例えば、
図10のカーネルa)で受信されたストリーミングデータから形成されてもよく、次いで、データがチャンクアップされて、
図11に示すオーバーラップウィンドウ1100を生成する。別の例では、カーネルは、上流のカーネルからオーバーラップウィンドウを受信し、次いで、オーバーラップウィンドウを下流のカーネルに送信することができる。一実施形態では、ウィンドウ1100Aは、ダブルバッファ905A~905Dのうちの1つに格納され、ウィンドウ1100Bは、ピンポン同期のために他方のバッファにある。次に、コンパイラは、カーネルの次の呼び出しの前に、オーバーラップ1105が一方のバッファから他方のバッファにコピーされることを保証する役割を担う。
【0095】
オーバーラップウィンドウ1100は、いくつかの実施形態では有用であるが、他の実施形態では有用ではない場合がある。例えば、オーバーラップウィンドウ1100は無線ドメインにおいて有用でありうるので、SoCは、異なるウィンドウを実行する間、カーネルの状態を維持することができる。一実施形態では、コアがカーネルの実行を終了した後、カーネルに関連付けられたレジスタはクリアされ、したがってカーネルの状態は失われる。しかしながら、オーバーラップ1105内のデータが同じであるオーバーラップ1105をウィンドウ1100Aと1100Bとの間に設けることによって、カーネルは、その後、カーネルがウィンドウ1100B内の新しいデータを処理し始めるときに、ウィンドウ1100Aの処理を終了した状態を回復することができる。言い換えると、(ウィンドウ1100A内の最後のサンプルを含む)ウィンドウ1100B内のオーバーラップ1105を処理することによって、カーネルは、ウィンドウ1100Aの処理の終わりにあった状態を回復する。次いで、カーネルは、ウィンドウ1100A内になかったウィンドウ1100B内の新しいデータの処理を開始することができる。したがって、ウィンドウ1100Bのブロックサイズ1110は、前のウィンドウ1100Aになかった、カーネルによって処理されている新しいデータを示す。このようにして、グラフは、受信データを処理するために(ストリーミングデータに対してカーネルにおけるストールを低減することができる)ウィンドウ1100を使用することができるが、オーバーラップ1105を使用することによって無限ストリーム錯覚を依然として維持することができる。
【0096】
カーネル間の通信リンクが(ストリーミングではなく)ウィンドウを使用する場合、一実施形態では、受信側カーネルは、そのすべての入力からデータのウィンドウ1100が受信されるまでデータを処理せず、これによりデータの処理が非ブロッキングになる。データのすべてのウィンドウ1100が受信されると、カーネルは、さらなるデータのためにストールされることなくデータを処理し、ウィンドウを下流のカーネルに出力する。例えば、
図9のカーネルdは、通信リンク620Fおよび620Dをそれぞれ使用して、カーネルfおよびeの両方に並列にデータのウィンドウ1100を出力する。カーネルdがカーネルfおよびeに出力するデータのウィンドウ1100は、同じデータであってもよいし、異なるデータであってもよい。
【0097】
別の実施形態では、ユーザは、すべてのウィンドウが受信されるかまたはすべてのデータの出力準備ができるまで待つのではなく、入力データを受信するかまたはデータを出力するときを決定するようにカーネルをプログラムすることができる。例えば、
図6に戻って参照すると、通信リンク620Eは非同期であり、カーネルbを定義するソースコードは、カーネルeからデータをいつ受信するかを決定する。
【0098】
方法500に戻ると、制御プログラムは、SoC上のデータフローグラフの実行を制御する。すなわち、
図10に示すように、カーネルおよび通信リンクが様々なハードウェア構成要素に割り当てられて構成されると、制御プログラムは、グラフの実行を制御するための命令をSoCに提供することができる。上述したように、制御プログラムは、ホストコンピューティングシステム(好ましくはデータセンタ内にあり得る)上で、またはSoCのPS内で実行することができる。一実施形態では、制御プログラムは、制御ソースコードを使用してコンパイルされる。
【0099】
図12は、一例による、データフローグラフのための制御プログラムを定義する制御ソースコード430である。ソースコード430は、データがどのようにしてグラフに読み込まれ、グラフから読み出されるべきかをコンパイラに示す接続1205を提供する。メインクラスは、グラフを初期化し(例えば、init())、グラフを実行し(例えば、run())、グラフを終了する(例えば、end())ための制御APIを含む。例えば、プログラマは、制御ソースコード430を使用して、グラフが停止する前に実行すべき反復回数を示すことができる。これは、デバッグ目的に有用であり得る。しかしながら、他の例では、制御プログラムは、アプリケーションに応じてグラフを無期限に動作させることができる。これらの制御APIについては、後でより詳細に説明する。
【0100】
一実施形態では、プログラマは、メモリモジュールのサイズを超える大きなルックアップテーブル(LUT)を必要とする場合がある。コンパイラがDPEアレイ内のメモリモジュールのいずれにとっても大きすぎる大型LUTを識別すると、コンパイラはLUTを複数のメモリモジュールに分散させることができる。コンパイラは、LUTをアレイに直接割り当てることができる。プログラマは、LUTを静的データおよびアレイパラメータとして宣言し、静的データおよびアレイパラメータをカーネルに接続することができる。コンパイラは、LUTを(係数表と同様に)カーネルへの内部データとして扱う。LUTのこの宣言はグラフ内にあり、グラフ構成要素として割り当てられる。一実施形態では、大型LUTはダブルバッファされず、一度に1つのカーネルによってのみアクセス可能である。
【0101】
一実施形態では、カーネルは、DPE内のコアからのストリームに対して直接読み出し/書き込みをすることができる。カーネルのソースコードでは、ストリームを関数パラメータとして宣言することができる。データがコア内のストリーミングポートで利用できない場合、カーネルはストールする可能性がある(したがって、ロック機構を必要としない)。これは、ストリーム自体のハードウェアによって実装される要素同期による要素であるが、入力データが利用できないためにコアがストールする可能性があり、バンク上にメモリ競合があり、または出力バッファが一杯になっている。
【0102】
一実施形態では、カーネルが任意のオンコアが提供できるサイクル数よりも多くのサイクル数を必要とする場合、カーネルはコア間で分割され、細分化されたカーネルを接続するためにカスケードストリームが使用される。ソースコードにおいて、プログラマは、カスケードを形成するために一緒にチェーン化された複数のカーネルを表現する。全体的な計算は、チェーン全体の累積和である。コンパイラは、カスケードされたカーネルの計算を複数のコアに分散させる。コアは、コア内のレジスタ内のサイクル蓄積、すなわち、コア内の内部レジスタを使用し、メモリモジュールを使用しないでサイクルを実行する。このように、コアは、メモリモジュールをバッファ(例えば、上記のシングルバッファおよびダブルバッファ)として使用することなく、レジスタ間通信を使用してチェーンを実行することができる。一実施形態では、プログラマが複数のカーネルをチェーン化してカスケードを形成するのではなく、コンパイラ(または他の何らかのソフトウェアアプリケーション)は、カーネルがコア間で分割されてカスケードを形成するこの変換を実行することができる。
【0103】
制約
図13は、一例による、制約を使用してデータフローグラフを実装するためにソースコードをコンパイルするための方法1300のフローチャートである。ブロック1305において、コンパイラは、データフローグラフを確立するソースコード内のユーザ定義制約を識別する。例えば、
図6を参照すると、プログラマは、制約615をグラフソースコード420に追加することができる。しかしながら、他の実施形態では、プログラマは、カーネルのソースコードに制約を課す。さらに他の実施形態では、プログラマは、別個のファイルに制約を定義することができる。グラフソースコードは、データフローグラフを実装するときにコンパイラが制約を識別できるように、ファイルを参照またはリンクすることができる。
【0104】
ユーザ定義制約は、SoC上での実装のためにソースコードをコンパイルするときにコンパイラではなくプログラマによって生成されるため、外部制約である。一実施形態では、プログラマによって提供される外部制約の数は、コンパイラのインテリジェンスに応じて異なり得る。コンパイラが、データフローグラフの十分に最適化された実装をもたらす内部制約を有する場合、プログラマは、制約をほとんど提供しないことを選択することができる。したがって、コンパイラの機能は、プログラマが使用することを決定する外部制約の数に影響を与える可能性がある。コンパイラのより新しいよりインテリジェントなバージョンが利用可能になるにつれて、プログラマが提供する制約はより少なくなる。
【0105】
制約の種類は様々であり得る。さらに、プログラマが提供する制約の数は、プログラマがSoC内の基礎となるハードウェアをどれだけ理解しているかに相関し得る。プログラマがSoCのハードウェアについてほとんど知らない場合、制約がデータフローグラフの全体的な性能(例えば、グラフのサイクル時間またはレイテンシなどのデータフローグラフの所望の性能)を規定する可能性がある。プログラマがSoC内のいくつかの基本的なハードウェア構成(例えば、DPE、PL、通信リンクのタイプなど)を理解している場合、プログラマはこれらの特定のグラフオブジェクトに対する制約を提供することもできる。したがって、一部の制約はハードウェアに依存せず(グラフ全体に影響を及ぼす性能制約など)、他の制約はハードウェアを認識し、データフローグラフ内の特定のグラフオブジェクト(またはグラフオブジェクトのグループ)に影響を及ぼす。
【0106】
ハードウェア認識制約の一例として、プログラマは、DPEアレイのどこに特定のカーネルを配置すべきか(例えば、カーネル位置制約)を規定することができる。あるいは、プログラマは、2つのカーネル間の位置関係を規定することができる(例えば、2つのカーネルは、同じコアでホストされるか、または隣接コアでホストされるべきである)。別の例では、制約は、DPEアレイのどこに通信リンク用の特定のバッファ(またはカーネル用のポート)を配置すべきかを規定することができる。バッファの位置要件は、絶対アドレスもしくはメモリバンク、または別のバッファもしくはカーネル、またはカーネルが実行するプロセッサに関連付けられたスタックに対する相対位置であり得る。別のタイプの制約は、特定のカーネルをホストするコアに隣接するメモリモジュール内に特定のバッファが配置されるべきかどうかを示すことができる。別のタイプの制約は、全体としてデータフローグラフに適用することができる。これらのタイプの制約を使用して、プログラマは、コンパイラがグラフオブジェクト(例えば、カーネル、ポート、通信リンクなど)をSoCに配置する方法を制御することができる。
【0107】
プログラマはまた、ハードウェアに依存しない可能性がある性能制約を提供することができる。例えば、プログラマは、グラフのレイテンシが特定の処理サイクル数未満であることを望む場合がある。コンパイラは、グラフの実装をテストして、それが性能制約を満たすかどうかを判定し、満たさない場合、制約が満たされるまでグラフを再構成することができる。例えば、コンパイラは、以前に2つのカーネルが同じコア上の同じ場所に配置されていた場合、それらを2つの異なるコアに分割するか、またはバッファを共有メモリモジュールに移動して、カーネルがDPEアレイ内の相互接続を使用する必要なくデータに直接アクセスできるようにすることができる。
【0108】
別の実施形態では、制約は、コア/ポート/FIFO/メモリモジュールの利用または好ましいFIFO深さを定義することができる。コンパイラは、グラフの実装をテストして、それが性能制約を満たすかどうかを判定し、満たさない場合、グラフを再構成することができる。性能制約により、コンパイラは、制約が満たされているかどうかを判定するためにグラフをテストすることが多いので、これらの制約は、導出制約とも呼ばれ得る。
【0109】
ブロック1310において、コンパイラは、制約内の一意の名前を使用して制約に対応するグラフオブジェクトを識別する。この例では、各グラフオブジェクト(例えば、各カーネル、通信リンク、ポートなど)に一意の名前を割り当てることができる。制約をフォーマットするとき、プログラマは一意の名前を使用して、制約が適用されるグラフオブジェクトをコンパイラに通知することができる。
【0110】
一実施形態では、プログラマは、インデックス内の各グラフオブジェクトに一意の名前を提供することができる。そうするとインデックスは、コンパイラにアクセス可能となり得る。別の実施形態では、コンパイラは、グラフオブジェクトに一意の名前を割り当てる。例えば、コンパイラは、グラフ内のすべてのグラフオブジェクトの階層ツリーを形成し、ツリーをルートからリーフまでトラバースすることによってオブジェクトに一意の名前を割り当てることができる。階層ツリーはまた、プログラマが一意の名前を使用して特定のオブジェクトに制約を割り当てることができるように、プログラマにアクセス可能である。
【0111】
ブロック1315において、コンパイラは、ソースコードをコンパイルするときに制約を満たすようにグラフオブジェクトを構成する。制約に従ってグラフオブジェクトを配置する様々な例が
図14に示されている。
【0112】
図14は、一例による、ユーザ定義の制約を使用して実装されたグラフオブジェクトを有するDPEアレイ105である。この例では、グラフオブジェクトは、カーネルa~dおよびバッファ905を含む。一実施形態では、コンパイラは、プログラマによって提供される位置制約に応答して、カーネルaをコア210Hに配置する。例えば、プログラマは、コア210に割り当てられた一意のアドレス1405を使用して、カーネルaをコア210Hに配置するようにコンパイラに命令することができる。すなわち、制約は、カーネルaをコア210Hに配置するようにコンパイラに命令するコア210Hのアドレス1405(すなわち、2,1)を含んでもよい。
【0113】
図14はまた、カーネルbおよびdが同じコア210E上にコロケートされるべきであることを示すコロケーション制約1415を示す。プログラマは、ソースコード内の制約をフォーマットして、コンパイラがカーネルbおよびdの両方を(例えば、そのアドレス1,1を使用して)コア210Eに配置することを要求することができるが、別の実施形態では、制約は、コンパイラにカーネルbおよびdをホストするための最良のコア210をそれ自体で識別する自由を与える特定のコアを規定しなくてもよい。
【0114】
図14はまた、カーネルcおよびカーネルbを隣接コア、すなわちコア210Dおよび210Eに配置するようにコンパイラに命令する相対位置制約1410を示す。ここでも、プログラマは、DPEアレイ105内のコア210のうちのどの2つがカーネルcおよびbをホストすべきかを示すように制約をフォーマットすることができるが、別の実施形態では、コンパイラは、可用性などの他のメトリックに基づいて使用するコア210を選択する自由を有する。
【0115】
さらに、
図14は、プログラマによって提供される制約に従ってバッファ905を配置することを示す。一実施形態では、プログラマは、例えばタイルのアドレス(0,1)を使用して、バッファ905がメモリモジュール230Bに配置されるべきであるという制約を規定する。あるいは、制約は、アレイ105内のメモリモジュールの絶対位置を提供せず、代わりに、バッファ905が、カーネルdに対応するコアによって直接アクセスされ得るメモリモジュール230内に配置されることを規定することができる。そうすることにより、コンパイラは、可用性などのメトリックを使用してバッファを実装するために、コア210Eを取り囲む4つのメモリモジュール230のうちの1つを選択する自由を得る。別の実施形態では、制約(例えば、カーネルのセットのスタック/予約メモリは同じメモリグループにマッピングされる)によって、複数のバッファが同じメモリグループにマッピングされてもよい。
【0116】
図14は、DPEアレイ105内にグラフオブジェクトを配置するために使用できるいくつかの位置制約を示しているだけである。上述したように、プログラマは、プログラマの好みに従ってグラフをカスタマイズするために使用できる、
図14に示されていない他の外部制約を提供することができる(またはコンパイラは他の導出制約を識別することができる)。さらなる制約タイプは、ある地点から別の地点へデータを伝送するために経路がとるべきルーティングリソース、データ経路が回路スイッチングされるべきかパケットスイッチングされるべきか、およびデータ経路上にどれだけの遅延が挿入されるべきかを含むことができる。いくつかの制約は、コンパイラがコンパイル済みコードを生成するときにより良い決定を行うのを助けることができる。メモリ競合を回避するためのバッファ間配置制約などの他の制約は、SoCの性能を改善することができる。
【0117】
方法1300に戻ると、ブロック1320において、コンパイラは、制約に従ってSoCのヘテロジニアス処理システムにおいてデータフローグラフを実装する。上述したように、コンパイラは、データフローグラフを実行するためにSoC内のヘテロジニアス処理システムを構成するビットストリームおよびバイナリコードを生成することができる。
【0118】
一実施形態では、データフローグラフは、複数のSoC(例えば、複数のFPGA)にわたって拡張することができる。その場合、グラフソースコードは、第1のSoCのヘテロジニアス処理システムにおいて第1のグラフオブジェクトを構成するために使用される第1の制約と、第2のSoCのヘテロジニアス処理システムにおいて第2のグラフオブジェクトを構成するために使用される第2の制約とを含み得る。
【0119】
図15は、一例による、継承可能な抽象インターフェース1505である。抽象インターフェース1505は、この例では、ポート1515を含むフィルタチェーン1510のためのインターフェースを定義する。インターフェース1505は、様々な方法でプログラマによって実装できるソフトウェアクラスによって定義することができる。例えば、フィルタチェーン1520は、抽象インターフェース1505を継承し、カーネルaおよびbを含む。対照的に、フィルタチェーン1525はまた、抽象インターフェース1505を継承するが、カーネルa、b、およびcを含む。例えば、フィルタチェーン1525は、フィルタチェーン1520よりも細かい処理を必要とする場合がある。抽象インターフェース1505は、オブジェクト指向プログラミング言語を使用して定義することができるため、インターフェース1505を継承し、異なる実装に使用することができる。
【0120】
図16は、一例による、複数のサブグラフ1505を有するデータフローグラフ1600である。
図16は、データフローグラフ1600のソースコードがサブグラフの2つのインスタンス、すなわちサブグラフ1505Aおよび1505Bを含むという点で
図15とは異なる。すなわち、サブグラフ1505を一度定義することができ、そのサブグラフ1505の複数のインスタンスをグラフ1600に挿入することができる。例えば、グラフ1600によって定義されるレシーバチェーンは、
図15の一方のチャネルシステムではなく2つのチャネルシステムに対応するため、サブグラフ1505によって定義されるフィルタのうちの2つを使用することができる。このようにして、サブグラフ1505は、(例えば、それ自体のファイル内の)グラフソースコードから別々に定義され、次いで任意の回数インスタンス化され得る。
【0121】
図16では、カーネルbは、サブグラフ1505Aにデータウィンドウを送信するための第1のポート1510Bと、サブグラフ1505Bにデータウィンドウを送信するための第2のポート1510Aとを含むように修正される。これは、ソースコードにおいてプログラマによって定義することができる。
【0122】
図17は、一例による制約付きデータフローグラフ1700である。
図17は、サブグラフ1505の複数のインスタンスを含む、
図16に示すグラフ1600を含む。しかしながら、グラフ1600は制約付きデータフローグラフ1700内に含まれる。一実施形態では、制約付きグラフ1700は、ロジック設計に制約を追加するラッパーグラフである。すなわち、(ポート1705を使用してアクセス可能な)制約付きグラフ1700内にグラフ1600をカプセル化することによって、プログラマは、グラフ1600の実行に全体的な制約を追加することができる。さらに、コンパイラは、制約付きグラフ1700から制約を自動的に伝播させ、それによってグラフ1600を異なる実装に変換することができ、その後、別のデータフローグラフにインスタンス化することができる。
【0123】
図18は、一例による、複数のソースからの制約をマージするための制約処理フロー1800である。フロー1800は、上述の制約タイプのいずれかを含むことができる制約1810を含むグラフソースコード1805を含む。さらに、フロー1800は、上述の制約タイプのいずれかを同様に含むことができる他のソースからの制約1815を含む。これらの後者の制約は、javascript(登録商標) object notation(JSON)ファイルフォーマット、TCLファイルフォーマットで、またはグラフィカルユーザインターフェース(GUI)を使用して定義することができる。したがって、他のソースからの制約1815は、ソースコード1805内に埋め込まれず、別個のファイルである。
【0124】
制約処理1820の間、コンパイラは、ソースコード1805内の制約1810を他のソースからの制約1815とマージする。一実施形態では、(定義されているかどうかにかかわらず)制約は、コンパイラの内部データ構造とマージできるようにフォーマットを有する。一実施形態では、プログラマは各サブグラフの制約を別々に指定することができ、コンパイラはこれらの制約の読み取りと、ソースコード1805によって定義された親グラフプログラムとのマージとを処理することができる。
【0125】
分割器、マッピング器、およびルータなどの制約クライアント1825は、マージされた制約を受信し、解1830が制約を満たすことを保証する。すなわち、制約クライアント1825は、SoCにおけるデータフローグラフの実装が、ソースコード1805に埋め込まれた制約1810ならびに他のソースからの制約1815を満たすことを保証する。
【0126】
制御API
図19は、一例による、SoC上でデータフローグラフを実装するためのコンピューティングシステム1900のブロック図である。コンピューティングシステム1900は、ここでは詳細に説明しない
図4で上述したものと同じ構成要素の多くを含む。しかしながら、
図19は、コンピューティングシステム1900が、
図4に示すコンピューティングシステム内にあってもなくてもよい制御API1905を含むという点で、
図4とは異なる。図示のように、制御API1905は、制御ソースコード430内に配置される。
【0127】
一般に、プログラマは、制御API1905を使用して、SoC100でのデータフローグラフ440の実行を制御するパラメータを変更することができる。すなわち、本明細書の実施形態は、API1905および対応する方法を使用して、制御ソースコード430からコンパイルされたローカル制御プログラムを介して、またはPS自体で制御ソースコードを実行することによって、SoC100のヘテロジニアス処理システム上で実行されるユーザアプリケーション(例えば、データフローグラフ440)を制御、対話、および少なくとも部分的に再構成する。制御API1905を使用して、ユーザは、そのようなリモート実行グラフをローカルオブジェクトとして直接操作し、それらに対する制御操作(例えば、グラフをロードおよび初期化する、適応制御のためのパラメータを動的に調整する、アプリケーションパラメータ、システム状態、およびイベントを監視する、プラットフォームの分散メモリ境界にわたってデータを読み書きするための動作をスケジューリングする、サブシステムの実行ライフサイクルを制御する、新たなサブシステムのためにコンピューティングリソースを部分的に再構成するため)を実行することができる。
【0128】
例えば、SoC100内のカーネルまたは他のグラフオブジェクトは、これらのオブジェクトの動作を制御する利得またはフィルタ係数などのパラメータを有することができる。これらのパラメータは、ホスト上で実行される制御プログラムまたはSoC自体を使用して動的に制御することができる。コンパイラ435は、パラメータを変更するように制御プログラムを構成することができ、これは、プログラマが(ソースコードを使用して)高レベルでAPI1905を表現することができる一方で、コンパイラ435が、レジスタの構成、ルートの識別、グラフオブジェクトの位置の識別などのパラメータを調整するためのハードウェア詳細を処理することを意味する。
【0129】
有利には、コンパイラ435は、API1905が所望の機能を実行することができるように、SoC100内のドライバ1910、レジスタ、および他のハードウェアを構成することができる。例えば、ドライバ1910は、DMAを実行してSoC100内のDDRメモリ内のデータを、データフローグラフ440内のカーネルを実行するDPE110のうちの1つに読み出すために使用され得る。ドライバ1910はPS130の一部として示されているが、他の実施形態では、ドライバ1910は、PL125内のコントローラを使用して、またはネットワークを使用してリモートコントローラからSoC100に送信される制御信号を介して実装することができる。
【0130】
制御API1905がないと、プログラマはドライバ1910を直接構成しなければならず、これによりプログラマは、カーネルの位置(例えば、ホストDPE)ならびにカーネルに到達するためのルートを知る必要があり得る。代わりに、コンパイラ435は、制御ソースコード430内の対応するAPI1905の検出に応答してドライバ1910を構成することができる。すなわち、API1905を定義するとき、プログラマは単にグラフオブジェクト(例えば、特定のカーネルまたはカーネルポート)を識別し、コンパイラ435は残り、例えば、DMAを実行するようにドライバ1910を構成し、レジスタをプログラムすることができる。
【0131】
図20Aおよび
図20Bは、例による、SoC上のデータフローグラフの実行を制御するための制御APIを示す。
図20Aは、データフローグラフの動作を制御するために使用できる制御API1905のリストを示す。
図20Aは、各API1905の隣にその目的を説明するコメントを含む。例えば、graph()APIは、空のデータフローグラフクラスコンストラクタを定義する。すべてのユーザ定義グラフは、このクラスの拡張である。
【0132】
init()APIはデータフローグラフを初期化し、run()APIはグラフを実行し、wait()APIはグラフが前の実行を完了するまで待機するか、またはいくつかのサイクルを待機してからグラフを一時停止し、resume()APIは一時停止後にグラフを再開し、end()APIは最後の実行が完了するのを待ってからDPEを無効化する。したがって、これらのAPI1905を使用して、プログラマは、グラフがいつ動作を開始するか、動作する長さ、およびグラフの終了を制御することができる。
【0133】
update()APIは、プログラマが(例えば、input_port&pポインタを使用して)グラフオブジェクトを指定することによってデータフローグラフ内のランタイムパラメータを更新することを可能にする。提供された情報を使用して、コンパイラは、後述するトリガを使用して更新を実行するようにSoC内のハードウェアを構成することができる。
【0134】
read()APIを使用して、プログラマは、実行中のデータフローグラフからランタイムパラメータを読み出すことができる。これは、動的データ依存決定に基づいてグラフ実行を制御するのに特に有用である。
【0135】
図20Bは、プログラミングモデルの一部であり得る他の制御API1905を示す。
図20Bは、SoC内のDPEアレイとDDRメモリとの間でデータを移動させるための特別なAPIを有するグローバルメモリ入力/出力(GMIO)クラスを含む。例えば、init()APIは、DDRメモリ内に存在するメモリアドレスのセットを提供することによってGMIOオブジェクトを初期化する。gm2me_nb()APIは、シム内のDMAレジスタを使用して、グローバルメモリからDPEアレイにデータを転送することができる。一実施形態では、コンパイラは、GMIOクラス内でAPI1905を実行するようにシム内のレジスタを構成する。さらに、これらのAPI1905は、(制御プログラムをホストすることができる)PSがGMIO読み出しおよび書き込みと同時に他の機能を実行することができることを意味する非ブロッキングコマンドである。一実施形態では、GMIO APIは、SoCがDDRメモリの同じセットを使用してデータをDPEアレイに転送し、アレイからデータを読み出すことを可能にする。すなわち、プログラマは、GMIO APIを使用して、DDRメモリからDPEアレイにデータを読み出し、次いで、DPEアレイはデータを処理し、処理されたデータを同じDDRメモリに格納することができる。
【0136】
図20Bはまた、PLとDPEアレイとの間でデータを移動するためのAPIを有するプログラマブルロジック入力/出力(PLIO)クラスを含む。PLIO APIは、データがDPEアレイと入力/出力ファイルとの間で転送されるシミュレーション環境にのみ使用され得るため、GMIO APIよりも単純である。
【0137】
図20Bはまた、特定のグラフオブジェクト(例えば、GMIOポートの特定のカーネル)の性能を監視するため、またはイベント追跡を実行するためのAPIを有するイベントクラスを有する。イベントAPIは、プログラマが特定のハードウェアイベントを追跡し、ハードウェアイベントの発生をカウントし、総性能メトリックを測定することを可能にする。一例では、プログラマは、データフローグラフの入力および出力を追跡することによってグラフのレイテンシを測定することができる。例えば、APIに応答して、コンパイラは、第1のデータがデータフローグラフに入力されてからデータフローグラフによって第1のデータが出力されるまでの間の処理サイクル数をカウントする性能カウンタを確立することができる。別の例では、プログラマは、DPE内で実行されるグラフのスループットを測定することができる。コンパイラは、サイクル数およびグラフ実行のいくつかの反復中に生成されたデータ項目の数をカウントするための性能カウンタを確立することができる。
【0138】
図21は、一例による、DPEアレイ105を異なる領域に論理的に分割することを示す。この実施形態では、トップ領域2105は、DPEアレイ105全体およびそのDPE110を含む。RC領域2110は、DPEアレイ105内の列のサブセットを含む。領域2115Aおよび2115Bは、RC領域2110内のサブ領域を画定する。このようにして、DPEアレイ105は、領域の階層に分割され得る。この例では、RC領域2110はトップ領域2105のサブ領域であり、領域2115Aおよび2115Bは、RC領域2110内に含まれるサブ領域である。
【0139】
上述したAPIおよび制約を使用して、プログラマは、アレイ105内の異なる領域に異なるデータフローグラフを割り当てることができる。例えば、複数のデータフローグラフは、時刻に応じて異なる数のアンテナを使用してデータを受信することができる無線送受信機から取得されたデジタルデータを処理することができる。アンテナに対応するデータフローグラフを無効化または有効化するために、プログラマは、配置制約を使用して各データフローグラフを別個のRC領域2110に配置することができ、その結果、特定のアンテナに対応するプロセス制御を選択的に有効化および無効化することができる。したがって、異なる領域に異なるデータフローグラフを配置することによりプログラマ制御が提供され、その結果、異なる領域で動作するデータフローグラフに影響を与えることなく、1つのデータフローグラフを有効化または無効化することができる。一実施形態では、プログラマは、クラスRCGraphから導出された複数の論理的に独立したコンテナグラフを提供し、それらに複数のデータフローグラフを割り当てる。次に、コンパイラは、各データフローグラフを独立して制御できるように、各コンテナグラフの特定のハードウェア領域を決定する。
【0140】
別の実施形態では、プログラマは、上述の制御APIを使用して、単一のコンテナグラフ内に複数の代替グラフを確立することができる。代替グラフは、同じロジックコンテナグラフを共有し、したがって同じハードウェア領域を共有するデータフローグラフである。コンテナグラフの代替グラフの数が1より大きい場合、これは、異なるデータフローグラフが同じハードウェア領域を共有するが、異なる時間に実行されることを意味する。一実施形態では、コンテナグラフおよび特定の領域への代替データフローグラフの割り当ては、コンパイラによってSoCに提供されるパッケージバイナリで定義される。
【0141】
図22Aは、一例による、データフローグラフの実行を動的に変更することを示す。すなわち、
図22Aは、グラフ2200がデータをどのように処理するかを変更するためにデータフローグラフ2200を動的に再構成する(例えば、ランタイムパラメータを変更する)ために1つまたは複数の制御APIを使用することを示す。この再構成は、基礎となるハードウェアを変更することなく行うことができる。すなわち、SoCが初期化された後、データフローグラフ2200は、ハードウェアを再構成する必要なく、オンザフライで異なる状態間で切り替わることができる。
【0142】
データフローグラフ2200は、専用LTE20チャネル2205、専用LTE10チャネル2215、およびランタイムパラメータ2220を使用してLTE20チャネルとLTE10チャネルとの間で選択的に変更することができる再構成可能チャネル2210を含む処理方式を示す。例えば、チャネル2210をLTE20チャネルとして構成するために、パラメータ2220は、ハーフバンドフィルタから受信されたデータを出力するようにmux2230を制御する。制御APIは、mux2230がハーフバンドフィルタおよび遅延アライメントブロックによって出力されたデータを無視し、その結果チャネル2210がLTE10チャネル2215と同様のデータを処理するようにパラメータ2220を変更することができる。
【0143】
一実施形態では、データフローグラフ2200内の複数の再構成可能な選択肢を、SoC内の同じ領域に割り当てることができる。これを
図22Bに示す。例えば、グラフ2250は、SoC内のトップ領域2255に割り当てられてもよい。あるいは、グラフ2200内の異なるチャネルは、異なる領域に割り当てられてもよい。この例では、mux2230を含む再構成可能チャネル2210を有するのではなく、グラフ2250は、再構成可能コンテナRC領域2260のための2つの選択肢を用いて構築される。一方の選択肢Alt02265はLTE20チャネルであり、他方の選択肢Alt12270は、ミキサ2275と共に2つのLTE10チャネルを保持する。Alt02265の固定LTE20チャネルは、2つのLTE10チャネルが割り当てられている1つまたは複数の領域とは別個に、SoC内のそれ自体の領域に割り当てることができるか、またはトップ領域2255の一部とすることができる。したがって、RC領域2260がLTE20チャネルとして機能すべきとき、制御APIは、(他の領域に配置された専用LTE20チャネルに影響を与えることなく)グラフAlt0 2265をロードするように領域を再構成することができる。しかしながら、RC領域2260が2つのLTE10チャネルとして機能すべきである場合、制御APIは、代替グラフAlt1 2270をロードするように領域を再構成することができる。そうすることで、mux2230などのチャネル2210を動的に再構成するために使用される
図22Aに示される回路が回避され、2つの選択肢のために同じDPEリソースが再使用される(これによりグラフ2200がSoCで使用する空間の量を減らすことができる)が、通常、mux2230のパラメータ2220を制御するよりも、LTE20の実施形態とLTE10の実施形態との間の領域でハードウェアを再構成する方が多くの時間がかかる。
【0144】
図23Aは、例によるトリガされたパラメータを示し、
図23Bは、例による非同期パラメータを示す。例えば、ストリーミングデータに対応するウィンドウおよびストリームとは異なり、パラメータを使用して、非ストリーミングデータを使用するデータフローグラフの実行を制御することができる。一実施形態では、プログラマは、カーネル実行の開始時に同期トリガを使用して、データフローグラフ内のパラメータを変更する。別の実施形態では、パラメータの変更は、カーネルの実行と非同期に行うことができる。一実施形態では、制御プログラム(PS上で実行されているかホスト上で実行されているかにかかわらず)は、トリガされたまたは非同期のパラメータの変更を開始する。別の実施形態では、プログラマブルロジックは、トリガされたまたは非同期のパラメータの変更を開始する。トリガを使用して変更することができるパラメータの例は、関数またはメソッド呼び出しにおけるパラメータ、またはウィンドウのサイズの変更を含む。
【0145】
図23Aは、対応する機能が呼び出されるたびにカーネルが新しいパラメータを待機するトリガされたパラメータを示す。結果として、カーネルは、制御プログラム2305がトリガされたパラメータを提供するまで実行しない。例えば、制御プログラム2305はパラメータのpingバッファへの書き込みトランザクション2315Aを生成し、これはカーネル2310を実行するDPEによって受信される。これに応答して、カーネル2310は、実行ブロック2325Aの間にデータを処理する。同時に、制御プログラム2305は、時間ブロック2320の間に他の活動を自由に実行することができる。すなわち、制御プログラム2305は、トリガされたパラメータ値を(非ブロッキングである)pingバッファに送信し、次いで、時間ブロック2320の間に他のタスクを実行することができる。
【0146】
特に、カーネル2310が実行ブロック2325Aを終了すると、そのデータがその入力で利用可能であっても、すぐにそれ以上のデータを処理し始めない。代わりに、カーネル2310は、実行ブロック2325Bを実行するために、(書き込みトランザクション2315Aと同じ値または異なる値を有することができる)トリガされたパラメータを含む第2の書き込みトランザクション2315Bを受信するまでpongバッファで待機する。実行ブロック2325Bを終了すると、カーネル2310は、実行ブロック2325Cを開始するために、書き込みトランザクション2315Cでトリガされたパラメータを受信するまで再び待機する。このようにして、トリガされたパラメータは、各実行ブロックの前に制御プログラム2305が更新されたパラメータをカーネル2310に送信することを可能にする。
【0147】
図23Bは、カーネル2310が以前に受信されたパラメータを使用して実行する非同期パラメータを示す。図示のように、制御プログラム2305は、実行ブロック2325D中にデータを処理するときに使用するために、カーネル2310の更新されたパラメータを含む書き込みトランザクション2315Dをpingバッファに送信する。同時に、制御プログラム2305は、
図23Aのように時間ブロック2320の間に他の活動を実行することができる。しかしながら、
図23Aとは異なり、実行ブロック2325Dが完了すると、カーネル2310は、実行ブロック2325Eおよび2325Fの間にすぐにデータの処理を開始することができる。カーネル2310が制御プログラム2305から新しいパラメータを受信していないので、カーネル2310は、実行ブロック2325Dの間の同じパラメータを使用して、実行ブロック2325Eおよび2325Fの間に入力データを処理する。
【0148】
実行ブロック2325Eの間、制御プログラム2305は、カーネル2310の更新されたパラメータを含む新しい書き込みトランザクション2315Eをpongバッファに送信する。更新されたパラメータ値は、書き込みトランザクション2315Eの完了後にカーネル2310によって使用するために利用可能である。したがって、カーネル2310が実行ブロック2325Gを開始すると、カーネル2310は更新されたパラメータ(ブロック2325D~2325Fの間に使用されるパラメータの値とは異なり得る)を使用する。このように、カーネル2310は、制御プログラム2305が更新されたパラメータをカーネル2310に送信するまで、同じパラメータを使用して継続的に実行することができる。
【0149】
一実施形態では、カーネルが呼び出されると、コンパイラは、カーネルが受信データの処理を開始する前にすべてのデータが利用可能であり、かつデータウィンドウを出力する前にすべてのデータの送信準備ができていることを保証するロック基準を作成する。しかしながら、非同期通信の場合、グラフはこれらのチェックのいずれも行う必要はなく、ユーザは、読み出す入力ウィンドウを取得するとき、または書き込むウィンドウを出力するときに使用される基準を定義するAPIを作成することができる。言い換えると、ユーザによって提供される基準は、カーネルが同期する時点を定義する。例えば、
図6では、カーネルeからカーネルbへの接続は非同期である。したがって、カーネルeはウィンドウを準備することができ、次いで、カーネルbは、カーネルbと同期する前に最初の数フレームをスキップすべきかどうかを(APIでユーザによって提供される基準を使用して)決定する。すなわち、ユーザによって提供された基準を使用してウィンドウをいつ受信または出力するかを決定することは、それぞれカーネルbおよびe次第である。
【0150】
上記では、本開示で提示される実施形態が参照される。しかしながら、本開示の範囲は、特定の記載された実施形態に限定されない。代わりに、記載された特徴および要素の任意の組み合わせは、異なる実施形態に関連するかどうかにかかわらず、想定される実施形態を実装および実施することが想定される。さらに、本明細書に開示された実施形態は、他の可能な解決策または従来技術を超える利点を達成することができるが、所与の実施形態によって特定の利点が達成されるかどうかは、本開示の範囲を限定するものではない。したがって、前述の態様、特徴、実施形態および利点は単なる例示であり、特許請求の範囲に明示的に記載されている場合を除いて、添付の特許請求の範囲の要素または限定とは見なされない。
【0151】
当業者には理解されるように、本明細書に開示される実施形態は、システム、方法、またはコンピュータプログラム製品として具現化され得る。したがって、態様は、完全にハードウェアの実施形態、完全にソフトウェアの実施形態(ファームウェア、常駐ソフトウェア、マイクロコードなどを含む)、または本明細書ではすべて一般に「回路」、「モジュール」、または「システム」と呼ばれ得るソフトウェアおよびハードウェアの態様を組み合わせた実施形態の形態をとることができる。さらに、態様は、コンピュータ可読プログラムコードが具現化された1つまたは複数のコンピュータ可読媒体に具現化されたコンピュータプログラム製品の形態をとることができる。
【0152】
1つまたは複数のコンピュータ可読媒体の任意の組み合わせを利用することができる。コンピュータ可読媒体は、コンピュータ可読信号媒体またはコンピュータ可読記憶媒体であってもよい。コンピュータ可読記憶媒体は、例えば、電子、磁気、光学、電磁気、赤外線、もしくは半導体のシステム、装置、またはデバイス、もしくはこれらの任意の適切な組み合わせであってもよいが、これらに限定されない。コンピュータ可読記憶媒体のより具体的な例(非網羅的なリスト)は、1つまたは複数の配線を有する電気的接続、ポータブルコンピュータディスケット、ハードディスク、ランダムアクセスメモリ(RAM)、読み出し専用メモリ(ROM)、消去可能プログラマブル読み出し専用メモリ(EPROMまたはフラッシュメモリ)、光ファイバ、ポータブルコンパクトディスク読み出し専用メモリ(CD-ROM)、光記憶装置、磁気記憶装置、またはこれらの任意の適切な組み合わせを含む。本明細書の文脈では、コンピュータ可読記憶媒体は、命令実行システム、装置、またはデバイスによって、もしくはそれに関連して使用するためのプログラムを含むか、または記憶することができる任意の有形媒体である。
【0153】
コンピュータ可読信号媒体は、例えばベースバンドにおいて、または搬送波の一部として、コンピュータ可読プログラムコードが内部に具現化された伝搬データ信号を含むことができる。そのような伝搬信号は、電磁気、光学、またはそれらの任意の適切な組み合わせを含むがこれらに限定されない様々な形態のいずれかをとることができる。コンピュータ可読信号媒体は、コンピュータ可読記憶媒体ではなく、命令実行システム、装置、またはデバイスによって、もしくはそれらと関連して使用するためのプログラムを通信、伝搬、または輸送することができる任意のコンピュータ可読媒体であってもよい。
【0154】
コンピュータ可読媒体上に具現化されたプログラムコードは、無線、有線、光ファイバケーブル、RFなど、またはこれらの任意の適切な組み合わせを含むがこれらに限定されない任意の適切な媒体を使用して送信され得る。
【0155】
本開示の態様のための動作を実行するためのコンピュータプログラムコードは、Java(登録商標)、Smalltalk、C++などのオブジェクト指向プログラミング言語、および「C」プログラミング言語または同様のプログラミング言語などの従来の手続き型プログラミング言語を含む、1つまたは複数のプログラミング言語の任意の組み合わせで記述することができる。プログラムコードは、完全にユーザのコンピュータ上で、部分的にユーザのコンピュータ上で、スタンドアロンソフトウェアパッケージとして、部分的にユーザのコンピュータ上で、部分的にリモートコンピュータ上で、または完全にリモートコンピュータもしくはサーバ上で実行することができる。後者のシナリオでは、リモートコンピュータは、ローカルエリアネットワーク(LAN)またはワイドエリアネットワーク(WAN)を含む任意のタイプのネットワークを介してユーザのコンピュータに接続されてもよく、または(例えば、インターネットサービスプロバイダを使用してインターネットを介して)外部コンピュータに接続されてもよい。
【0156】
本開示の態様は、本開示に提示された実施形態による方法、装置(システム)、およびコンピュータプログラム製品のフローチャート図および/またはブロック図を参照して以下に説明される。フローチャート図および/またはブロック図の各ブロック、ならびにフローチャート図および/またはブロック図のブロックの組み合わせは、コンピュータプログラム命令によって実施され得ることが理解されよう。これらのコンピュータプログラム命令は、汎用コンピュータ、専用コンピュータ、または他のプログラマブルデータ処理装置のプロセッサに提供されて機械を生成することができ、その結果、コンピュータまたは他のプログラマブルデータ処理装置のプロセッサを介して実行する命令は、フローチャートおよび/またはブロック図の1つまたは複数のブロックで指定された機能/動作を実施するための手段を作成する。
【0157】
これらのコンピュータプログラム命令はまた、コンピュータ、他のプログラマブルデータ処理装置、または他のデバイスに特定の方法で機能するように指示することができるコンピュータ可読媒体に記憶されてもよく、その結果、コンピュータ可読媒体に記憶された命令は、フローチャートおよび/またはブロック図の1つまたは複数のブロックで指定された機能/動作を実施する命令を含む製品を製造する。
【0158】
コンピュータプログラム命令はまた、コンピュータ、他のプログラマブル装置、または他のデバイス上で一連の動作ステップを実行させてコンピュータ実施プロセスを生成するために、コンピュータ、他のプログラマブルデータ処理装置、または他のデバイスにロードされてもよく、その結果、コンピュータ、または他のプログラマブル装置上で実行する命令は、フローチャートおよび/またはブロック図の1つまたは複数のブロックで指定された機能/動作を実施するためのプロセスを提供する。
【0159】
図のフローチャートおよびブロック図は、本発明の様々な例によるシステム、方法、およびコンピュータプログラム製品の可能な実装のアーキテクチャ、機能、および動作を示す。これに関して、フローチャートまたはブロック図の各ブロックは、指定されたロジック機能を実施するための1つまたは複数の実行可能命令を含むモジュール、セグメント、または命令の一部を表すことができる。いくつかの代替実施態様では、ブロックに記載された機能は、図に記載された順序とは異なる順序で行われてもよい。例えば、連続して示される2つのブロックは、実際には、実質的に同時に実行されてもよく、またはブロックは、関連する機能に応じて、時には逆の順序で実行されてもよい。また、ブロック図および/またはフローチャート図の各ブロック、ならびにブロック図および/またはフローチャート図のブロックの組み合わせは、指定された機能または動作を実行するか、専用ハードウェアとコンピュータ命令の組み合わせを実行する、専用ハードウェアベースのシステムによって実装されてもよいことに留意されたい。
【0160】
上記は特定の例を対象としているが、その基本的な範囲から逸脱することなく他のおよびさらなる例を考案することができ、その範囲は以下の特許請求の範囲によって決定される。