(57)【特許請求の範囲】
【請求項１】
グラフから出力精度の異なる複数の処理関数を有するノードを抽出し、
データメモリに記憶され、ノードが持っている処理関数の引数の入出力方向および入出力精度が登録された処理関数情報を参照して、前記抽出したノードに後続するノードの必要入力精度を調べ、
前記抽出したノードが有する複数の処理関数のうち、前記調べた必要入力精度以上の出力精度であって、最低の出力精度を有する処理関数を選択し、
前記選択した処理関数を前記抽出したノードの処理関数に設定する
演算制御装置。
【請求項２】
前記抽出したノードに対して、複数の前記後続するノードがある場合に、
前記処理関数を選択するときの前記必要入力精度として、前記複数の後続するノードの必要入力精度の中で最大の必要入力精度を用いる
請求項１記載の演算制御装置。
【請求項３】
前記後続するノードの必要入力精度として、コンパイラがコード情報をコンパイルしたときに取得したノードの必要入力精度を用いる
請求項１記載の演算制御装置。
【請求項４】
グラフマネージャプログラム及び画像処理プログラムを記憶するプログラムメモリと、
前記グラフマネージャプログラム及び前記画像処理プログラムを実行して、前記画像処理に係るグラフを解析して実行するプロセッサと、
前記解析したグラフを記憶するデータメモリとを備え、
前記プロセッサは、前記データメモリに記憶した前記グラフについて、
出力精度の異なる複数の処理関数を有するノードを抽出し、
前記データメモリに記憶され、ノードが持っている処理関数の引数の入出力方向および入出力精度が登録された処理関数情報を参照して、前記抽出したノードに後続するノードの必要入力精度を調べ、
前記抽出したノードが有する複数の処理関数のうち、前記調べた必要入力精度以上の出力精度であって、最低の出力精度を有する処理関数を選択し、
前記選択した処理関数を前記抽出したノードの処理関数に設定する
演算制御装置。
【請求項５】
グラフから出力精度の異なる複数の処理関数を有するノードを抽出するステップと、
データメモリに記憶され、ノードが持っている処理関数の引数の入出力方向および入出力精度が登録された処理関数情報を参照して、前記抽出したノードに後続するノードの必要入力精度を調べるステップと、
前記抽出したノードが有する複数の処理関数のうち、前記調べた必要入力精度以上の出力精度であって、最低の出力精度を有する処理関数を選択するステップと、
前記選択した処理関数を前記抽出したノードの処理関数に設定するステップと
をコンピュータが実行する演算制御方法。
【請求項６】
請求項５記載の演算制御方法の各ステップを、コンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は演算制御装置、演算制御方法及び演算制御プログラムに関する。
【背景技術】
【０００２】
Ｔｈｅ  Ｋｈｒｏｎｏｓ  Ｇｒｏｕｐ（以下、「Ｋｈｒｏｎｏｓ」という。）で策定中の画像認識向けＡＰＩ（Application Programming Interface）の国際標準規格にＯｐｅｎＶＸがある。ＯｐｅｎＶＸでは、ターゲット・デバイスである演算制御装置上で動作するグラフマネージャが、グラフ形式で記述されたユーザアプリケーションを解釈し、演算制御装置の演算器（アクセラレータ）を用いて効率的に処理を行う（非特許文献１参照）。
【０００３】
図１１はＯｐｅｎＶＸコード及び当該コードから作成されるグラフの例を示す図である。グラフを図中右上の枠内に示している。
ＯｐｅｎＶＸコードでは、まずvx〇〇Node()関数群（例えば、処理関数xvThresholdNode(graph,in,thres,thout)など）によりグラフ構造を定義する。また、vxVerifyGraph()関数によりグラフ構造を解析し、グラフ中に表される処理の並列性や処理順序を決定する。そして、vxProcessGraph()関数によりグラフに係る処理を実行する。
図１１に示したグラフでは、入力画像ｉｎについてvxThresholdノードで二値化処理を行った後、vxSubtractノード、1回目のvxAddノードでそれぞれ減算、加算を行い、最後にそれらの結果を２回目のvxAddノードで加算している。この例では、vxThresholdノードを最初に処理する必要があるが、vxSubtractノードと1回目のvxAddノードとはどちらを先に処理しても良く、並列に処理しても良い。
なお、ここでいうグラフは有向グラフ（Directed Acyclic Graph）である。
【０００４】
グラフ上で使用するノード（Base Node）は、ＯｐｅｎＶＸコードにおける互換性を保つために、Ｋｈｒｏｎｏｓによって必要精度や挙動などの仕様が厳密に定義されている。例えば、画素毎のエッジ方向を算出するvxPhaseノードは、０〜２５５の８ｂｉｔ精度で出力するものと定義されている。算出するエッジ方向が８、９方向程度であれば、一般的には３、４ｂｉｔ精度のIf-Then-Elseなどの比較的軽い処理（約２０サイクル）で十分に間に合うが、Ｋｈｒｏｎｏｓによって定義された８ｂｉｔ精度の処理には演算量の大きいarctanなどの処理（約１１５０サイクル）が必要となり、処理時間がかかる。
【０００５】
図１２はＯｐｅｎＶＸコード及び当該コードから作成されるグラフの別の例を示す図である。やはりグラフを図中右上の枠内に示している。
この例では、Ｘ方向及びＹ方向のエッジ成分を算出するvxSobel3x3ノードの出力sobelx及びsobelyを入力としてvxPhaseノードがエッジ方向を算出する。そして、算出したエッジ方向phaseを入力としてvxHistogramノードが呼び出される。
ここで、例えば、画像認識アプリの一つであるＨＯＧ（Histogram Of Gradient）アプリのヒストグラム算出処理（vxHistogramノード）では、通常は８、９方向程度の３、４ｂｉｔ精度で十分である。
【０００６】
このため、ユーザがＨＯＧアプリを実装する際にvxPhaseノードの後続ノードとしてvxHistogramノードを接続した場合に、vxHistogramノードでは３ｂｉｔ程度の精度で十分であるにも拘わらず、vxPhaseノードでは８ｂｉｔ精度の演算を行うことになる。このため、３ｂｉｔ精度のエッジ方向算出ノードを用いた場合と比較して、同じ処理結果を得るのに数倍の処理時間がかかっていた。
【０００７】
また、一般的なＣ言語やＣ＋＋言語では処理の並列性を表すことが難しい。例えば、関数Ａの出力を利用する関数Ｂと関数Ｃとがある場合に、関数Ｂと関数Ｃとの間に依存関係がなければ、関数Ｂと関数Ｃとを並列に処理することが可能である。ところが、一般的なＣ言語で逐次的にプログラムを記述すると、この並列性が陽には現れない。
図１３はＣ言語で記述したプログラムの例を示す図である。
例えば、図の左のようにプログラムを書くと関数Ｂの後に関数Ｃが実行され、図の右のようにプログラムを書くと関数Ｃの後に関数Ｂが実行される。つまり、関数Ｂと関数Ｃとを並列に実行して良いかどうかは表現されていない。
【０００８】
このため、複数の演算リソースを有するマルチコアプロセッサなどにおいては、ユーザが関数のｆｏｒｋ（分岐）やｊｏｉｎ（合流）を陽に記述する必要があった。しかしながら、ターゲット・デバイス毎に最適な関数の割り当てが異なる場合もあり、コード互換性を保ったままですべてのデバイスに最適なプログラムを記述するのは難しかった。
ＯｐｅｎＶＸでは、Ｃ言語プログラム上でグラフ構造を定義しており、ＯｐｅｎＶＸ対応デバイスが備えるグラフマネージャが上記プログラムを解釈し、プログラム上で定義されているグラフ構造を解析し、並列性を抽出することができる。このため、ユーザがターゲット・デバイスの詳細を知らずに記述したＯｐｅｎＶＸコードであっても、グラフマネージャを介することによりターゲット・デバイスに最適な関数の割り当てを実現できる。
【先行技術文献】
【非特許文献】
【０００９】
【非特許文献１】Khronos Group，"OpenVX"，［online］，［平成27年3月26日検索］，インターネット＜URL:https://www.khronos.org/openvx/＞
【発明の概要】
【発明が解決しようとする課題】
【００１０】
しかしながら、従来のグラフマネージャは、図１２に示したようなＯｐｅｎＶＸコードにおいて、ユーザが記述した関数を用いるために、処理時間が長くなってしまうことがあった。
この性能低下の原因は、前述したように、後続する処理で必要な精度が低いにも拘わらず、ユーザが、先行する処理について、高い精度であることが厳密に定義された処理を指定してしまうことにある。
【００１１】
ＯｐｅｎＶＸでは用意されているノードを用いることが想定されているため、必要以上の精度の処理関数を用いて処理していても、ユーザがそのことに気付かないことがある。このために、ユーザの意図しない性能低下が発生することになる。
そこで、無駄な演算を回避して、ユーザが処理精度のことを気にしなくても処理を効率化して性能向上を享受できる演算制御装置、演算制御方法及びプログラムが望まれていた。
その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１２】
一実施の形態によれば、演算制御装置は、グラフ中のノード間の接続関係を解析し、後続ノードの必要精度に応じて、先行ノードの処理精度を算出し、先行ノードに処理精度の異なる派生ノードが登録されている場合に、必要十分な処理精度のノードで置き換えて、グラフに係る処理を実行する。
なお、上記実施の形態の装置を方法やシステムに置き換えて表現したもの、該装置または該装置の一部の処理をコンピュータに実行せしめるプログラム、該装置を備えた撮像装置なども、本発明の態様としては有効である。
【発明の効果】
【００１３】
上記一実施の形態によれば、無駄な演算を回避して、ユーザが処理精度のことを気にしなくても処理を効率化して性能向上を享受できる演算制御装置、演算制御方法及びプログラムを提供することができる。
【図面の簡単な説明】
【００１４】
【図１】実施の形態１に係る演算制御装置１の概略構成を示すブロック図である。
【図２】実施の形態１に係る演算制御装置１上で動く応用プログラムの処理手順を示すフローチャートである。
【図３】実施の形態１に係る想定グラフ及びノード情報を示す図である。
【図４】実施の形態１に係るカーネル情報を示す図である。
【図５】実施の形態１に係る処理関数情報を示す図である。
【図６】実施の形態１に係る処理関数vxVerifyGraph()の詳細な処理手順を示すフローチャートである。
【図７】実施の形態１に係る処理関数vxProcessGraph()の詳細な処理手順を示すフローチャートである。
【図８】実施の形態２に係る演算制御方法の概要を説明するための図である。
【図９】実施の形態３に係る演算制御方法の概要を説明するための図である。
【図１０】実施の形態４に係る演算制御方法の概要を説明するための図である。
【図１１】ＯｐｅｎＶＸコード及び当該コードから作成されるグラフの例を示す図である。
【図１２】ＯｐｅｎＶＸコード及び当該コードから作成されるグラフの別の例を示す図である。
【図１３】Ｃ言語で記述したプログラムの例を示す図である。
【発明を実施するための形態】
【００１５】
説明の明確化のため、以下の記載及び図面は、適宜、省略、及び簡略化がなされている。また、様々な処理を行う機能ブロックとして図面に記載される各要素は、ハードウェア的には、ＣＰＵ、メモリ、その他の回路で構成することができ、ソフトウェア的には、メモリにロードされたプログラムなどによって実現される。したがって、これらの機能ブロックがハードウェアのみ、ソフトウェアのみ、またはそれらの組合せによっていろいろな形で実現できることは当業者には理解されるところであり、いずれかに限定されるものではない。なお、各図面において、同一の要素には同一の符号が付されており、必要に応じて重複説明は省略されている。
【００１６】
また、上述したプログラムは、様々なタイプの非一時的なコンピュータ可読媒体（ｎｏｎ−ｔｒａｎｓｉｔｏｒｙ  ｃｏｍｐｕｔｅｒ  ｒｅａｄａｂｌｅ  ｍｅｄｉｕｍ）を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体（ｔａｎｇｉｂｌｅ  ｓｔｏｒａｇｅ  ｍｅｄｉｕｍ）を含む。
【００１７】
非一時的なコンピュータ可読媒体の例は、磁気記録媒体（例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ）、光磁気記録媒体（例えば光磁気ディスク）、ＣＤ−ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、半導体メモリ（例えば、マスクＲＯＭ、ＰＲＯＭ（Ｐｒｏｇｒａｍｍａｂｌｅ  ＲＯＭ）、ＥＰＲＯＭ（Ｅｒａｓａｂｌｅ  ＰＲＯＭ）、フラッシュＲＯＭ、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ））を含む。
【００１８】
また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体（ｔｒａｎｓｉｔｏｒｙ  ｃｏｍｐｕｔｅｒ  ｒｅａｄａｂｌｅ  ｍｅｄｉｕｍ）によってコンピュータに供給されても良い。
一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【００１９】
（実施の形態１）
本実施の形態１に係る演算制御装置は、ＯｐｅｎＶＸデバイスとなるもので、グラフ中のノード間の接続関係を解析し、後続ノードの必要精度に応じて、先行ノードの処理精度を算出し、先行ノードに処理精度の異なる派生ノードが登録されている場合に、必要十分な処理精度のノードで置き換えて、グラフに係る処理を実行する。
【００２０】
まず、本実施の形態１に係る演算制御装置１の構成について説明する。
図１は本実施の形態１に係る演算制御装置１の概略構成を示すブロック図である。
演算制御装置１は、プログラムメモリ１０、プロセッサ２０、データメモリ３０、アクセラレータ４０などを備える。
プログラムメモリ１０は、ｍａｉｎ関数から始まる応用プログラム及びグラフマネージャプログラムを記憶する。応用ブログラムは、図１１または図１２に示したような、プログラマが記述したＯｐｅｎＶＸコードをコンパイラがコンパイルして、実行形式（例えば、ｅｘｅ形式）のプログラムとしたものである。
【００２１】
プロセッサ２０は、プログラムメモリ１０からグラフマネージャプログラムを読み出して実行し、ＯｐｅｎＶＸデバイスのグラフマネージャとして動作する。また、プロセッサ２０は、グラフマネージャとして、プログラムメモリ１０から読み出した応用プログラムのグラフ構造を解析して、当該応用ブログラムの動作を実行する。
データメモリ３０は、プロセッサ２０が解析したグラフ構造を記憶する。また、データメモリ３０は、後述するカーネル情報、処理関数情報などを記憶する。
アクセラレータ４０は、プロセッサ２０が解析し、設定したグラフを実行する。
【００２２】
次に、本実施の形態１に係る演算制御装置１の動作、すなわち、演算制御方法について説明する。
図２は本実施の形態１に係る演算制御装置１上で動く応用プログラムの処理手順を示すフローチャートである。
応用プログラムでは、まず、グラフ構造の定義により、グラフを作成する（ステップＳ１０）。つまり、必要なノードを生成して、それらの間の接続関係を設定する。
図３は本実施の形態１に係る想定グラフ及びグラフ情報を示す図である。グラフ情報は、プロセッサ２０がグラフマネージャプログラム及び応用プログラムを実行したときに、グラフマネージャとして、後述するカーネル情報、処理関数情報などを参照して作成するものである。
【００２３】
図中左上の枠内に本実施の形態１に係る応用プログラムで想定するグラフを示す。このグラフでは、入力端子ｉｎ、出力端子ｏｕｔ以外に３つのノードが存在する。グラフ情報には、これらの３つのノードについての、グラフ中でノードを識別するためのＩＤと、処理内容を示すカーネル名と、カーネルに対応する処理関数と、入出力引数の情報とが含まれる。図３に示したグラフ情報では、入出力引数の情報は、ノードＩＤとその引数番号とで表されている。例えば、ノードＩＤ＝１のvxSobel3x3ノードでは、出力引数である２番目の引数が、ノードＩＤ＝２のvxPhaseノードの1番目の引数に接続されている。また、ノードＩＤ＝３のvxHistogramノードでは、入力引数である１番目の引数が、ノードＩＤ＝２のvxPhaseノードの３番目の引数に接続されている。
【００２４】
図４は本実施の形態１に係るカーネル情報を示す図である。カーネル情報は、半導体ベンダなどのユーザがデータメモリ３０に予め記憶させておくものである。
カーネル情報には、各カーネルについて、そのカーネルを実現する処理関数が１つ以上登録されている。例えば、vxPhaseカーネルには、処理関数vxPhaseKernel()及び処理関数vxPhaseKernelFast()が登録されている。
【００２５】
図５は本実施の形態１に係る処理関数情報を示す図である。処理関数情報も、ユーザがデータメモリ３０に予め記憶させておくものである。
処理関数情報には、各処理関数について、引数毎の引数名、入出力方向及び精度が登録されている。例えば、処理関数vxPhaseKernel()では、３番目の引数は、引数名がｏｕｔであり、出力引数であり、その精度は８ｂｉｔである。また、処理関数vxPhaseKernelFast()では、３番目の引数は、引数名がｏｕｔであり、出力引数であり、その精度は３ｂｉｔである。
【００２６】
応用プログラムでは、ステップＳ１０のグラフ作成時に、カーネルに対応する処理関数が複数登録されている場合には、最初に登録されている処理関数をデフォルトの処理関数として用いる。例えば、図３に示したグラフ情報のノードＩＤ＝２のvxPhaseノードについては、図４に示した処理関数情報のようにvxPhaseカーネルに対応する処理関数が２つ登録されているが、最初に登録されている処理関数vxPhaseKernel()をデフォルトの処理関数として用いる。
【００２７】
応用プログラムでは、続いて、図２に示した処理関数vxVerifyGraph()、すなわち、グラフ構造の解析を実行する（ステップＳ２０）。
図６は本実施の形態１に係る処理関数vxVerifyGraph()の詳細な処理手順を示すフローチャートである。ステップＳ２０の処理関数vxVerifyGraph()はステップＳ２１０〜ステップＳ２３０で構成される（ステップＳ２０の後にステップＳ２１０〜ステップＳ２３０が続くのではない）。
【００２８】
処理関数xvVerifyGraph()では、まず、グラフ中の全ノードについて入出力が定義されているかどうかを調べる（ステップＳ２１０）。定義されていないノードがあれば（ステップＳ２１０のＮｏ）、エラーメッセージを出力し（ステップＳ２４０）、終了するなどの動作を行う。
次に、グラフ中のノードを開始ノードから順にたどり、入出力の型が一致しているかどうか調べる（ステップＳ２２０）。入出力の型が一致していないノードがあれば（ステップＳ２２０のＮｏ）、やはりエラーメッセージを出力し（ステップＳ２４０）、終了するなどの動作を行う。
【００２９】
次に、グラフ中の全てのノードの中から精度の異なる複数の処理関数を持っているノードを探し、そのノードについて、後続するノードの必要精度属性Ｐを調べる。そして、そのノードが持っている複数の処理関数の中から、必要精度属性Ｐ以上で、かつ、最低の精度を有する処理関数を選択し、当該ノードの処理関数として設定する（ステップＳ２３０）。
【００３０】
このステップＳ２３０について、具体的に説明する。
まず、図３に示したグラフの各ノードについて、出力精度の異なる複数の処理関数を持っているノードを探す。図４に示したカーネル情報のように、ノードＩＤ＝２のvxPhaseノードが、処理関数vxPhaseKernel()と処理関数vxPhaseKernelFast()とを持っていることが分かる。
次に、vxPhaseノードに後続するvxHistogramノードで必要な入力精度を調べる。図５に示した処理関数情報のように、処理関数vxHistogramKernel()の入力引数ｄｉｒの精度が３ｂｉｔであることが分かる。
【００３１】
次に、vxPhaseノードが持っている処理関数vxPhaseKernel()と処理関数vxPhaseKernelFast()との中から、前述の３ｂｉｔ以上で、かつ、最低の出力精度を有する処理関数、すなわち、出力引数ｏｕｔの精度が３ｂｉｔである処理関数vxPhaseKernelFast()を選択し、vxPhaseノードの処理関数として設定する。これにより、vxPhaseノードの処理関数が処理関数vxPhaseKernel()から演算の効率の良くなる処理関数vxPhaseKernelFast()に置き換わる。
【００３２】
なお、このステップＳ２３０において、精度の異なる複数の処理関数を持っているノードについて、デフォルトで設定されている処理関数が必要精度属性Ｐ以上で、かつ、最低の精度を有する処理関数であったときには、当然、処理関数を置き換えることはしない。
また、後続するノードの必要精度として、後続するノードの入力精度以外の精度を用いたり、後続するノードの必要精度と比較する先行するノードの精度として、先行するノードの出力精度以外を用いたりすることも可能である。
【００３３】
そして、応用プログラムでは、最後に、図２に示した処理関数xvProcessGraph()、すなわち、グラフで表される処理の実行を行う（ステップＳ３０）。
図７は本実施の形態１に係る処理関数vxProcessGraph()の詳細な処理手順を示すフローチャートである。ステップＳ３０の処理関数vxProcessGraph()はステップＳ３１０〜ステップＳ３５０で構成される。
【００３４】
まず、ステップＳ２３０で一部のノードについて処理関数を置き換えたグラフの全ノードの状態を未実行状態にする（ステップＳ３１０）。
そして、グラフ中のノードにおいて、未実行状態で、かつ、実行可能な（入力引数に接続されているノードがすべて実行完了している）ノードを列挙する（ステップＳ３２０）。このとき、入力端子ｉｎは常に実行完了として扱う。
【００３５】
そして、列挙されたノードについて、列挙された順に対応する処理関数を実行する（ステップＳ３３０）。なお、上述したように、応用プログラムの動作は原則としてプロセッサ２０が行うが、ステップＳ３３０の処理関数の実行は、プロセッサ２０が行っても良いし、プロセッサ２０がアクセラレータ４０に命じて、アクセラレータ４０が行っても良い。
【００３６】
そして、ステップＳ３３０で処理関数を実行したノードの出力を有効にして、当該ノードの状態を実行完了とする（ステップＳ３４０）。
最後に、グラフ中の全ノードが実行完了状態かを判断し（ステップＳ３５０）、全ノードが実行完了状態ではないとき（ステップＳ３５０のＮｏ）はステップＳ３２０に戻り、全ノードが実行完了状態のとき（ステップＳ３５０のＹｅｓ）は処理関数vxProcessGraph()を終了する。
【００３７】
このように、本実施の形態１に係る演算制御装置又は演算制御方法では、必要以上の精度を実現する関数の実行を抑制して、実行時間の削減を実現することができる。
なお、本実施の形態１に係る演算制御方法では、上述したような先行ノードの精度を下げる場合以外に、先行ノードの精度を上げる場合も起こり得る。
【００３８】
以上説明したように、本実施の形態１に係る演算制御装置は、グラフから精度の異なる複数の処理関数を有するノードを抽出し、抽出したノードに後続するノードの必要精度を算出し、抽出したノードが有する複数の処理関数のうち、算出した必要精度以上の精度であって、最低の精度を有する処理関数を選択し、選択した処理関数を抽出したノードの処理関数に設定するものである。
【００３９】
（実施の形態２）
本実施の形態２に係る演算制御装置は、精度の異なる複数の処理関数を持っているノードに後続するノードの必要精度属性Ｐとして、有効ビット幅（情報として用いることが可能なビットの幅）ではなく、後続するノードが処理する値が取り得る種類の数、つまり、後続するノードが入力する情報が取り得る値の数を用いて、複数の処理関数の中から置き換える処理関数を選択するものである。
本実施の形態２に係る演算制御装置の概略構成は、実施の形態１に係る演算制御装置と同様であり、図示及び説明を省略する。
【００４０】
図８は本実施の形態２に係る演算制御方法の概要を説明するための図である。
対象となるグラフはvxPhaseノードとvxHistogramノードとが連続するものである。そして、vxPhaseノードには値域０〜２５５の８ｂｉｔ精度の処理関数vxPhaseKernel()が設定されている。また、vxHistogramノードには内部で値域を０〜３１、３２〜６３、・・・、２２４〜２５５の８種類に分類して利用する、つまり、８種類の値しか利用しない３ｂｉｔ精度の処理関数xvHistogramKernel()が設定されている。つまり、vxPhaseノードは後続するvxHistogramノードに対して必要以上の精度の処理関数を用いている。また、vxPhaseノードは、処理関数vxPhaseKernel()の他に、値域０〜７の３ｂｉｔ精度の処理関数vxPhase3Kernel()を有している。
【００４１】
このとき、本実施の形態２に係る演算制御方法では、vxPhaseノードの処理関数vxPhaseKernel()を処理関数vxPhase3Kernel()に置き換えると共に、処理関数vxPhase3Kernel()の出力を３２倍にスケーリングするvxMultiplyノードを挿入して、値域を０〜２５５に変更して後続するvxHistogramノードに接続する。
このようにして、本実施の形態２に係る演算制御装置又は演算制御方法では、精度として有効ビット幅以外のものを用いることにより、性能向上を実現できる場合を増やすことができる。
【００４２】
以上説明したように、本実施の形態２に係る演算制御装置は、後続するノードの必要精度を、後続するノードが入力する情報が取り得る値の数に基づいて算出するものである。
また、本実施の形態２に係る演算制御装置は、複数の処理関数を有するノードと後続するノードとの間に、複数の処理関数を有するノードの出力をスケーリングするノードを追加するものである。
【００４３】
（実施の形態３）
本実施の形態３に係る演算制御装置は、精度の異なる複数の処理関数を持っているノードに対して複数の後続するノードがある場合に、複数の後続ノードの中で最も高い必要精度属性Ｐを有する後続ノードに合わせて、精度の異なる複数の処理関数の中から先行するノードに設定する処理関数を選択するものである。
本実施の形態３に係る演算制御装置の概略構成も、実施の形態１に係る演算制御装置と同様であり、図示及び説明を省略する。
【００４４】
図９は本実施の形態３に係る演算制御方法の概要を説明するための図である。
対象となるグラフはvxPhaseノードに対して、vxＡノード、vxＢノード、vxＣノードが並列的に後続するものである。vxＡノード、vxＢノード、vxＣノードの必要精度はそれぞれ３ｂｉｔ、５ｂｉｔ、４ｂｉｔである。つまり、後続する３つのノードの中で、vxＢノードが最も高い必要精度５ｂｉｔを有している。
このとき、本実施の形態３に係る演算制御方法では、vxPhaseノードの処理関数を５ｂｉｔ精度の処理関数vxPhase5Kernel()に置き換える。
【００４５】
このようにして、本実施の形態３に係る演算制御装置又は演算制御方法では、先行するノードとして、より適切な精度を用いることにより、性能向上を実現できる場合を増やすことができる。
なお、本実施の形態３に係る演算制御装置又は演算制御方法は、上述したような先行するノードに対して複数の後続ノードが並列する場合に限らず、先行するノードに対して複数の後続ノードが直列する場合についても適用することができる。
以上説明したように、本実施の形態３に係る演算制御装置は、複数の処理関数を有するノードに対して、複数の後続するノードがある場合に、処理関数を選択するときの必要精度として、複数の後続するノードの必要精度の中で最大の必要精度を用いるものである。
【００４６】
（実施の形態４）
本実施の形態４に係る演算制御装置は、コンパイラがＯｐｅｎＶＸコードをコンパイルするときに、各ノードの処理内容を解析して必要精度情報を取得するものである。
本実施の形態４に係る演算制御装置の概略構成も、実施の形態１に係る演算制御装置と同様であり、図示及び説明を省略する。
【００４７】
図１０は本実施の形態４に係る演算制御方法の概要を説明するための図である。説明を分りやすくするため、参考例としての実施の形態１に係る演算制御方法と、本実施の形態４に係る演算制御方法とを上下に並べて示している。
実施の形態１に係る演算制御方法では、各ノードの必要精度情報と置換可能なノード情報とを半導体ベンダが予め用意して、演算制御装置（ＯｐｅｎＶＸデバイス）１のデータメモリ（図示せず）に記憶させておく。
【００４８】
これに対して、本実施の形態４に係る演算制御方法では、コンパイラがＯｐｅｎＶＸコードをコンパイルして実行形式（例えば、ｅｘｅ形式）のプログラムとするときに、コンパイラが各ノードの処理内容を解析して有効ビット幅などの必要精度情報を取得し、演算制御装置１のデータメモリ（図示せず）に記憶させる。このようにすれば、半導体ベンダは置換可能なノード情報だけを予め用意して、演算制御装置１のデータメモリに記憶させれば良い。
このようにして、本実施の形態４に係る演算制御装置又は演算制御方法では、ユーザが予めノードの精度を登録しなくても、性能向上を享受することができる。
【００４９】
以上説明したように、本実施の形態４に係る演算制御装置は、後続するノードの必要精度として、コンパイラがコード情報をコンパイルしたときに取得したノードの必要精度を用いるものである。
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は既に述べた実施の形態に限定されるものではなく、その要旨を逸脱しない範囲において種々の変更が可能であることはいうまでもない。
【符号の説明】
【００５０】
１    演算制御装置
１０    プログラムメモリ
２０    プロセッサ
３０    データメモリ
４０    アクセラレータ
【図１】
0006453685.tif 000002
【図２】
0006453685.tif 000003
【図３】
0006453685.tif 000004
【図４】
0006453685.tif 000005
【図５】
0006453685.tif 000006
【図６】
0006453685.tif 000007
【図７】
0006453685.tif 000008
【図８】
0006453685.tif 000009
【図９】
0006453685.tif 000010
【図１０】
0006453685.tif 000011
【図１１】
0006453685.tif 000012
【図１２】
0006453685.tif 000013
【図１３】
0006453685.tif 000014