(57)【要約】【課題】  ソフトウェア記述の一部を論理回路化する際に、ソフトウェア上で論理回路が繰り返し呼ばれる際の性能を考慮する。【解決手段】  ソフトウェア記述の一部を論理回路化する際に、論理回路で並列演算構成が可能な複数回実行される処理を検出し、当該処理を論理回路で行なう際の入力をリスト化し、論理回路への入力量を削減した際の性能を論理回路化候補リストとして出力する機能を持つ計測部と、当該論理回路化候補リストから選択された論理回路化候補に対し、ソフトウェア記述に論理回路への入力量を削減するための記述を挿入する機能を持つ記述挿入部と、を備える回路設計支援装置である。【選択図】図３
2020135743.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェア記述の一部を論理回路化する際に、論理回路で並列演算構成が可能な複数回実行される処理を検出し、当該処理を論理回路で行なう際の入力をリスト化し、論理回路への入力量を削減した際の性能を論理回路化候補リストとして出力する機能を持つ計測部と、
当該論理回路化候補リストから選択された論理回路化候補に対し、前記ソフトウェア記述に論理回路への入力量を削減するための記述を挿入する機能を持つ記述挿入部と、
を備える回路設計支援装置。
【請求項２】
前記記述挿入部は、
論理回路への入力に含まれる複数の配列のうち、同じ値を繰り返し入力する配列を、他の配列と同じ要素数を持つ配列に変換し、前記他の配列と変換した配列を論理回路に転送するように、ソフトウェア記述を変更する機能を持つ、
請求項１に記載の回路設計支援装置。
【請求項３】
前記記述挿入部は、
前記他の配列と変換した配列を統合して論理回路に転送する際に、前記他の配列と変換した配列とを識別可能な情報を付加するように、ソフトウェア記述を変更する機能を持つ、
請求項２に記載の回路設計支援装置。
【請求項４】
前記計測部は削減量演算部を備え、
前記削減量演算部は、論理回路への入力量の削減によって処理時間がどれだけ短縮できるかを計算し、ソフトウェア記述内の処理毎に当該処理のループ回数、当該処理を論理回路化した際の入力と、削減可能な論理回路への入力量を出力する機能を持つ
請求項１に記載の回路設計支援装置。
【請求項５】
前記削減量演算部は、
論理回路への入力に複数の配列が含まれており、かつ同じ値を論理回路へ転送している配列があるときに、当該配列の入力量の削減によって処理時間がどれだけ短縮できるかを計算する、
請求項４に記載の回路設計支援装置。
【請求項６】
前記削減量演算部は、
論理回路化する処理の繰り返し回数をLとし、繰り返し同じ値を転送する配列の要素数をa、毎回異なる値を転送する配列の要素数をbとし、a>bかつbL>aの条件が成立したときにbL−a、b>aかつaL>bの条件が成立したときにa(L−1)の転送量が削減可能であることを計算する、
請求項５に記載の回路設計支援装置。
【請求項７】
前記記述挿入部は、
同じ値を繰り返し入力する配列を論理回路内のメモリへ格納する処理を、前記ソフトウェア記述に挿入する機能を持つ、
請求項２に記載の回路設計支援装置。
【請求項８】
前記記述挿入部は、
同じ値を繰り返し入力する配列を参照する論理回路に対して、入力ではなく、前記メモリを参照するように、前記ソフトウェア記述を変更する機能を持つ、
請求項７に記載の回路設計支援装置。
【請求項９】
前記記述挿入部は、
同じ値を繰り返し転送する配列を、並列演算が呼び出される前に、予め論理回路へ入力するように、前記ソフトウェア記述を変更する機能を持つ、
請求項２に記載の回路設計支援装置。
【請求項１０】
ソフトウェア記述の一部を論理回路化する回路設計支援方法であって、
前記ソフトウェア記述から論理回路化する繰り返し処理を抽出する、繰り返し処理抽出処理と、
抽出した前記繰り返し処理において、同じ値を繰り返し使用する入力配列を抽出する、同値転送配列抽出処理と、
前記同じ値を繰り返し使用する入力配列を、他の入力配列と同じ要素数を持つ配列に変換するように、前記ソフトウェア記述を変更する記述挿入処理と、
を行なう回路設計支援方法。
【請求項１１】
前記同じ値を繰り返し使用する入力配列を、他の入力配列と同じ要素数を持つ配列に変換する際に、変換した入力配列と他の入力配列を識別可能な情報を付加するように、前記ソフトウェア記述を変更する、
請求項１０記載の回路設計支援方法。
【請求項１２】
前記同じ値を繰り返し使用する入力配列を、前記論理回路で前記繰り返し処理を行なう前に、論理回路のメモリに格納するように、前記ソフトウェア記述を変更する、
請求項１０記載の回路設計支援方法。
【請求項１３】
前記論理回路で前記繰り返し処理を行なう際に、前記メモリから前記同じ値を呼び出して処理を行なうように、前記ソフトウェア記述を変更する、
請求項１２記載の回路設計支援方法。
【請求項１４】
抽出した前記繰り返し処理と、前記ソフトウェア記述を変更することによる性能の変化を対応付けて表示する、論理回路化候補リストを出力する出力処理と、
前記論理回路化候補リストから論理回路化する繰り返し処理を選択する選択処理と、
をさらに含む、請求項１０記載の回路設計支援方法。
【請求項１５】
ＣＰＵと論理回路とメモリを備え、前記メモリに記憶されたソフトウェアを前記ＣＰＵで実行して処理を行なう際に、前記論理回路を呼び出して処理の一部を実行させる、情報処理装置であって、
前記ＣＰＵは、前記論理回路を呼び出して処理の一部を実行させる際に、前記論理回路が実行する処理の入力が複数の配列を含み、かつ、複数の配列が同じ値を繰り返し入力する配列を含む場合には、前記同じ値を繰り返し使用する配列を、他の配列と同じ要素数を持つ配列に変換して前記論理回路に転送し、
前記論理回路は、前記同じ値を繰り返し使用する配列を内蔵メモリに記憶し、該内蔵メモリに記憶された配列を用いて処理を行なう、
情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、論理回路設計を支援する回路設計支援技術に関する。具体的な例では、ソフトウェア記述から論理回路記述を自動的に生成する高位合成を用いた論理回路設計を支援する回路設計支援装置や方法に関する。
【背景技術】
【０００２】
CPU（Central Processing Unit）上で動作するソフトウェア処理を高速化する手法の一つとして、ソフトウェア処理の負荷となっている処理を論理回路デバイスで実装し、オフロードする手法がある。FPGA（field-programmable gate array）等に代表される論理回路デバイスは、論理回路記述によって内部の論理回路を自由に設計することができる。逐次処理を行うCPUとは異なり、論理回路は複数の処理を同時に実行できるため、ソフトウェア処理を高速化する際は、演算を論理回路上で並列に構築することでCPUを上回る高速化性能を発揮することが可能である。
【０００３】
従来、論理回路の設計は、レジスタ転送レベルによる設計が必要であったが、近年ではより抽象度の高いC言語等の高級言語によって設計する高位合成も可能になっている。高位合成を活用することで、CPU上で動作するソフトウェアの負荷処理コードを直接高位合成を用いて論理回路へ変換し、論理回路デバイスで高速化する事も可能である。
【０００４】
しかし、ソフトウェアの記述は一般的にCPU上で逐次的に処理されるように記述されている為、そのまま高位合成で論理回路へ実装すると、並列化がうまくされない、外部メモリへアクセスする等の論理回路にとって冗長な処理が発生し、期待した高速化効果を得る事が困難である。
【０００５】
特開2015−95130号公報（特許文献１）では、「並列化候補コードブロックにおいて、評価対象となるコードブロックの範囲である評価対象範囲を前記クリティカルコードブロックを中心にして公狭を変化させて複数設定し、評価対象範囲ごとに、評価対象範囲のコードブロックに対応するデータパスの特性を評価し、複数の評価対象範囲の中から、回路並列化の対象にする評価対象範囲を選択する評価部とを有することを特徴とする。」という記載がある通り、単純に並列演算による高速化効果が高いと見込める箇所へ高位合成を適用するだけでなく、論理回路にとって最適となる箇所を見極める必要がある。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開2015−95130号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
特許文献１は、すなわち、ソフトウェア処理内で並列回路による高速化が達成可能な箇所を論理回路化対象として設定し、その周辺の複数の処理を含めた時の複数の論理回路化ケースに対して性能評価をする技術である。
【０００８】
しかしながら、特許文献１においては、ソフトウェア上で論理回路が繰り返し呼ばれる際の性能を含めた評価をしていない。すなわち、ソフトウェア記述の一部を論理回路化する際に、ソフトウェア上で論理回路が繰り返し呼ばれる際の性能を考慮することが望まれる。
【課題を解決するための手段】
【０００９】
本発明の好ましい一側面は、ソフトウェア記述の一部を論理回路化する際に、論理回路で並列演算構成が可能な複数回実行される処理を検出し、当該処理を論理回路で行なう際の入力をリスト化し、論理回路への入力量を削減した際の性能を論理回路化候補リストとして出力する機能を持つ計測部と、当該論理回路化候補リストから選択された論理回路化候補に対し、ソフトウェア記述に論理回路への入力量を削減するための記述を挿入する機能を持つ記述挿入部と、を備える回路設計支援装置である。
【００１０】
本発明の好ましい他の一側面は、ソフトウェア記述の一部を論理回路化する回路設計支援方法であって、ソフトウェア記述から論理回路化する繰り返し処理を抽出する、繰り返し処理抽出処理と、抽出した繰り返し処理において、同じ値を繰り返し使用する入力配列を抽出する、同値転送配列抽出処理と、同じ値を繰り返し使用する入力配列を、他の入力配列と同じ要素数を持つ配列に変換するように、ソフトウェア記述を変更する記述挿入処理と、を行なう回路設計支援方法である。
【００１１】
本発明の好ましい他の一側面は、ＣＰＵと論理回路とメモリを備え、メモリに記憶されたソフトウェアを前記ＣＰＵで実行して処理を行なう際に、論理回路を呼び出して処理の一部を実行させる、情報処理装置である。この装置では、ＣＰＵは、論理回路を呼び出して処理の一部を実行させる際に、論理回路が実行する処理の入力が複数の配列を含み、かつ、複数の配列が同じ値を繰り返し入力する配列を含む場合には、同じ値を繰り返し使用する配列を、他の配列と同じ要素数を持つ配列に変換して論理回路に転送し、論理回路は、同じ値を繰り返し使用する配列を内蔵メモリに記憶し、該内蔵メモリに記憶された配列を用いて処理を行なう。
【発明の効果】
【００１２】
ソフトウェア記述の一部を論理回路化する際に、ソフトウェア上で論理回路が繰り返し呼ばれる際の性能を考慮したシステムが得られる。
【図面の簡単な説明】
【００１３】
【図１】ソフトウェア処理の論理回路化の一例を示す概念図。
【図２】ソフトウェア処理の論理回路化の他の例を示す概念図。
【図３】実施形態が適用される動作記述の設計支援装置を示す構成図。
【図４】実施例に関わる高位合成の構成を示すブロック図。
【図５】実施形態中の計測部における動作を示すフローチャート。
【図６】実施例によるソフトウェア処理の論理回路化の例を示す概念図。
【図７】実施形態中の記述挿入部における動作を示すフローチャート。
【図８】実施形態における論理回路化候補リストの表図。
【図９】実施形態が適用されるハードウェアアーキテクチャを示す構成図。
【図１０】ソフトウェア処理の論理回路化におけるコード記述例の図。
【図１１】実施例によるソフトウェア処理の論理回路化におけるコード記述例の図。
【発明を実施するための形態】
【００１４】
実施の形態について、図面を用いて詳細に説明する。ただし、本発明は以下に示す実施の形態の記載内容に限定して解釈されるものではない。本発明の思想ないし趣旨から逸脱しない範囲で、その具体的構成を変更し得ることは当業者であれば容易に理解される。
【００１５】
以下に説明する発明の構成において、同一部分又は同様な機能を有する部分には同一の符号を異なる図面間で共通して用い、重複する説明は省略することがある。
【００１６】
同一あるいは同様な機能を有する要素が複数ある場合には、同一の符号に異なる添字を付して説明する場合がある。ただし、複数の要素を区別する必要がない場合には、添字を省略して説明する場合がある。
【００１７】
本明細書等における「第１」、「第２」、「第３」などの表記は、構成要素を識別するために付するものであり、必ずしも、数、順序、もしくはその内容を限定するものではない。また、構成要素の識別のための番号は文脈毎に用いられ、一つの文脈で用いた番号が、他の文脈で必ずしも同一の構成を示すとは限らない。また、ある番号で識別された構成要素が、他の番号で識別された構成要素の機能を兼ねることを妨げるものではない。
【００１８】
図面等において示す各構成の位置、大きさ、形状、範囲などは、発明の理解を容易にするため、実際の位置、大きさ、形状、範囲などを表していない場合がある。このため、本発明は、必ずしも、図面等に開示された位置、大きさ、形状、範囲などに限定されない。
【００１９】
本実施の形態では、動作記述の設計支援装置を説明する。当該動作記述の設計支援装置は、ソフトウェア処理のうち、並列回路が構成できる繰り返し処理を抽出し、抽出した処理がソフトウェア上で複数回呼ばれている場合に、複数回の呼び出しを考慮して論理回路への入力量を削減し、処理時間を短縮することができる。
【００２０】
一般的に、高位合成によってソフトウェア処理の一部を論理回路化する場合、一つの処理に対して論理回路として最適化されるよう高位合成が行われる。以下、高位合成を実施する際の具体的な変換処理について説明する。
【００２１】
例えば、ソフトウェア記述の一部を論理回路化し高速化する高位合成において、論理回路が複数回呼ばれ、複数の配列が転送され、値の変わらない配列が存在するとき、入力配列を全て引数化すると、同じ値を持つ配列を繰り返し入力する処理が必要になる。そこで、値の変わらない配列を要素数の大きい配列の要素数と揃えることで、入力インターフェースを共通にし、同じ値を持つ配列を１回の入力で行なうようにする。また、最も大きい要素数の配列一つを論理回路への入力とし、全ての入力配列の要素数を揃えることで、入力インターフェースを共通にすることができる。同じ値を入力する配列を論理回路内のメモリへ格納することで、繰り返しの転送をすることなく、論理回路内で再利用を可能にし、転送時間を削減し、高速化することができる。
【００２２】
図１にソフトウェア処理の一部を高位合成によって論理回路化したときの構成の一例を示した。高位合成によってある処理を論理回路化すると、当該処理はソフトウェア上で関数化され、当該関数における引数が論理回路への入出力として扱われる。図１においては、ソフトウェア記述（１００）で記述された処理Ａ，Ｂ，Ｃ，Ｄのうち、５０回繰り返し呼ばれる処理D（１０１Ｄ）を論理回路化し、論理回路D（２００Ｄ）へ入力となる配列A[100]を配列A1[100]（３０１）配列A2[100]（３０２）配列A3[100]（３０３）と、順に転送している。
【００２３】
尚、配列A1、A2、A3は、いずれも異なる値を格納する１００の要素を持つ配列A[100]を意味し、処理D（１０１Ｄ）の繰り返しである５０回分異なる値、すなわち、A1[100]からA50[100]までを論理回路Ｄ（２００Ｄ）へ入力するように続く。論理回路D（２００Ｄ）では、受け取った配列A[100]に対して、その１００の要素を並列に展開して５０回並列演算（２０１）を行い、必要に応じてその他の演算（２０２）を行ない結果を出力し、ソフトウェア処理に戻す。以上のような構成とすることで、論理回路D（２００Ｄ）によって配列A[100]の１００の要素を並列演算できる。
【００２４】
図２は、複数の配列を入力とする例を示した図である。ソフトウェア記述（１００）の処理Ａ，Ｂ，Ｃ，Ｄのうち、１００回呼び出される処理B（１０１Ｂ）に対して、論理回路化を実行すると、論理回路B（２００Ｂ）となる。
【００２５】
処理B（１０１Ｂ）は、複数（この例では２つ）の配列A[100]とB[10]を入力として持っている為、論理回路B（２００Ｂ）に対しても配列A[100]、配列B[10]の複数の配列からなる入力セット（５０１）（５０２）（５０３）等が入力される。
【００２６】
論理回路B（２００Ｂ）では、並列演算（２０１）が構成され、複数の配列からなる入力セット（５０１）（５０２）（５０３）等の中の、配列A1[100]、A2[100]、A3[100]・・A100[100]に対して順に並列演算が実行される。論理回路B（２００Ｂ）では、並列演算（２０１）と同時に配列B[10]を入力として演算（２０３）も処理される。
【００２７】
ここで、入力において、配列A[100]は毎回異なる値が格納され、転送されるが、配列B[10]は同じ値を転送しているとすると、本来は配列Bの転送、及び演算（２０３）は一度の処理で十分にもかかわらず、毎回転送し、演算していることとなる。
【００２８】
高位合成で論理回路化を行うと、一回の論理回路の呼び出し時の入力における配列の要素数と配列数は一様に決定される。すなわちこの例では、論理回路Bへの入力は、常に要素100の配列と要素10の配列の２つに限定される。そのため、図２の例では、配列A[100]と配列B[10]の入力セットを一度に入力することが条件となり、配列B[10]だけを転送することはできない。よって、入力セット（５０２）、及び入力セット（５０３）に内在する配列Bは、入力セット（５０１）の値と同じであるにも関わらず論理回路B（２００Ｂ）へ入力しなければならない。この同じ値を繰り返し転送する処理は、論理回路への転送量を増加させ、処理時間を増大させる。
【００２９】
この課題を考慮した実施例について、以下説明する。以下の実施例では、高速化対象のソフトウェア記述に対し、並列回路が構成できる繰り返し処理を抽出し、抽出した演算を論理回路化した際に、当該処理が複数回ソフトウェア上で呼ばれる場合に、同じ値を繰り返し転送する入力配列（以下同値転送配列とも表記する）があるかを検出する。同値転送配列が存在する場合、対象の論理回路で並列演算が処理される前に論理回路内のメモリへ予め転送されるように記述を挿入することで、繰り返しの転送にかかっていた処理時間を削減する。
【００３０】
また、本来１回の入力で十分な配列については、他の配列と要素数を統一して統合することにより、論理回路への繰り返しの転送を省略する。図２の例で説明すると、配列Aと配列Bを統合して１種類の入力セットとし、その入力セットに配列Aと配列Bを含むようにし、論理回路に入力できるようにする。具体的には、配列Bを１００の要素を含む形に変形し、高位合成により配列Aと同様に入力できるようにすることで、要素数１００の１種類の配列の転送で処理を実行できるようにする。
【００３１】
図３は、本発明をソフトウェア記述に適用した時の実施例であり、動作記述の設計支援装置の処理の流れを示したものである。計測部（２）、記述挿入部（４）、高位合成（７）は、機能ブロックを示している。機能ブロックで実行される計算や制御等の機能は、入力装置、出力装置、処理装置、および記録装置を備える情報処理装置、たとえばサーバで実現されるものとする。機能ブロックは、記憶装置に格納されたプログラムが処理装置によって実行されることで、定められた処理を他のハードウェアと協働して実現される。計算機などが実行するプログラム、その機能、あるいはその機能を実現する手段を、「機能」、「手段」、「部」、「ユニット」、「モジュール」等と呼ぶ場合がある。
【００３２】
ソフトウェア記述（１）、論理回路化候補リスト（３）、最適化済み動作記述（５）、動作記述外ソフトウェア記述（６）は、機能ブロックで処理されるあるいは処理されたデータあるいはソフトウェアである。最適化済み動作記述（５）は、高位合成（７）で論理回路化され、論理回路（８）として例えばFPGAに実装される。動作記述外ソフトウェア記述（６）は、CPU処理（９）によってCPUで処理される。
【００３３】
計測部（２）は、ソフトウェア記述（１）に対して、並列演算が可能となる処理を抽出し、各並列演算の呼び出される回数及び、各並列演算の含む同値転送配列を検出する。当該同値転送配列に対し、予め論理回路へ転送する記述を挿入した場合の削減時間を演算し、結果を論理回路化候補リスト（３）として出力する。論理回路化候補リスト（３）は例えばサーバの表示装置（モニタなど）や、プリンターによって出力表示され、ユーザ（設計者）が見ることができる。
【００３４】
設計者は出力された論理回路化候補リスト（３）から、どの処理箇所を論理回路化するかを選択する。記述挿入部（４）では、選択した論理回路化箇所が含む同値転送配列に対し、並列演算の前に予め論理回路へ転送するように記述を挿入する。結果、ソフトウェア記述（１）は、論理回路化候補リスト（３）で選択された箇所をもとに、記述挿入部（４）で最適化記述が挿入された後に、最適化済み動作記述（５）と、動作記述外ソフトウェア記述（６）とに分けられる。
【００３５】
最適化済み動作記述（５）はそのまま高位合成（７）によって論理回路化され、ロジックデバイス上で論理回路（８）として実装される。動作記述外ソフトウェア記述（６）は、CPU側で処理される。
【００３６】
図４は、計測部（２）と論理回路化候補リスト（３）と、記述挿入部（４）の詳細を記した図である。この動作記述の設計装置では、高速化できる箇所を抽出してインターフェースを共通化する。計測部（２）は、繰り返し処理抽出部（１０）、同値転送配列抽出部（１１）、削減量演算部（１２）から構成される。
【００３７】
繰り返し処理抽出部（１０）は、ソフトウェア記述から、同じ処理が複数回実行される繰り返し処理を抽出する。具体的には、ソフトウェア記述から並列演算による高速化が達成できる繰り返し処理を抽出し、各繰り返し処理がソフトウェア上で呼び出される回数を計測する。
【００３８】
同値転送配列抽出部（１１）は、繰り返し処理で参照される引数を表す入出力配列から、同じ値を繰り返し入力している配列を抽出する。具体的には、繰り返し処理抽出部（１０）で抽出した各繰り返し処理に対して、論理回路化した際の入出力となる配列を検出し、そのうちで、論理回路化すると同じ値を何度も入力することとなる配列を抽出する。
【００３９】
削減量演算部（１２）は、条件を満たした同値転送配列に対して、削除した際の削減量と、高速化性能を出力する。具体的には、同値転送配列抽出部（１１）において抽出した各同値転送配列に対して図５で後述のステップ１８からステップ２７に示す処理を実行することで、削減できる同値転送配列の転送量と、削除後の高速化性能を算出し、各繰り返し処理リスト、同値転送配列と合わせて論理回路化候補リスト（３）として出力する。
【００４０】
論理回路化候補リスト（３）は、繰り返し回数、同値転送配列を削減した時の入力あるいは出力のデータ量、削減したデータ量及び短縮したレイテンシ数を繰り返し処理毎に表示する。設計者は、論理回路化候補リスト（３）から、実際に論理回路化する繰り返し処理を選択する。
【００４１】
ソフトウェア記述（１）は論理回路化候補リスト（３）で選択された論理回路化候補に基づいて、記述挿入部（４）によって、同値転送配列の入力が削減されるよう記述が挿入される。当該記述により、選択された処理が論理回路化される際に、インターフェースが共通化される手法によって高速化が可能となる。結果、設計者は同値転送配列が削減された最適化済み動作記述（５）と、動作記述外ソフトウェア記述（６）を得ることができる。
【００４２】
図５は、図４に示した回路設計支援装置の計測部（２）の処理を示すフローチャートである。図５に基づく動作は以下の通りである。ステップ１３からステップ１６までは繰り返し処理抽出部（１０）が実行する。
【００４３】
ステップ１３：ソフトウェア記述（１）を読み込み、記述に含まれる繰り返し処理を抽出する。繰り返し処理は、同一の処理を異なる要素へ適用するため、並列回路構成による高速化効果が高い。
【００４４】
ステップ１４：ステップ１３で読み込まれた繰り返し処理をリスト化する。
【００４５】
ステップ１５：ステップ１４でリスト化された各繰り返し処理に対して、内部の処理を含めて関数化する。この時、関数で用いる変数及び配列等は全て引数化する。引数化によって、内部の処理で参照、代入する外部データを全て引数として明確化できる。ここで引数となった変数、配列は論理回路化にあたって、論理回路の入出力値となる。
【００４６】
ステップ１６：ステップ１５において切り離された関数の引数を入力、出力別に列挙する。
【００４７】
ステップ１７からステップ２６までの処理では、同値転送配列を検出し、削減可能な転送量を演算する。ステップ１７からステップ２１までの処理は、同値転送配列抽出部（１１）で実行する。ステップ２２からステップ２６までの処理は、削減量演算部（１２）で実行する。
【００４８】
図６に基づいて、各ステップで行われる具体的な処理とその原理を説明する。本実施例では、図６の形を取ることで、図２における入力セット（５０２）、（５０３）及び以降に続く入力セット内部にある配列B[10]の転送を削減できる。
【００４９】
図６は、図２と同様に同じ処理を１００回繰り返す処理B（１０１Ｂ）を論理回路化する際に、本実施例の技術を適用した一例である。図２と同様に、処理B（１０１Ｂ）は、複数の配列A[100]とB[10]を入力として持っている為、通常は論理回路B（２００）に対しても配列A[100]、配列B[10]の複数の配列が入力される。
【００５０】
本実施例では、論理回路B（２００）への入力配列を、並列演算（２０１）の対象である配列A[100]の型となる１つの配列、１００の要素のみとし、配列B[10]の配列要素数を配列A[100]と同様の１００とする（６００）。このためには、例えば１０の元の配列要素に、９０のダミーデータを付加すればよい。この形へ変形することで、一回の論理回路B（２００）の呼び出しにおける入力は１００の要素を持つ一つの配列のみとなり、配列A[100]、配列B[10]それぞれを個別に転送することができる。
【００５１】
この時、論理回路B（２００）上では入力された配列がどの配列であるか判断ができない為、変数による信号によってどの配列かを判定する入力判定処理（２０４）を演算前に配置する。尚、配列の型や配列の値によって入力配列を判断してもよい。
【００５２】
入力判定処理（２０４）は、入力された配列が配列B[10]（インターフェース上B[100]に変形されている）であった場合は、論理回路B（２００）上のメモリ（２０５）へ格納し、配列A[100]であった場合は、並列演算（２０１）へ処理を渡す。この構成によって、本来の並列演算前に、配列B[10]を一度入力し、メモリ（２０５）へ格納した後に、配列A[100]入力の際は並列演算（２０１）を実行し、配列B[10]が必要な演算（２０３）は、配列B[10]を、CPUからの入力よりもレイテンシの少ない論理回路内のメモリ（２０５）から取得することができる。結果、配列B[10]の入力を最初の一回のみに削減しつつ、図２と同等の論理回路B（２００）を設計することができる。
【００５３】
このときの配列B[10]の削減量は、９９回の転送がなくなり、10*99 = 990の配列要素から、一回の転送にA[100]と合わせる為に必要となった配列要素90を引いた、900の要素数分の転送となる。以上に示す処理によって同値転送配列の入力量が削減され、処理の高速化が達成できる。
【００５４】
図５のフローチャートでは、本実施例が適用できる条件を以下として示し、判定している。
a)論理回路化候補処理に対して、複数の配列が入力されている（ステップ１８）
b)同じ値を繰り返し入力している配列が含まれている（ステップ１９）
c)論理回路化候補処理の繰り返し回数を取得し（ステップ１７）、Lとする。同値転送配列の配列要素数をa、並列演算予定の転送配列の配列要素数をbとした時に（ステップ２１）、a＞b && bL＞a（ステップ２２）を満たす時、bL-aの転送量を削減可能（ステップ２３）となり、b＞a && aL＞b（ステップ２４）を満たす時、a(L-1)の転送量を削減可能（ステップ２５）となる。なお、「x && y」はx と y が共にtrueの時にtrueを返す演算子である。
【００５５】
入力配列が条件を満たした場合、ステップ２６へ移動し、削減後の転送量と処理速度を、ステップ２０において纏めた各候補への入出力配列リストと統合する（ステップ２７）。結果、論理回路化候補処理の入力を最適化した後の高速化性能を出力する（ステップ２８）。出力は、ユーザに提示可能な論理回路化候補リスト（３）として纏め出力される。
【００５６】
図７は、図３の記述挿入部（４）における処理のフローチャートである。記述挿入部（４）では、ソフトウェア記述（１）に記述を挿入または変更することにより、ソフトウェア記述（１）を高位合成して生成される論理回路に、所定の機能を付加する。図７に基づく動作は以下の通りである。
【００５７】
ステップ７０１：論理回路化候補リスト（３）より、どの箇所を論理回路化するかを設計者が選択する。設計者は、論理回路を搭載するデバイスのリソース量や、目的とする性能を鑑みてどの処理を論理回路化するか選択する。尚、このステップにおいて、論理回路化候補リスト（３）から、最も転送時間を短縮できたものを自動で選択する機能を備える事もできる。
【００５８】
ステップ７０２：ステップ７０１で選択した論理回路化箇所に対して、計測部（２）で検出した同値転送配列による転送時間を短縮するため、図６（６００）の例に示したように、論理回路へ入力する配列のうち、最も要素数の多い配列の要素数へ、他の配列の要素数を揃える。
【００５９】
ステップ７０３：論理回路への入力を、入力予定の配列のうち最大となる配列の要素数を持つ配列一つへと制限する。これにより、論理回路への入力インターフェース（ＩＦ）を統合していることになる。
【００６０】
ステップ７０４：図６（２０４）に示す、入力判定処理を挿入する。同値転送配列が入力された場合はメモリ（２０５）への格納（ステップ７０５）を、毎回異なる値が格納された配列が入力された場合は並列演算（２０１）を行うように分岐を記述する。
【００６１】
ステップ７０６：同値転送配列を用いる演算（２０３）において、ステップ５０で記述したメモリ（２０５）内に格納した配列を使用するよう記述を変更する。これによって、同じ値を繰り返し入力する必要なく、論理回路内のメモリから配列を再利用することができる。
【００６２】
ステップ７０７：同値転送配列を、並列演算（２０１）が行われる前に動作記述上で予め論理回路（２００）へ入力する処理を挿入する。これによって、繰り返し呼ばれる並列演算処理の前に同値転送配列を入力することが可能となる。
【００６３】
図８は、図３における論理回路化候補リスト（３）の出力例である。各論理回路化候補処理が項目としてリスト化され、当該処理を関数化した際のループ回数と入出力、及び同値転送配列と、本実施例を適用した際の削減量（入力データの削減量や処理時間の削減量）を表示する。
【００６４】
図９は、実施形態にかかる対象のソフトウェアが動作するアーキテクチャを示す図である。本実施例の対象となるソフトウェアは、CPU(Central Processing Unit)（９０１）によってRAM（Random Access Memory）（９０２）内のプログラムを読み込むことで動作し、一部の処理をPLD(Programmable Logic Device)（９０３）上の論理回路で構成する形をとる。PLDは例えばFPGAであり、ソフトウェア処理の負荷となっている処理を論理回路デバイスで実装している。論理回路デバイスは、複数の処理を並列に実行可能である。この構成により、CPUの処理の一部をPLDに移管し、処理の効率化を行なう。各装置（５４〜５６）はバス（９０４）によって接続されている。
【００６５】
CPU（９０１）は、プログラムが記憶されているRAM（９０２）から当該プログラムを読み出し、処理を行う。論理回路を実行する際は、入力となる配列をPLD（９０２）へ転送し、結果をCPU（９０１）が再び受け取る。
【００６６】
図１０は、比較のために示す、図２に示す論理回路化におけるコード例である。１２０行〜１２５行にあるhardware関数（１００１）は、論理回路化する関数であり、図２における論理回路B（２００Ｂ）に該当する。Hardware関数（１００１）内部では、入力された配列B[10]に対してはfunc_once（１００２）による処理を、配列A[100]に対しては１００回のループ演算（１００３）を行っている。
【００６７】
高位合成によって論理回路化されると、このループ演算（１００３）が並列演算として構成される。hardware関数（１００１）は、２６０行〜２６３行にある繰り返し処理（１００４）で１００回呼び出されている。高位合成を行う場合、このhardware関数（１００１）が呼ばれると、CPUから論理回路へ処理が受け渡される。
【００６８】
hardware関数（１００１）への入力は、１２０行で定義されるように、要素数１００の配列A[100]、要素数１０の配列B[10]、出力は、要素数１００の配列output[100]となる。配列A[100]は、繰り返し処理（１００４）において、２６２行目のhardware関数の呼び出し前に、２６１行目のrefresh関数によって配列の値が毎回更新されている。配列Bは、２５５行目のinitialize関数によって初期化され、以降は値の代入処理は行われない。
【００６９】
結果、hardware関数（１００１）に対し、配列A[100]は毎回異なる値を入力し、配列B[10]は毎回同じ値を入力する構成となる。以上のように、図２の構成は、図６の構成に比較して繰り返し入力によるオーバヘッドが大きい。
【００７０】
図１１は、図６に示す処理構造を持つ、本実施例を適用した際のコード例である。１２０行目から１２７行目のhardware_manager関数（１１０１）は、図６の入力判定処理（２０４）とメモリ（２０５）を加えた論理回路B（２００）の記述である。
【００７１】
hardware_manager関数（１１０１）は、１２０行に定義されるように、引数に100の要素を持つ配列input[100]と配列判定用の信号となる変数sig、出力用配列のoutput[100]を持つ。この内input[100]は、図１０における２つの配列A[100]と配列B[10]を統合したインターフェースに相当する。図６において、100の要素の配列一つを論理回路B（２００）への入力としたように、配列A[100]、配列B[10]の入力となる。
【００７２】
配列input[100]によって入力された配列が配列A[100]と配列B[10]のどちらであるかは、引数のsigによって判定される。この時、配列の型から配列の種類を判定できる場合等、入力配列の値によって判定が可能である場合は配列の中身で判定してもよい。
【００７３】
１２２行目、１２４行目の条件分岐は、図６の入力判定処理（２０４）にあたり、配列Bが入力された場合（１１０３）は、sig = 0であるためメモリへ格納される。このメモリは論理回路デバイス内部にあるメモリ（２０５）であり、CPUから論理回路処理が呼び出された際に初期化されない。高位合成においては、関数内部の配列は呼び出される度初期化されるが、グローバル配列として宣言（１１０２）することで初期化されない配列とすることができる。
【００７４】
２５５行目から２５７行目のコード（１１０５）では、２５６行目で配列Bを入力配列inputへ関数mem_setによって格納し、２５７行目で変数sigを0に設定して、hardware_manager関数（１１０１）を呼び出して転送している。この処理は図６における処理（６００）にあたる。当該コード（１１０５）によって、配列Bのみを論理回路へ転送することができる。論理回路（２００）では、入力input[100]を受け取ると、１２２行目で入力判定処理（２０４）が変数sigを確認し、sig = 0であれば配列Bと判定して、１２３行目でメモリ（２０５）に格納する。
【００７５】
２５８行目から２６１行目のコード（１１０６）では、refresh関数とhardware_manager関数が１００回繰り返されている。Refresh関数では、配列A[100]へ繰り返しの度に新しい値を格納している。２６０行目では、配列A[100]を入力として、変数sigを1に設定して、論理回路を呼び出している。ここで、配列A[100]はinput[100]と同じ要素数の為、直接の転送が可能である。配列A[100]が転送された場合、hardware_manager関数（１１０１）では、１２５行目のhardware関数の呼び出し（１１０７）が実行される。hardware関数は、図１０におけるhardware関数（１１０１）と同等の演算処理を行う関数である。
【００７６】
ただし、図１０の２６２行目のhardware関数の呼び出しでは、その１２０行目で定義されているように配列Aと配列Bが固定されているのに対して、図１１の１２５行目のhardware関数の呼び出しでは、その１２０行目で定義されるように入力inputに配列Aと配列Bの両方が統合され、bram Bの値はメモリから呼び出される。
【００７７】
論理回路（２００）では、入力input[100]を受け取ると、１２４行目で入力判定処理（２０４）が変数sigが１であることを確認し、並列演算（２０１）を行なう。また、論理回路へ入力された配列A[100]と、既に論理回路内メモリへ格納されている配列B[10]を引数として演算（２０２）を行う。ここで、配列B[10]を論理回路内のメモリ（２０５）から参照することで、ソフトウェアからの転送時間を削減し、論理回路全体の処理時間を削減することができる。
【００７８】
なお、上記実施例では配列の判別のために変数sigを採用しているが、一方の配列のみにフラグを付するなど他の方法でも良い。
【００７９】
以上説明した実施例によれば、CPU上で実行されるソフトウェア記述の論理回路化において、論理回路によって並列演算が構成できる箇所を検出し、当該処理がソフトウェア記述上で複数回呼び出される場合に、論理回路への入力を複数回呼ばれることを考慮して最適化し、転送量を削減することで高速化することができる。これにより、例えばソフトウェア上で複数回論理回路が呼ばれる時にFPGAへの入力量が最適化されアプリケーション全体における転送時間が減少し、高速化が達成される。
【図１】
2020135743.tif 000003
【図２】
2020135743.tif 000004
【図３】
2020135743.tif 000005
【図４】
2020135743.tif 000006
【図５】
2020135743.tif 000007
【図６】
2020135743.tif 000008
【図７】
2020135743.tif 000009
【図８】
2020135743.tif 000010
【図９】
2020135743.tif 000011
【図１０】
2020135743.tif 000012
【図１１】
2020135743.tif 000013