(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024133043
(43)【公開日】2024-10-01
(54)【発明の名称】アクセラレータハードウェア上での実装に適合したソースコードを生成するための方法
(51)【国際特許分類】
G06F 8/34 20180101AFI20240920BHJP
G06F 8/41 20180101ALI20240920BHJP
【FI】
G06F8/34
G06F8/41
【審査請求】未請求
【請求項の数】15
【出願形態】OL
【外国語出願】
(21)【出願番号】P 2024041729
(22)【出願日】2024-03-15
(31)【優先権主張番号】18/185,413
(32)【優先日】2023-03-17
(33)【優先権主張国・地域又は機関】US
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.MATLAB
2.SIMULINK
3.BLUETOOTH
4.VERILOG
(71)【出願人】
【識別番号】506012213
【氏名又は名称】ディスペース ゲー・エム・ベー・ハー
【氏名又は名称原語表記】dSPACE GmbH
【住所又は居所原語表記】Rathenaustr.26,D-33102 Paderborn, Germany
(74)【代理人】
【識別番号】100114890
【弁理士】
【氏名又は名称】アインゼル・フェリックス=ラインハルト
(74)【代理人】
【識別番号】100098501
【弁理士】
【氏名又は名称】森田 拓
(74)【代理人】
【識別番号】100116403
【弁理士】
【氏名又は名称】前川 純一
(74)【代理人】
【識別番号】100134315
【弁理士】
【氏名又は名称】永島 秀郎
(74)【代理人】
【識別番号】100162880
【弁理士】
【氏名又は名称】上島 類
(72)【発明者】
【氏名】イェルク ニーレ
(72)【発明者】
【氏名】キンシュック カルリ
(72)【発明者】
【氏名】パバリ マズムダー
【テーマコード(参考)】
5B081
5B376
【Fターム(参考)】
5B081AA10
5B081BB03
5B081CC32
5B376BC08
5B376BC33
5B376BC38
5B376BC57
5B376BC74
5B376EA06
(57)【要約】 (修正有)
【課題】ブロック図の1つまたは複数のブロックからソースコードを生成するための方法を提供する。
【解決手段】方法は、少なくとも2つのブロック、すなわち、配列変数に対応する行列信号を放出するソースブロックと、行列信号を受信し、かつ、行列信号に適用された演算に基づいて出力信号を放出する演算ブロックとを含むブロック図を読み込むことと、ブロック図を中間表現に変換することと、ループ本体が、配列変数にアクセスする命令を含む中間表現内の少なくとも1つの候補ループを識別することと、少なくとも1つの候補ループから少なくとも1つの並列化可能なループを識別することと、少なくとも1つの並列化可能なループおよび配列変数のためのビルドオプションを決定することと、決定したビルドオプションに基づいてビルドプラグマを中間表現に挿入することと、中間表現をソースコードに翻訳することと、を含む。
【選択図】
図3
【特許請求の範囲】
【請求項1】
ブロック図の1つまたは複数のブロックからソースコードを生成するための方法であって、前記ブロック図は、少なくとも2つのブロック、すなわち、
配列変数に対応する行列信号を放出するソースブロックと、
前記行列信号を受信し、かつ前記行列信号に適用された演算に基づいて出力信号を放出する演算ブロックと、
を含み、前記方法は、
・前記ブロック図を中間表現に変換することであって、前記ブロック図を前記中間表現に変換することは、前記少なくとも2つのブロックを変換することを含み、前記演算ブロックを変換することから少なくとも1つのループが結果的に生じることと、
・前記中間表現内の少なくとも1つの候補ループを識別することであって、前記候補ループのループ本体は、前記配列変数にアクセスする少なくとも1つの命令を含むことと、
・前記少なくとも1つの候補ループから少なくとも1つの並列化可能なループを識別することと、
・前記少なくとも1つの並列化可能なループおよび前記配列変数のためのビルドオプションを決定することと、
・決定された前記ビルドオプションに基づいてビルドディレクティブ、特にビルドプラグマを前記中間表現に挿入することと、
・前記中間表現をソースコードに翻訳することと、
を含む方法。
【請求項2】
少なくとも1つの並列化可能なループを識別することは、候補ループに対して以下のチェック、すなわち
・前記ループ本体の前記命令が、前記候補ループの複数回の異なる反復同士の間にデータ依存性を導入しないこと、またはアキュムレータ依存性を導入するだけであることを判定することであって、アキュムレータ依存性の場合には、毎回のループ反復が1つの値を固定されたメモリ位置に書き込み、現在の反復において書き込まれる値は、前回の反復において書き込まれた値に基づいて計算されることと、
・前記ループ本体内でアクセスされるあらゆる配列に関して、1次元におけるアクセスインデックスが単調に変化し、かつあらゆる他のアクセスインデックスがループ不変であることを判定することと、
・前記ループ本体内にブレーク文またはリターン文が存在しないことを判定することと、
・アドレス演算またはポインタ演算が存在しないことを判定することと、
・前記候補ループ内にネストされた内側のループが存在しないことを判定することと、
・前記候補ループの最大反復回数が、コードを生成する際にその値を決定することができる式によって固定されていることを判定することと、
のうちの1つまたは複数を実施することを含む、
請求項1記載の方法。
【請求項3】
前記少なくとも1つの並列化可能なループのためのビルドオプションを決定することは、前記並列化可能なループの最大反復回数と、アクセスされる前記配列変数内の要素の数と、プログラマブルロジックデバイス上で利用可能なリソースと、に基づいてアンロール係数を決定することを含み、
アクセスされる前記配列変数のためのビルドオプションを決定することは、前記配列変数にアクセスする前記並列化可能なループの前記アンロール係数に基づいてパーティション係数を決定することを含む、
請求項1記載の方法。
【請求項4】
前記少なくとも1つの並列化可能なループのためのビルドオプションを決定することは、アンロール係数を決定することを含み、
前記アンロール係数は、計算速度の増加とリソース消費量の増加との間のコスト・ベネフィット比を最適化することによって決定される、
請求項1記載の方法。
【請求項5】
ループのための前記リソース消費量は、前記ループ本体内におけるそれぞれの演算ごとの特定のリソース消費量を加算することによって決定され、
前記特定のリソース消費量は、演算ライブラリから読み出される、
請求項1記載の方法。
【請求項6】
前記演算ライブラリは、特定のプログラマブル論理回路またはアクセラレータコアにおいて種々異なる可能な演算を含んでいるコードを実装することによって決定され、
前記特定のリソース消費量は、実装された前記コードから測定される、
請求項5記載の方法。
【請求項7】
ループに対するレイテンシは、前記ループ本体内におけるそれぞれの演算ごとの特定のレイテンシに基づいて決定され、
前記特定のレイテンシは、演算ライブラリから読み出される、
請求項1記載の方法。
【請求項8】
前記演算ライブラリは、特定のプログラマブル論理回路またはアクセラレータコアにおいて種々異なる可能な演算を含んでいるコードを実装することによって決定され、
前記特定のレイテンシは、実装された前記コードから測定される、
請求項7記載の方法。
【請求項9】
複数の並列化可能なループに関して、前記並列化可能なループのアンロール係数は、前記並列化可能なループのための組み合わされたコスト・ベネフィット関数を最適化することによって決定され、
特定のプログラマブルロジックデバイスまたはアクセラレータコアの利用可能なリソースは、満たされるべき境界条件を形成する、
請求項1記載の方法。
【請求項10】
複数の並列化可能なループおよび/または複数のアクセスされる配列変数に対して、以下の制約、すなわち、
・特定の配列にアクセスするそれぞれの並列化可能なループのためのアンロール係数が同じである、
・同じ並列化可能なループ内でアクセスされる複数の配列変数のためのパーティション係数が同じである、
のうちの1つまたは複数が課される、
請求項1記載の方法。
【請求項11】
複数の並列化可能なループおよび配列変数のためのビルドオプションを決定することは、相互に依存する並列化可能なループおよび配列変数からなるクラスタを決定することを含み、
前記クラスタ内にある第1の並列化可能なループに関して、前記第1の並列化可能なループによってアクセスされるそれぞれの配列変数が前記クラスタに追加され、
前記クラスタ内にある第1の配列変数に関して、前記第1の配列変数にアクセスするそれぞれの並列化可能なループが前記クラスタに追加され、
前記クラスタ内のすべての並列化可能なループのためのアンロール係数は、前記クラスタ内のすべてのループのコストを加算することによって計算される、前記クラスタのための組み合わされたコスト・ベネフィット比を最適化し、前記クラスタ内のすべてのループのためのベネフィットを加算し、両方の合計の比率を決定することに基づいて選択される、
請求項1記載の方法。
【請求項12】
決定された前記ビルドオプションに基づいてビルドディレクティブ、特にビルドプラグマを修正された前記中間表現に挿入することは、
・前記少なくとも1つの並列化可能なループに対してアンロールディレクティブ、特にアンロールプラグマを挿入することと、
・前記配列変数に対してパーティションディレクティブ、特にパーティションプラグマを挿入することであって、前記パーティションディレクティブまたは前記パーティションプラグマは、前記配列を複数のより小さい配列にパーティショニングすることを指定し、前記配列変数の後続する要素は、それぞれ異なるより小さい配列内に配置されることと、
・少なくとも1つのループに対してパイプラインディレクティブ、特にパイプラインプラグマを挿入することであって、前記パイプラインディレクティブまたは前記パイプラインプラグマは、完全にはアンロールされていない任意のループに挿入可能であることと、
のうちの1つまたは複数を含む、
請求項1記載の方法。
【請求項13】
前記中間表現は、少なくとも1つの関数本体を含み、
前記方法は、
・前記関数本体のリソース消費量を決定することと、
・前記関数への呼び出しの数を決定することと、
・前記リソース消費量が所定のリソース閾値よりも少ないことと、前記関数が所定の呼び出し閾値よりも少ない頻度で呼び出されることと、に基づいて、関数インライン化ディレクティブ、特に関数インライン化プラグマを前記中間表現に挿入することと、
をさらに含む、
請求項1記載の方法。
【請求項14】
制御ユニットを構成するための方法であって、前記制御ユニットは、少なくとも1つのプログラマブルロジックデバイスまたはアクセラレータコアを含み、前記方法は、
・請求項1記載の方法によってソースコードを生成することと、
・ビルトプラグマに依存しているビットストリームを生成するために、高位合成ツールチェーンを介して前記プログラマブルロジックデバイス上で実行するためのソースコードを実装すること、またはビルトディレクティブに依存しているバイナリを生成するために、専用のコンパイラを介して前記アクセラレータコア上で実行するためのソースコードを実装することと、
・前記ビットストリームまたは前記バイナリを前記制御ユニットに送信することと、
・前記ビットストリームまたは前記バイナリを前記制御ユニットの不揮発性メモリ上に格納することと、特に、前記ビットストリームを用いて前記制御ユニットの前記プログラマブルロジックデバイスを構成することと、
を含む方法。
【請求項15】
ブロック図の1つまたは複数のブロックからソースコードを生成するための、プロセッサ実行可能命令が格納された非一時的なコンピュータ可読媒体であって、前記ブロック図は、少なくとも2つのブロック、すなわち、
配列変数に対応する行列信号を放出するソースブロックと、
前記行列信号を受信し、かつ前記行列信号に適用された演算に基づいて出力信号を放出する演算ブロックと、
を含み、前記プロセッサ実行可能命令は、実行された場合に、
・前記ブロック図を中間表現に変換することであって、前記ブロック図を前記中間表現に変換することは、前記少なくとも2つのブロックを変換することを含むことと、
・前記中間表現内の少なくとも1つの候補ループを識別することであって、前記候補ループのループ本体は、前記配列変数にアクセスする命令を含むことと、
・前記少なくとも1つの候補ループから少なくとも1つの並列化可能なループを識別することと、
・前記少なくとも1つの並列化可能なループのためのビルドオプションを決定することと、
・前記配列変数のためのビルドオプションを決定することと、
・決定された前記ビルドオプションに基づいてビルドディレクティブ、特にビルドプラグマを前記中間表現に挿入することと、
・前記中間表現をソースコードに翻訳することと、
を促進する、非一時的なコンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、特に制御ユニットをプログラミングするために、ブロック図から実行可能コードを生成することに関する。
【背景技術】
【0002】
制御装置は、プロセスの物理変数を記録するため、かつ/または接続されたアクチュエータを使用してプロセスに対して、例えば制動動作におけるアンチロック制御に対して影響を及ぼすために、多くの異なる用途において使用されている。プロセスの動的挙動を決定する時定数は、多くの場合、1ms以下のサイクル時間を必要とするので、制御ユニットは、リアルタイム性能を有していなければならない。マイクロ秒の範囲内のサイクル時間を必要とする電気モータの制御のような用途の場合には、制御システムは、多くの場合、プログラマブルロジックデバイス、特にフィールドプログラマブルゲートアレイ(FPGA)を含む。FPGAは、その機能が、初期化時に読み込まれたビットストリームに従って構成される回路によって提供され、したがってハードウェアにおける並列性を可能にするので、プロセッサよりも低いレイテンシを実現可能である。構成ビットストリームは、特定のFPGAデバイスのための合成ツールチェーンにおいて作成される。FPGA、およびFPGAとマイクロコントローラとを組み合わせたシステムオンチップデバイスの両方が市販されている。近年では、例えばニューラルネットワークのための行列計算のようなその他の用途のためのアクセラレータコアも、より一般的になってきている。
【0003】
制御ユニットをより高速に設計するために、制御ストラテジは、多くの場合、MATLAB/Simulinkのようなコンピューティング環境内のモデルに基づいて開発される。したがって、所望の特性が存在するかどうかをチェックするために、プロセスおよび/もしくはコントローラ、または制御ユニットの全般的な挙動を、まず始めにシミュレートすることができる。特に、モデルは、計算のような演算を実行するブロックを含んでいるブロック図であってよく、例として、ブロックは、複数の入力信号から1つの出力信号を計算することができる。一般的に、ブロック図は、サイクリックに実行され、すべてのブロックは、メモリに永続的に保持され、それぞれのブロックは、時間ステップごとに一度実行される。特に、それぞれの時間ステップにおいて、ブロックは、現在のステップのための出力信号を生成するために、先行するブロックからの入力信号に1つまたは複数の演算を適用することができる。ブロック図は、複数の状態および遷移条件が定義される離散的な挙動を記述するためのサブモデルをさらに含むことができる。制御ユニットをプログラミングするためのソースコードは、コード生成器を使用してモデルから生成可能である。生産品質でのソースコードを生成するためのコード生成器は、例えば刊行物“Production Quality Code Generation from Simulink Block Diagrams”, Proceedings of the 1999 International Symposium on Computer Aided Control System Design, Kohala Coast, Hawaii, H. Hanselmann et al.から公知である。
【0004】
生成されたソースコードを、特殊化された高位合成ツールを介して、プログラマブルロジックデバイスのための構成ビットストリームに変換することができる。システムオンチップデバイスのための合成ツールチェーンは、刊行物“Model-Based Design Automation of Hardware/Software Co-Designs for Xilinx Zynq PSoC”, Proceedings of the 2018 International Conference on ReConFigurable Computing and FPGAs (ReConfig), Cancun, Mexico, Franz-Josef Streit et al.から公知である。ツールチェーンを使用することにより、設計者は、所与のMATLAB/Simulinkモデルを、専用のインターフェースによって相互接続されたハードウェアおよびソフトウェアの混合実装に翻訳することができる。FPGAを効率的に使用するために、ビルドオプションを指定するためのコンパイラディレクティブ、特にコンパイラプラグマが自動的に挿入される。一般的なビルドオプションは、自動的なループパイプライニングを適用することであり、これにより、それぞれ異なる計算ステージにおける複数回のループ反復からのデータの重複処理によってスループットを増加させる。新たなデータは、少なくとも1つのクロックサイクルの開始間隔の後に受け入れられる。第1の結果を生成するための計算ステージの数に依存しているレイテンシの後に、1つの後続する結果がそれぞれの開始間隔で出力される。しかしながら、ここで説明した方法は、複数の入力値の並列処理を伴うFPGA構成の考えられる高速化を活用していない。
【0005】
より高速な制御および/またはより複雑な制御アルゴリズムのために適合したアクセラレータハードウェアは、プログラマブルロジックデバイスに限定されているわけではなく、より高速な計算および/または並列処理を可能にする他のアクセラレータコアを含むこともできる。近年では、複数の変数を並列に処理するベクトル計算を実施するように適合させられたアクセラレータコア、および/または例えばニューラルネットワークのための行列計算を処理するように適合させられたアクセラレータコアを含んでいるマイクロコントローラが市販されるようになってきた。目的のマイクロコントローラ上で利用可能なアクセラレータコアに適合したビルドオプションを指定することにより、格段により高速な実行速度でコードを生成することが可能となる。
【0006】
したがって、アクセラレータハードウェアの、最も注目すべきはFPGA上で利用可能な論理回路のより良好な利用につながるビルドプラグマのようなビルドディレクティブを、自動的に生成することを可能にすることが望ましいだろう。
【発明の概要】
【課題を解決するための手段】
【0007】
例示的な実施形態では、本発明は、ブロック図の1つまたは複数のブロックからソースコードを生成するための方法であって、ブロック図は、少なくとも2つのブロック、すなわち、配列変数に対応する行列信号を放出するソースブロックと、行列信号を受信し、かつ行列信号に適用された演算に基づいて出力信号を放出する演算ブロックとを含む、方法を提供する。本方法は、ブロック図を中間表現に変換することであって、ブロック図を中間表現に変換することは、少なくとも2つのブロックを変換することを含み、演算ブロックを変換することから少なくとも1つのループが結果的に生じることと、中間表現内の少なくとも1つの候補ループを識別することであって、候補ループのループ本体は、配列変数にアクセスする少なくとも1つの命令を含むことと、少なくとも1つの候補ループから少なくとも1つの並列化可能なループを識別することと、少なくとも1つの並列化可能なループおよび配列変数のためのビルドオプションを決定することと、決定されたビルドオプションに基づいてビルドプラグマのようなビルドディレクティブを中間表現に挿入することと、中間表現をソースコードに翻訳することとを含む。
【0008】
以下では、本開示の主題を、例示的な図面に基づいてさらにより詳細に説明する。本明細書に記載および/または図示されているすべての特徴を、単独で使用してもよいし、または種々異なる組み合わせで組み合わせて使用してもよい。種々異なる実施形態の特徴および利点は、添付の図面を参照しながら以下の詳細な説明を読むことによって明らかになるであろう。
【図面の簡単な説明】
【0009】
【
図1】コンピュータシステムの好ましい実施形態を示す図である。
【
図2】好ましくはコンピュータシステム内に存在するソフトウェアコンポーネントの概略図である。
【
図3】ソースコードを生成するための本発明による方法の一実施形態を示す概略的なフローチャートである。
【
図4】複数のループと、複数のアクセスされる配列と、を有する例示的なソースコードを示す図である。
【
図5】例示的なソースコードにおけるループと配列との間の関係を示すグラフである。
【発明を実施するための形態】
【0010】
本発明の例示的な実施形態は、並列処理および/または例えばFPGA上で利用可能な論理回路に適合したアクセラレータコアのより良好な利用を可能にする、ビルドプラグマのようなビルドディレクティブを含んでいるブロック図からソースコードを生成することを支援する。ループをアンロールし、ハードウェアにおける並列化を使用することによって、実行速度の大幅な向上が可能である。
【0011】
したがって、ブロック図の1つまたは複数のブロックからソースコードを生成するための方法であって、ブロック図は、少なくとも2つのブロック、すなわち、配列変数に対応する行列信号を放出するソースブロックと、行列信号を受信し、かつ行列信号に適用された演算に基づいて出力信号を放出する演算ブロックとを含む、方法が提供される。本方法は、ブロック図を中間表現に変換することであって、ブロック図を中間表現に変換することは、少なくとも2つのブロックを変換することを含み、演算ブロックを変換することから少なくとも1つのループが結果的に生じることと、中間表現内の少なくとも1つの候補ループを識別することであって、候補ループのループ本体は、配列変数にアクセスする少なくとも1つの命令を含むことと、少なくとも1つの候補ループから少なくとも1つの並列化可能なループを識別することと、少なくとも1つの並列化可能なループおよび配列変数のためのビルドオプションを決定することと、ビルドプラグマのようなビルドディレクティブを、決定されたビルドオプションに基づいて中間表現に挿入することと、中間表現をソースコードに翻訳することとを含む。好ましくは、ビルドオプションは、並列化可能なループの少なくとも2回の反復に対してループ本体を並列に処理することを含む。好ましくは、ループ本体は、ループのそれぞれの反復ごとに少なくとも一度実行される命令を含む。
【0012】
行列信号は、複数の同一の要素を含んでいる配列変数に対応する信号であり、個々の要素は、好ましくはインデックスを介してアドレス指定可能である。この点において、ベクトルは、1次元の行列である。本発明の方法は、2次元の行列信号、またはn>2の場合にはテンソル信号とも称することができるn次元の行列信号のような、より高次元の行列信号にも適用可能である。特に、ある1つのインデックスが単調に変化する一方で、その他のインデックスがループ不変(loop-invariant)であるような、すなわち、その他のインデックスの各々がループのすべての反復にわたって変化しないままであるようなループに対して、効果的な並列化が可能である。単調に変化するインデックスは、1つの反復から次の反復へと増加することができ、本発明の方法は、単調に増加するインデックスにも、単調に減少するインデックスにも適用可能である。このことは、配列が、ループ内の演算のためにただ1つの次元に沿って順次にアクセスされるということ、また、これらの演算が、それらの間に依存性が存在しないが故に並列に実行可能であるということを含意する。
【0013】
有利には、本発明の一実施形態による方法により、アクセラレータコアまたはFPGAのようなアクセラレータハードウェアにおける並列化可能なループの最適化された実装が可能となる。アクセラレータコアは、データおよび/または行列計算のベクトル処理のために適合可能である。ハードウェアでの並列化により、ループの2回以上の反復を並列に実行することができる。利用可能なリソースとループの複雑さとに基づいて種々異なるアンロール係数、すなわち並列に実行される反復の回数が可能である。並列化は、アンロールディレクティブ、例えばアンロールプラグマをソースコードに挿入することによって指定可能である。実行時間はアンロール係数に反比例しているので、計算速度の顕著な増加が可能となる。計算速度の増加を最大化するために、好ましくは利用可能なリソースに適合した最大アンロール係数が選択される。本方法は、好ましくは、並列化可能なループ内でアクセスされるそれぞれの配列ごとにビルドオプションも決定する。アンロール係数に基づいて、配列のためのパーティション係数を決定することができる。配列のパーティショニングは、パーティションプラグマのようなパーティションディレクティブをソースコードに挿入することによって指定可能である。このことにより、複数のより小さい配列を作成することが可能となり、これらのより小さい配列は、複数のメモリバンク内に配置可能であり、したがって複数のループ反復から並列にアクセス可能である。ビルドディレクティブは、プラグマの形態で、または任意の他の注釈、例えば所定のコメントまたは宣言文として挿入可能である。ビルドツールチェーンにおけるコンパイラまたは別のツールによって認識される任意の指定子またはトークンを、ループをアンロールするための、かつ/または配列をパーティショニングするための最適な係数を示すためのビルドディレクティブとして使用することができる。特に、実装ツールチェーンは、ビルドプラグマに基づいて特定のデバイスに対するFPGA構成を生成することができる。したがって、ビルドプラグマのようなビルドディレクティブを本発明の実施形態に従って自動的に挿入することにより、時間のかかる手動での最適化から開発者が解放される。ブロック図は、ビルドディレクティブを手動で再実行することなく変換可能であるので、モデルの反復的な開発が促進される。生成されたソースコードにより、プロセッサベースのソフトウェアインザループシミュレーションも可能となり、したがって、プロセッサのみのデバイスから、プログラマブルロジックデバイスのようなアクセラレータハードウェアを含んでいるシステムへのシームレスな移行が可能となる。
【0014】
一実施形態では、少なくとも1つの並列化可能なループを識別することは、候補ループに対して以下のチェックのうちの1つまたは複数を実施することを含む:
・ループ本体の命令が、候補ループの複数回の異なる反復同士の間にデータ依存性を導入しないこと、またはアキュムレータ依存性を導入するだけであることを判定することであって、アキュムレータ依存性の場合には、毎回のループ反復が1つの値を固定されたメモリ位置に書き込み、現在の反復において書き込まれる値は、前回の反復において書き込まれた値に基づいて計算される、こと。
反復同士の間にデータ依存性が存在しないことにより、ループのためのアンロール係数を自由に決定することが可能となる。反復同士の間の唯一のデータ依存性がアキュムレータ依存性に限定されている場合には、依然としてループをアンロールすることが可能である。
・ループ本体内でアクセスされるあらゆる配列に関して、1次元の最大1つのインデックスが単調に変化する一方で、すべての他の次元に関するすべての他のインデックスがループ不変であることを判定すること。
配列は、1次元の配列であってよく、この唯一の次元は、単調に変化するインデックスを用いてアクセスされる。2次元の配列の場合には、それぞれのアクセスは、ループ不変である第1のインデックスと、単調に変化する第2のインデックスとによって行われるか、または単調に変化する第1のインデックスと、ループ不変である第2のインデックスとによって行われる必要がある。より高次元の配列の場合には、追加的なインデックスは、ループ不変でなければならない。このループ不変という用語は、現在のループのそれぞれの反復に対して変化しないままである式を指す。アキュムレータ依存性の場合には、ループ不変のインデックスを用いて単一の配列要素にアクセスすることができる。ループの毎回の反復において同じ要素がアクセスされるように、不変のインデックスのみを用いて配列がアクセスされる場合には、この配列をパーティショニングする必要がない。
・ループ本体内にブレーク文またはリターン文が存在しないことを判定すること。
・アドレス演算またはポインタ演算が存在しないことを判定すること。
ループ本体内にブレーク文またはリターン文が存在しないことを規定し、アドレス演算またはポインタ演算が存在しないことを確認し、これにより、予測不可能な制御フローが発生しないことを保証することによって、最適なビルドオプションのためにループを容易に分析することができる。
・候補ループ内にネストされた内側のループが存在しないことを判定すること。
・候補ループの最大反復回数が、コードを生成する際にその値を決定することができる式によって固定されていることを判定すること。
内側のループ、または最大反復回数に関する変数式が存在していたとすれば、ソースコードに追加的なチェックを導入すること、かつ/またはFPGA構成に追加的な制御回路を導入することが必要となり、これにより、並列化によって実現可能な計算速度の如何なる増加も縮小されてしまうか、または完全に相殺されてしまうだろう。行列演算の場合には、単調に変化する、例えば単調に増加する配列インデックスを用いて配列にアクセスすることが一般的であり、行列乗算の場合には、アキュムレータ依存性が一般的である。したがって、本方法は、制御システムのモデルベース設計のためのブロック図から生成される典型的なソースコードのために良好に適している。
【0015】
一実施形態では、少なくとも1つの並列化可能なループのためのビルドオプションを決定することは、並列化可能なループの最大反復回数と、アクセラレータハードウェア上で、特にプログラマブルロジックデバイス上で利用可能なリソースと、に基づいてアンロール係数を決定することを含み、アクセスされる配列変数のためのビルドオプションを決定することは、配列変数にアクセスする並列化可能なループのアンロール係数に基づいてパーティション係数を決定することを含む。配列変数を複数のより小さい配列にパーティショニングし、この際、配列の後続する要素をそれぞれ異なるパーティション内に配置することにより、アンロールされたループの並列処理のための十分なメモリ帯域幅が保証される。配列変数が、FPGAにおけるブロックRAMのようなデュアルポートメモリ内に配置される場合には、パーティション係数は、偶数のアンロール係数の場合、好ましくはアンロール係数を2で割ったものとして決定される。奇数のアンロール係数の場合には、パーティション係数は、好ましくはアンロール係数と同じであると決定される。
【0016】
一実施形態では、少なくとも1つの並列化可能なループのためのビルドオプションを決定することは、アンロール係数を決定することを含み、アンロール係数は、計算速度の増加とリソース消費量の増加との間のコスト・ベネフィット比を最適化することによって決定される。ループのアンロールとは、複数回の反復に対してループ本体を並列実行することを指す。並列に実行されるべき反復の回数が、アンロール係数によって与えられる。ループのすべての反復に対してループ本体が並列に実行された場合には、ループが完全にアンロールされ、ループに対する実行速度が最大化される。しかしながら、ループを完全にアンロールするリソース消費量は、過度になる可能性がある。したがって、計算速度とリソース消費量との間の比率、または計算速度の増加とリソース消費量の増加との間の比率を最適化することにより、最良の全体結果を得ることができる。
【0017】
一実施形態では、ループのリソース消費量は、ループ本体内におけるそれぞれの演算ごとの特定のリソース消費量を加算することによって決定され、特定のリソース消費量は、演算ライブラリから読み出される。演算ライブラリは、特定のプログラマブルロジックデバイスのような特定のアクセラレータハードウェアに固有であってよく、ソースコードのループ本体内において使用することができる個々の演算のためのリソース消費量および実行速度のようなプロパティを定義することを可能にする。演算という用語は、任意の算術演算、論理演算、関係演算、または他の数学的演算(平方根または三角関数など)を指すことができる。演算ライブラリは、複数の演算に対するレイテンシおよびリソース消費量を指定するXMLファイルとして実装可能であり、特定のアクセラレータコアまたは特定のFPGAデバイスに固有であってよく、特定のクロック周期に固有であってよい。種々異なるまたは適合した演算ライブラリを使用することにより、本発明による方法を、プログラマブルロジックデバイスのような種々異なるアクセラレータハードウェアに適用することができる。
【0018】
一実施形態では、ループのレイテンシは、ループ本体内におけるそれぞれの演算ごとの特定のレイテンシに基づいて決定され、特定のレイテンシは、演算ライブラリから読み出される。ループのレイテンシを決定することにより、ループをアンロールするベネフィットを推定することが可能となる。種々異なるループ反復同士の間にデータ依存性が存在しない場合には、ループ本体内におけるそれぞれの演算のレイテンシを加算することによってループのレイテンシを決定することができる。さらに、ループのレイテンシは、ループ本体を実行するために必要とされるデータを複製するために必要とされる期間を含むことができる。
【0019】
一実施形態では、演算ライブラリは、特定のアクセラレータコアまたは特定のプログラマブル論理回路において種々異なる可能な演算を含んでいるコードを実装することによって決定され、特定のリソース消費量および/または特定のレイテンシは、実装されたコードから測定される。特定のFPGAデバイスまたはアクセラレータコアが利用可能になると、高位合成ツールチェーンまたはデバイスメーカーの適合したコンパイラおよびリンカーを使用してデバイスに対する種々異なる演算を実装するソフトウェアモジュールによって、この特定のFPGAデバイスまたはアクセラレータコアのための演算ライブラリを自動的に生成することが可能となる。ビルド結果に基づいて、個々の演算のリソース消費量およびレイテンシを決定することができる。データ型および/またはクロック周期を変化させるための演算を自動的に実装することにより、ソフトウェアモジュールは、レイテンシおよびリソース消費量に対してこれらのパラメータが及ぼす影響を決定することができる。
【0020】
一実施形態では、複数の並列化可能なループに関して、並列化可能なループのアンロール係数は、並列化可能なループのための組み合わされたコスト・ベネフィット関数を最適化することによって決定され、特定のアクセラレータコアまたは特定のプログラマブルロジックデバイスの利用可能なリソースは、満たされるべき境界条件を形成する。アクセラレータハードウェア上で、特にプログラマブルロジックデバイス上で利用可能なリソースは、制御プログラムを実装するために生成されたコード内に存在するそれぞれのループを完全にアンロールすることを可能にしなくてもよい。したがって、すべてのループのアンロール係数は、好ましくは制御アルゴリズムのソースコード全体に対する最大実行速度に関して最適化される。
【0021】
一実施形態では、複数の並列化可能なループおよび/または複数のアクセスされる配列変数に対して、以下の制約、すなわち、
・特定の配列にアクセスするそれぞれの並列化可能なループのためのアンロール係数が同じである、
・同じ並列化可能なループ内でアクセスされる複数の配列変数のためのパーティション係数が同じである、
のうちの1つまたは複数が課される。
パーティション係数の制約は、少なくとも1つのループ内においてループ可変(loop-variant)のインデックスを用いてアクセスされる配列変数にのみ適用される。これらの制約を課すことにより、アンロールされたループのために適したメモリ帯域幅が保証され、その一方で、パーティショニングされた配列を実装するための追加的なロジックによって並列化のベネフィットが削減されないことが保証される。
【0022】
一実施形態では、複数の並列化可能なループおよび配列変数のためのビルドオプションを決定することは、相互に依存する並列化可能なループおよび配列変数からなるクラスタを決定することを含み、クラスタ内にある第1の並列化可能なループに関して、当該第1の並列化可能なループによってアクセスされるそれぞれの配列変数がクラスタに追加され、クラスタ内にある第1の配列変数に関して、当該第1の配列変数にアクセスするそれぞれの並列化可能なループがクラスタに追加され、クラスタ内のすべての並列化可能なループのためのアンロール係数は、クラスタ内のすべてのループのコストを加算することによって計算される、クラスタのための組み合わされたコスト・ベネフィット比を最適化し、クラスタ内のすべてのループのためのベネフィットを加算し、両方の合計の比率を決定することに基づいて選択される。クラスタを決定する際には、定数のインデックスのみを用いてアクセスされる配列を無視することができる。
【0023】
一実施形態では、決定されたビルドオプションに基づいてビルドディレクティブ、特にビルドプラグマを修正された中間表現に挿入することは、
・少なくとも1つの並列化可能なループに対してアンロールディレクティブ、特にアンロールプラグマを挿入することと、
・配列変数に対してパーティションディレクティブ、特にパーティションプラグマを挿入することであって、パーティションディレクティブまたはパーティションプラグマは、配列を複数のより小さい配列にパーティショニングすることを指定し、配列変数の後続する要素は、それぞれ異なるより小さい配列内に配置されることと、
・少なくとも1つのループに対してパイプラインディレクティブ、特にパイプラインプラグマを挿入することであって、パイプラインディレクティブまたはパイプラインプラグマは、完全にはアンロールされていない任意のループに挿入可能であることと
のうちの1つまたは複数を含む。
アンロールディレクティブまたはアンロールプラグマを挿入することにより、並列化可能なループを完全にまたは所定の係数を用いてアンロールするように実装ツールチェーンが命令される。このことにより、プログラマブルロジック回路上で利用可能な並列性を活用することが可能となる。パーティションディレクティブまたはパーティションプラグマは、1つの単調に変化するループ可変のインデックスを用いてアクセスされる配列に対してのみ挿入される。並列化可能なループ内でアクセスされる配列変数に対してパーティションディレクティブまたはパーティションプラグマを挿入することにより、配列を複数のより小さい配列にパーティショニングするように実装ツールチェーンが命令され、配列変数の後続する要素は、それぞれ異なるより小さい配列内に配置される。このことにより、十分なメモリ帯域幅が保証される。なぜなら、並列に実行されるアンロールされたループの反復により、種々異なるメモリバンク内の複数のより小さい配列から複数の配列要素にアクセスすることが可能となるからである。少なくとも1つのループに対してパイプラインディレクティブまたはパイプラインプラグマを挿入することにより、パイプラインの初期化後にそれぞれのクロックサイクルにおいてデータを効率的に処理するための回路を追加するように実装ツールチェーンが命令される。パイプライン処理は、非常に少ないリソース消費量しかもたらさないので、パイプラインディレクティブまたはパイプラインプラグマを、完全にはアンロールされていない任意のループに適用することができる。このことにより、ループのアンロールから結果的に得られる計算速度の大幅な増加に適していないあらゆるループに対して実行速度が増加する。挿入されるビルドディレクティブは、アクセラレータハードウェアに応じて異なっていてよい。例えば、パイプラインディレクティブは、FPGAに対してのみ挿入可能であり、任意の他のアクセラレータコアに対して挿入可能でなくてもよい。
【0024】
一実施形態では、中間表現は、少なくとも1つの関数本体を含み、方法は、
・関数本体のリソース消費量を決定することと、
・関数への呼び出しの数を決定することと、
・リソース消費量が所定のリソース閾値よりも少ないことと、関数が所定の呼び出し閾値よりも少ない頻度で呼び出されることとに基づいて、関数インライン化ディレクティブ、特に関数インライン化プラグマを中間表現に挿入することと
をさらに含む。
関数インライン化ディレクティブまたは関数インライン化プラグマを挿入することにより、呼び出しサイトにおいて関数呼び出しを関数本体全体と置き換えるように実装ツールチェーンが命令される。関数は、ハードウェアにおける別個のモジュールとしてモデル化され、関数呼び出しは、一般的に、信号をモジュール入力にルーティングするために1つの追加的なサイクルを必要とする。したがって、小さい関数が限られた回数だけ呼び出される場合には、過度なリソース消費量なしで演算速度を増加させることができる。
【0025】
本発明はさらに、制御ユニットを構成するための方法であって、制御ユニットは、少なくとも1つのプログラマブルロジックデバイスまたはアクセラレータコアを含み、本方法は、
・本発明の一実施形態による方法によってソースコードを生成することと、
・ビルトプラグマに依存しているビットストリームを生成するために、高位合成ツールチェーンを介してプログラマブルロジックデバイス上で実行するためのソースコードを実装すること、またはビルトディレクティブに依存しているバイナリを生成するために、専用のコンパイラを介してアクセラレータコア上で実行するためのソースコードを実装することと、
・ビットストリームまたはバイナリを制御ユニットに送信することと、
・ビットストリームまたはバイナリを制御ユニットの不揮発性メモリ上に格納することと、特に、
・ビットストリームを用いて制御ユニットのプログラマブルロジックデバイスを構成することと
を含む、方法に関する。
【0026】
本発明はさらに、ブロック図の1つまたは複数のブロックからソースコードを生成するための、プロセッサ実行可能命令が格納された非一時的なコンピュータ可読媒体であって、ブロック図は、少なくとも2つのブロック、すなわち、配列変数に対応する行列信号を放出するソースブロックと、行列信号を受信し、かつ行列信号に適用された演算に基づいて出力信号を放出する演算ブロックとを含み、プロセッサ実行可能命令は、実行された場合に、
・ブロック図を中間表現に変換することであって、ブロック図を中間表現に変換することは、少なくとも2つのブロックを変換することを含むことと、
・中間表現内の少なくとも1つの候補ループを識別することであって、候補ループのループ本体は、配列変数にアクセスする命令を含むことと、
・少なくとも1つの候補ループから少なくとも1つの並列化可能なループを識別することと、
・少なくとも1つの並列化可能なループのためのビルドオプションを決定することと、
・配列変数のためのビルドオプションを決定することと、
・決定されたビルドオプションに基づいてビルドプラグマのようなビルドディレクティブを中間表現に挿入することと、
・中間表現をソースコードに翻訳することと
を促進する、非一時的なコンピュータ可読媒体に関する。
【0027】
本発明はさらに、ヒューマンマシンインターフェースと、不揮発性メモリと、プロセッサとを含んでいるコンピュータシステムであって、プロセッサは、本発明による方法を実施するように構成されている、コンピュータシステムに関する。
【0028】
以下では、図面を参照しながら本発明をより詳細に説明し、図面では、同様の部分は、同じ参照符号によって示されている。図示の実施形態は、極めて概略的であり、すなわち距離ならびに横方向および垂直方向の寸法は、縮尺通りではなく、別段の指示がない限り互いに導出可能な幾何学的関係を有していない。
【0029】
図1は、コンピュータシステムPCの例示的な構成を示す。コンピュータシステムは、特にマルチコアプロセッサとして実装されていてよいプロセッサCPUと、メインメモリRAMと、バスコントローラBCと、を有する。コンピュータシステムPCは、好ましくはユーザによって直接的に手動で操作されるように構成されており、グラフィックスカードGPUを介してモニタDISが接続されており、周辺インターフェースHMIを介してキーボードKEYおよびマウスMOUが接続されている。原則的に、コンピュータシステムPCのヒューマンマシンインターフェースは、タッチインターフェースとして構成されていてもよい。コンピュータシステムは、特にハードディスクおよび/またはソリッドステートディスクとして構成されていてよい不揮発性データストレージHDDと、インターフェースNET、特にネットワークインターフェースとをさらに含む。インターフェースNETを介して制御ユニットESを接続することができる。原則的に、任意の種類の1つまたは複数のインターフェース、特に有線のインターフェースをコンピュータシステムPC上に設けることができ、それぞれ制御ユニットESに接続するために使用することができる。有利には、イーサネット規格に準拠したネットワークインターフェースを使用することができ、インターフェースNETは、無線であってもよいし、特にWLANインターフェースとして構成されていてもよいし、またはBluetoothのような規格に準拠していてもよい。
【0030】
制御ユニットESは、シリーズ制御ユニットとして構成されていてもよいし、または目的のプラットフォームのための評価ボードとして構成されていてもよい。有利には、制御ユニットESは、プロセッサとプログラマブルロジックデバイスとを含んでいるシステムオンチップSOCと、不揮発性メモリNVMとをコンピュータシステムPCに接続するためのインターフェースNETを含む。プログラマブルロジックデバイスは、典型的にはルックアップテーブルとフリップフロップとを組み合わせたプログラマブルロジックブロックと、再構成可能な相互接続部と、ブロックRAMとを含み、さらには、デジタル信号処理ブロックのような専用の回路を含むことができる。プログラマブルロジックデバイスの構成メモリにビットストリームが書き込まれると、それに応じて回路が構成される。代替的な実施形態では、制御ユニットESは、プロセッサとプログラマブルロジックデバイスとをプリント回路基板上の別個のチップとして含む。本発明の実施形態は、プログラマブルロジックデバイスのパッケージングに関係なく適用可能である。
【0031】
図2は、好ましくはコンピュータシステムPC上にインストールされるソフトウェアコンポーネントの図を示す。これらのソフトウェアコンポーネントは、オペレーティングシステムOSのメカニズムを使用して、例えば不揮発性メモリHDDにアクセスするか、またはネットワークインターフェースNETを介して外部のコンピュータとの接続を確立する。
【0032】
技術的なコンピューティング環境TCEにより、モデルを作成することが可能となり、モデルからソースコードを生成することが可能となる。モデル化環境MODでは、好ましくはグラフィカルユーザインターフェースを介して動的システムのモデルを作成することができる。特に、動的システムのモデルは、ブロック図であってよく、これらのブロック図は、複数のブロックを含み、動的システムの経時的な挙動および/または内部状態を記述している。これらのブロックのうちの少なくともいくつかは、信号を介して、すなわちスカラー型または複合型であってよいデータ交換のための指向性リンクを介してリンクされている。ブロックは、アトミックであってよく、すなわち周囲のブロックの視点から以下のような1つのユニットを形成することができ、つまり、コンピューティングステップの開始時にすべての入力信号が適用されなければならず、コンピューティングステップの終了時にすべての出力信号が存在しなければならないような1つのユニットを形成することができる。ブロック図が階層的である場合には、下位平面内の複数のブロックが、上位平面内の1つのブロックの構成を記述することができる。階層ブロックまたは複合ブロックは、下位平面内の複数のブロックを、たとえこれらのブロックがアトミックであったとしても含むことができる。特に、複合ブロックは、サブシステムであってよく、サブシステムは、別個の関数での実装、および/または専用の信号を介したサブシステムの実行のトリガのような、追加的なプロパティを有することができる。サブシステムのプロパティをさらに指定するために、サブシステム内に特殊ブロックを配置することができる。コンピューティング環境TCEは、1つまたは複数のライブラリBIBを含み、このライブラリBIBからモデルをビルドするためのブロックまたはモジュールを選択することができる。スクリプト環境MATでは、計算を実施するため、またはモデルを修正するための命令を、インタラクティブにまたはバッチファイルを介して入力することができる。コンピューティング環境TCEは、シミュレーション環境SIMをさらに含み、このシミュレーション環境SIMは、システムの経時的な挙動を調査するためにブロック図を解釈または実行するように構成されている。これらの計算は、好ましくはコンピュータシステムのマイクロプロセッサCPUの1つまたは複数のコア上の高精度な浮動小数点数を使用して実施される。
【0033】
好ましくはソースコードを、コード生成器PCGを使用して、作成されたモデルからCのようなプログラミング言語で生成することができる。モデルに関する、特にブロック変数に関する追加的な情報は、有利には定義データプールDDTに格納されている。有利には、固定小数点命令を使用してモデルの計算を支援するために、ブロック変数に数値範囲および/またはスケールが割り当てられる。ソースコードの所望のプロパティ、例えばMISRAのような規格への準拠を、定義データプールDDTに設定または格納することもできる。有利には、それぞれのブロック変数が所定の変数型に割り当てられ、1つまたは複数の所望のプロパティ、例えば変数のマージのような最適化の許容可能性が設定される。コード生成器PCGは、好ましくは定義データプールDDTの設定を分析し、ソースコードを生成する際にこれらの設定を考慮する。定義データプールDDTは、ツリー構造を有していてもよいし、または簡単なファイルとしてコンピュータシステムのメモリに格納されていてもよく、代替的に、定義データを専用のデータベースシステムに格納してもよい。定義データプールは、プログラムインターフェース、および/またはインポート/エクスポート関数を有することができる。
【0034】
制御アルゴリズムのためのブロック図は、一般的に、複数の要素を含んでいる行列信号を放出または受信するポートブロックと、1つまたは複数の行列信号を受信し、それぞれの要素に演算を適用して、行列信号を放出する処理ブロックとを含む。例示的な演算は、同じ次元を有する2つの行列信号を要素ごとに加算することであってよく、その結果、同じ次元のさらなる行列信号が得られる。2つの1次元の行列信号、すなわちベクトルを加算するために、コード生成器PCGは、典型的には終了閾値としての要素数を有するforループを生成する。forループの本体内では、行列信号に対応する配列変数がアクセスされ、反復が、実行中のインデックスによって指定された要素にアクセスする。2次元の行列信号のための一般的な演算は、行列乗算の計算であり、生成されるソースコードは、典型的には2つのネストされたforループを含む。内側のループでは、配列変数ごとにただ1つのインデックスが変化するのに対し、他のインデックスは、(外側のループの次の反復まで)変化しない何らかの固定値を有する。ブロック図から生成されたソースコードの構造は、本発明の実施形態によれば、最適化に十分に適合している。
【0035】
コンピュータシステム上には、制御プログラムCTLおよび実装ツールチェーンIMPがインストールされている。制御プログラムにより、例えば新たに作成されたビットストリームを不揮発性メモリNVMに書き込むように、組み込みシステムESを構成することが可能となる。実装ツールチェーンIMPは、製品コード生成器からのプラグマを用いてCコードに基づいて高位合成を実施するように構成されている。実装における一般的な中間形式は、VerilogまたはVHDLのようなハードウェア記述言語におけるレジスタ転送レベル(RTL)の抽象化レベルでの所望の機能の記述である。ハードウェア記述言語は、ハードウェアの並行性および並列性をモデル化するように適合させられている。RTL記述を特定のプログラマブルロジックデバイスに適合したビットストリームに変換するためのツールは、FPGAメーカーから入手可能である。例示的な実装ツールチェーンには、Xilinx社製のVivado HLSと、同じくXilinx社製のVivado Design Suiteの一部としてのビットストリーム変換ツールとが含まれる。
【0036】
Cのような高水準言語でのアルゴリズムをRTL記述に変換する場合には、スケジューリングが重要なステップである。ハードウェア実装により、複数の演算を、もしこれらの演算同士の間にデータ依存性が存在しない場合には並列実行することが可能となる。さらに、演算の連鎖を実施して、従属する演算を、この従属する演算の先行する演算と同じサイクル内にスケジューリングすることができる。可能な連鎖数は、FPGAのクロック周期に依存している。さらなるステップでは、演算が、FPGAファブリック内のリソースにバインドされる。例えば、乗算演算をDSPブロックにバインドすることができる。さらに、より高速なクロック速度で適切に機能することを可能にするために、演算同士の間にレジスタを導入してもよい。その後、スケジューリングされてバインドされたアルゴリズムのための適切な制御信号を作成するコントローラ実装が生成される。最後に、スケジューリングされてバインドされたアルゴリズムと、コントローラ実装とのRTL記述が生成される。ビットストリーム変換ツールの演算は、ビルドオプションを指定するためのビルドプラグマを介して適合可能である。
【0037】
図示の例ではFPGAに焦点が当てられているが、他のアクセラレータコアを使用してもよい。高位合成ツールチェーンの代わりに、アクセラレータコアの命令アーキテクチャのための専用のコンパイラ/リンカーを使用することが可能である。ビルドディレクティブのフォーマットは、特定のコンパイラに依存していてよい。
【0038】
図3は、ソースコードを生成するための本発明による方法の一実施形態の概略的なフローチャートである。本方法は、コンピュータシステムPCの例示的な実施形態のプロセッサによって完全に実行可能であるが、ネットワークを介してリンクされたオペレータコンピュータと1つまたは複数のサーバとを有するクライアントサーバ環境内での実行のために意図されていてもよく、この場合には、計算量の多いステップをサーバ上で実行することができる。
【0039】
ステップS1(ブロック図を読み込む)において、ブロック図が入力される。ブロック図は、信号によってリンクされた少なくとも2つの処理ブロックを含み、複数のさらなるブロックを含むことができる。有利には、ブロック図を入力することは、少なくとも1つのブロックプロパティを、かつ/またはコード、例えば変数のデータ型を生成するための関連設定を、定義データプールDDTから読み出すことも含む。
【0040】
ステップS2(中間表現に変換する)において、選択されたモデルが、ブロック図の1つまたは複数のブロックから、好ましくは1つまたは複数の階層グラフを含んでいる中間表現に変換される。これらの階層グラフは、特にデータフローグラフ、制御フローグラフ、またはツリー構造であってよい。ブロック図に加えて、定義データプールDDTからの追加的な情報も、有利には中間表現を生成する際に考慮され、この中間表現に組み込まれる。これは、定義データプールDDT内の情報に基づいて要素が生成される状況、または要素のプロパティ、もしくはコード、例えば変数のデータ型を生成するため関連設定が定義データプールDDTから抽出される状況も含むことができる。
【0041】
ステップS3(中間表現を最適化する)において、必要とされる変数の数、および/またはメモリ消費量、例えばスタック占有率、および/または演算もしくはプロセッサ命令の数、および/またはソースコードの実行時間を削減するように、階層グラフを最適化することができる。この最適化は、複数の中間ステップを含むことができ、これらの中間ステップでは、最適化規則を適用することにより、階層グラフの集合を、変更された階層グラフの別の異なる集合に変換することができる。最適化中には、例えば定数畳み込みまたはデッドコード削除のような種々異なるストラテジを適用することができる。したがって、複数のさらなる最適化規則を連続的に適用することができ、その結果、より最適化された中間表現が得られる。最適化された中間表現は、初期のブロック図に構造的に近いものから、CまたはC++のような言語でのソースコードに近似したプロパティを有する表現へと反復的に変化することができる。
【0042】
ステップS4(さらなるループ?)において、潜在的な最適化がまだ評価されていないようなさらなる候補ループを、中間表現が含んでいるかどうかについてチェックが実施される。ループ可変のパターンを有する配列変数へのアクセスを含んでいるループ本体を有するループのみを、候補ループとしてみなす必要がある。評価のためのさらなるループが中間表現内に存在する場合には、ステップS5が次に実施され、そうでない場合には、実行がステップS10に続く。
【0043】
ステップS5(クラスタ完成?)において、目下識別されたさらなるループに関して、相互に関連するループおよび配列変数からなるクラスタが完成したかどうかについてチェックが実施される。このさらなるループが、他のループがアクセスしない1つの配列変数のみにアクセスする場合には、完成したクラスタは、そのループおよびその配列変数からなる。このさらなるループが、第2のループによってもアクセスされる配列変数にアクセスする場合には、このさらなるループと、配列変数および第2のループとの両方が、クラスタの一部になる。さらなるループが、第1の配列変数および第2の配列変数にアクセスする場合には、これら両方の配列変数が、クラスタの一部になる。相互に関連するループおよび配列変数からなるクラスタを調べることにより、
図4に関連して後述するように、アンロール係数およびパーティション係数におけるミスマッチが回避される。クラスタが完成すると、ステップS6が次に実施され、そうでない場合には、実行は、並列化に関してまだ評価されていないさらなるループをチェックするためにステップS4に続く。さらなるループは、好ましくは、すでにクラスタの一部になっている配列変数にアクセスするループを調べることによって選択される。
【0044】
ステップS6(並列化可能?)において、クラスタ内のループが並列化可能かどうかについてチェックが実施される。このチェックは、クラスタ内のすべてのループが並列化可能であることを保証するために、クラスタ内のそれぞれのループごとに実施される。並列化可能なループは、以下の条件を満たしている必要がある:
・ループ本体の命令は、候補ループの複数回の異なる反復同士の間にデータ依存性を導入しないか、またはアキュムレータ依存性を導入するだけであり、アキュムレータ依存性の場合には、毎回のループ反復が1つの値を固定されたメモリ位置に書き込み、現在の反復において書き込まれる値は、直前の反復において書き込まれた値に基づいて計算される。データ依存性を有さないループを、非アキュムレータループと称することができ、アキュムレータ依存性を有するループを、アキュムレータループと称することができる-原則的に、この種類のループをアンロールすることができる。
・ループ本体内でアクセスされるあらゆる配列について、1次元の最大1つのインデックスは、単調に変化する一方で、すべての他の次元に関するすべての他のインデックスは、ループ不変である。より複雑なアクセスパターンを有するループは、アンロールには適しておらず、クラスタ全体のためのアンロールを妨げる可能性がある。
・候補ループの最大反復回数は、コードを生成する際にその値を決定することができる式によって固定されている。これは、例えば最大反復カウントとしての定数を有するforループであってよい。
・ループ本体内にブレーク文またはリターン文が存在しない。そうでなければ、ループをアンロールするために終了条件のチェックを追加することが必要になり、このことは、高速化の可能性を低減し、リソース消費量を増加させてしまうだろう。
・アドレス演算またはポインタ演算が存在しない。そうでなければ、制御フローおよび/またはデータフローにおける予測不能な変化が結果的に生じる可能性がある。
・候補ループ内にネストされた内側のループが存在しない。
クラスタ内のすべてのループがそれぞれの条件を満たしている場合には、そのクラスタは並列化可能であり、ステップS7が次に実施され、そうでない場合には、実行がステップS9に続く。
【0045】
ステップS7(アンロール係数を計算する)において、現在のクラスタ内の並列化可能なループのための適切なアンロール係数Uが計算される。並列化可能なループのアンロール係数Uを決定するための主な原理は、以下のとおりである:
・並列化可能なループのアンロール係数は、そのループからアクセスされるあらゆる配列のパーティション係数以上でなければならない。
・アンロール係数がパーティション係数よりも大きい場合には、計算速度の如何なる増加も、ループ本体内でアクセスされる配列のデータ帯域幅によって制限されてしまう。1つのループからアクセスされるすべての配列が、特定の係数によってパーティショニングされる場合には、達成可能な並列性は、2にその係数を掛けたものに制限される(これらの配列が、デュアルポートメモリ内に配置されている場合)。したがって、ループが係数Fによってアンロールされる場合には、ループ本体内でアクセスされる配列は、Fが偶数の場合にはF/2によってパーティショニングされるべきであり、Fが奇数の場合にはFによってパーティショニングされるべきである。
・1つのループが複数の配列にアクセスする場合には、そのループからアクセスされるすべての配列は、同じ係数によってパーティショニングされるべきである。
・1つの配列が複数のループによってアクセスされる場合には、その配列にアクセスするすべてのループは、同じ係数を用いてアンロールされるべきである。
・アンロール係数Uは、好ましくはクラスタ内のすべてのループのための反復回数の係数である。なぜなら、並列化可能なループの反復回数は、最良の結果を得るためにはアンロール係数Uの倍数でなければならないからである。
クラスタ内のすべての並列化可能なループのために、同じアンロール係数Uが決定される。アンロール係数を決定するために、クラスタに対するコスト・ベネフィット関数が最適化される。この計算の詳細については後述する。
【0046】
ステップS8(アンロールプラグマおよびパーティションプラグマを挿入する)において、ビルドディレクティブまたはビルドプラグマが、決定されたビルドオプションに基づいて中間表現に挿入される。クラスタの並列化可能なループに対してアンロールディレクティブ、特にアンロールプラグマが挿入される。このようなビルドディレクティブまたはビルドプラグマは、ループ本体内に挿入可能であり、ハードウェアにおいてループ本体の複数回の反復を実装するように実装ツールチェーンに命令し、その結果、対応するリソース消費量が生じる。アンロールプラグマは、“#pragma UNROLL factor=U”の形式を有し、ここで、Uは、整数であり、すなわちステップS7で決定されたアンロール係数である。クラスタの配列に対してパーティションディレクティブ、特にパーティションプラグマが挿入される。このビルドプラグマは、変数定義の後に挿入可能であり、1つの配列変数を複数のより小さい配列にパーティショニングするように実装ツールチェーンに命令する。パーティションプラグマは、“#pragma HLS ARRAY_PARTITION variable=a cyclic factor=F dim=D”の形式を有し、ここで、aは、配列の名前であり、cyclicは、後続する要素が、それぞれ異なるより小さい配列内に配置されるべきであることを示し、係数Fは、作成すべきより小さい配列の数を示す整数であり、次元Dは、どの次元の配列変数がパーティショニングされるべきかを示す整数である。係数Fは、配列にアクセスするループのアンロール係数Uに対応しなければならないか、または偶数のUおよびデュアルポートメモリの場合にはU/2に、すなわちアンロール係数の半分に対応していてよい。次元Dは、ベクトル信号の場合には1であり、2次元の配列の場合には、Dは、単調に変化するインデックスを用いてアクセスされる配列の次元、すなわち1または2のいずれかを示す(他の次元インデックスが、ループ不変である場合)。多次元の配列の場合には、Dは、単調に変化するインデックスを用いてアクセスされる次元を示す一方で、その他の次元は、ループ不変のままである。配列へのアクセスは、今や個々のメモリバンクに対応しているので、メモリ帯域幅により、配列にアクセスする並列化可能なループをアンロールすることが可能となる。好ましくは、アンロール係数が最大反復回数よりも小さい(すなわち、完全にはアンロールされていない)すべての並列化可能なループに対してパイプラインプラグマが挿入される(ステップS9で説明する)。次いで、実行は、並列化に関してまだ評価されていないさらなるループをチェックするためにステップS4に続く。
【0047】
ステップS9(パイプラインプラグマを挿入する)において、アンロールされていないループに対してパイプラインディレクティブ、特にパイプラインプラグマが挿入される。このようなビルドディレクティブまたはビルドプラグマは、ループ本体内に挿入可能であり、ループの連続的な反復の重複実行を可能にするように実装ツールチェーンに命令する。このために、ループは、複数の異なるステージにパーティショニングされ、これにより、2回の反復のそれぞれ異なるステージを並列に実行することができる。パイプラインプラグマは、開始間隔、すなわち計算の2回の連続した反復の開始の間に必要とされるサイクルの数が1サイクルである場合、“#pragma HLS PIPELINE II= 1”の形態を有する。ループの合計レイテンシは、開始間隔が1の場合、それぞれのステージに対する1サイクルにループの反復回数を加えたものから1サイクルを引いたものへと短縮される。次いで、実行は、並列化に関してまだ評価されていないさらなるループをチェックするためにステップS4に続く。
【0048】
ステップS10(中間表現をソースコードに翻訳する)において、実施された中間ステップの全体から結果的に得られる最適化された中間表現または最適化された階層グラフが、テキストプログラミング言語の、特にCコードまたはC++のソースコードに翻訳される。このステップにおいても、特に、生成された命令が、原則的に言語によって含まれている命令の部分集合を表すように、かつ/または生成された制御構造が、原則的に言語によって含まれている制御構造の部分集合を表すように、さらなる最適化を実施することができる。これにより、厳密に定義された言語規則を満たすことが可能となる。代替的または追加的に、ソースコードの可読性を改善するため、かつ/またはデバッグを単純化するために、追加的な情報、例えばプログラム行とブロック図のブロックとの間の参照を生成して、特にコメントの形態でソースコードに組み込むことができる。
【0049】
図4は、複数のループと、複数のアクセスされる配列と、を有する例示的なソースコードを示す。第1のループL1は、配列t1,a,およびxにアクセスし、これらすべてのアクセスは、単調に増加するインデックスを用いて実施される。第2のループL2は、配列t2,b,およびuにアクセスし、これらすべてのアクセスは、単調に増加するインデックスを用いて実施される。第3のループL4は、配列t4,y,およびzにアクセスし、これらすべてのアクセスは、単調に増加するインデックスを用いて実施される。第4のループL3は、配列t3,t1,およびt2にアクセスし、これらすべてのアクセスは、単調に増加するインデックスを用いて実施される。
【0050】
ループおよび配列がクラスタにグループ化され、この場合、クラスタは、クラスタ内の配列への少なくとも1つの非不変(non-invariant)のアクセスを含んでいるあらゆるループが、そのクラスタの1つの要素になるという原則と、そのクラスタ内のループから非不変のインデックスを使用してアクセスされるあらゆる配列と、に基づいて、すべての相互に関連するループおよび配列からなる。ループと配列との間の関係と、クラスタとを、無向グラフとして視覚化することができ、この無向グラフでは、それぞれのノードが1つのループまたは1つの配列に対応している。
【0051】
図5は、例示的なソースコードにおけるループと配列との間の関係を示すグラフである。クラスタ1は、ループL1と、L1内でアクセスされる配列t1,a,およびxとを含む。ループL3もt1にアクセスするので、ループL3もクラスタ1の一部となる。結果として、L3内でアクセスされる配列t3およびt2も、クラスタ1の一部となる。ループL2もt2にアクセスするので、ループL2もクラスタ1の一部となる。結果として、L2内でアクセスされる配列bおよびuも、クラスタ1の一部となる。クラスタ1内のループのための最適なアンロール係数U1を決定する際には、コスト・ベネフィット関数は、クラスタ1内のすべての要素を考慮する必要がある。ループL4は、クラスタ1内の配列のいずれにもアクセスしないので、ループL4は、このクラスタの一部ではない。L4と、このループ内でアクセスされるすべての配列とは、クラスタ2の一部である。このクラスタ内のいずれの配列にも他のループがアクセスしないので、クラスタ2に関するグラフ内には、さらなるノードが存在しない。ループL4のための最適なアンロール係数U2を決定する際には、コスト・ベネフィット関数は、クラスタ2の要素のみを考慮すればよい。すべてのアンロール係数に関連する制約は、制御アルゴリズムの合計リソース消費量が、FPGAデバイスのような使用されるべきアクセラレータハードウェア上で利用可能なリソースよりも少なくなければならないことである。
【0052】
少なくとも1つの並列化可能なループを含んでいるそれぞれのクラスタごとに、ビルドオプションを決定する必要がある。このようなクラスタは、アンロール係数の集合に関連付けられる。クラスタ内のすべてのループが並列化可能なループである場合であって、かつ複雑なアクセスパターンによって配列のパーティショニングが妨げられることがない場合には、これらのループのためのアンロール係数とパーティション係数とが一致していなければならないので、アンロール係数の集合は、すべてのループの反復カウントおよび配列のサイズの一般的な算術係数を含み、それぞれのループのためのアンロール係数は、最良な結果を得るためのループ反復カウントの係数であるべきである。クラスタ内の少なくとも1つのループが並列化可能でない場合、かつ/または少なくとも1つのループ可変のアクセスパターンが配列のパーティショニングを妨げる場合には、配列が(FPGA内のブロックRAMのような)デュアルポートメモリバンク内に配置されている場合、唯一可能なアンロール係数は2である。
【0053】
FPGAのリソースは、構成可能な論理ブロック(CLB)、ルックアップテーブル(LUT)、デジタル信号処理ブロック(DSP)、およびブロックRAM(BRAM)を含む。最適化の目標は、クラスタ内のループをアンロールするためのコストが、指定されたリソース消費量閾値を超えることなく、すべてのクラスタに対するベネフィットが最大化されるように、それぞれのクラスタのためのアンロール係数を決定することである。リソース消費量閾値を、FPGA上のすべての利用可能なリソースの所定のパーセンテージに制限することができる。
【0054】
ループのためのコスト・ベネフィット関数は、以下のパラメータ、すなわちループの最大反復カウントNと、アンロール係数Uと、ループ本体のレイテンシLと、1回のループ反復に対するリソース使用量Cと、に基づいて計算可能である。さらに、データ転送コストも考慮することができる。ループ本体内で使用される特定のリソース種類に対して、リソース使用量を考慮する必要がある。好ましくは、ループ本体のリソース使用量に関する簡単な付加モデルが使用される。演算を実現するために、特定の数の特定の種類のリソースが必要とされる。特定のリソース種類の使用量は、ループ本体内に存在するそれぞれの演算ごとに必要とされるリソースを合計することにより、ループ本体に対して計算可能である。アキュムレータループの場合には、さらなるパラメータ、すなわちアキュムレーション演算のレイテンシAを、アキュムレータアクセスパターンを有する複数の変数に対して考慮する必要があり、すなわち、あらゆるアキュムレーション演算の最長のレイテンシを考慮する必要がある。コスト・ベネフィット計算は、それぞれの演算ごとのレイテンシおよびリソース数のデータベースを必要とする。これらの値は、使用されるFPGAデバイスおよびクロック周波数に依存しており、後述するように測定可能である。対応するデータベースを設けることにより、種々異なるFPGAデバイスおよび/またはクロック周波数のためにコストモデルを使用することができる。アクセラレータコアのような他のアクセラレータハードウェアのために、同様のコストモデルを使用してもよい。
【0055】
所与のリソース種類rに対する特定のアンロール係数Uのコストは、1回の反復でのリソース使用量Cにアンロール係数を乗算することにより、CU,r=Cr・(U-1)のように計算可能であり、したがって、追加的なコストは、アンロール係数から1を引いたものにそれぞれのリソースに対するリソース使用量Cを掛けたものとなる。なぜなら、ループ本体を、何らアンロールすることなく一度実装する必要があるからである。この関係は、アキュムレータおよび非アキュムレータループに当てはまる。特定のアンロール係数のベネフィットBは、アンロールによって節約されるクロックサイクルの観点から表すことができる。ループ本体内におけるそれぞれの演算ごとのレイテンシを合計し、これを反復カウントNと乗算することにより、元々のループに対する推定されるサイクルLO=N・Lを推定することができ、このことは、アキュムレータループおよび非アキュムレータループに当てはまる。あるループをUの係数によってアンロールした場合、アンロールされたループ本体は、N/U回実行される。非アキュムレータループの場合には、すべてのアンロールされた反復を並列に実行することができるので、アンロールされたループ本体のレイテンシはLである。その結果として得られるベネフィットは、B=N・L・(U-1)/Uである。アンロールされたループ本体のレイテンシは、アキュムレータループごとに異なる。ループ本体のすべての非累積部分が並列に実行され、U回のアキュムレーション演算が逆ツリー構造でスケジューリングされるものと仮定すると、アキュムレータループの反復に対するレイテンシを、L+log2U・Aによって推定することができる。その結果として得られるベネフィットは、B=N・L-N/U・(L+log2U・A)である。追加的なデータ転送コストは、この計算には含まれていないが、考慮する必要がある場合もある。原則的に、代替的に、最適なアンロール係数を決定する際により複雑なコスト推定モデルを使用してもよい。アンロール係数は、整数線形計画法または任意の他の一般的な最適化法によってベネフィット・コスト関数を最適化することによって決定可能である。
【0056】
種々異なる演算を含んでいるソースコードを提供し、オペランドに対する所望のデータ型を定義し、所望のFPGAデバイスのためのソースコードを実装することにより、種々異なる演算に対するレイテンシおよびリソース消費量のデータベースとしての演算ライブラリを、種々異なるFPGAデバイスに対して自動的に測定することができる。実装ツールチェーンの変換ツールは、典型的には、実装された設計のためのリソース消費量を計算する。なぜなら、この情報も、配置ステップおよびルーティングステップにおいて必要とされるからである。クロック速度および/またはデータ型を適合させるためのスクリプトを使用し、実装ツールチェーンのアプリケーションプログラミングインターフェースを呼び出すことにより、演算ライブラリを自動的に決定することができる。他のアクセラレーションハードウェアのための演算ライブラリ、例えばベクトル計算のためのアクセラレータコアも、同様に取り扱い可能である。
【0057】
本開示の主題は、図面および前述の説明において詳細に図示および記載されているが、このような図示および記載は、例証または例示するためのものであり、限定するためのものではないと考えられるべきである。本発明は、特許請求の範囲によって規定されているので、本発明を特徴付ける本明細書でなされた如何なる記述もまた、例証または例示するためのものであり、限定するためのものではないと考えられるべきである。当業者であれば、添付の特許請求の範囲内で、上述の種々異なる実施形態の特徴の任意の組み合わせを含むことができる変更および修正を行うことができることが理解されよう。
【0058】
特許請求の範囲において使用される用語は、前述の説明に一致する最も広い合理的な解釈を有するものと解釈されるべきである。例えば、ある要素を導入する際における冠詞“a”または“the”の使用は、複数の要素を除外するものとして解釈されるべきではない。同様に、「または」の表記は、包括的であると解釈されるべきであり、したがって、文脈または前述の説明からAおよびBの一方のみが意図されていることが明らかでない限り、「AまたはB」の表記は、「AおよびB」を除外するわけではない。さらに、「A、B、およびCのうちの少なくとも1つ」という表記は、A、B、およびCからなる要素のグループのうちの1つまたは複数として解釈されるべきであり、A、B、およびCがカテゴリとして関連しているかどうかにかかわらず、それぞれの列挙された要素A、B、およびCのうちの少なくとも1つを必要とするものとして解釈されるべきではない。さらに、「A、B、および/またはC」または「A、B、またはCのうちの少なくとも1つ」という表記は、列挙された要素からの任意の単一のエンティティ、例えばAを含むか、列挙された要素からの任意の部分集合、例えばAおよびBを含むか、または要素A、B、およびCの列挙全体を含むものとして解釈されるべきである。
【外国語明細書】