(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2023177109
(43)【公開日】2023-12-13
(54)【発明の名称】入出力制御方法、入出力制御プログラム、及び入出力制御装置
(51)【国際特許分類】
G06F 30/327 20200101AFI20231206BHJP
【FI】
G06F30/327
【審査請求】未請求
【請求項の数】8
【出願形態】OL
(21)【出願番号】P 2022089832
(22)【出願日】2022-06-01
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.VERILOG
(71)【出願人】
【識別番号】000004226
【氏名又は名称】日本電信電話株式会社
(71)【出願人】
【識別番号】504157024
【氏名又は名称】国立大学法人東北大学
(74)【代理人】
【識別番号】110001519
【氏名又は名称】弁理士法人太陽国際特許事務所
(72)【発明者】
【氏名】小林 大祐
(72)【発明者】
【氏名】大森 優也
(72)【発明者】
【氏名】中村 健
(72)【発明者】
【氏名】ウィッデヤスーリヤ ハシタ ムトゥマラ
(72)【発明者】
【氏名】張山 昌論
(72)【発明者】
【氏名】岩崎 裕江
【テーマコード(参考)】
5B146
【Fターム(参考)】
5B146GA02
5B146GC02
(57)【要約】
【課題】入力サイクル数と出力サイクル数がそれぞれ異なり入出力が間欠的であったとしても、内部状態を持つRTLモジュールをOpenCLのパイプラインに組み込むことができる。
【解決手段】OpenCLカーネル20は、RTLモジュール30をライブラリとして所定のサイクル毎に呼び出し、データが有効である旨を示す有効フラグ、又はデータが無効である旨を示す無効フラグを、入力データと共にRTLモジュール30に対して入力し、RTLモジュール30は、有効フラグ又は無効フラグを、出力データと共にOpenCLカーネル20に対して出力する。
【選択図】
図2
【特許請求の範囲】
【請求項1】
OpenCL(Open Computing Language)によって記述されたOpenCLプログラムにおけるOpenCLカーネルは、レジスタ転送レベルによって設計されたRTL回路をライブラリとして所定のサイクル毎に呼び出し、データが有効である旨を示す有効フラグ、又は前記データが無効である旨を示す無効フラグを、入力データと共に前記RTL回路に対して入力し、
前記RTL回路は、前記有効フラグ又は前記無効フラグを、出力データと共に前記OpenCLカーネルに対して出力する、
入出力制御方法。
【請求項2】
前記OpenCLカーネルは、前記RTL回路が有効な前記入力データを要求している場合は、有効な前記入力データと共に前記有効フラグを入力し、前記RTL回路が有効な前記入力データを要求していない場合は、無効な前記入力データと共に前記無効フラグを入力し、
前記RTL回路は、前記OpenCLカーネルから前記有効フラグが入力された場合に、当該有効フラグと共に入力された有効な前記入力データを取り込み、前記OpenCLカーネルから前記無効フラグが入力された場合に、当該無効フラグと共に入力された無効な前記入力データを取り込まない、
請求項1に記載の入出力制御方法。
【請求項3】
前記RTL回路は、前記出力データが有効である場合に、有効な当該出力データと共に前記有効フラグを出力し、前記出力データが無効である場合に、無効な当該出力データと共に前記無効フラグを出力し、
前記OpenCLカーネルは、前記RTL回路から前記有効フラグが出力された場合に、当該有効フラグと共に出力された有効な前記出力データを記憶し、前記RTL回路から前記無効フラグが出力された場合に、当該無効フラグと共に出力された無効な前記出力データは記憶しない、
請求項1に記載の入出力制御方法。
【請求項4】
前記RTL回路が前記出力データを複数の出力ポートから出力する場合において、前記RTL回路を包含するラッパーモジュールが、当該複数の出力ポートを1つの出力ポートに多重化し、前記出力データを前記OpenCLカーネルが提供する変数のビット幅に調節する、
請求項1に記載の入出力制御方法。
【請求項5】
前記RTL回路は、前記OpenCLカーネルが有効な前記入力データを入力するサイクルの所定数前のサイクルにおいて、前記OpenCLカーネルに対して、有効な前記入力データを要求する入力要求フラグを出力し、
前記OpenCLカーネルは、前記入力要求フラグが出力された前記所定数後のサイクルにおいて、有効な前記入力データを前記RTL回路に入力する、
請求項1に記載の入出力制御方法。
【請求項6】
前記OpenCLカーネルは、前記OpenCLカーネルが前記RTL回路を呼び出した回数と前回前記OpenCLカーネルが前記RTL回路を呼び出した際における前記回数との差分、及び前記RTL回路が起動してからのサイクルの数と前回前記RTL回路が起動してからのサイクルの数との差分のうち少なくとも一方が前記所定のサイクルと同一でない場合はエラーを通知する、
請求項1に記載の入出力制御方法。
【請求項7】
コンピュータを、OpenCL(Open Computing Language)によって記述されたOpenCLプログラムにおけるOpenCLカーネルとして機能させるための入出力制御プログラムであって、
前記OpenCLカーネルは、レジスタ転送レベルによって設計されたRTLモジュールをライブラリとして所定のサイクル毎に呼び出し、データが有効である旨を示す有効フラグ、又は前記データが無効である旨を示す無効フラグを、入力データと共に前記RTLモジュールに対して入力し、
前記RTLモジュールは、前記有効フラグ又は前記無効フラグを、出力データと共に前記OpenCLカーネルに対して出力する、
入出力制御プログラム。
【請求項8】
OpenCL(Open Computing Language)によって記述されたOpenCLプログラムにおけるOpenCLカーネルを含む入出力制御装置であって、
前記OpenCLカーネルは、レジスタ転送レベルによって設計されたRTL回路をライブラリとして所定のサイクル毎に呼び出し、データが有効である旨を示す有効フラグ、又は前記データが無効である旨を示す無効フラグを、入力データと共に前記RTL回路に対して入力し、
前記RTL回路は、前記有効フラグ又は前記無効フラグを、出力データと共に前記OpenCLカーネルに対して出力する、
入出力制御装置。
【発明の詳細な説明】
【技術分野】
【0001】
開示の技術は、FPGA(Field―Programmable Gate Array)を、OpenCL(Open Computing Language)及びレジスタ転送レベル(Register Transfer Level:RTL)で設計された言語で混合記述することにより設計する場合におけるデータの入出力制御方法、入出力制御プログラム、及び入出力制御装置に関する。
【背景技術】
【0002】
近年、様々なアプリケーションのハードウェアアクセラレーションを実現するデバイスとして、FPGAが注目を集めている。従来のASIC(Application Specific Integrated Circuit)デバイスと異なり、FPGAは書き換え可能な回路である。FPGAにおける回路設計の手段として、従来のASICデバイスの設計でも用いられている、VerilogHDL(Hardware Description Language)等のハードウェア記述言語で記述されたRTLによる設計がある。また、近年では、FPGAにおける回路設計の手段として、OpenCL等の、C言語又はC++言語をベースにした高級プログラミング言語で記述したソースコードからRTLを生成する「高位合成」と呼ばれる設計手段が進展している。
【0003】
高位合成による設計は、よりハードウェアレベルに近いふるまいを記述するRTLによる設計(以下、「RTL設計」という)と対比して上位設計とも呼ばれる。高位合成による設計は、一般的なソフトウェア開発で用いられるC言語又はC++言語をベースにしたプログラミングスタイルで記述可能なため、従来のRTL設計に比べて低コストで設計することが可能である。しかしながらRTL設計による回路と比べて、パフォーマンス性能が低下する場合、及びFPGA内のリソース使用量が増える場合があるため、上位設計が完全にRTL設計を置き換えるところまでには至っていない。
【0004】
そこで、OpenCLによる上位設計と従来のRTL設計とを混合させてFPGAの回路を設計する場合がある。具体的に、既存のRTL設計の資産の活用をしたい場合、又はハイパフォーマンス性能を出したい回路ブロックにはRTL設計を行い、設計を柔軟に組み替える可能性がある場合、又はハイパフォーマンス性能が求められていない回路ブロックにはOpenCLにより設計を行う場合がある。このように、OpenCLによる上位設計と従来のRTL設計とを混合させることで、設計コストの低廉化と必要なパフォーマンスを達成することの両立を目指すことが可能である。
【0005】
例えば、非特許文献1には、RTLによって設計された回路(以下、「RTLモジュール」という)をOpenCLでプログラムに組み込む上で用いるFPGA向けの開発キットが開示されている。この開発キットには、「ヘルパー関数方式」及び「IO(Input/Output)チャネル方式」がある。ヘルパー関数方式では、OpenCLで記述されたOpenCLプログラムのライブラリとしてRTLモジュールを用いる。OpenCLプログラムでは、このライブラリ化されたRTLモジュールを、OpenCLプログラムのカーネル関数(以下、「OpenCLカーネル関数」という)として呼び出して利用する。このOpenCLカーネル関数をヘルパー関数という。一方、IOチャネル方式は、RTLモジュールを他の外部IP(Intellectual Property:回路設計データ)と同様に呼び出して利用する方式である。
【0006】
ヘルパー関数方式は、OpenCLカーネル関数としてRTLモジュールを呼び出すことにより、通常のOpenCLカーネル関数を利用する場合のプログラミングスタイルで利用できる。したがって、ヘルパー関数方式は、実装コスト、拡張性、及び移植性等の面でメリットがある。しかし、ヘルパー関数方式は、入出力手段が関数呼出しの形に制約され、かつ外部IO機能の制御が出来ないというデメリットがある。
【0007】
一方、IOチャネル方式には、外部IO機能の実装も含めた柔軟な実装が可能であるというメリットがある。しかし、IOチャネル方式には、OpenCLカーネル関数と接続するために、FPGAボードの製造メーカから提供されているBSP(Board Support Package)の修正が必要であるというデメリットがある。また、IOチャネル方式には、FPGAボードを変えるたびに、当該FPGAボードのBSPに適合するようにBSPの修正が必要となるというデメリットもある。
【0008】
そこで、特別に外部IO機能の制御が必要でない場合は、実装コスト、拡張性、及び移植性の面でメリットがあるヘルパー関数を採用している。
【先行技術文献】
【非特許文献】
【0009】
【非特許文献1】インテル株式会社、インテル(登録商標)FPGA SDK for OpenCLTMプロ・エディション:プログラミング・ガイド、2019年4月1日、URL:https://www.intel.co.jp/content/www/jp/ja/docs/programmable/683846/19-1/overview.html
【非特許文献2】藤田典久、大畠佑真、小林諒平、山口佳樹、朴泰祐、“OpenCLとVerilog HDLの混合記述によるFPGAプログラミング“、情報処理学会研究報告 Vol.2017-HPC-158 No.16、2017年3月9日、URL:https://ipsj.ixsq.nii.ac.jp/ej/?action=repository_uri&item_id=177921&file_id=1&file_no=1
【発明の概要】
【発明が解決しようとする課題】
【0010】
ヘルパー関数方式による実装では、RTLモジュールはOpenCLのパイプラインの中に組み込まれて動作する。そして、RTLモジュールがパイプラインに対してデータを入力する頻度ii(initiation interval)は予め設定することができる。しかし、iiを設定しても、RTLモジュールは必ずしも上記設定したii毎に、OpenCLカーネルからデータを受け取れるとは限らない。例えば、OpenCLカーネルにおける処理が複雑な場合、又はRTLモジュールがデータを受け取る準備ができていない場合、RTLモジュールは連続的でなく間欠的にデータを受け取ることになる。また、RTLモジュールの処理タイミング、及びデータの出力タイミングの関係で、RTLモジュールから出力されたデータを間欠的にOpenCLカーネルが受け取る場合もある。
【0011】
そこで、RTLモジュールにおける処理が終わったタイミングでOpenCLカーネルが出力データを得られるよう、RTLモジュール内での処理のサイクル数に応じた遅延量としてのレイテンシ(latency)を設定する必要がある。レイテンシは、コンフィグファイル(configuration file)にサイクル数を記述することで設定される。しかし、このコンフィグファイルに記述するサイクル数は、入力から当該入力に対する出力までの1対1の関係を表す固定の値でしか設定できない、という課題がある。
【0012】
また、例えば、画像処理を行うRTLモジュールは、複数個の画素等の複数の入力データに対する処理を所定のサイクル数をかけて実行し、複数の結果を出力する。このようなRTLモジュールは、入力データの受け取りに所定の複数のサイクル数を要し、内部状態を持ちながら複数のサイクル数をかけて所定の処理を実行する。更に、このようなRTLモジュールは、入力とは異なるサイクル数で結果を出力するよう設計されることがある。すなわち、このようなRTLモジュールの入力サイクル数と出力サイクル数とは異なる。
【0013】
このように、入力サイクル数と出力サイクル数とがそれぞれ異なる上に、データの入出力を間欠的に行い、かつ内部状態を持つRTLモジュールに対して、適切なレイテンシの設定ができないという課題がある。これにより、RTLモジュールが正確な入力データをもとに処理を実行できないという課題、及びRTLモジュールが出力したデータを正確にOpenCLカーネルに受け渡せないという課題があった。
【0014】
開示の技術は、上記の点に鑑みてなされたものであり、入力サイクル数と出力サイクル数がそれぞれ異なり入出力が間欠的であったとしても、内部状態を持つRTLモジュールをOpenCLのパイプラインに組み込むことができる、入出力制御方法、入出力制御プログラム、及び入出力制御装置を提供することを目的とする。
【課題を解決するための手段】
【0015】
本開示の第1態様は、入出力制御方法であって、OpenCL(Open Computing Language)によって記述されたOpenCLプログラムにおけるOpenCLカーネルは、レジスタ転送レベルによって設計されたRTL回路をライブラリとして所定のサイクル毎に呼び出し、データが有効である旨を示す有効フラグ、又は前記データが無効である旨を示す無効フラグを、入力データと共に前記RTL回路に対して入力し、前記RTL回路は、前記有効フラグ又は前記無効フラグを、出力データと共に前記OpenCLカーネルに対して出力することを含む。
【0016】
本開示の第2態様は、コンピュータを、OpenCL(Open Computing Language)によって記述されたOpenCLプログラムにおけるOpenCLカーネルとして機能させるための入出力制御プログラムであって、前記OpenCLカーネルは、レジスタ転送レベルによって設計されたRTLモジュールをライブラリとして所定のサイクル毎に呼び出し、データが有効である旨を示す有効フラグ、又は前記データが無効である旨を示す無効フラグを、入力データと共に前記RTLモジュールに対して入力し、前記RTLモジュールは、前記有効フラグ又は前記無効フラグを、出力データと共に前記OpenCLカーネルに対して出力する。
【0017】
本開示の第3態様は、OpenCL(Open Computing Language)によって記述されたOpenCLプログラムにおけるOpenCLカーネルを含む入出力制御装置であって、前記OpenCLカーネルは、レジスタ転送レベルによって設計されたRTL回路をライブラリとして所定のサイクル毎に呼び出し、データが有効である旨を示す有効フラグ、又は前記データが無効である旨を示す無効フラグを、入力データと共に前記RTL回路に対して入力し、前記RTL回路は、前記有効フラグ又は前記無効フラグを、出力データと共に前記OpenCLカーネルに対して出力する。
【発明の効果】
【0018】
開示の技術によれば、入力サイクル数と出力サイクル数がそれぞれ異なり入出力が間欠的であったとしても、内部状態を持つRTLモジュールをOpenCLのパイプラインに組み込むことができる。
【図面の簡単な説明】
【0019】
【
図1】実施形態に係る入出力制御装置のハードウェア構成の一例を示す模式図である。
【
図2】第1の実施形態に係るOpenCLカーネルの構成の一例を示す模式図である。
【
図3】第1の実施形態に係るOpenCLカーネルの機能構成の一例を示すブロック図である。
【
図4】第1の実施形態に係るOpenCLカーネルにおける入出力制御処理の一例を示すフローチャートである。
【
図5】第1の実施形態に係る入出力制御装置の効果について説明するための模式図である。
【
図6】第2の実施形態に係るOpenCLカーネルの構成の一例を示す模式図である。
【
図7】第2の実施形態に係るOpenCLカーネルの機能構成の一例を示すブロック図である。
【
図8】第2の実施形態に係るOpenCLカーネルにおける入出力制御処理の一例を示すフローチャートである。
【発明を実施するための形態】
【0020】
以下、開示の技術の実施形態の一例を、図面を参照しつつ説明する。なお、各図面において同一又は等価な構成要素及び部分には同一の参照符号を付与している。また、図面の寸法比率は、説明の都合上誇張されており、実際の比率とは異なる場合がある。
【0021】
[第1の実施形態]
図1に示すように、本実施形態に係る入出力制御装置10は、FPGA11、DRAM(Dynamic Random Access Memory)12、及びSRAM(Static Random Access Memory)13を有する。各構成は、バス19を介して相互に通信可能に接続されている。
【0022】
FPGA11は、後述するOpenCLカーネル20が有する各機能を実現するように設計されている。具体的に、FPGA11は入出力制御プログラムとしてのカーネルプログラム100を実行するように設計されている。
【0023】
DRAM12は、FPGA11の外部メモリである。また、SRAM12は、FPGA11の内部にある内部メモリである。
【0024】
次に、
図2を用いて、本実施形態に係るOpenCLカーネル20の構成を説明する。
【0025】
図2に示すように、OpenCLカーネル20にはRTLモジュール30が組み込まれている。
【0026】
OpenCLカーネル20は、OpenCLプログラムにおけるホストプログラム、又はOpenCLカーネル20とは別のOpenCLカーネルから呼び出される。OpenCLカーネル20は所定の処理が終了すると、呼び出し元となるホストプログラム又は別のOpenCLカーネルに戻る。
【0027】
RTL回路としてのRTLモジュール30は、複数の入力データをもとに処理を実行し、複数の出力データを出力する回路である。OpenCLカーネル20が、for文又はwhile文等の繰り返し構文を用いて連続的に所定のサイクル毎にRTLモジュール30をライブラリとして呼び出すことで、RTLモジュール30の連続サイクル動作を制御する。なお、RTLモジュール30はラッパーモジュール40に包含されている。
【0028】
ラッパーモジュール40は、datain_0及びdatain_1をOpenCLカーネル20から受け取るための入力ポートを備える。また、RTLモジュール30は、ラッパーモジュール40からdatain_0を受け取るための入力ポート、及びdatain_1に格納されたvalid_flag_inを受け取るための入力ポートを備える。
【0029】
また、RTLモジュール30は、dataout_0、write_addr、req_ready、req_addr、valid_flag_out、及びfinish_flagを出力するための出力ポートを備える。ラッパーモジュール40は、RTLモジュール30が備える複数の出力ポートを1つの出力ポートに多重化(MUX)し、出力データをOpenCLカーネル20が提供する変数のビット幅に調節する。これにより、RTLモジュール30が複数の出力ポートを持つ場合であっても、当該出力ポートの値を同時にOpenCLカーネル20へ出力することができる。
【0030】
なお、従来のRTLモジュールはラッパーモジュール40に包含されておらず、OpenCLカーネル20からdatain_0を受け取るための入力ポートのみを備えていた。したがって、本実施形態に係るRTLモジュール30は、datain_1を受け取るための入力ポートを更に備えている点が従来のRTLモジュールと異なる。
【0031】
また、従来のRTLモジュールは、dataout_0、及びwrite_addrをそれぞれ出力するための出力ポートのみを備えていた。したがって、本実施形態に係るRTLモジュール30は、req_ready、req_addr、valid_flag_out、及びfinish_flagを出力するための出力ポートを更に備えている点が従来のRTLモジュールと異なる。
【0032】
なお、RTLモジュール30が出力するフラグは、データ処理のためのフラグであり、RTLモジュール30の内部の実際の処理に大きな影響を与えるものではない。また、datain_0、datain_1、valid_flag_in、dataout_0、write_addr、req_ready、req_addr、valid_flag_out、及びfinish_flagの詳細については後述する。
【0033】
次に、
図3を用いて、本実施形態に係るOpenCLカーネル20の機能構成について説明する。OpenCLカーネル20は、入力RAM201、準備部202、決定部203、関数部204、パース部205、終了判定部206、及び出力RAM207としての機能を有する。
【0034】
入力RAM201は、RTLモジュール30に入力する入力データ群を格納する記憶領域である。入力RAM201は、DRAM12及びSRAM13で実現される。
【0035】
準備部202は、初期化処理を実行する。具体的に、準備部202は、DRAM12から入力データをコピーし、SRAM13に当該コピーをした入力データを記憶する。準備部202がDRAM12にアクセスする配列変数をdram_in[i]、SRAM13にアクセスする配列変数をsram_in[i]とする。iは配列アクセスのためのインデックスを示す。なお、入出力制御装置10は、OpenCLプログラムにおけるホストプログラムの内部で用いるDRAMからDRAM12へ予めデータを転送し、所望のDRAM12へアクセスをするためのインデックス変数を設定することで、DRAM12に格納されたデータを参照することが可能となる。しかし、DRAM12へのアクセス要求から実際に値が返ってくるまでのレイテンシは相対的に大きいため、本実施形態では準備部202がDRAM12から予めコピーした入力データを、SRAM13に記憶している。
【0036】
また、準備部202は、RTLモジュール30へ入力データを受け渡す際に用いるレジスタ変数であるdatain_0、及びRTLモジュール30が出力した出力データをDRAM12又はSRAM13に書き込む際の書き込み先アドレスを示すwrite_addrに0を格納する。また、準備部202は、入力データが有効であるか無効であるかを示すフラグ変数であるdatain_1、及びRTLモジュール30が有効な入力データを要求する入力要求フラグを示すreq_readyにFalseを設定する。また、準備部202は、有効な入力データが格納されているRAM領域にアクセスするためのアドレスを示すreq_addr、及びRTLモジュール30が出力した出力データが有効であるか無効であるかを示すvalid_flag_outにFalseを設定する。また、準備部202は、RTLモジュール30における処理が全て終了したことを示すfinish_flagにFalseを設定する。
【0037】
また、準備部202は、RTLモジュール30がOpenCLカーネル20に対して有効な入力データを要求している場合に、req_addrで示されるアドレス情報をもとに、有効な入力データを入力RAM201から取得する。そして、準備部202は、datain_0に有効な当該入力データを格納する。
【0038】
決定部203は、RTLモジュール30が有効な入力データを要求している場合は、準備部202が入力RAM201から取得した有効な入力データと共に、データが有効である旨を示す有効フラグを、RTLモジュール30に対して入力することを決定する。一方、決定部203は、RTLモジュール30が有効な入力データを要求していない場合は、任意の無効な入力データ(例えば、0)と共に、データが無効である旨を示す無効フラグを、RTLモジュール30に対して入力することを決定する。なお、任意の無効な入力データとして0以外の任意の値、例えば処理上絶対に現れない値であってもよい。そして、決定部203はdatain_1に有効フラグとしてのTrue又は無効フラグとしてのFalseを設定する。そして、決定部203はdatain_0及びdatain_1をラッパーモジュール40に受け渡す。RTLモジュール30及びラッパーモジュール40が有する関数部204としての機能の詳細は後述する。
【0039】
パース部205は、関数部204から出力されたdataoutを所定のビットマスクでパース(parse)し、それぞれ所定の変数に格納する。dataoutは、dataout_0、req_addr、req_ready、write_addr、valid_flag_out、及びfinish_flagの値が1つになった返り値である。具体的に、パース部205は、dataoutに、Aで表される所与のビットマスク処理を実行し、aビットだけ右ビットシフト処理をすることで得た値をdataout_0に格納する。また、パース部205は、dataoutに、Bで表される所与のビットマスク処理を実行し、bビットだけ右ビットシフト処理をすることで得た値をreq_addrに格納する。また、パース部205は、dataoutに、Cで表される所与のビットマスク処理を実行し、cビットだけ右ビットシフト処理をすることで得た値をreq_readyに格納する。また、パース部205は、dataoutに、Dで表される所与のビットマスク処理を実行し、dビットだけ右ビットシフト処理をすることで得た値をwrite_addrに格納する。また、パース部205は、dataoutに、Eで表される所与のビットマスク処理を実行し、eビットだけ右ビットシフト処理をすることで得た値をvalid_flag_outに格納する。また、パース部205は、dataoutに、Fで表される所与のビットマスク処理を実行し、fビットだけ右ビットシフト処理をすることで得た値をfinish_flagに格納する。そして、パース部205は、終了判定部206にfinish_flagを受け渡す。なおAからF、及びaからfは、設計内容に応じて予め定義された値である。
【0040】
また、パース部205は、RTLモジュール30から有効フラグが出力された場合に、当該有効フラグと共に出力された有効な出力データを出力RAM207に記憶する。具体的に、パース部205は、valid_flag_outにTrueが設定されている場合に、出力RAM207においてwrite_addrで特定される領域にdataout_0を格納する。一方、パース部205は、RTLモジュール30から無効フラグが出力された場合(すなわち、valid_flag_outにFalseが設定されている場合)は、当該無効フラグと共に出力された無効な出力データを記憶しない。
【0041】
終了判定部206は、パース部205から取得したfinish_flagにTrueが設定されているか否かを判定する。言い換えると、終了判定部206は、finish_flagにRTLモジュール30における処理が全て終了した旨が設定されているか否かを判定する。終了判定部206はfinish_flagにFalseが設定されている場合は、準備部202に処理を実行させる。一方、終了判定部206はfinish_flagにTrueが設定されている場合は、処理を終了する。
【0042】
出力RAM207は、所定のサイクル毎にパース部205から出力された出力データのうち、有効な出力データを格納する記憶領域である。出力RAM207は、DRAM12及びSRAM13で実現される。
【0043】
次に、
図2を参照して関数部204の機能の詳細を説明する。
【0044】
OpenCLカーネル20は、有効な入力データ又は無効な入力データが格納されたdatain_0、及び有効フラグ又は無効フラグが格納されたdatain_1をラッパーモジュール40に入力する。ラッパーモジュール40は、datain_0をRTLモジュール30に対して入力し、datain_1をvalid_flag_inとしてRTLモジュール30に入力する。
【0045】
RTLモジュール30は、valid_flag_inにFalseが設定されている場合、すなわち無効フラグが入力された場合は、datain_0に格納された無効な入力データを取り込まず、処理を実行しない。一方、RTLモジュール30は、valid_flag_inにTrueが設定されている場合、すなわち有効フラグが入力された場合は、datain_0に格納された有効な入力データを取り込んで処理を実行する。
【0046】
そして、RTLモジュール30は、所定のサイクル毎に出力データを出力する。具体的に、RTLモジュール30は、OpenCLカーネル20からの入力データをもとに実行した有効な出力データ以外の無効な出力データを格納したdataout_0、及びFalseを設定したvalid_flag_outである無効フラグを出力する。また、RTLモジュール30は、OpenCLカーネル20からの入力データをもとに実行した有効な出力データを格納したdataout_0、Trueを設定したvalid_flag_outである有効フラグ、及びwrite_addrを出力する。
【0047】
また、RTLモジュール30は、次のサイクルにおいて有効な入力データを要求する場合は、Trueを設定したreq_ready、及び有効な当該入力データが格納されているRAM領域にアクセスするためのアドレスを設定したreq_addrを出力する。一方、RTLモジュール30は、次のサイクルにおいて有効な入力データを要求しない場合は、Falseを設定したreq_readyを出力する。また、RTLモジュール30は、処理が全て終了した場合はTrueを設定したfinish_flagを出力し、処理が全て終了していない場合はFalseを設定したfinish_flagを出力する。
【0048】
ラッパーモジュール40はRTLモジュール30が出力したこれらのデータを1ポートに多重化(MUX)し、OpenCLカーネル20が提供する変数のビット幅に調節したうえでOpenCLカーネル20に出力する。そして、OpenCLカーネル20は当該多重化されたデータをdataoutに格納する。
【0049】
次に、本実施形態に係るOpenCLカーネル20の作用について説明する。
【0050】
図4は、OpenCLカーネル20による入出力制御処理の流れを示すフローチャートである。
【0051】
ステップS100で、準備部202はDRAM12から入力データをコピーし、SRAM13に当該コピーをした入力データを記憶する。具体的に、準備部202はdram_in[i]にsram_in[i]を設定する。そして、準備部202の処理はステップS101に移行する。
【0052】
ステップS101で、準備部202は、初期化処理を実行する。具体的に、準備部202は、datain_0及びwrite_addrに0を格納する。また、準備部202は、datain_1、req_ready、req_addr、valid_flag_out、及びfinish_flagにFalseを設定する。そして、準備部202の処理はステップS102に移行する。
【0053】
ステップS102で、決定部203はRTLモジュール30がOpenCLカーネル20に対して有効な入力データを要求しているか否かを判定する。言い換えると、決定部203はreq_readyにTrueが設定されているか否かを判定する。決定部203はreq_readyにTrueが設定されている場合(ステップS102:YES)、ステップS103に移行する。一方、決定部203はreq_readyにFalseが設定されている場合(ステップS102:NO)、ステップS105に移行する。
【0054】
ステップS103で、準備部202はreq_addrで示されるアドレス情報をもとに、sram_inから取得した有効な入力データをdatain_0に格納する。そして、準備部202の処理はステップS104に移行する。
【0055】
ステップS104で、決定部203はdatain_1にデータが有効である旨を設定する。すなわち、決定部203はdatain_1にTrueを設定する。そして、決定部203の処理はステップS107に移行する。
【0056】
ステップS105で、決定部203は無効な入力データをdatain_0に格納する。そして、決定部203の処理はステップS106に移行する。
【0057】
ステップS106で、決定部203はdatain_1にデータが無効である旨を設定する。すなわち、決定部203はdatain_1にFalseを設定する。そして、決定部203の処理はステップS107に移行する。
【0058】
ステップS107で、関数部204はdatain_0、及びdatain_1を引数にして処理を実行し、返り値をdataoutに格納する。具体的に、関数部204はRTLモジュール30のヘルパー関数RTL_moduleを、datain_0及びdatain_1を引数にして呼び出し実行する。RTLモジュール30は、ヘルパー関数RTL_module経由で入力されたdatain_0及びdatain_1に基づき、datain_1にTrueが設定されていれば、有効な入力データが入力されたとしてdatain_0を利用した処理を行う。そして、RTLモジュール30は所定のサイクル毎に何らかの出力を行う上で、その出力がRTLモジュール30での処理を行った上での有効な出力データであれば、Trueを設定したvalid_flag_outと共に、有効な出力データを格納したdataout_0、及びwrite_addrを出力する。また、RTLモジュール30は次のサイクルにおいても有効な入力データを要求する場合は、Trueを設定したreq_ready、及びreq_addrを出力する。そしてラッパーモジュール40はこれらを1ポートに多重化(MUX)した後、ヘルパー関数からの返り値として出てきた値をOpenCLカーネル20のdataoutに格納する。そして、関数部204の処理はステップS108に移行する。
【0059】
ステップS108で、パース部205はdataoutを所定のビットマスクでパースすることで得られた値を、dataout_0、req_addr、req_ready、write_addr、valid_flag_out、及びfinish_flagに格納する。そして、パース部205の処理はステップS109に移行する。
【0060】
ステップS109で、パース部205はvalid_flag_outにRTLモジュール30が出力した出力データが有効である旨が設定されているか否かを判定する。具体的に、パース部205はステップS108で得られたvalid_flag_outにTrueが格納されているか否かを判定する。パース部205はvalid_flag_outにTrueが設定されている場合(ステップS109:YES)、ステップS110に移行する。一方、パース部205はvalid_flag_outにFalseが設定されている場合(ステップS109:NO)、ステップS102に戻る。言い換えると、パース部205はvalid_flag_outにTrueが設定されるまでステップS102からステップS109までの処理を繰り返す。
【0061】
ステップS110で、パース部205は出力RAM207のSRAM13においてwrite_addrで特定される領域であるsram_out[i]にdataout_0を格納する。そして、パース部205の処理はステップS111に移行する。
【0062】
ステップS111で、終了判定部206はfinish_flagにRTLモジュール30における処理が全て終了した旨が設定されているか否かを判定する。具体的に、終了判定部206はfinish_flagにTrueが設定されているか否かを判定する。終了判定部206はfinish_flagにTrueが設定されている場合(ステップS111:YES)、ステップS112に移行する。
【0063】
ステップS112で、パース部205は出力RAM207のDRAM12においてiで特定される領域であるdram_out[i]に、ステップS110においてsram_out[i]に格納した値を格納し、本入出力制御処理を終了する。
【0064】
一方、終了判定部206はfinish_flagにFalseが設定されている場合(ステップS111:NO)、ステップS102に戻る。言い換えると、終了判定部206はfinish_flagにTrueが設定されるまでステップS102からステップS111までの処理を繰り返す。
【0065】
ここで、ステップS102からステップS111までの繰り返し処理におけるreq_ready、及びreq_addrは、1つ前の繰り返し処理(すなわち、1つ前のサイクル)においてRTLモジュール30から出力されている。具体的に、OpenCLカーネル20がRTLモジュール30をライブラリとして所定のサイクル毎に呼び出す場合に、RTLモジュール30は、OpenCLカーネル20が有効な入力データを入力するタイミングの1つ前のサイクルにおいて、OpenCLカーネル20に対して、Trueを設定したreq_ready、及びreq_addrを出力する。そして、OpenCLカーネル20は、Trueが設定されたreq_ready、及びreq_addrが出力されたタイミングの次のサイクルにおいて、有効な入力データを入力RAM201から取得する。そして、OpenCLカーネル20は、有効な当該入力データと共に、有効フラグをRTLモジュール30に対して入力する。これにより、OpenCLカーネル20は適切なタイミングでRTLモジュール30に有効な入力データを入力することができる。また、OpenCLカーネル20は適切なタイミングでRTLモジュール30からの出力データを受け付けることができる。なお、RTLモジュール30が要求したデータを準備部202が準備するのに所定数としてのnサイクルを要するのであれば、RTLモジュール30は、データが必要なサイクルのnサイクル前にTrueを設定したreq_readyを出力すればよい。
【0066】
次に、本実施形態に係る入出力制御装置10の効果について説明する。
【0067】
例えば、
図5の上図に示すように、RTLモジュールの入力サイクル数と出力サイクル数とが同じで、データの入出力を連続的に行っていることを前提としているため、レイテンシは入力から当該入力に対する出力までの1対1の関係を表す固定の値でしか設定できない。なお、
図5に示す例では、RTLモジュールが全体の処理に要するサイクルを1000clk(クロック)としている。しかしながら、
図5の下図に示すように、実際のRTLモジュールの入力サイクル数と出力サイクル数とはそれぞれ異なる上に、データの入出力を間欠的に行っており、かつ内部状態を持っている。したがって、適切なレイテンシの設定ができないため、RTLモジュールが正確な入力データをもとに処理を実行できないという課題、及びRTLモジュールが出力したデータを正確にOpenCLカーネルに受け渡せないという課題があった。
【0068】
この課題に対し、本実施形態に係る入出力制御方法では、OpenCLカーネル20は、RTLモジュール30をライブラリとして所定のサイクル毎に呼び出し、有効フラグ又は無効フラグを、入力データと共にRTLモジュール30に対して入力する。そして、RTLモジュール30は、有効フラグ又は無効フラグを、出力データと共にOpenCLカーネル20に対して出力する。これにより、入力サイクル数と出力サイクル数がそれぞれ異なり入出力が間欠的であったとしても、内部状態を持つRTLモジュール30をOpenCL20のパイプラインに組み込むことが可能となる。
【0069】
[第2の実施形態]
第2の実施形態では、OpenCLカーネル20がRTLモジュール30を呼び出した回数と前回OpenCLカーネル20がRTLモジュール30を呼び出した際における上記回数との差分が所定のサイクル数でない場合にエラーを通知する点が第1の実施形態と異なる。また、RTLモジュール30が起動してからのサイクル数と前回RTLモジュール30が起動してからのサイクル数との差分が所定のサイクル数でない場合も、エラーを通知する点が第1の実施形態と異なる。以下、第1の実施形態との相違点について説明する。
【0070】
まず、
図6を用いて、本実施形態に係るOpenCLカーネル20の構成を説明する。
【0071】
図6に示すように、本実施形態に係るラッパーモジュール40は、処理回路(timing_judge)50を更に包含する点が第1の実施形態と異なる。
【0072】
処理回路50は、RTLモジュール30と接続されたRTL回路であって、RTLモジュール30とは異なるRTL回路である。このように、ラッパーモジュール40に追加のRTL回路を含めることで、単一のRTL回路だけでは実現できない機能を追加する場合でも、ラッパーモジュール40が入出力のインタフェースをOpenCLカーネル20と整合をとることで可能となる。処理回路50は、後述するcount_opencl及びcount_rtlを入力するための2つの入力ポート、及びtiming_err_flagを出力するための1つの出力ポートを備える。なお、処理回路50は、RTLモジュール30と一体であってもよい。
【0073】
次に、
図7を用いて、本実施形態に係るOpenCLカーネル20の機能構成について説明する。本実施形態に係るOpenCLカーネル20は、入力タイミング判定部208及び出力タイミング判定部209を有する点が第1の実施形態と異なる。なお、入力RAM201、準備部202、関数部204、終了判定部206、及び出力RAM207は第1の実施形態と同一であるため、ここでの説明を省略する。
【0074】
決定部203は、count_openclを入力タイミング判定部208に受け渡す。count_openclは、RTLモジュール30(すなわち、ヘルパー関数RTL_module)を呼び出すたびに1ずつ増える情報、すなわちRTLモジュール30を呼び出した回数である。具体的に、count_openclは、OpenCLカーネル20がRTLモジュール30を繰り返し呼び出す際のループカウンタ、又はRTLモジュール30を繰り返し呼び出した回数をカウントするために定義したカウンタ変数である。count_openclがループカウンタである場合において、繰り返し呼び出す処理をOpenCLカーネル20の内部のfor文で行う場合は、count_openclはfor文のループインデックスでもよい。
【0075】
入力タイミング判定部208の機能の詳細は後述する。
【0076】
パース部205は、関数部204から出力されたdataoutをパースし、必要な出力データ及びフラグをそれぞれ取得する。そして、パース部205は、timing_err_flag、及びcount_rtlを出力タイミング判定部209に受け渡す。count_rtlは、RTLモジュール30が起動した直後からのサイクル数を1ずつカウントした値である。
【0077】
出力タイミング判定部209は、timing_err_flagにTrueが設定されている場合は、OpenCLカーネル20とRTLモジュール30とのやり取りが所望の動作をしていないと判定し、エラー通知をする。また、出力タイミング判定部209は、timing_err_flagにFalseが設定されている場合は、RTLモジュール30の内部カウンタ情報であるcount_rtlと、1つ前に呼出した際のRTLモジュール30の内部カウンタ情報であるpre_count_rtlとの差分を計算する。出力タイミング判定部209は、上記差分が所定のサイクルでない場合に、RTLモジュール30が出力データを所定のサイクル毎に出力していないと判定し、エラー通知をする。
【0078】
一方、上記差分が所定のサイクルである場合に、出力タイミング判定部209はパース部205に対して、上記差分が所定のサイクルである旨を通知する。上記通知を受け取ったパース部205は、RTLモジュール30から有効フラグが出力された場合に、当該有効フラグと共に出力された有効な出力データを出力RAM207に記憶する。
【0079】
次に、
図6を参照して入力タイミング判定部208の機能の詳細を説明する。
【0080】
OpenCLカーネル20は、datain_0及びdatain_1に加え、datain_2をラッパーモジュール40に入力する。ラッパーモジュール40は、datain_2に格納されたcount_openclを処理回路50に入力する。また、RTLモジュール30はcount_rtlを処理回路50に対して入力する。
【0081】
入力タイミング判定部208としての機能を有する処理回路50は、RTLモジュール30が予め定められたタイミングでOpenCLカーネル20からデータを受け取っているか否かを判定する。具体的に、処理回路50は、当該サイクルにおけるcount_opencl及び1つ前の呼び出し時に格納したpre_count_openclとの差分が所定のサイクル数であるか否かを判定する。また、処理回路50は、当該サイクルにおけるcount_rtl及び1つ前の呼び出し時に格納したpre_count_rtlとの差分が所定のサイクル数であるか否かを判定する。処理回路50は、count_opencl及びpre_count_openclの値の差分と、count_rtl及びpre_count_rtlの値の差分と、のうち少なくとも一方が所定のサイクル数でない場合にtiming_err_flagにTrueを設定して出力する。一方、処理回路50は、count_opencl及びpre_count_openclの値の差分と、count_rtl及びpre_count_rtlの値の差分と、が共に所定のサイクル数である場合にtiming_err_flagにFalseを設定して出力する。
【0082】
例えば、RTLモジュール30が1サイクル毎にOpenCLカーネル20からデータを受け取る設定である場合、count_opencl及びpre_count_openclの値の差分と、count_rtl及びpre_count_rtlの値の差分と、は共に1となる。しかし、例えば、RTLモジュール30が1サイクル毎に呼び出されていない場合、count_opencl及びpre_count_openclの値の差分は1でも、count_rtl及びpre_count_rtlの値の差分は1より大きな値になる。このように、count_opencl及びpre_count_openclの値の差分と、count_rtl及びpre_count_rtlの値の差分と、のうち少なくとも一方が1でない場合、処理回路50は、timing_err_flagにTrueを設定して出力する。一方、count_opencl及びpre_count_openclの値の差分と、count_rtl及びpre_count_rtlの値の差分と、が共に1である場合、処理回路50は、timing_err_flagにFalseを設定して出力する。
【0083】
次に、本実施形態に係るOpenCLカーネル20の作用について説明する。
【0084】
図8は、OpenCLカーネル20による入出力制御処理の流れを示すフローチャートである。
【0085】
図8のステップS200で、準備部202は
図4のステップS100と同一の処理を実行する。そして、準備部202の処理はステップS201に移行する。
【0086】
ステップS201で、準備部202は初期化処理を実行する。具体的に、準備部202はdatain_0及びwrite_addrに加え、count_opencl、count_rtl、及びpre_count_rtlに0を格納する。また、準備部202はdatain_1、req_ready、req_addr、valid_flag_out、及びfinish_flagにFalseを設定する。そして、準備部202の処理はステップS202に移行する。
【0087】
ステップS202で、決定部203はcount_openclをインクリメントする。
【0088】
ステップS203からステップS207までの処理は、
図4のステップS102からステップS106までの処理と同一であるため、説明を割愛する。
【0089】
ステップS208で、datain_2にcount_openclを格納する。そして、決定部203の処理はステップS209に移行する。
【0090】
ステップS209で、関数部204及び入力タイミング判定部208は、datain_0、datain_1、及びdatain_2を引数にして実行したRTLモジュール30及び処理回路50からの返り値をdataoutに格納する。そして、関数部204及び入力タイミング判定部208の処理はステップS210に移行する。
【0091】
ステップS210で、パース部205はdataoutを所定のビットマスクでパースすることで得られた値を、dataout_0、req_addr、req_ready、write_addr、valid_flag_out、及びfinish_flagに格納する。更に、パース部205はdataoutを所定のビットマスクでパースすることで得られた値を、count_rtl及びtiming_err_flagに格納する。そして、パース部205の処理はステップS211に移行する。
【0092】
ステップS211で、出力タイミング判定部209は、RTLモジュール30が予め定められたタイミングでOpenCLカーネル20から入力データを受け取っていないか否かを判定する。言い換えると、出力タイミング判定部209は、ステップS210で得られたtiming_err_flagにTrueが格納されているか否かを判定する。出力タイミング判定部209は、timing_err_flagにTrueが設定されている場合(ステップS211:YES)、ステップS214に移行する。一方、出力タイミング判定部209は、timing_err_flagにFalseが設定されている場合(ステップS211:NO)、ステップS212に移行する。
【0093】
ステップS212で、出力タイミング判定部209は、count_rtlと、pre_count_rtlとの差分が所定のサイクル(
図8に示す例では、1)であるか否かを判定する。出力タイミング判定部209は、count_rtlと、pre_count_rtlとの差分が所定のサイクル(
図8に示す例では、1)である場合(ステップS212:YES)、ステップS213に移行する。一方、出力タイミング判定部209は、count_rtlと、pre_count_rtlとの差分が所定のサイクル(
図8に示す例では、1)でない場合(ステップS212:NO)、ステップS214に移行する。
【0094】
ステップS213で、入力タイミング判定部208は、count_rtlに格納された値を、pre_count_rtlに格納する。そして、入力タイミング判定部208の処理はステップS215に移行する。
【0095】
ステップS214で、出力タイミング判定部209は、RTLモジュール30が所定のサイクル毎に入力データを受け取れていない、又はRTLモジュール30が所定のサイクル毎に出力データを出力していない旨を示すエラー通知をする。そして、出力タイミング判定部209は、本入出力制御処理を終了する。
【0096】
ステップS215からステップS218までの処理は、
図4のステップS109からステップS112までの処理と同一であるため、説明を割愛する。
【0097】
次に、本実施形態に係る入出力制御装置10の効果について説明する。
【0098】
RTLモジュールは所定のサイクル毎にOpenCLカーネルから呼び出され、入力データを受け取ることを想定している。しかし、OpenCLカーネルは所定のサイクル毎に入力データを入力しているつもりでも、例えばOpenCLカーネルの入力データの読み出しが遅延することで、RTLモジュールが上記所定のサイクル毎に入力データを受け取れていない場合がある。入力データの読み出しの遅延は、OpenCLカーネルが入力する入力データが、SRAMと比べてアクセス遅延の大きいDRAMに格納されていた場合、又は他からのアクセスによるメモリアクセス競合が発生している場合に発生することがある。また、RTLモジュールは所定のサイクル毎に出力データを出力したつもりでも、OpenCLカーネルは上記所定のサイクル毎に当該出力データを受け取れていない場合がある。この場合、パイプラインストールが発生し、所望の結果を得ることができない場合がある。しかし、生成したハードウェアプログラムとしてはエラー無く動作するように見えるため、原因の特定が難しい、という課題があった。
【0099】
この課題に対し、本実施形態に係るOpenCLカーネル20は、OpenCLカーネル20がRTLモジュール30を呼び出した回数と前回OpenCLカーネル20がRTLモジュール30を呼び出した際における当該回数との差分、及びRTLモジュール30が起動してからのサイクル数と前回RTLモジュール30が起動してからのサイクル数との差分のうち少なくとも一方が所定のサイクル数でない場合は、エラーを通知する。これにより、RTLモジュール30が所定のサイクル毎に入力データを受け取れていない場合、又はRTLモジュール30が所定のサイクル毎に出力データを出力していない場合であっても、その旨を把握することができる。
【0100】
[変形例]
なお、本発明は、上述した実施形態に限定されるものではなく、この発明の要旨を逸脱しない範囲内で様々な変形や応用が可能である。
【0101】
例えば、上記各実施形態でFPGAが実行する各種処理を、FPGA以外の各種のプロセッサが実行してもよい。この場合のプロセッサとしては、GPU(Graphics Processing Unit)等が例示される。また、入出力制御処理を、これらの各種のプロセッサのうちの1つで実行してもよいし、同種又は異種の2つ以上のプロセッサの組み合わせ(例えば、複数のFPGA、及びGPUとFPGAとの組み合わせ等)で実行してもよい。
【符号の説明】
【0102】
10 入出力制御装置
11 FPGA
12 DRAM
13 SRAM
19 バス
20 OpenCLカーネル
30 RTLモジュール
40 ラッパーモジュール
50 処理回路
201 入力RAM
202 準備部
203 決定部
204 関数部
205 パース部
206 終了判定部
207 出力RAM
208 入力タイミング判定部
209 出力タイミング判定部