JP7407192B2 - フィールド・プログラマブル・ゲート・アレイのためのコードを最適化する方法および装置 - Google Patents

フィールド・プログラマブル・ゲート・アレイのためのコードを最適化する方法および装置 Download PDF

Info

Publication number
JP7407192B2
JP7407192B2 JP2021531192A JP2021531192A JP7407192B2 JP 7407192 B2 JP7407192 B2 JP 7407192B2 JP 2021531192 A JP2021531192 A JP 2021531192A JP 2021531192 A JP2021531192 A JP 2021531192A JP 7407192 B2 JP7407192 B2 JP 7407192B2
Authority
JP
Japan
Prior art keywords
code
dfg
hardware accelerator
dataflow graph
level
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2021531192A
Other languages
English (en)
Other versions
JP2022508296A (ja
Inventor
フェレイラ,アフォンソ ソアレス カナス
マヌエル パイヴァ カルドソ,ジョアン
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
INESC TEC Instituto de Engenharia de Sistemas e Computadores Tecnologia e Ciencia
Original Assignee
INESC TEC Instituto de Engenharia de Sistemas e Computadores Tecnologia e Ciencia
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Priority claimed from EP18189022.9A external-priority patent/EP3611613A1/en
Application filed by INESC TEC Instituto de Engenharia de Sistemas e Computadores Tecnologia e Ciencia filed Critical INESC TEC Instituto de Engenharia de Sistemas e Computadores Tecnologia e Ciencia
Publication of JP2022508296A publication Critical patent/JP2022508296A/ja
Application granted granted Critical
Publication of JP7407192B2 publication Critical patent/JP7407192B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4434Reducing the memory space required by the program code
    • G06F8/4435Detection or removal of dead or redundant code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F30/00Computer-aided design [CAD]
    • G06F30/30Circuit design
    • G06F30/34Circuit design for reconfigurable circuits, e.g. field programmable gate arrays [FPGA] or programmable logic devices [PLD]
    • G06F30/343Logical level
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Evolutionary Computation (AREA)
  • Geometry (AREA)
  • Devices For Executing Special Programs (AREA)

Description

本出願は、2018年8月9日に出願されたポルトガル特許出願第20181000054166号および2018年8月14日に出願されたヨーロッパ特許出願第18189022.9号の優先権および利益を主張する。
本発明は、ハードウェア・アクセラレータのためのコードを最適化する方法および装置に関する。
フィールド・プログラマブル・ゲート・アレイ(FPGA)が、ソフトウェア・アプリケーションの実行を加速するための一般的な解決策になりつつある。ハイレベル合成ツール(HLS)の使用は、ソフトウェア開発者が、FPGAベースのハードウェア・アクセラレータ上で使用するためのソフトウェア・コードを開発することができるようにするために、ソフトウェア開発者のための抽象度を提供することを目的としている。しかし、ソフトウェア・コードを再構築し、ディレクティブを効率的に使用する必要により、使用されるHLSツールと、ソフトウェア・コードがその上で実行されるFPGAハードウェアの両方について習熟することが要求される。本明細書に記載の手法は、プログラム実行トレースから生成可能なアンフォールド・グラフ表現を、フォールドなどのグラフ・ベースの最適化とともに使用して、HLSツールに入力する適切なCコードを生成する。本明細書に記載の手法は、通常であれば入力ソフトウェア・コードの手動再構築と適切なディレクティブの手動挿入の使用によってのみ実現可能な効率的なハードウェア実装形態を生成することができることを、実験が証明している。
FPGAを使用して実装されるハードウェア・アクセラレータは、多くのシステムで必要とされるパフォーマンス向上および/またはエネルギー消費節減をもたらすことができる。最適化された場合、これらのFPGAベースのハードウェア・アクセラレータは、効率的なエネルギー消費と併せて、高いパフォーマンスが可能である[1]。
アプリケーションのカスタム・ハードウェア実装形態(特定用途向けアーキテクチャとも呼ばれる)は、ハードウェアが十分な資源を提供する限り、複数の独立した演算の並行実行を可能にする。この並行実行は、高い命令レベル並列性(ILP)を有するアルゴリズムの実行を加速する。一定程度のILPを有するアルゴリズムを実行するようにハードウェアを設計するためには、現在の方法は様々な技能を必要とし、きわめて特異なプログラミング言語およびツールの理解を必要とする。効率的なハードウェアを記述することは多大な時間を要する。これらの側面は、ハードウェア・アクセラレータとしてのFPGAの使用と開発の障害となっている。
上記の問題に対処するために、ハイレベル合成(HLS)の分野では、多くの努力がなされてきた。HLSツールは、C言語などのソフトウェア・プログラミング言語で知られている抽象度などの高抽象度を使用してプログラマがFPGAハードウェアを対象とすることを可能にする。このようなより高い抽象度の目的は、開発者がFPGAをより容易にプログラミングすることができるようにし、他の手法で必要とされる時間を要する作業なしに、より複雑なアプリケーションを扱うことができるようにすることである。しかし、HLSツールは抽象度を高めるが、HLSツールは依然としてプログラマがFPGAハードウェア上で最適化されたソリューションを実装するには、ある程度のハードウェアの専門知識を必要とする。HLSツールは、プログラミング言語(Cなど)に対応することはできるが、そのソフトウェア・コードの構造が、結果として生成されるハードウェアに大きな影響を与える[2]。さらに、HLSツールの典型的なものは、効率的な実装形態を生成するための追加のディレクティブまたは構成を必要とすることがある。従来技術のHLSツールは、この場合はソフトウェア・プログラマである平均的な当業者が参入するには障壁がある。この参入障壁を低くすることによって、より多くのソフトウェア開発者が、アプリケーションを加速するため、および/または、有意なエルギー消費削減を達成するために、FPGAベースのハードウェアの演算能力を使用することができるようになるであろう。
Cベースのプログラミング言語は、多くのHLSツールの一般的な入力である[1]。Cプログラミング・モデルはCPUに合わせて調整され、ハードウェアの並行性および可能なカスタマイズを考慮していないため、これらの従来技術のHLSツールは、プログラマが構成またはディレクティブを提供することにより合成をガイドすることができるようにすることによって上記の限界を埋め合わせる。
ソフトウェア・コードの構造は生成されるハードウェアのパフォーマンスに大きな影響を与えることも知られている。このハードウェアは、FPGAまたはASICとして実装可能である。したがって、従来技術では、通常、複雑なコード再構築を必要とし、HLSツールとコンパイラは、そのような最適化を提供することができず、それらの自動適用も保証しない場合がある。CベースのHLSをより利用しやすくするために、入力ソフトウェア・コードを容易に再構築する方法が必要である。本明細書では、(例えばFPGAを使用して実装される)特殊用途向けハードウェアを対象とするように最適化されたCコードを自動的に生成する手法について記載する。コードは、次に、FPGAまたはASICを使用した電子回路を製造するために使用することができる。
従来技術
ソース間最適化は、HLSの分野における研究主題であった。例えば、Congら[5]は、コード再構築の問題について簡単に概説し、ソフトウェア開発者のためにコード再構築を容易にするためのフレームワークを提示している。Cardosoら[6]は、ユーザが、コード変換とディレクティブの挿入とを適用するために戦略をプログラムすることができるようにする手法を提示している。LegUp HLSツール[8]はまた、Cを入力として受け付け、HLS最適化を実装するために修正LLVMコンパイラ[9]によりコード再構築を実装する。
ストリーミング・ベースの計算を特に扱う手法も関連する。例えば、Mencerは、[7]において、ASCと呼ばれるCベースの言語を使用する手法を提示している。ASCは、ハードウェアでデータ・ストリーミング・ベースの計算を実装するために設計された。Max Compiler[10]は、Javaに基づくMaxJという名称のプログラミング言語でデータフロー・グラフとして記述されたストリーミング計算を実装するためのHLSツールである。[11]では、著者らは、MaxJコンパイラの文脈でよりよいFPGA実装形態を生成するためのデータ・フロー・グラフ(DFG)最適化について論じている。本明細書の方法は、典型的なCベースのHLSツールのためのより使いやすいコードを提供するために、ソース間コード再構築に焦点を合わせているため、本明細書における手法は上記の研究とは異なる。本記載の方法は、LegUpおよびVivado HLSなどのHLSツールのための有用なコード再構築を実現することができるため、別次元の研究とみることができる。MaxCompiler手法と比較すると、本記載の手法は、再構築されたMaxJコードを提供するためにも使用可能ではあるが、その場合、この方法は、MaxJコード生成プログラムをバックエンドとして必要とすることになる。さらに、発明者らは、使用されるDFGが、アプリケーションの元のコードをインストルメンテーションし、修正されたアプリケーションの実行によりグラフを得ることによって得られるため、この方法は他の入力プログラミング言語の文脈でも使用可能であることにも着目している。
コンパイラおよびHLSツールの中間表現としてのグラフの使用は一般的である(例えば、Daniel D.Gajski, Nikil D.Dutt, Allen C.-H.Wu, and Steve Y.L.Lin. 1992. High-Level Synthesis: Introduction to Chip and System Design. Kluwer Academic Publishers, Norwell, MA, USAおよびJoao M. P. Cardoso, Pedro C.Diniz, Markus Weinhardt, “Compiling for reconfigurable computing: A survey,” ACM Comput. Surv. 42(4): 13:1-13:65(2010)を参照)。典型的には、入力ソース・コードの構造は制御データフロー・グラフ(CDFG)またはデータフロー・グラフ(DFG)、あるいは両者の拡張版によって表され、次に、これらのグラフを使用してコード変換および最適化が適用される。
1つの典型的な事例は、例えばループ制御構造と、誘導変数の値を修正した部分グラフを再現することによって内部的に実装可能なループ・アンロールである。これは、HLSツールが最適化の一部を適用する典型的な方法である。それらのグラフは、割り当て、バインディングおよびスケジューリングを行うためにも使用される(HLSの3つの重要なタスク。例えば、Philippe Coussy, Daniel D. Gajski, Michael Meredith, Andres Takach, “An Introduction to High-Level Synthesis,” IEEE Design & Test of Computers 26(4): 8-17 (2009) Joao M. P. Cardoso, Markus Weinhardt, “High-Level Synthesis,” Chapter 2, FPGAs for Software Programmers 2016, Dirk Koch, Frank Hannig, Daniel Ziener (eds.), Springer 2016, pp. 23-47を参照)。この手法は、ソース間コンパイラでも使用される(木表現を使用するものもあれば、グラフ表現を使用するものもある)。これらのコンパイラでは、変換後のグラフは次に、最終コード(例えば、C間コンパイラにおけるCコード)を生成する機能を果たすコード生成段階に入力される。
HLSツールは、効率的な実装形態を生成するために、追加のディレクティブまたは構成を必要とすることがある。HLSツールなどの従来技術の解決策は、きわめて複雑なコード再構築においては不満足なパフォーマンスを示す。実際、関連する高度な複雑さは、より効率的なハードウェアを生成するのに必要な程度の再構築を自動的に提供する既存のコード再構築ツールが存在しない実際の理由であり、ユーザが最適化を特定し、それらの一連の最適化を適用することが一般的である(例えば、Joao M. P. Cardoso, Joao Teixeira, Jose C. Alves, Ricardo Nobre, Pedro C.Diniz, Jose Gabriel F. Coutinho, Wayne Luk, “Specifying Compiler Strategies for FPGA-based Systems,” FCCM 2012: 192-199を参照)。
例えば、コンパイラ最適化の選択に基づいてコンパイラ最適化を適用するための順序は、それぞれ、フェーズ選択およびフェーズ順序と呼ばれ、従来のコンパイラ最適化の文脈(および、コード再構築に関してではない)においてであっても、設計空間探索(DSE)方式を必要とし、他のより効率的な解決策が存在しないために機械学習技術の対象とされている(例えば、Amir H. Ashouri, William Killian, John Cavazos, Gianluca Palermo, Cristina Silvano, “A Survey on Compiler Autotuning using Machine Learning,” ACM Comput. Surv. 51(5): 96:1-96:42 (2019) and Zheng Wang, Michael F. P. O’Boyle, “Machine Learning in Compiler Optimization,” Proceedings of the IEEE 106(11): 1879-1901 (2018).を参照)。この問題は、より深いコード再構築、および/または、ループと特定のパラメータ(例えばデータ依存関係および反復回数)とを必要とする再構築技術を考慮すると、さらに複雑である。
一部の従来技術の解決策は、この複雑なフェーズ選択およびフェーズ順序問題を、入力プログラムの構造とそれをグラフ(例えばCDFG)で効率的に表すことから始めることによって解決することができる。しかし、これらの従来技術の解決策は、コンパイラにおける、特定のコード再構築を実現するための順序において必要となり得る特定の最適化の存在にきわめて大きく依存し、特定の最適化が存在しないことは、ツールがより高パフォーマンスのハードウェアを生成することを妨げ得る。
国際特許出願第WO2018/078451(Reconfigure io ltd)は、複数のFPGAに対する並行非同期プログラムを特に加速する装置を教示しているが、この従来技術の装置は単一のFPGAに対するカーネルを加速しない。この装置は、特定の入力モデルであるCSPを使用する。
A.Lotfi and R. K. Gupta, “ReHLS: Resource-Aware Program Transformation Workflow for High-Level Synthesis,” DOI 10.1109/ICCD.2017.92は、HLSツールを使用したハードウェアの生成の結果として得られるハードウェア資源の削減の文脈でコード変換の使用を開示している。この文献は、オープン・ソースLLVM中間表現IRを使用した入力コードの表現の基本ブロックのために構築されたDFGの使用を教示している。Lotfiらで開示されている手法は、共有可能なハードウェア資源を特定し、それによってFGPAのために必要な設計面積を削減するために、DFGにおいて共通のパターンを検索する。HLSツールに入力される生成されたコードは、資源共有のために選択されたパターンを考慮し、HLSツールをガイドするためにHLSディレクティブを使用する。
Lotfiらに記載されている手法は、可能なハードウェア資源削減のために発明者らの発明で使用されるDFGに適用可能な最適化の種類の一例である。このような最適化は、同じハードウェア資源、または、類似点に基づくデータ経路のマージのサポートを使用するハードウェア資源を使用した部分グラフの選択の実装を可能にする(例えば、N. Moreano, E. Borin, Cid de Souza and G. Araujo, “Efficient data path merging for partially reconfigurable architectures,” in IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems, vol. 24, no. 7, pp. 969-980, July 2005. doi: 10.1109/TCAD.2005.850844を参照)。
しかし、Lotfiらは、メモリ転送を削減するための最適化方式について記載していない。Lotfiらは、インストルメンテーション・コードも付加しない。
O. Reiche, et al, “Generating FPGA-based image processing accelerators with Hipacc” doi: 10.1109/ICCAD.2017.8203894は、画像処理のためのドメイン固有言語およびコンパイラである、Hipaccの使用を開示している。この文献は、DSL(ドメイン固有言語)のプログラムが入力として使用され、次にそのDSLコードがプログラミング言語に変換される手法の一例を開示している。変換されたコードは、コンパイラおよび/またはHLSツールへの入力である。Reicheらの例では、Hipacc DSLのプログラムを、CコードC/C++およびOpenCLコードに変換する例が開示されている。この変換プロセスでは、典型的なコンパイラ最適化(抽象構文木(AST)レベルで適用される)が、対象(例えばFPGAまたはGPU)に従って行われる。Reicheらは、Hipacc DSLコードのインストルメンテーションによって、または内部ASTおよびデータ依存関係からDFGを生成することによって生成可能なデータフロー・グラフのアンフォールドとフォールドについては記載していない。
J.P. Pinilla and S. J. E. Wilton, “Enhanced source-level instrumentation for FPGA in-system debug of High-Level Synthesis designs,” doi:10.1109/FPT.2016.7929514は、HLSツールによって生成されたハードウェアの挙動を監視/検証するために、コードをインストルメンテーションする方法を教示している。この概念は、プログラムの挙動を監視するために、プログラムの入力コードにインストルメンテーション・コードを差し込むものである。差し込まれたインストルメンテーション・コードはHLSツールに入力され、生成されるハードウェアは、入力された元のプログラムの挙動を実装するためのハードウェアと、プログラムの挙動を監視するための回路の両方を含む。言い換えると、Pinillaらのインストルメンテーション・コードは、生成されたハードウェアの挙動を実行時またはシミュレーション時に把握および/または検証するための監視点を提供する。類似の手法の別の例は、Joshua S.Monson and Brad L. Hutchings. 2015. Using Source-Level Transformations to Improve High-Level Synthesis Debug and Validation on FPGAs. In Proceedings of the 2015 ACM/SIGDA International Symposium on Field-Programmable Gate Arrays (FPGA ‘15). ACM, New York, NY, USA, 5-8. DOI: https://doi.org/10.1145/2684746.2689087に示されているものである。
Y.Uguen, F.de Dinechin and S. Derrien, “Bridging high-level synthesis and application-specific arithmetic: The case study of floating-point summations,” 2017 27th International Conference on Field Programmable Logic and Applications (FPL), Ghent, 2017, pp. 1-8.doi: 10.23919/FPL.2017.8056792における研究は、浮動小数点データ・タイプと固定小数点データ・タイプとを使用した演算式を最適化するソース間コンパイラ手法、および特に総和リダクション・パターンを扱うことを提示している。この手法は、HLSツールのためのC/C++コードを生成する。記載されているUguenらの手法は、HLSツールに対するコードの生成をさらに強化するために組み込むことができる多くの可能な最適化のうちのもう1つの最適化である。Uguenらの最適化は、固定小数点データと浮動小数点データとを含む総和リダクション演算の存在に対して行われる。
S.Cheng and J.Wawrzynek,“Architectural synthesis of computational pipelines with decoupled memory access,”2014 International Conference on Field-Programmable Technology (FPT), Shanghai, 2014, pp. 83-90. doi: 10.1109/FPT.2014.7082758における研究は、計算からのメモリ操作およびデータ・アクセスの分離を利用するパイプライン化実装形態を実現するために入力コードを再構築する手法を提示している。演算の種類に従って制御データ・フロー・グラフ(CDFG)の一部が部分グラフとしてクラスタ化され、次に、Chengらは、部分グラフのそれぞれについてハードウェア・ユニットの分離実行を考慮したコードを生成することを教示している。再構築されたコードはHLSツールに入力される。これは、HLSツールに対するコードの生成を向上させる多くの可能な最適化のうちのさらなる他の1つであり、この場合、(例えばメモリ・アクセスと計算との間の)挙動の分離と、その結果としてのより詳細度の粗いパイプライン方式の使用の増強とを考慮している。
本明細書は、ハードウェア・アクセラレータの最適化構成を生成する方法を提示する。この方法は、インストルメンテーション・コードが事前に付加されたアプリケーションの重要機能を実行することによって現在得られる(算術、論理、演算子レベル)の計算のデータフロー・グラフ(DFG)表現に基づく。
本明細書は、入力プログラム・コードの構造に自動的に適用されると提供することができるコード再構築の方法を開示し、適用されるコンパイラ最適化(ならびに、そのパラメータおよびターゲット・コード要素の特定の値)の特定とそれらを適用する順序(また、通常はそれらの一部を複数回適用する)とを必要とすることになる。
インストルメンテーション・コードを自動的に差し込むことによって、本明細書で概説する方法は、異なる入力プログラミング言語を有し得る。一例として、Cコードが実施形態における入力として考慮された。しかし、本発明はCには限定されない。
この方法は、フォールドおよびアンフォールド・グラフ操作と、グラフ自体の構造の変換とを使用した。この方法は、重要なアプリケーション・カーネルのコードを完全に再構築することができるフレームワークで実装された。このフレームワークは、フロントエンドとバックエンドの2段階からなる。フロントエンドは、元のバージョンにインストルメンテーション・コードを差し込むことによって実行トレースからDFGを生成する。フレームワークのバックエンドは、DFGを自動的に再構築することができ、HLSにとって使いやすい方法でディレクティブが付加されたCコードを生成する。
Xilinx FPGAを対象とし、標準ソリューションのVivado HLSを基準にしてベンチマーク評価する一実施形態を提示し、この方法により得られる関連の高速化を例示する。元のCコードと比較すると、この方法によって生成されたCコードは、元の未修正のCコードよりパフォーマンスに優れており、大幅な高速化が達成される。実現されたCコードは、手動で最適化された、ディレクティブが付加されたCコードに匹敵し、ほとんどの場合はより優れている。元の未修正Cコードと比較すると、この手法は30倍から100倍高速の実装形態を実現する。Vivado HLSディレクティブを使用して最適化されたCと比較すると、この手法は2倍から15倍高速な実装形態を実現する。しかし、このフレームワークにより生成されたディレクティブを有するCコードは、専門家によって適用された手動によるコード変換によって常に再現可能である。したがって、この手法は、ソフトウェア開発者が、Vivado HLSなどのHLSの専門家の支援を必要とせずに、Cコードを入力として使用し、典型的なHLSツールをバックエンドとして使用して、効率的なハードウェア・アクセラレータを対象とすることを可能にし得る。
本発明の方法および装置のコンパイルの流れを示す図である。
ドット積カーネルの場合のフロントエンドの出力を示す図である。
バックエンドを表す図を示す図である。
それぞれ4、3、1024および2に等しいNz、Ns、NmおよびNyを考慮したフィルタ・サブバンド・ベンチマークの場合のフロントエンドで生成されたDFGを示す図である。
それぞれ4、3、1024および2に等しいNz、Ns、NmおよびNyを考慮した最初のステップ後のフィルタ・サブバンド・ベンチマークを示す図である。
それぞれ4、3、1024および2に等しいNz、Ns、NmおよびNyを考慮した2番目のステップ後のフィルタ・サブバンド・ベンチマーク共通演算部分グラフを示す図である。
それぞれ4、3、1024および2に等しいNz、Ns、NmおよびNyを考慮した2番目のステップ後の最初の出力のためのフィルタ・サブバンド・ベンチマーク固有演算部分グラフを示す図である。
それぞれ4、3、1024および2に等しいNz、Ns、NmおよびNyを考慮した2番目のステップ後の2番目の出力のためのフィルタ・サブバンド・ベンチマーク固有演算部分グラフを示す図である。
それぞれ4、3、1024および2に等しいNz、Ns、NmおよびNyを考慮した2番目のステップ後の3番目の出力のためのフィルタ・サブバンド・ベンチマーク固有演算部分グラフを示す図である。
それぞれ4、3、1024および2に等しいNz、Ns、NmおよびNyを考慮した4番目のステップ後のフィルタ・サブバンド・ベンチマーク非ループ・データフローを示す図である。
それぞれ4、3、1024および2に等しいNz、Ns、NmおよびNyを考慮した4番目のステップ後のフィルタ・サブバンド・ベンチマーク外側ループ・データフローを示す図である。
それぞれ4、3、1024および2に等しいNz、Ns、NmおよびNyを考慮した4番目のステップ後のフィルタ・サブバンド・ベンチマーク内側ループ・データフローを示す図である。
それぞれ512、32、1024、64および4に等しいNz、Ns、Nm、Nyおよびアンロール・ファクタを考慮した5番目のステップ後の演算的に最適化されたフィルタ・サブバンド・ベンチマーク内側ループ・データフローを示す図である。
それぞれ512、32、1024、64および4に等しいNz、Ns、Nm、Nyおよびアンロール・ファクタを考慮した6番目のステップ後のアンロールされたフィルタ・サブバンド・ベンチマーク内側ループ・データフローを示す図である。
フィルタ・サブバンド・ベンチマークの場合の高速化を示す図である。
HLSツールを対象とするCコードを自動的に再構築する方法および装置10を開示し、図1の概略図に示す。このコードは、ハードウェア・アクセラレータ20の構成のために製造ユニットへの入力として使用可能である。ハードウェア・アクセラレータ20は、プログラム可能な、ロジック・ゲートなどの複数の電子構成要素を含む。この装置は、プログラムの実行トレースをデータフロー・グラフ(DFG)として生成することができるフロントエンド110を含む。DFGは次に、ハードウェア・アクセラレータ20に渡すための出力プログラムを生成するために、バックエンド135で処理される。出力プログラムは、この非限定的な例では、HLSツールのためのCのソフトウェア・コードを使用したソフトウェア・コードを含む。
DFGは、アプリケーションにおけるデータフローの優れた表現であり、アプリケーションにおける並列性などの特性を表すことがわかっている。これらの特性の特定は、ハードウェアの改良された実装形態を可能にする。フロントエンド110は、複数の異なる入力言語からのDFGの生成を可能にする。このようにして、異なる言語のソフトウェア・プログラマがCベースのHLSツールを使用することを可能にする。本明細書では、バックエンド135と、バックエンド135がDFGを操作し、分析して出力プログラムを自動的に生成する方法とについて説明する。フロントエンド110が生成するDFGの種類と、それらを入力アプリケーション・ソース・コードから構築する手法についても説明する。
図1に、コード再構築を適用するための本開示の方法のコンパイルの流れを示す。第1のステップ100で、フロントエンド110にCコード105が入力される。フロントエンド110は、ステップ115でCコード105を実行し、ステップ120で、Cコード105におけるアルゴリズムの実行トレースのDFG125を生成する。DFG125は、ステップ115における元の実行からのすべての演算を含み、あらゆるデータ依存関係が強制的に維持される。グラフは、アルゴリズムの依存関係を記録するのみであり、Cコード105のアルゴリズムの実際の実行順序は記録しないことはわかるであろう。したがって、互いに並列に実行可能な演算は、DFG125のグラフでは相互依存関係なしに現れる。したがって、データ依存関係は別個に記録する必要がある。
フロントエンド110は、多くの異なる入力に適合することが可能なため汎用的であり、Cコード入力のための実装形態に限定されず、他のソフトウェア言語にも容易に移植することができる。
バックエンド130への入力DFG125について、ドット・グラフ記述言語において説明する。ドット・グラフ記述言語はIDと一連の属性とによって記述されるノードを有することが知られている。ノードの1つ1つがすべて少なくとも2つの属性を有する。属性のうちの第1の属性はラベルであり、属性の他方は種別である。ノードは3つの種別を有することができ、それらは定数と、変数と演算である。ラベルは、ノードの種別に応じて、変数の名前、定数の値、または演算の種類を格納する。変数が配列の場合、ノードはその配列へのアクセスのインデックスも含む。さらに、変数ノードは、変数の種類と、変数ノードがローカル変数であるか関数の入力であるかも属性として保持する。
本開示の最初の態様では、フロントエンド110は基本演算を使用するソフトウェア・コードのカーネルのみを扱う。変数の割り当ては、異なるノード間(例えば、定数型ノードから変数型ノードへの)の接続で表される。演算は、ノード種別演算によって表され、オペランドと結果とはそれぞれのノードによって表され、それに応じて接続される。本開示のこの態様では、ソフトウェア・コードにおけるカーネルの実行を表すDFG125は、ドット記述を実行時にファイルに書き出すものである。
インストルメンテーション・コード112(すなわち、実行されると、DFGの記述の部分を出力するコード)を元のCコード105に差し込み、修正されたCコードをコンパイルし、実行することによって、入力DFGが生成される。基本インストルメンテーション規則は、元のCコード内の各命令文の前にインストルメンテーション・コードを付加することである。付加されたインストルメンテーション・コードは、DFGノードと、付随するC命令文の演算およびオペランドを表すエッジとを記述する。例えば、演算のない代入文の場合、付加されるインストルメンテーション・コード112は2つのノード、すなわち入力ノードと出力ノードを接続エッジともに備えるDFG部分を出力する。
DFG124におけるノードの値は、現在の演算を記述する。一例を挙げてみる。Cコード105が、a=b+c、すなわち変数aが変数bとcにおける値の和の値をとるなどの命令文を含むとする。このインストルメンテーション・コードの実行は、変数cとbとaのノードのそれぞれについてドット記述を生成し、これらのノードの属性として変数名(例えば、a、bまたはc)と、種類(例えば整数)と、左オペランドまたは右オペランドの項におけるそれぞれの識別情報とを含む。
別の例として、ノードがメモリ・アクセスをあら合わす場合があり得る。付加されるインストルメンテーション・コードはノードを変数として記述し、ラベルは明示的なメモリ・インデックスによるメモリにおけるアクセスである。
正しい依存関係を考慮する必要がある。図1のCコード105によって表されるソフトウェア・コードの実行時に、変数は複数の値を有し得る。変数がとるすべての新しい値について、DFG125におけるグラフに新たなノードが作成される。この方法および装置は、古くなった値ではなく、複数の値を有する変数の最新の値に対応するノードのIDを知ることができる必要もある。この依存関係を保証するために、インストルメンテーション・コード112は、最新の割り当てを反映するように変数名のリネームを使用する。例えば、インストルメンテーション・コード112は、変数名に割り当てを表す数字を付加する。そこで、コードが以下のシーケンスから開始する場合を想定する。
a=b;d=a+c;a=d+a;
この方法および装置は、第1の演算にa_1、b_0というIDを使用する。この後に、第2の演算のd_1、a_1、c_0というIDと、最後の演算のa_2、d_1、a_1というIDが続く。図2に、インストルメンテーション・コード112が付加されたドット積カーネルの実行の結果のDFG125を示す。
DFG125は、追加のステップを回避するためと、大きなトレースとその後のDFGコンパクト化とを出力する必要のない可能な将来のコンパクトなDFG表現を踏まえて、実行トレースを生成して次にトレースからDFG125を構築する代わりに、アプリケーションの実行から作成される。
次に、バックエンド135の構造とその実装形態について説明する。バックエンド135は、フロントエンド110によって生成されたDFG125の分析と最適化とを扱う、図3に記載された様々なステップを含む。適用される厳密な最適化は、グラフと構成130とに応じて異なる。
この方法および装置が適切な数のロード/ストア命令文を有する出力プログラムにおけるコードを明示的に生成するように、ハードウェア・アクセラレータ20によって(例えば、利用可能なメモリ・ポートの数を使用して)サポートされる同時ロード/ストアの数をユーザが定義することができる。カーネルの入力および出力と、最適化オプションのうちの一部も設定される。最適化オプションは、配列分割またはループ・パイプライン化を含むが、これらには限定されない。バックエンド135はすべてのコード再構築、最適化を実装し、HLSツールのためのディレクティブを差し込むため、バックエンド135はこの方法および装置の最も重く、最も複雑な部分である。
バックエンド135は、図3に示すように別々の7ステップに分けられる。この方法は、DFG125におけるグラフを刈り込むことから開始し、アプリケーション内およびDFG125に記録されている反復パターンを特定してグラフをコンパクトにする。その後、この方法は、データフローの改良された表現を得るために、そのコンパクトな記述を最適化する。グラフにおいて反復パターンをフォールドすることができる。反復パターンは複数回発生し得るため、これらの反復シーケンスを改善することによってアプリケーションの大部分を最適化することが可能である。
図3に示す最初の3つのステップ(すなわち、グラフ初期化ステップ300と、出力分析ステップ310と、並列マッチング・ステップ320)は、グラフ処理と、反復パターンの特定とを扱う。その後の3つのステップ(ステップ330、340および350)は、データフローを最適化し、最後のステップ(ステップ360)はHLSディレクティブが付加されたCコードを生成する。
グラフ初期化の最初のステップ300は、次の最適化の前に入力グラフを初期設定し、前処理し、分析するいくつかのステップのために設けられている。この最初のステップ300は、DFG125における不要なノードの刈り込みを含む。このステップ300は、さらなるアルゴリズムの効率を向上させることができる。最初のステップ300は、(ローカル配列をスカラー変数にすることができる場合は常に)入力コードからローカル配列も除去し、それによって、FPGAにおいてBRAM(Xilinx FPGAにおいてブロックRAMと呼ばれるオンチップRAM)を使用することを回避するためにそれらのローカル変数を複数の固有変数で実装する。
2番目のステップ310は、出力を分析し、次のステップ320のためにグラフを準備する。一態様では、初期グラフはきわめて大きい可能性があり、多くの方法でコンパクトにすることができる。この方法および装置は、異なる出力を生成するシーケンス間のパターンの存在を判断することによってグラフをコンパクト化する。カーネルが単一の出力を有する場合は、このステップ310と次のステップ320はスキップされる。
出力が配列である場合、この方法および装置はステップ310で、配列内の出力値のすべての1つ1つの出力値の個別データフローを特定する。次のステップ320に進む前に、この方法および装置は、出力上の共通の演算を、出力の1つ1つに固有の演算から分ける。したがって、複数の出力の場合、この方法および装置は、共通の演算のすべてを有するグラフを生成し、次に、それらの出力のそれぞれを生成する固有の演算を有するグラフのリストを生成する。3番目のステップ320は、前のステップ310で特定された別々のデータフローを比較する。このステップ320の目標は、これらの別々のデータフローのすべてを、単一のシーケンスによって表すことができるループとしてコンパクト化することである。このコンパクト化が成功した場合、グラフのサイズは大幅に縮小される。この単一のシーケンスは複数回反復されることになるため、グラフが最適化される場合、アプリケーション実行の大部分も最適化される。最適化されない場合、シーケンスが類似しているにもかかわらず、すべてのシーケンスを別々に最適化する必要が生じることになる。また、ループがなければ、結果のCコードは過剰にアンフォールドされる可能性があり、その結果として(資源共有方式を考慮しても)実現不可能な実装形態となる可能性がある。このステップ320が成功した場合、この方法および装置は、ループを記述するグラフとなる共通の演算のグラフを有する。この階層的表現により、より複雑なコード構造の表現が可能になる。
図4を参照して、Ny、NzおよびNsがそれぞれ2、4および3の場合のフィルタ・サブバンド・ベンチマーク(リスト1参照)のためのフロントエンドからの結果のDFGを示す。リスト1のソース・コードと比較すると、y値の計算とs配列の異なる結果とがわかる。第1のステップ310(不要ノードの刈り込み)を行った後の結果が図5に示されている。この新たなDFGでは、変数情報はエッジに格納され、それによってよりコンパクトなグラフとなる。
リスト1 フィルタ・サブバンド・ソース・コード
Figure 0007407192000001
図6、図7、図8および図9を参照して、前記で図5に示したDFGの2番目のステップ310の分離の結果を示す。図7、図8および図9は、3つの出力のそれぞれについて固有である元のデータフローのセグメントを示す。図6は共通の演算を示す。元のデータフローと比較すると、これらのセグメントをすべて認めることができる。すべての出力についてy値が与えられ、したがってy値がすべての出力に共通であるため、この分離は、元のDFGおよびリスト1のソース・コードと整合する。一方、これらのy値をs配列に適用したものは、出力のそれぞれに固有である。2番目のステップ310を、Ny、NzおよびNsがそれぞれ64、512および32であるフィルタ・サブバンド・ベンチマークに適用すると、リスト1のコードになる。
2番目のステップ310の共通ノードと固有ノードとの分離は、3番目のステップ320の成功のために必要である。これらのデータフローが共通の演算を含む場合、データフローはプログラムにおいて1回実行されればよく、出力ごとに複数回実行される必要はないが、データフローは3番目のステップ320で通常通りにマッチングされることとなり、ループに含められることになる。例えば、リスト1に示すフィルタ・サブバンド・ベンチマークは、2つのネストされたループ・セットを含む。最初のループは、出力を計算するために2番目のループで値が使用されるyベクトルを計算する。3番目のステップ320(並列マッチング)で、この方法および装置は固有出力シーケンスをマッチングし、その内側ループがアンロールされた2番目のループと類似したループを特定する。2番目のステップ310における共通ノードと固有ノードの分離がなければ、この方法および装置はy値の計算のマッチングも行うことになり、この方法はそれらの値を出力の1つ1つについて再度計算するループを生成することになる。そのような実装形態は、生成されたコードに基づく元の実装形態よりもはるかに劣ることになり、そのためこの分離はこの方法の一部として組み込まれている。
3番目のステップ320のマッチングを上記の例に適用すると、3つの別々のDFGのマッチングに成功し(図7、図8および図9)、したがって3つのセグメントすべてを1つのループで実装することができ、ループの最初の反復回である図7によって示される。リスト3に、3番目のステップ320のマッチングを適用した結果のコードも示す。
リスト3 この方法の3番目のステップ320の後の、Nz、Ns、NmおよびNyがそれぞれ512、32、1024および64に等しい実行を考慮したフィルタ・サブバンド
Figure 0007407192000002
4番目のステップ(順次マッチング)の目的は、パイプライン化を実装することである。3番目のステップ320では、出力の並列化を扱っている。しかし、その後でも多くの最適化の見込みのある大きなグラフが依然として存在している。4番目のステップ330では、この方法および装置は、特定の基準を満たす潜在的な変数を特定し、この変数に沿ってグラフをパイプライン化する。一態様では、この方法は、より頻繁に書かれている変数のうちの1つを選択する。これは、最長のパイプラインの構築を試みる発見的方法である。次に、この方法および装置は、選択された変数のそれぞれの新たな値を生成するシーケンスをマッチングして、パイプライン化可能なループを特定する。マッピング・アルゴリズム・パイプラインは、前のステップで作成された、図6および図7に示すグラフ階層構造をたどる。パイプラインが前のループを中断させる場合、この方法および装置はこの4番目のステップ330ではループを優先する。4番目のステップ330は、結果のパイプラインを実装するようにグラフを再構築する。この4番目のステップ330は、グラフをさらにコンパクトにするとともにグラフの構造を改良するという利点を有する。
このステップの効果の一例は、フィルタ・サブバンド・ベンチマークへの適用である。リスト1における元のコードを分析すると、y値が計算されるたびに、そのy値をただちに使用することができる一方で、他のy値が計算されることが明らかである。この関係は元のコードでは明示的ではなく、したがってHLSツールはこの並列化の可能性を認識するのが困難である可能性がある。しかし、DFG表現により、この並列化が特定しやすくなる。このベンチマークのグラフが4番目のステップ330に達すると、この方法および装置はベクトルsに沿ってパイプライン化することを選択し、その結果、リスト2のコードとなる。
リスト2のアルゴリズムのこの修正された記述は、並列化を明確に顕在化して、この並列化を利用することができるパイプラインを実装する。
リスト2 この方法の4番目のステップ330後の、Nz、Ns、NmおよびNyがそれぞれ512、32、1024および64に等しい実行を考慮したフィルタ・サブバンド
Figure 0007407192000003
4番目のステップ330のパイプライン化をフィルタ・サブバンド・ベンチマークに適用することによって、この方法および装置は図10、図11、および図12に示すDFGを得る。グラフは、配列sに沿ってパイプライン化されている。図11および図12の部分グラフは、パイプライン化の外側ループと内側ループの単一反復回を表す。各反復回において、外側ループはy値を計算し、この値が次に内側ループで使用される。内側ループでは、各yがs配列のすべての出力を計算するために使用される。図10の部分グラフは、パイプライン化をマッチングしなかったデータフローを示す。この場合、データフローはs配列の初期設定であった。
5番目のステップ340は、データフロー最適化を適用するためのステップである。一態様では、5番目のステップ340はメモリ・アクセスを最適化する。5番目のステップ340における最適化の非限定的一例は、メモリ再利用である。この方法および装置は、冗長なメモリ・アクセスがあるかを特定するために現在のループを分析する。この冗長性がパターンに従っている場合、この方法および装置はバッファを使用して、反復回間の値を格納し、それによってメモリ読み出しの回数を削減する。これにより、特定のアプリケーションのメモリ・ボトルネックを大幅に抑制することができる。このメモリ最適化は、3番目のステップ320と4番目のステップ330のループに適用することができる。3番目のステップ320におけるループが基準に合う場合、アクセスを最適化することによってデータフローが変化し、4番目のステップ330におけるパイプラインが実装されなくなるため、4番目のステップ330はスキップされ、この最適化が適用される。
選択可能な別の最適化は、メモリ・ボトルネックを軽減するための配列の完全分割である。前述の最適化は、値をバッファに格納することによってデータ再利用によりメモリ・アクセスを削減する。メモリ・ボトルネックを低減するもう1つの方法は、HLSツールによって提供される配列分割ディレクティブによるものである。この場合、この方法および装置は、DFG全体を通して最終パスを行う。メモリへの別々の同時アクセスの数に基づいて、この方法および装置は、検出された同時メモリ・アクセスの最大数を単一のサイクルでスケジュールすることができるように、適切な配列分割ファクタを設定することができる。この最適化により資源使用を大幅に向上させることができる。これは、演算のより多くを並列に実行することができるように、第1に、BRAMのうちのより多くのBRAMを使用することにより、第2にメモリ・ボトルネックを低減することによる。この最適化は、グラフの構造を変更せず、単に異なるディレクティブとするのみである。フィルタ・サブバンド関数に適用すると、この最適化はリスト4に含まれる配列分割ディレクティブを差し込む。
リスト4 この方法の5番目のステップ340と6番目のステップ350を完全に通過した後の、Nz、Ns、NmおよびNyがそれぞれ512、32、1024および64に等しい実行を考慮したフィルタ・サブバンド
Figure 0007407192000004
最適化の1つのタイプは、演算最適化に焦点を合わせる。このタイプの最適化の1つは、累積を部分和のシーケンスとして再構築する累積最適化である。バックエンドは、まず、累積チェーンを検出する。次に、バックエンドはそのチェーンを削除し、代わりに平衡木(より多くのILPを提供する)構造によって同じ計算を実装する。図13に、図14のチェーンと比較して平衡累積を示す。4つのシーケンス化された加算の代わりに、新たなデータフローは2つの並列加算の後にもう1つの加算が続く木からなる。平衡木の結果は次に、前の反復回からのs値と合計される。この方法および装置がリスト4のコードに見られる部分和を得るのは、このアンフォールドによるものである。
6番目のステップ350は、より多くのILPを顕在化させるために、この方法および装置が生成したループをアンフォールドする。このアンフォールドは、ループのデータフローを再現する一方、反復回間の依存関係が確実に維持されるようにすることによって、実装される。ループをアンフォールドすることによって、より多くの最適化が得られ、それによってこの6番目のステップ350の後に5番目のステップ340を行うことができる。この方法は、構成ファイル130で示されている同時ロード/ストアの数に基づいてループをアンフォールドする。6番目のステップ350が5番目のステップからDFGを受け取り、アンロールするループがそれ以上なくなると、DFGは最終ステップに送られる。
図14に、図12に示すフィルタ・サブバンド・パイプライン・ループの内側ループのアンフォールドの結果を示す。バックエンドは、データフロー、この場合は加算と乗算を再現し、次に、反復回間の正しい依存関係を維持するようにデータフローを接続し、その結果、累積チェーンが得られる。エッジにおいて、メモリへの更新されたアクセスと、区別のために付加ラベルが付加されたコピーされた変数とが示されている。このアンフォールドされたデータフローは、上記の最適化を適用する5番目のステップ340に戻される。この方法がリスト4のコードに見られるアンフォールドされたコードを得るのは、このアンフォールドによる。この場合、外側ループは4倍にアンフォールドされている。
最後のステップ360は、ディレクティブを有する出力Cコードを書くことによってハードウェア・アクセラレータのためのプログラムを出力するために設けられている。この方法および装置は、生成されたDFG125が表すCコードを書き出し、構成ファイル130で指定されている同時メモリ・アクセスの数に基づくメモリ分割などの必要なディレクティブを付加する。最後に、ステップ370で出力プログラムをハードウェア・アクセラレータに提供することができる。
別の実施形態では、この方法および装置は以下によって入力DFGを得ることもできる。
(a)アプリケーションが実行されるときに(GraphVizのドットなど)DFGのテキスト表現を報告するインストルメンテーション・コードを備えたアプリケーションを実行する。
(b)実行された命令を報告するインストルメンテーション・コードを備えるアプリケーションを実行し、次にソフトウェア・ツールが実行トレースからDFGを構築することができる。
(c)実行されたアセンブリ命令、バイトコード命令または中間表現命令を報告または監視する(これは、逆アセンブルおよびメモリ非曖昧化を含むことがある)。
(d)ループを完全にアンロールすることができ、関数をインライン展開することができ、結果のコードのDFGを生成するコンパイラ(入力データに依存する値を扱う場合、コンパイラは典型値、最小、平均および最大期待値に関する情報に依拠し得る)。
本明細書の方法および装置は、多様なコンピューティング・プラットフォームを対象とする場合の実行時間、電力およびエネルギー消費を改善する。FPGAのためのHLSツール(および特にXilinx Vivado HLSツール)のためのコード再構築およびディレクティブ挿入に焦点を合わせた例を示したが、本発明は以下の文脈でも使用可能である。
(a)ディレクティブ出力に関して可能な修正を必要とするFPGAを対象とする他のHLSツール(LegUpなど)
(b)ASICを対象とするHLSツール
(c)FPGAを対象とするOpenCLコードのコード生成
(d)マルチコアおよび/またはGPUを対象とするOpenCLまたはCUDAのコード生成
(e)場合によりOpenMPおよびOpenACCなどのディレクティブ駆動型プログラミング・モデルで拡張されたスレッド・ライブラリまたはCコードを使用してマルチスレッド・コードを生成する、マルチコアCPUおよび複数CPUを対象とするCコード生成
(f)SIMDアーキテクチャのための適切なCコード生成、および適切なベクトル化
実験結果
本節では、本明細書の方法および装置によって得られた最初の実験結果を示す。一連のベンチマークを使用した。すべてのベンチマークが、制御フローがきわめて少ない演算量の多いアルゴリズムからなり、DSPアルゴリズムを代表する。ベンチマークは、テキサス・インスツルメンツのDSPLIB[3]、UTDSP Benchmark Suite[4]、またはMPEGアプリケーションからのものである。使用した最も単純なベンチマークは、DSPLIBのドット積である。DSPLIBの自己相関ベンチマークも使用している。1D firベンチマークは、N個のタップを有するFIR(有限インパルス応答)フィルタを実装する典型的なコードである。フィルタ・サブバンド・ベンチマークは、MPEGアプリケーションのものである。2D Convolutionが、最大のベンチマークであり、これは2D畳み込みを実行するカーネルである。この畳み込みは、UTDSPのソーベル・エッジ検出アプリケーションの一部である。
複数の最適化レベルについてのこの方法および装置の有効性を表1に示す。レベル01は、ディレクティブまたはコード再構築を適用しない。レベル02は、図3に示すすべてのステップを通過するが、5番目のステップ340の最適化を実装しない。レベル03は、前記レベルに自動メモリ分割ディレクティブを追加する。レベル04は、5番目のステップ350におけるメモリ最適化を追加する。レベル05は、レベル03に演算最適化を追加し、レベル06はレベル04に演算最適化を追加する。レベル07とレベル08は、それぞれレベル05および06に完全配列分割を適用する。

Figure 0007407192000005
これらの最適化を考慮して生成されたCコードの結果を、入力Cコードにわたって手動による最適化と比較する。Cコードのベースラインが表2に簡単に要約されている。ソフトウェア・プログラマがいくつかのきわめて基本的なディレクティブを使用することができるであろうというのは妥当な想定である。しかし、典型的なソフトウェア・プログラマがすべての種類のディレクティブに精通していると想定することはできない。したがって、この評価手法は、この方法の有効性を、異なるレベルのハードウェア設計知識について調査することを可能にしている。

Figure 0007407192000006


Figure 0007407192000007
32GBのRAMを有するインテル・コアi7-7700を備えたPCでCコードをVivado HLS2017.4により、Artix(TM)-7FPGA、85Kロジック・セル(xc7z020clg4841)を対象として合成し、速度と資源値とを得ている。20nsの制約を有するフィルタ・サブバンド・ベンチマーク以外は、ベンチマークのすべてが10nsの時間制約を有していた。ハードウェア実装形態の合計時間は、クロック周期とレイテンシとの乗算として計算される。高速化は、表2の実装形態の合計時間を異なる最適化レベルの結果の合計時間で割った結果である。
図15に示すフィルタ・サブバンド・ベンチマークは、すべてのレベルにおいてこの方法および装置がC-highと比較しても高速化向上を示しているため、この方法および装置の態様を示すためのきわめてよい例である。図15は、元のC実装形態(左軸)および最適化されたC-high実装形態(右軸)と比較した高速化を示す。バーと点の上部に明確な値が示されている。バーは元のCに関する高速化を示し、点はC-highを基準にした高速化を示す。ベンチマークにはループがなく、完全にアンフォールドされているためにレベル01はほとんどのILPを顕在化させるため、レベル01には大幅な高速化がある。しかし、その資源使用量は、使用されているFPGAの最大資源量を大幅に超える。
資源使用量を制限するために、この方法および装置はループにおけるデータフローをフォールドする。レベル02でフォールドすることによって、この方法および装置は、C-highバージョンと比較して改善された結果を達成する。これは、リスト2に見られるように、アルゴリズムをより効率的に実行する、この方法および装置によって生成されたパイプラインによるものである。レベル03において、高速化はC-highと比較して2.81倍に向上している。レベル04の最適化の結果、C-highと比較して2.55倍の高速化となる。この高速化は、この方法および装置が反復回1回当たりのメモリ読み出しを半分にするデータによる。これは、この方法および装置が、メモリ読み出しの量を低減することによってパイプラインの開始値を下げることができるため、パイプラインに対する効果が大きい。最適化されたループは3番目のステップ320のループであり、したがって、4番目のステップ330の最適化は適用することができない。したがって、高速化はレベル03よりは低い。この例では、得られた最大周波数は約54.5Mhzであった。
レベル05は、C-highと比較して3.28倍の高速化を獲得する。これは、レベル03における2.81倍と比較して大幅な向上である。演算最適化は、実装形態のレイテンシまたは反復間隔には大きな影響を与えない。反復間隔は後続の反復回間の時間である。反復間隔が小さいほど、より多くの計算が並列で行われており、それによってレイテンシが低減し、クロック・サイクル数が減少していることを示している。しかし、累積チェーンを分割することによって、Vivado HLSはコードを異なる方式で合成する。従来は、チェーン化された加算を実行するために、Vivado HLSは、より効率的となるように互いにチェーン化されている加算器を適用していた。しかし、部分和により、Vivado HLSは加算を並列に合成する。このような加算器の実装は異なっており、したがって、その結果はより大幅な高速化につながるより低い頻度を有する。レベル06において演算最適化を追加することにより、3.43倍の高速化が得られる。以前には加算のすべての結果が出力ベクトルに保存されていたことにより、Vivado HLSは、すべての中間値をメモリに書き込む必要があったが、これは不要である。このチェーンを平衡化し、結果をローカル変数に記憶することによって、メモリ・アクセスにより生じる遅延が解消される。レベル07は、メモリを分割することによってより多くのILPが可能であるため、C-highと比較して5.49倍の高速化を獲得する。レベル08は、高速化がきわめて大きいが、必要な資源が対象FPGAのキャパシティをはるかに超えるため、含めていない。資源使用量に関しては、すべての実装形態が、より多くのILPを有するため、より多くの資源を使用する(表3参照)。しかし、出力コードがローカル配列を使用しなくなり、その代わりに値をレジスタに格納するため、これらの実装形態が使用するBRAMはより少ない。以前の方法では、Vivado HLSは2つの異なるループを扱っており、したがってHLSツールは、新たなループを開始する前に最初のループで計算された値をメモリに記憶する必要があった。唯一の例外は、多くのBRAMを使用するレベル04である。これは、この実装形態のコードがすべての加算の結果を出力ベクトルに格納するためである。したがって、パイプライン化を可能にするためには、HLSツールは、値が失われないように保証するために加算の結果を格納するための追加のBRAMをインスタンス化する必要がある。しかし、レベル06において加算を分割することによって、Vivado HLSは出力ベクトルに最後にのみ格納する。したがって、HLSツールは追加のBRAMを必要とせず、その代わりにそれらをレジスタに保存する。
ドット積は、単純なカーネルである。最初の最適化レベルはよりよい結果にはつながらない。この方法および装置がメモリ分割を適用した後は、この方法および装置はC-highバージョンの速度に匹敵する(表4参照)。出力レベル03は、入力の基本バージョンおよび中間バージョンよりもそれぞれ16.8倍および5.6倍の高速化により高速である。メモリ冗長性がない場合、レベル04は結果を変化させない。レベル02の最大周波数は156MHzであり、レベル03の最大周波数は112MHzであった。

Figure 0007407192000008
1D firベンチマークは5番目のステップ340における最適化の効果を示す。レベル02およびレベル03において単にフォールドすることにより、C-highバージョンとほぼ同じ結果が得られた。これは、この方法が元のものと同じループを生成するためである。レベル03の出力は、C-interと比較して1.86倍しか向上しない。この方法および装置がレベル04でアクセスを最適化すると、高速化はC-highバージョンと比較して14.39倍、C-interと比較して26.7倍である。これは、すでに最適化されている実装形態の大幅な向上である。このFIRベンチマークはN=32タップ(係数)を使用している。したがって、新たな出力を計算するために32個の入力を必要とする。しかし、前の反復回から31個の入力が再利用され、したがってこの最適化では新たな値は1つしか読み出されず、その結果、パフォーマンスが大幅に向上する。レベル06の演算最適化は、04と比較して高速化に効果がない。レベル07の最適化は、05の1倍と比較して8倍の高速化に達する大きな効果がある。これは、メモリ・ボトルネックを最小限にするメモリ分割による。レベル08においてメモリを分割することにより、レベル06の高速化はC-highと比較して16.18倍に上昇させる。この場合も、より多くのILPの顕在化により資源使用量が増大する(表5参照)。最も顕著な上昇は、より多くの値を格納するフリップ・フロップ(FF)と、より多くの並行乗算を行うDSP(デジタル・シグナル・プロセッシング)における上昇である。すべてのレベルについて、最大周波数は114MHzであった。表中のLUTは、ルックアップ・テーブルを意味する。

Figure 0007407192000009
自己相関は、きわめて興味深い結果を示すもう1つのカーネルである。自己相関は、大きい内側ループを有する小さい最も外側のループからなる。この方法は、レベル02によって、C-highと比較して1.3倍、C-interと比較して2.7倍の向上を示す良好な結果を得ている。これは、外側ループのアンロール・ディレクティブがアンロールされたコードのループ融合を考慮しない最も内側のループによるものである。このディレクティブは、内側ループの複数の独立したコピーを生成する。手動アンフォールドは、これらを結合して単一のループとし、より多くのILPを顕在化させる。これは、多くの冗長メモリ使用がある自己相関アプリケーションにおいて多くの利点を有する。パイプラインが分割される場合、Vivado HLSは、カーネルにおける冗長アクセスを利用しないことになり、より多くのメモリ読み出しをスケジュールする。本明細書のDFG手法は、データフローを再現し、単一の内側ループを継続して有するだけでよいため、より良好なアンロールされたループの生成を可能にするため、この改良されたループ・アンロール能力はDFG手法の別の優位性も強調する。前述のように、このアプリケーションは多くの冗長記憶を有するため、このアプリケーションはレベル04最適化の最良の対象である。この方法および装置がメモリ使用を最適化する場合、速度の大幅な向上が見られ、C-highの7.9倍速い。この速度の大幅な向上は、資源使用量の大幅な増加という代償を払って達成される(表6参照)。この増加は、3番目のステップ320のループにメモリ最適化を適用することにより、4番目のステップ330にフォールドがなくなり、それにより、結果のコードがさらに大きくアンロールされるためである。レベル06における演算最適化は、レベル04と比較して高速化を向上させない。レベル08は、C-highと比較して47.49倍の高速化を達成し、これは他よりもはるかに大きい。これは、この方法が入力配列を完全に分割するためであり、レベル06の自己相関ベンチマークの場合には、ループを開始する前に多くのサイクルがsd値を読み出すことに使用されていた。単一のサイクルでこれらをすべて読み出すことは、出力に大きな影響を及ぼす。しかし、このレベルの分割が可能なのは、自己相関ベクトルが170個の整数値からなる小さい入力ベクトルであるためである。より大きなベクトルは、完全に分割することができない。レベル08はレベル06と比較して資源使用量を大幅に増加させない。すべてのレベルが最大周波数130MHzを得る。

Figure 0007407192000010
2D Convolutionベンチマークのための前述の事例の一部におけるように、レベル02およびレベル03は同じループを生成し、したがってC-highと比較して高速化はなく、C-interと比較すると1.6倍の高速化となる。3×3カーネルでは、次の画素に進むたびに、隣接9画素を読み取る必要がある。これらの画素のうちの6画素が前の画素の計算に使用されているため、必要な新たな値は3個のみである。

Figure 0007407192000011
レベル04のデータ再利用を適用することによって、C-highと比較して1.36倍、C-interと比較して2.25倍の高速化を達成する。この場合、メモリ・アクセスがより少ないため、内側ループのパイプラインについて実現される反復間隔は、6ではなく3である。この高速化は、メモリ再利用を追加することによってループの構造を変えるために、期待したほど大きくはない。2D畳み込みは、2D配列をたどるのに2つのネストされたループを使用する。元のコードには、外側ループと内側ループとの間に演算はなく、そのため元のコードは完全なループである。メモリ・アクセスを最適化することによって、内側ループに入る前にバッファにロードされ、それによって外側ループは完全なループではなくなる。従来、Vivado HLSはループを自動的に平坦化し、実行を最適化していた。完全なループがなければこれは不可能であり、期待されるほど向上しない。資源使用量は、C-highバージョンより少しだけ多い(表7参照)。2D畳み込みは、他のベンチマークよりもはるかに演算が多く、Vivado HLSによって完全にアンフォールドすることはできない。したがってレベル01の結果はない。
レベル06では、この高速化は、この高速化を演算最適化と組み合わせることによって向上する。この場合の差別化要因は、ループにおける除算の最適化である。除数はすべての反復回で共通であるため、この方法は逆数をループの外部で計算し、除算を逆数による乗算で代用する。ハードウェアにおいて乗算は除算よりも効率的であるため、これによりパイプライン深度が浅くなる。したがって、このレベルの高速化は1.64倍である。レベル05の結果は、データ再利用のない演算最適化は、単にループ平坦化のため、大きな効果がないことを示している。レベル06と同様に、反復レイテンシは削減されるが、ループ平坦化に起因して実装形態には1つのループしかなく、パイプラインを開始する前にループ外部でやはり除算が実装される必要があるため、多くのステップを有する大きなパイプラインにおける反復レイテンシを削減しても大きな効果はない。ループ平坦化のないレベル06では、ループ内でより小さいパイプラインが複数回実行されることになり、したがって、反復レイテンシの削減はより大きな効果がある。除算最適化のもう1つの利点は、除算最適化によって資源使用量が削減されることである(表7参照)。レベル07およびレベル08における配列の分割は、それぞれ2.99倍および2.5倍の高速化を達成する。他の事例とは異なり、レベル07は08よりも良好な実装を有する。これは、この場合、Vivado HLSが2つの解決策を実装する方式に起因する。レベル08は、07よりも反復間隔がより小さく、深度がより浅いパイプラインを有する。08の分割のパフォーマンスは実際にはよりよいが、Vivado HLSの実装は、内側ループが2倍にアンロールされ、Vivado HLSが最後の2つの乗算を単一の乗算器よりもより頻度の高い単一のユニットで実装するため、結果をより悪化させる。これは07では起こらず、したがって頻度はより低く、それによってより高い高速化が得られる。レベル07の場合、メモリ分割が適用されるが演算分割が適用されない場合、累積チェーンが実装の有効性を低下させるため高速化は2.27倍に過ぎなくなる。したがって、単なるディレクティブによるメモリの分割の問題ではない。また、より多くのILPおよびより大幅な高速化を引き出すためにコードを再構築する必要もある。このベンチマークのすべての最適化レベルが114MHzの最大周波数を達成する。
すべてのCコードが手動介入なしに完全にこの方法および装置によって生成され、提示されたその結果は、この手法、および特に本明細書の方法および装置の有用性を強力に証明している。
バックエンド135の実行時間を計測した。ほとんどのベンチマークについて実行時間は1秒と2秒の間であったが、例外として、2D Convolutionベンチマークは最大のDFGによるベンチマークでもあるため、平均して11秒と12秒の間であった。もう1つの例外は、5秒で実行される自己相関ベンチマークのレベル04である。メモリ最適化により、4番目のステップ330のフォールドはなく、出力コード・ステップ370に大きなDFGが入力される。最速のレベルは02および03であった。レベル01は最適化を実装しないが、大きなDFGを出力することで長い実行時間につながる。レベル04の実行時間の増加は、最適化されたループの複雑さとサイズとに依存する。
バックエンドの実行時間に対するデータセット・サイズの影響、したがって入力DFGサイズの影響を分析するために、2D Convolutionベンチマークの異なる入力サイズについてバックエンドの実行時間を計測した。計測のために選択された最適化レベルは07であった。計測は、ステップ360におけるCコードの生成に至るまでの、ステップ310からステップ360までの完了に必要な実行時間を含み、入力画像サイズが64×64、96×96、128×128、および160×160の場合である。96×96の入力サイズでは、バックエンドを実行するのに50秒かかる。この入力サイズを128×128に増やすと、バックエンドを実行するのにほぼ2.8分かかる。160×160の入力サイズは、バックエンドで処理されるのに約7分を要する。反復回間でこの増加率が一定しているとすると、256×256の入力画像を処理するのに約28分を要することになり、これは低めの画素解像度では長時間である。したがって、この手法の現在の実装形態は大きな入力トレースにはあまり拡張性がない。
すべてのステップについて所要時間を分析すると、大幅な増加の理由は2番目のステップ310を処理するのに要する時間であることが明らかである。3番目のステップ320が常に入力DFGを同じサイズにコンパクト化するため、4番目330から7番目のステップ360に要する時間は、入力サイズに応じて変化しない。3番目のステップ320は、より大きな入力でもあまり長い時間を要しない。これは、2番目のステップ310の処理が、3番目のステップ320のマッチングを効率的に適用することができるようにするためである。かなりの実行時間を要するのは2番目のステップ310である。96×96画素の出力画像は9216個の出力を有し、128×128は16384個の出力を有し、すなわち約2倍の出力数である。上述のように、バックエンドは出力を生成するすべてのデータフローを分離する。それぞれを均一化し、次に共通ノードについて比較する。これは、128×128画像の場合、バックエンドが16384本のデータフローを生成し、均一化し、比較することを意味する。バックエンドを加速し、この手法の拡張性をより高くする1つの方法は、2番目のステップ310のより効率的な実装であろう。例えば、2番目のステップ310は、出力のDFGが生成されるときに共通ノードと固有ノードとを分離するように最適化することができる。
現在、この方法および装置は与えられた構成の速度の最適化を試みている。しかし、この方法および装置は、フォールドのレベルを上げるかまたは並行ロード/ストアの数を変更する以外には、資源使用量を扱う直接的な方法を提示しない。しかし、これらの間接的な方式は最適化を無用に制限する可能性がある。さらに、5番目のステップ340のデータ再利用などの一部の最適化は、高い資源使用量につながる可能性がある。したがって、資源使用量を制御するために2つの側面を考慮することができる。すなわち、(a)バックエンド最適化の選択と、(b)HLSツールを制御するディレクティブの選択である。Vivado HLSの場合、資源使用量を最小限にする直接的な方式は、資源割り当てディレクティブによるものである。Vivado HLSは、資源数または特定の量の並行演算の制限を可能にする。例えば、ベンチマーク自己相関のレベル04の場合の並行乗算の量を40に制限することによって、結果の実装形態は、DSPを160個に対して40個のみ使用するが、C-highに対する高速化は7.91倍と比較して6.09倍である。このように、4分の1の数のDSPで、高速化は元の実装形態の77%に低下するに過ぎない。この例は、高速化を大幅に犠牲にせずに資源を直接制限する単純な事例を示している。したがってバックエンド135に資源を制限するためのディレクティブを挿入するように指示するために潜在的により多くの構成が実装され得る。
本開示は、ソフトウェア・コードをハイレベル合成(HLS)ツールにより適するように変換する手法を提示する。この手法は、インストルメンテーション・コードが事前に付加されたアプリケーションの重要機能を実行することによって現在得られる(算術、論理、演算子レベルの)計算のデータフロー・グラフ(DFG)表現に基づく。この手法は、グラフ演算をフォールドおよびアンフォールドすることに主として依拠し、重要なアプリケーション・カーネルのコードを完全に再構築することができる方法で実装された。現在の研究ではCコードが入力として考慮されているが、この手法は、適切なインストルメンテーション・コードの組み込みにより、異なる入力プログラミング言語に対処する可能性も有している。この方法のバックエンド135は、DFGを自動的に再構築することができ、HLSにとって使いやすい方式でディレクティブが付加されたCコードを生成することができる。得られた結果はきわめて有望である。元のCコードと比較すると、本開示の方法および装置によって生成されたCコードは、元のCコードよりパフォーマンスが優れ、大幅な高速化が達成される。実現されたCコードは、手動で最適化された、ディレクティブが付加されたCコードに匹敵し、ほとんどの場合、よりすぐれている。したがって、この手法は、ソフトウェア開発者が、典型的なHLSツールをバックエンド135として使用し、HLS専門家の支援を必要とせずに、効率的なハードウェア・アクセラレータを対象とすることを可能にし得る。
謝辞
INESC TECは、プロジェクト「TEC4Growth -TL -SMILES-5 Pervasive Intelligence, Enhancers and Proofs of Concept with Industrial Impact」(NORTE-01-0145-FEDER-00020)の下で、本研究の開発の過程で助成金を提供しており、また、プロジェクトCONTEXTWA (POCI-01-0145-FEDER-016883)からの基金が使用され、両者は欧州地域開発基金によって資金提供されている。
参考文献
[0001]R. Nane, V. M. Sima, C. Pilato, J. Choi, B. Fort, A. Canis, Y. T. Chen, H. Hsiao, S. Brown, F. Ferrandi, J. Anderson, and K. Bertels. A survey and evaluation of FPGA high-level synthesis tools. IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems, 35 (10):1591-1604, Oct 2016.
[0002]Joao M. P. Cardoso and Markus Weinhardt. High-level Synthesis, pages 23-47. Springer International Publishing, Cham, 2016.
[0003]Texas Instrument, TMS320C6000 DSP Library (DSPLIB), accessed in 16 June 2018. URL http://www.ti.com/tool/sprc265
[0004]Corina G.Lee, 15 Aug 2002, accessed in 16 June 2018. URL http://www.eecg.toronto.edu/~corinna/DSP/infrastructure/UTDSP.tar.gz
[0005]Cong, Jason Huang, Muhuan Pan, Peichen Wang, Yuxin Zhang, Peng. (2016). Source-to-Source Optimization for HLS, pages 137-163. Springer International Publishing, Cham, 2016.
[0006]J. M. P. Cardoso, J. Teixeira, J. C. Alves, R. Nobre, P. C. Diniz, J. G. F. Coutinho, and W. Luk. Specifying compiler strategies for FPGA-based systems. In 2012 IEEE 20th International Symposium on Field Programmable Custom Computing Machines, pages 192-199, April 2012.
[0007]O. Mencer. ASC: a stream compiler for computing with FPGAs. IEEE Transactions on Computer Aided Design of Integrated Circuits and Systems, 25(9):1603-1617, Sept 2006.
[0008]Andrew Canis, Jongsok Choi, Mark Aldham, Victor Zhang, Ahmed Kammoona, Tomasz Czajkowski, Stephen D. Brown, and Jason H. Anderson. LegUP: An open-source high-level synthesis tool for FPGA based processor/accelerator systems. ACM Trans. Embed. Comput. Syst., 13(2):24:1-24:27, Sep. 2013.
[0009]LLVM. The llvm compiler infrastructure project, 2018. URL https://llvm.org.
[0010]Maxeler Technologies. Maxcompiler white paper, 2017. https://www.maxeler.com/ media/documents/MaxelerWhitePaperProgramming.pdf.
[0011]N. Voss, S. Girdlestone, O. Mencer, and G. Gaydadjiev. Automated dataflow graph merging. In 2016 International Conference on Embedded Computer Systems: Architectures, Modeling and Simulation (SAMOS16), pages 219-226, July 2016.

Claims (10)

  1. 装置に含まれるフィールド・プログラマブル・ゲート・アレイ(FPGA)においてハードウェア・アクセラレータ(20)の構成を生成する方法であって、
    前記ハードウェア・アクセラレータ(20)上で実装されるアルゴリズムを記述するコードの複数の行を有し、かつ、前記コードの複数の行の前にインストルメンテーション・コード(112)が差し込まれたプログラム(105)を前記装置のフロントエンド(110)において実行(115)し、メモリにおいてアンフォールドされたデータフロー・グラフ(DFG)を生成すること(125)と、
    生成された前記アンフォールドされたデータフロー・グラフ(DFG)を前記装置のバックエンド(135)に渡すことと、
    前記アンフォールドされたデータフロー・グラフ(DFG)における反復パターンを特定し、不要ノードの刈り込み(310)を行うことと、
    冗長メモリ・アクセスを特定して冗長メモリ・アクセスを削除すること、再利用値のバッファへの記憶を行うこと、または前記ハードウェア・アクセラレータ(20)において利用可能な資源へのメモリ・アクセスを適応化することのうちの少なくとも1つによって、前記バックエンド(135)において前記アンフォールドされたデータフロー・グラフ(DFG)を最適化することと、
    記最適化されたデータフロー・グラフ(DFG)から出力プログラム(140)を出力(360)して、前記ハードウェア・アクセラレータ(20)の構成を生成することとを含む方法。
  2. 前記アンフォールドされたデータフロー・グラフ(DFG)の前記最適化は、前記特定された反復パターンを前記データフロー・グラフ(DFG)内にフォールディングすることを含む、請求項に記載の方法。
  3. 不要ノードの前記刈り込み(310)は、ローカル配列をスカラー変数に変換することを含む、請求項に記載の方法。
  4. 出力された配列内の出力値の個別データフローを特定することと、出力上の共通の演算を、前記出力の1つ1つに固有の演算から分けて、それにより、前記共通の演算を有するグラフと、前記固有の演算を有するグラフのリストとを生成することをさらに含む、請求項1からのいずれかに記載の方法。
  5. 算術演算におけるステップの数を削減すること、または並行算術演算の数を増やすことのうちの少なくとも一方をさらに含む、請求項1からのいずれか一項に記載の方法。
  6. 前記アンフォールドされたデータフロー・グラフ(DFG)におけるパイプライン化を特定すること(330)をさらに含む、請求項1からのいずれかに記載の方法。
  7. 前記アンフォールドされたデータフロー・グラフ(DFG)は複数のループを含み、前記方法は、前記データフロー・グラフ(DFG)における前記複数のループのうちの1つまたは複数のループをアンフォールドすること(350)と、次に前記データフロー・グラフ(DFG)の前記最適化を繰り返すこととをさらに含む、請求項1からのいずれか一項に記載の方法。
  8. ハードウェア・アクセラレータ(20)の構成方法であって、
    請求項1からのいずれか一項により前記ハードウェア・アクセラレータ(20)の構成を、前記ハードウェア・アクセラレータ(20)の前記構成を表す出力プログラム(140)の形態で生成することと、
    前記出力プログラム(140)を前記ハードウェア・アクセラレータ(20)に提供し、それによって前記ハードウェア・アクセラレータ(20)の構成を可能にすることとを含む方法。
  9. 請求項1からのいずれか一項に記載の方法を実装するように構成された装置。
  10. 複数の電子構成要素を含むハードウェア・アクセラレータ(20)であって、前記複数の電子構成要素は、請求項1からのいずれか一項に記載の方法によって出力される出力プログラム(140)によってプログラムされる(370)、ハードウェア・アクセラレータ。
JP2021531192A 2018-08-09 2019-08-09 フィールド・プログラマブル・ゲート・アレイのためのコードを最適化する方法および装置 Active JP7407192B2 (ja)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
PT20181000054166 2018-08-09
PT2018154166 2018-08-09
EP18189022.9 2018-08-14
EP18189022.9A EP3611613A1 (en) 2018-08-14 2018-08-14 Method and apparatus for optimizing code for field programmable gate arrays
PCT/EP2019/071491 WO2020030807A1 (en) 2018-08-09 2019-08-09 Method and apparatus for optimizing code for field programmable gate arrays

Publications (2)

Publication Number Publication Date
JP2022508296A JP2022508296A (ja) 2022-01-19
JP7407192B2 true JP7407192B2 (ja) 2023-12-28

Family

ID=75684130

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2021531192A Active JP7407192B2 (ja) 2018-08-09 2019-08-09 フィールド・プログラマブル・ゲート・アレイのためのコードを最適化する方法および装置

Country Status (5)

Country Link
US (1) US11656857B2 (ja)
EP (1) EP3827336A1 (ja)
JP (1) JP7407192B2 (ja)
CN (1) CN112840316A (ja)
WO (1) WO2020030807A1 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2021097784A1 (en) * 2019-11-22 2021-05-27 Huawei Technologies Co., Ltd. Method and system for constructing compiler intermediate representations from tensorflow graph

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010238054A (ja) 2009-03-31 2010-10-21 Mitsubishi Electric Corp 半導体設計支援装置、高位合成方法及び半導体設計支援プログラム
JP2012083901A (ja) 2010-10-08 2012-04-26 Nec Corp 構成情報管理装置、その方法及びそのプログラム並びに動作合成装置
JP2014095955A (ja) 2012-11-07 2014-05-22 Ricoh Co Ltd 半導体集積回路の設計装置及び設計方法
WO2017158785A1 (ja) 2016-03-17 2017-09-21 三菱電機株式会社 高位合成装置、高位合成方法及び高位合成プログラム

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6507947B1 (en) * 1999-08-20 2003-01-14 Hewlett-Packard Company Programmatic synthesis of processor element arrays
FR2865047B1 (fr) * 2004-01-14 2006-04-07 Commissariat Energie Atomique Systeme de generation automatique de codes optimises
US7565631B1 (en) * 2004-07-02 2009-07-21 Northwestern University Method and system for translating software binaries and assembly code onto hardware
WO2010140883A2 (en) * 2009-06-02 2010-12-09 Vector Fabrics B.V. Improvements in embedded system development
US9367658B2 (en) 2011-06-22 2016-06-14 Maxeler Technologies Ltd. Method and apparatus for designing and generating a stream processor
US9424079B2 (en) * 2013-06-27 2016-08-23 Microsoft Technology Licensing, Llc Iteration support in a heterogeneous dataflow engine
US10089259B2 (en) 2015-07-21 2018-10-02 BigStream Solutions, Inc. Precise, efficient, and transparent transfer of execution between an auto-generated in-line accelerator and processor(s)
US10025566B1 (en) * 2016-10-07 2018-07-17 The Mathworks, Inc. Scheduling technique to transform dataflow graph into efficient schedule
EP3532937A1 (en) 2016-10-25 2019-09-04 Reconfigure.io Limited Synthesis path for transforming concurrent programs into hardware deployable on fpga-based cloud infrastructures
CN106775905A (zh) * 2016-11-19 2017-05-31 天津大学 基于fpga的高级综合实现拟牛顿算法加速的方法
US10635823B2 (en) * 2018-01-12 2020-04-28 Intel Corporation Compiling techniques for hardening software programs against branching programming exploits
US20190370407A1 (en) * 2018-05-30 2019-12-05 Ab Initio Technology Llc Systems and methods for dataflow graph optimization

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010238054A (ja) 2009-03-31 2010-10-21 Mitsubishi Electric Corp 半導体設計支援装置、高位合成方法及び半導体設計支援プログラム
JP2012083901A (ja) 2010-10-08 2012-04-26 Nec Corp 構成情報管理装置、その方法及びそのプログラム並びに動作合成装置
JP2014095955A (ja) 2012-11-07 2014-05-22 Ricoh Co Ltd 半導体集積回路の設計装置及び設計方法
WO2017158785A1 (ja) 2016-03-17 2017-09-21 三菱電機株式会社 高位合成装置、高位合成方法及び高位合成プログラム

Also Published As

Publication number Publication date
US11656857B2 (en) 2023-05-23
CN112840316A (zh) 2021-05-25
WO2020030807A1 (en) 2020-02-13
EP3827336A1 (en) 2021-06-02
US20210382702A1 (en) 2021-12-09
JP2022508296A (ja) 2022-01-19

Similar Documents

Publication Publication Date Title
Windh et al. High-level language tools for reconfigurable computing
Guo et al. A compiler intermediate representation for reconfigurable fabrics
Rus et al. Hybrid analysis: static & dynamic memory reference analysis
Numan et al. Towards automatic high-level code deployment on reconfigurable platforms: A survey of high-level synthesis tools and toolchains
JP2007528059A (ja) ソフトウェアのモデル化、抽象、および分析のためのシステムと方法
Clark et al. Scalable subgraph mapping for acyclic computation accelerators
Özkan et al. FPGA-based accelerator design from a domain-specific language
Matai et al. Enabling fpgas for the masses
Cardoso et al. Controlling a complete hardware synthesis toolchain with LARA aspects
JP7407192B2 (ja) フィールド・プログラマブル・ゲート・アレイのためのコードを最適化する方法および装置
Sbirlea et al. Dfgr an intermediate graph representation for macro-dataflow programs
Fischer et al. Design space characterization for architecture/compiler co-exploration
Menotti et al. LALP: A language to program custom FPGA-based acceleration engines
Ferreira et al. Unfolding and folding: a new approach for code restructuring targeting HLS for FPGAs
Campos et al. On data parallelism code restructuring for HLS targeting FPGAs
Vogt et al. GCC-plugin for automated accelerator generation and integration on hybrid FPGA-SoCs
Ferreira et al. Graph-based code restructuring targeting HLS for FPGAs
Hohenauer et al. C Compilers for ASIPs
EP3611613A1 (en) Method and apparatus for optimizing code for field programmable gate arrays
Lloyd et al. A case for better integration of host and target compilation when using OpenCL for FPGAs
Nawaz et al. Recursive variable expansion: A loop transformation for reconfigurable systems
Ferreira Restructuring Software Code for High-Level Synthesis Using a Graph-based Approach Targeting FPGAs
Majumder et al. Automatic multi-dimensional pipelining for high-level synthesis of dataflow accelerators
Ammar et al. Heterogeneity of abstractions in EDA tools: Reviewing models of computation for many-core systems targeting intensive signal processing applications
Fischer et al. BUILDABONG: A framework for architecture/compiler co-exploration for ASIPs

Legal Events

Date Code Title Description
A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20210218

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20210407

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20210729

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20211020

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20220803

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20230622

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20230627

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20230927

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20231120

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20231205

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20231218

R150 Certificate of patent or registration of utility model

Ref document number: 7407192

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150