TOP > 国内特許検索 > プログラム、及び情報処理装置 > 明細書

明細書 :プログラム、及び情報処理装置

発行国 日本国特許庁(JP)
公報種別 公開特許公報(A)
公開番号 特開2015-018379 (P2015-018379A)
公開日 平成27年1月29日(2015.1.29)
発明の名称または考案の名称 プログラム、及び情報処理装置
国際特許分類 G06F   9/48        (2006.01)
G06F   9/38        (2006.01)
FI G06F 9/46 452A
G06F 9/38 370C
請求項の数または発明の数 7
出願形態 OL
全頁数 25
出願番号 特願2013-144661 (P2013-144661)
出願日 平成25年7月10日(2013.7.10)
発明者または考案者 【氏名】山際 伸一
出願人 【識別番号】504171134
【氏名又は名称】国立大学法人 筑波大学
個別代理人の代理人 【識別番号】100100549、【弁理士】、【氏名又は名称】川口 嘉之
【識別番号】100123319、【弁理士】、【氏名又は名称】関根 武彦
【識別番号】100105407、【弁理士】、【氏名又は名称】高田 大輔
審査請求 未請求
テーマコード 5B013
Fターム 5B013DD03
要約 【課題】プログラム毎に生じるデータのやりとりを回避して処理の時間短縮を図ることを可能とする技術を提供する。
【解決手段】プロセッサが周辺バスを介してデータとともに記憶装置に設定し、当該記憶装置に接続されたアクセラレータによって実行されるプログラムであって、プログラムは、複数の部品プログラムを含み、データは、少なくとも、前記部品プログラムの実行順序を示すシナリオデータと、前記複数の部品プログラムのうち最初に実行される部品プログラムに対する入力データと、シナリオインデックスの初期値とを含み、アクセラレータに、シナリオインデックスの初期値に従って実行すべき部品プログラムを特定する処理と、特定した部品プログラムに従った演算処理と、シナリオインデックスの値をインクリメントする処理と、インクリメントされたシナリオインデックスの値に応じて次の部品プログラムを特定する処理と、を少なくとも実行させる。
【選択図】図4
特許請求の範囲 【請求項1】
プロセッサが周辺バスを介してデータとともに記憶装置に設定し、当該記憶装置に接
続されたアクセラレータによって実行されるプログラムであって、
前記プログラムは、複数の部品プログラムを含む統合プログラムであり、前記データは、少なくとも、前記部品プログラムの実行順序を示すシナリオデータと、前記複数の部品プログラムのうち最初に実行される部品プログラムに対する入力データと、シナリオインデックスの初期値とを含み、
前記アクセラレータに、前記シナリオインデックスの初期値に従って実行すべき部品プログラムを特定する処理と、特定した部品プログラムに従った演算処理と、前記シナリオインデックスの値をインクリメントする処理と、インクリメントされたシナリオインデックスの値に応じて次の部品プログラムを特定する処理と、
を少なくとも実行させるプログラム。
【請求項2】
前記プログラムは、或る部品プログラムの出力データが当該或る部品プログラムの次に実行される部品プログラムの入力データとなるときに、当該出力データと当該入力データとをペアとする定義を含み、
前記アクセラレータに、前記或る部品プログラムの実行終了時に、前記出力データの記憶アドレスと、前記出力データとペアをなす前記入力データの記憶アドレスとを交換する処理をさらに実行させる、
請求項1に記載のプログラム。
【請求項3】
前記シナリオインデックスの初期値が記憶される第1インデックスアドレスと、インクリメントされたシナリオインデックスの値が記憶される第2インデックスアドレスとをペアとする定義をさらに含み、
前記アクセラレータに、部品プログラムの実行が終了するごとに、前記第1インデックスアドレスと前記第2インデックスアドレスとを交換する処理をさらに実行させる、
請求項1又は2に記載のプログラム。
【請求項4】
プロセッサと、
前記プロセッサと周辺バスを介して接続される記憶装置と、
前記記憶装置に接続され、前記プロセッサによって前記記憶装置に設定されたプログラム及びデータを用いて所定の処理を行うアクセラレータとを含み、
前記プログラムは、前記処理にて実行される複数の演算を行うための複数の部品プログラムを含む統合プログラムであり、前記データは、少なくとも、前記部品プログラムの実行順序を示すシナリオデータと、前記複数の部品プログラムのうち最初に実行される部品プログラムに対する入力データと、シナリオインデックスの初期値とを含み、
前記アクセラレータは、前記シナリオインデックスの初期値に従って実行すべき部品プログラムを特定する処理と、特定した部品プログラムに従った演算処理と、前記シナリオインデックスの値をインクリメントする処理と、インクリメントされたシナリオインデックスの値に応じて次の部品プログラムを特定する処理と、を少なくとも実行する
情報処理装置。
【請求項5】
前記プログラムは、或る部品プログラムの出力データが当該或る部品プログラムの次に実行される部品プログラムの入力データとなるときに、当該出力データと当該入力データとをペアとする定義を含み、
前記アクセラレータは、前記或る部品プログラムの実行終了時に、前記出力データの記憶アドレスと、前記出力データとペアをなす前記入力データの記憶アドレスとを交換する処理をさらに実行する、
請求項4に記載の情報処理装置。
【請求項6】
前記シナリオインデックスの初期値が記憶される第1インデックスアドレスと、インクリメントされたシナリオインデックスの値が記憶される第2インデックスアドレスとをペアとする定義をさらに含み、
前記アクセラレータは、部品プログラムの実行が終了するごとに、前記第1インデックスアドレスと前記第2インデックスアドレスとを交換する処理をさらに実行する、
請求項4又は5に記載の情報処理装置。
【請求項7】
所定順序で直列に実行される複数のプログラムが統合された統合プログラムの生成処理をコンピュータに実行させるプログラムであって、
(1)プログラム間に、或るプログラムから次のプログラムへの遷移を示す時刻番号を設定するステップと、
(2)時刻番号毎に、或る時刻番号に対応する二つのプログラムの一方からの出力が、他方のプログラムの入力となるときの出力と入力とをスワップペアとして定義するステップと、
(3)最長の処理フローが得られるように時刻番号を合成することによって前記複数のプログラムの実行順を示すシナリオを生成するステップと、
(4)スワップペアをなす入力及び出力を記憶するための記憶容量に基づいて、時刻番号間のスワップペアをなす入力同士及び出力同士の合成を行うステップと、
(5)最初に実行されるプログラムの入力と、いずれかのスワップペアの入力との合成、及び最後に実行されるプログラムの出力と、いずれかのスワップペアの出力との合成を、各入力及び各出力のそれぞれの記憶容量に基づいて試行するステップと、
(6)前記(4)及び(5)の少なくとも一方で合成された入力及び出力と、前記(4)及び(5)で合成されずに残った入力及び出力とがそれぞれ入力及び出力として定義された前記統合プログラムを定義するとともに、前記シナリオに従って実行すべきプログラムの特定に使用されるシナリオインデックスの設定を行うステップと
をコンピュータに実行させるプログラム。
発明の詳細な説明 【技術分野】
【0001】
本発明は、プログラム、及び情報処理装置に関する。
【背景技術】
【0002】
現在、ネットワークには、様々なセンサ及びデバイスが接続され、これらのセンサ及びデバイスから刻々と出力されるデータがネットワーク上でデータストリームを形成する。データストリームを形成するデータ(ストリームデータと呼ばれる)を滞りなく処理する(リアルタイムに処理する)手法として、ストリームコンピューティングがある。
【0003】
近年、ストリームコンピューティングを実現するためのアクセラレータ技術が急速に発達している。代表的なアクセラレータの一つに、GPU(Graphical Processing Unit)
がある。GPUは、画像表示に必要な演算を高速で行うことを主たる目的として設計されており、制御のための計算を得意としていない。また、通常、GPU自体は、通常OS(Operating System)で行われるようなリソース管理を行っていない。このため、ストリームコンピューティングのためにGPUが適用される場合には、以下のような手法の採用が一般的である。
【0004】
すなわち、GPUは、CPU(Central Processing Unit)を搭載したコンピュータ(
情報処理装置、例えば、パーソナルコンピュータ、ワークステーションのような専用又は汎用のコンピュータ)に備えられた周辺バスに接続される。GPUが目的の計算を行うに当たっては、CPUがGPU用のプログラムのダウンロード(GPUへのプログラムの提供:プログラムマッピングともいう)と入出力データに係る設定(I/Oセットアップ)を行う。そして、CPUがGPUにダウンロードされたプログラムの実行を指示する。GPUは、指示に従ってプログラムの実行を開始し、目的の計算を行う。このようなハードウェア構成では、GPUは、CPUをメインプロセッサとした場合のコプロセッサとして機能する。
【先行技術文献】
【0005】

【非特許文献1】Shinichi Yamagiwa and Leonel Sousa. Modeling and Programming Stream-based Distributed Computing based on the Meta-Pipeline Approach, International Journal of Parallel, Emergent and Distributed Systems, Taylor & Francis, Vol. 24, Issue 4, pp. 311-330, August 2009.
【非特許文献2】Shinichi Yamagiwa and Leonel Sousa, Design and implementation of a tool for modeling and programming deadlock free meta-pipeline applications, 10th Workshop on Advances on Parallel and Distributed Processing Symposium (APDCM/IPDPS), pp.1-8, April. 2008 , IEEE.
【非特許文献3】Shinichi Yamagiwa, Leonel Sousa, Tomas Brandao, "Meta-Pipeline: A new execution mechanism for distributed pipeline processing", 6th International Symposium on Parallel and Distributed Computing (ISPDC 2007), Jun 2007.
【発明の概要】
【発明が解決しようとする課題】
【0006】
上述したような、CPUとGPUとが周辺バスで接続されたハードウェア環境において、複数のプログラムがGPUで順次実行されることにより、所望の結果を得る処理フローを考える。この場合、CPUは、プログラム毎に、GPUに対するプログラムマッピング(GPUへのプログラムの提供)と、入出力データの設定を行う。
【0007】
周辺バスの動作周波数(処理速度)は、CPUの動作周波数(処理速度)より低いことが少なくない。このため、プログラム毎に実行されるCPUとGPUとの周辺バスを介したやりとりによるオーバヘッドによって、所望の結果を得るまでに時間がかかるという問題があった。オーバヘッドの影響はGPUにおける高速演算により吸収され得るが、そのような環境は、GPUの本来の性能が発揮される環境と言いがたい。
【0008】
本発明の態様は、プログラム毎に生じるデータのやりとりを回避して処理の時間短縮を図ることを可能とする技術を提供することを目的とする。
【課題を解決するための手段】
【0009】
本発明の態様の一つは、プロセッサが周辺バスを介してデータとともに記憶装置に設定し、当該記憶装置に接続されたアクセラレータによって実行されるプログラムであって、
前記プログラムは、複数の部品プログラムを含み、前記データは、少なくとも、前記部品プログラムの実行順序を示すシナリオデータと、前記複数の部品プログラムのうち最初に実行される部品プログラムに対する入力データと、シナリオインデックスの初期値とを含み、
前記アクセラレータに、前記シナリオインデックスの初期値に従って実行すべき部品プログラムを特定する処理と、特定した部品プログラムに従った演算処理と、前記シナリオインデックスの値をインクリメントする処理と、インクリメントされたシナリオインデックスの値に応じて次の部品プログラムを特定する処理と、
を少なくとも実行させるプログラムである。
【0010】
また、本発明の他の態様は、上記したプログラムを記憶したコンピュータ読み取り可能な記憶媒体、上記プログラムを実行する情報処理装置、上記したプログラムを用いた情報処理装置のアクセラレータ用プログラムの実行方法としても特定することができる。
【発明の効果】
【0011】
本発明の態様によれば、プログラム毎に生じるデータのやりとりを回避して処理の時間短縮を図ることが可能となる。
【図面の簡単な説明】
【0012】
【図1】図1は、GPUを備える情報処理装置(コンピュータ)の構成例を示す図である。
【図2】図2は、GPUで実行されるパイプライン処理のフローを模式的に示す図である。
【図3】図3は、図2に示した処理フローが単一のプログラムにパッキングされた状態を模式的に示す図である。
【図4】図4は、GPUによる、統合プログラムの実行手順の例を示すフローチャートである。
【図5】図5は、或る部品プログラムを用いた繰り返し処理を含む処理パイプラインの処理フロー例を模式的に示す。
【図6】図6は、図5に示した或る部品プログラムの繰り返し処理を再帰的な処理に置換した状態を模式的に示す。
【図7】図7は、或る部品プログラムの後段に位置する他の部品プログラムをパッキングした状態を模式的に示す。
【図8】図8は、統合プログラムのシナリオ生成方法手順の一例を示す図である。
【図9】図9は、GPU用のプログラムによって記述された統合プログラムの一例を示す。
【図10】図10は、フローモデル(flow-model)と呼ばれる、パイプライン処理のモデルを定義したモデル定義情報と、所定の記述言語で記述されたパイプライン処理で行われる演算を指示するプログラム(カーネルプログラム)とが所定の記述言語で記述されたファイルの例を示す。
【図11】図11は、フローモデルを実行形式に変換するプログラム(実行支援プログラム)によって変換された統合プログラムの実行形式の例を示す。
【発明を実施するための形態】
【0013】
以下、図面を参照して本発明の実施形態について説明する。実施形態の構成及び設定は例示であり、本発明は実施形態の構成及び設定に限定されない。

【0014】
<情報処理装置の構成>
図1は、GPUを備える情報処理装置(コンピュータ)の構成例を示す図である。情報処理装置10として、例えば、パーソナルコンピュータ(PC),ワークステーションのような専用又は汎用のコンピュータを適用することができる。

【0015】
図1において、情報処理装置10は、バスBを介して相互に接続された、CPU11と、主記憶装置12と、補助記憶装置13と、入力装置14と、出力装置15と、通信インタフェース回路(通信I/F)16とを備える。情報処理装置10は、さらに、バスBを介して接続されたビデオRAM(VRAM)17と、VRAM17に接続されたGPU18とを備える。

【0016】
主記憶装置12は、CPU11の作業領域として使用されるメインメモリとして機能する。メインメモリは、例えば、RAM(Random Access Memory)及びROM(Read Only Memory)によって形成される。

【0017】
補助記憶装置13は、制御装置に相当するCPU11によって実行される、各種のプログラム,及び各プログラムの実行時に使用されるデータを記憶する。補助記憶装置13は、例えば、不揮発性記録媒体であり、例えば、ハードディスク,フラッシュメモリ,EEPROM(Electrically Erasable Programmable Read-Only Memory),SSD(Solid State Drive)の少なくとも1つを用いて形成することができる。主記憶装置12及び補助記憶装置13のそれぞれは、記億装置,記録媒体の一例である。

【0018】
入力装置14は、キーボード,マウスやタッチパネルのようなポインティングデバイスを含み、情報(データ)の入力に使用される。出力装置15は、例えば、ディスプレイ装置であり、情報を画面に表示する。通信I/F16は、ネットワークとの通信処理を司る。

【0019】
バスBは、周辺バスの一例であり、例えば、PCI (Peripheral Component Interconnect)バスや PCI expressを適用することができる。もっとも、主記憶装置12とVRAM17とは、AGP(Accelerated Graphics Port)のような、グラフィック・アクセラレ
ータ(GPU)用の専用バスを介して接続されても良い。

【0020】
VRAM17は、GPU18によって実行されるプログラム,実行に際して使用されるデータ,GPU18によるプログラムの実行結果としてのデータを記憶する。GPU18は、VRAM17に記憶されたプログラムを実行することによって、所定の演算を行い、その結果をVRAM17に書き込む。VRAM17は、記憶装置、記憶媒体の一例である。なお、記憶媒体には、CDやDVD、ブルーレイディスクのような可搬性を有するディスク記録媒体も含まれる。

【0021】
GPU18は、アクセラレータの一例であり、CPU11をメインプロセッサとしたと
きのコプロセッサとして機能する。すなわち、GPU18は、CPU11の制御下で、例えば、所定の複数の演算からなるパイプライン処理を行う。

【0022】
CPU11は、主記憶装置12に記憶されたGPU18向けのプログラムを実行することにより、GPU18で実行されるプログラム(カーネルプログラムと呼ばれる)のコンパイルを行い、VRAM17及びGPU18の内部メモリの少なくとも一方にGPU18が実行可能な形式で記憶(マッピング)する。これが、GPU用のプログラムのダウンロードに相当する。また、CPU11は、VRAM17にカーネルプログラムに応じた入出力設定(入力及び出力に係るアドレス(ポート)設定)を行う。CPU11は、カーネルプログラムの実行によって最終的に得られるGPU18の出力データ(VRAM17に記憶される)を、パイプライン処理の結果(複数の演算の最終結果)として得ることができる。

【0023】
CPU11は、例えば、通信I/F16で受信されるストリームデータに関して、GPU18を用いたリアルタイム処理を行い、GPU18の演算結果を出力装置15で表示したり、通信I/F16からネットワークへ送信したりする。これによって、情報処理装置10は、ストリームコンピューティングを実施することができる。

【0024】
なお、図1に示したハードウェア構成において、VRAM17とGPU18とがセットにされたグラフィックカードと呼ばれるデバイスが適用されても良い。また、VRAM17の代わりに、主記憶装置12の記憶領域の一部をVRAM領域として使用する構成が採用されてもよい。

【0025】
また、アクセラレータはGPUに限られず、GPU18の代わりに、プログラムに従って動作するデバイスが適用されても良い。例えば、デバイスは、DSP(Digital Signal
Processor)や、FPGA(Field Programmable Gate Array)を含むプログラマブルロ
ジックデバイス(PLD)を適用することができる。

【0026】
<GPUで実行される処理>
次に、GPU18で実行される処理について説明する。図2は、GPU18で実行されるパイプライン処理のフローを模式的に示す図である。図2に示す処理パイプラインの例では、それぞれ異なる演算を行う3つのプログラムA,B及びCが、プログラムA→プログラムB→プログラムCの順でGPU18により実行される。プログラムA,B及びCのそれぞれの入力は、データa,b,c及びpとして定義され、プログラムA,B及びプログラムCのそれぞれの出力は、データd,e,f及びqとして定義される。

【0027】
プログラムAの出力データd,e及びfのそれぞれは、プログラムBの入力データa,b,cとなり、プログラムBの出力データd,e及びfのそれぞれは、プログラムCの入力データa,b,cとなる。データpは、各プログラムA,B,Cにおける入力のみのデータであり、データqは、各プログラムA,B,Cにおける出力のみのデータである。

【0028】
図2に示す処理フローを単純に実行しようとすると、各プログラムA,B,Cの実行毎に、CPU11によるVRAM17へのプログラムマッピング及び入出力セッティングが実行されてしまい、オーバヘッドが大きくなる。このため、実施形態では、プログラムA,B及びCのパッキング(合成)が行われたGPU用のプログラムが適用される。

【0029】
図3は、図2に示した処理フローが単一のプログラムにパッキングされた状態を模式的に示す図である。或るプログラムの出力データが次のプログラムの入力となる関係を持つとき、当該出力データと入力データとがペアとして定義される。図3に示す例では、データaとデータd,データbとデータe,データcとデータfとのそれぞれはペアとして定
義される。このような入力データと出力データとの組を“スワップペア(swap pair)”
と呼ぶ。

【0030】
さらに、プログラムA,B,及びCは、単一のカーネルプログラムの形式(統合プログラム(packed program)と称する)に集約される。統合プログラムの入力は、データa,b及びcと、シナリオデータ(scenario)と、入力シナリオインデックス(scenario_index_in)とを含む。一方、統合プログラムの出力は、データd,e及びfと、出力シナリ
オインデックス(scenario_index_out)とを含む。

【0031】
シナリオデータ(シナリオ)は、統合プログラムに含まれるプログラムA,B及びC(それぞれを部品(コンポーネント)プログラムと称することもある)の動作手順(実行順(A→B→C))を指定するデータであり、プログラムA,B及びCのいずれが実行されるかは、入力シナリオインデックスの値に応じて決定される。

【0032】
例えば、入力シナリオインデックスの値が初期値(例えば“0”)であるときにプログラムAが実行され、入力シナリオインデックスの値が“1”であるときに、次のプログラムBが実行され、入力シナリオインデックスの値が“2”であるときに次のプログラムCが実行される。シナリオデータは、インデックス値がインクリメントされる毎に、次の部品プログラムが実行対象として特定されるための情報形式を有する。

【0033】
入力シナリオインデックスは、次に実行する部品プログラムを指定するための値である。入力シナリオインデックスの値は、当該インデックス値で指定された部品プログラムの実行開始前、実行中、実行終了後のいずれかにおいてインクリメントされ、インクリメントされた値が出力シナリオインデックスとして、部品プログラムの出力の一つとして出力される。入力シナリオインデックスと出力シナリオインデックスとは、スワップペアの1つとして定義することができる。

【0034】
なお、図3において、統合プログラムに対する入力データAp,Bp及びCpのそれぞれは、プログラムA,B,Cのそれぞれに対する入力データであり、出力データAq,Bq,Cqのそれぞれは、プログラムA,B,Cからの出力データである。これらは、隣接する(接続関係にある)部品プログラム間で、スワップペアを形成しないデータである。

【0035】
図4は、GPU18による、上記した統合プログラムの実行手順の例を示すフローチャートである。図4に示す01では、前処理が実行される。前処理として、CPU11がGPU18側の記憶領域(VRAM17及びGPU18の内部メモリの少なくとも一方)に対する統合プログラムのマッピング及び入出力設定を行う。但し、以下の説明では、GPU18側の記憶領域としてVRAM17のみが使用される例について説明する。これによって、VRAM17には、統合プログラムがGPU18で実行可能な形式で記憶される。また、統合プログラムに対する初期入力データとして、プログラムAに対する入力データA,B,C及びAp,プログラムBに対するデータBp,プログラムCに対する入力データCp,シナリオデータ,及び入力シナリオインデックスの初期値を示す数値(例えば“0”)が、VRAM17の所定アドレスにそれぞれ記憶される。ここで、データa,b及びcのそれぞれは、所定の入力アドレス“ADDR1”,“ADDR2”,“ADDR3”に格納されており、入力シナリオインデックス値“0”は、所定のアドレス“ADDR4”に格納されるものとする。

【0036】
その後、GPU18がCPU11から発行された統合プログラムの実行指示を受け取ると、GPU18は、シナリオデータと入力シナリオインデックスの初期値とをVRAM17から読み出して、入力シナリオインデックス値に対応するプログラム、すなわち実行すべき部品プログラムを特定する(02)。ここで、GPU18は、入力シナリオインデッ
クス値“0”(初期値)に従って、最初の部品プログラム、すなわちプログラムAの実行を開始する。

【0037】
このとき、GPU18は、プログラムA中で指定された入力データのアドレス(入力アドレス)を示す入力ポインタ値に従って、VRAM17からプログラムA用のデータa,b,c及びデータApを読み出し、プログラムAに従った演算を行う(03)。

【0038】
GPU18は、演算結果として得られたデータd,e,f及びAqを、出力ポインタで指定されるVRAM17上のアドレス(出力アドレス)にそれぞれ記憶する(04)。このとき、データd,e,fのそれぞれは、所定の出力アドレス“ADDR5”,“ADDR6”,“ADDR7”に格納される。

【0039】
また、GPU18は、入力シナリオインデックスの値をインクリメントし、出力シナリオインデックス“1”として、出力ポインタで指定されたアドレス“ADDR8”に記憶する(05)。なお、04の処理と05の処理の順序は逆でも良い。

【0040】
次に、GPU18は、シナリオ(プログラムA,B,C)の全ての実行が終了したか否かを判定する(06)。シナリオが終了していれば(06;YES)、図4に示す処理が終了する。これに対し、シナリオが終了していなければ(06;NO)、GPU18は、スワップペアとして定義されたデータに関する入力アドレスと出力アドレスとの交換(スワップ)を行う(07)。入出力アドレスのスワップは、例えば、入力ポインタと出力ポインタとの交換(スワップ)によって行われる。これによって、出力アドレス“ADDR5”~“ADDR8”のそれぞれが次の部品プログラムに関する入力アドレスとなり、入力アドレス“ADDR1”~“ADDR4”のそれぞれが次の部品プログラムに関する出力アドレスとなる。

【0041】
続いて、処理が02に戻り、GPU18は、インデックス値の入力ポインタに従って、アドレス“ADDR8”から読み出したインデックス値“1”に基づき、シナリオ上の次の部品プログラムに該当するプログラムBを特定する。GPU18は、入力アドレスから入力データを得て、プログラムBの実行を開始する(03)。このとき、GPU18は、入力ポインタに従ってアドレス“ADDR4”~“ADDR7”から読み出されるプログラムAの出力データd,e,fを、入力データa,b,cとして扱う。

【0042】
GPU18は、プログラムBの実行によって得られた演算結果としての出力データd,e,fのそれぞれを、出力ポインタに従って、アドレス“ADDR1”,“ADDR2”,“ADDR3”に格納する(04)。なお、プログラムBの実行に際して、データBpも読み出され、プログラムBの実行結果として得られた出力データBqは、所定の出力アドレスに格納される。

【0043】
GPU18は、アドレス“ADDR8”から読み出したインデックス値“1”をインクリメントしたインデックス値“2”を得て、出力ポインタで指定されたアドレス“ADDR4”に格納する(05)。

【0044】
続いて、GPU18は、シナリオ未終了との判断(06;NO)を経て、スワップペアとして定義されたデータに関する入力ポインタと出力ポインタとの交換(スワップ)を行う(07)。これによって、出力アドレス“ADDR1”~“ADDR4”のそれぞれが入力アドレスとなり、入力アドレス“ADDR5”~“ADDR8”のそれぞれが出力アドレスとなる。

【0045】
GPU18は、インデックス値の入力ポインタに従って、アドレス“ADDR4”から
読み出したインデックス値“2”を確認し(02)、インデックス値“2”に応じたプログラムCの実行を開始する(03)。GPU18は、入力ポインタに従って入力データを取得する。このとき、GPU18は、アドレス“ADDR1”~“ADDR3”から読み出されるプログラムBの出力データd,e,fを、入力データa,b,cとして扱う。

【0046】
GPU18は、プログラムCの実行によって得られた演算結果としての出力データd,e,fのそれぞれを、出力ポインタに従って、アドレス“ADDR5”,“ADDR6”,“ADDR7”に格納する(04)。なお、プログラムCの実行に際して、データCpも読み出され、プログラムCの実行結果として得られた出力データCqも、所定の出力アドレスに格納される。

【0047】
GPU18は、プログラムCの実行が終了すると、シナリオ終了と判定し(06;YES)、図4の処理(統合プログラムの実行)を終了する。VRAM17上の出力アドレスに記憶されたプログラムCの出力データd,e,f及びデータAq,Bq及びCqは、GPU18によるパイプライン処理の結果として、CPU11に渡される。

【0048】
なお、上記した処理における、スワップペアを形成するデータの数(3個)は例示であり、プログラムの実行に際して使用されるデータの数に応じて変動する。また、入力データAp,Bp,Cp及び出力データAq,Bq,Cqも例示である。すなわち、入力データAp,Bp,Cpの一部又は全部に相当するデータがない場合もあれば、出力データAq,Bq,Cqの一部又は全部に相当するデータがない場合もある。また、プログラムの内容に応じて、2以上のスワップペアを形成しないデータが出力される場合もあり得る。

【0049】
図4に示したGPU18の処理によれば、統合プログラムに含まれた複数のGPU用プログラムの実行が、シナリオと、シナリオインデックス値とを用いて制御される。これによって、プログラムAに後続するプログラムB及びCの実行に際して、CPU11とGPU18とのやりとり(プログラムマッピング及び入出力データセッティング)が回避される。このため、CPU11へのプログラムA及びBの実行結果の返却や、CPU11によるプログラムB及びCのマッピング及び入出力セッティングに係るオーバヘッドを削減することができる。よって、CPU11がGPU18を用いた複数のプログラムの実行結果を得るための時間を短縮することができる。また、オーバヘッドの削減によって、GPU18による高速演算の効果を十分に発揮させることができる。

【0050】
また、統合プログラムでは、スワップペアが定義され、次の部品プログラムの実行開始に先立って、スワップペアに係る出力アドレスと入力アドレスとの交換が行われる。これによって、CPU11とGPU18とのやりとり(すなわち、主記憶装置12に記憶された入力データをVRAM17にコピーする処理)が回避されるので、オーバヘッドの削減を図ることができる。

【0051】
さらに、入出力アドレスの交換が実行されることで、CPU11による前処理での入出力セッティングにおいて、2番目以降の部品プログラムに関して、スワップペアに係る入出力設定を省略することができる。これによって、前処理の処理量が削減される。統合プログラムの作成にあたっては、スワップペアを定義することで、複数のプログラムを容易にパッキングすることができる。

【0052】
また、シナリオインデックス値の制御は、カウンタによって行うこともできる。但し、上述したように、シナリオインデックス値を入力シナリオインデックスと出力シナリオインデックスとのスワップペアとすることで、入出力アドレスの入れ替えにより、次のインデックス値を与えることができる。これによって、カウンタを省略できるという利点がある。統合プログラム作成の観点からは、カウンタ生成の手順を省略できる。

【0053】
なお、図3では、スワップペアを定義し得る複数の部品プログラムA~Cがパッキングされた統合プログラムの例を示した。但し、スワップペアを定義できることは、統合プログラム作成に当たっての条件とされない。例えば、図3の統合プログラムからデータa~fが省略された場合のような、スワップペアのない複数の部品プログラムがパッキングされた統合プログラムがGPU18で実行される場合においても、前処理で入力データAp,Bp,Cpを設定することで、GPU18の処理結果である出力データAq,Bq,Cqを周辺バスを介したデータ送受信なく得ることができる。すなわち、上述したオーバヘッド削減の効果を得ることができる。

【0054】
<他のパッキング手法>
図5から図7は、図2及び図3に示したケースと異なる複数のプログラムのパッキング手法を模式的に示す図である。図5は、部品プログラム(カーネルプログラム)X及びYを用いた処理パイプラインの処理フロー例を示す。図5に示す例では、カーネルプログラムXを用いた処理が3回繰り返された結果がカーネルプログラムYに入力される。そして、カーネルプログラムYから出力されるデータが、処理パイプラインの最終結果として出力される。

【0055】
図5のカーネルプログラムXの繰り返し処理に着目すると、2回目、3回目のカーネルプログラムXに対する入力は、前段のカーネルプログラムXの出力である。従って、図6に示すように、2回目及び3回目のカーネルプログラムXの処理は、初回のカーネルプログラムXにおける再帰的処理に置換可能である。当該処理は、カーネルプログラムXの入力と出力とをスワップペアとして、初回のカーネルプログラムXの出力データのアドレス(出力アドレス)を、入力アドレスと交換することで、実現することができる。

【0056】
さらに、カーネルプログラムYの入力に着目すると、カーネルプログラムYの入力は、カーネルプログラムXによる3回目の処理結果(出力データx,y)である。このため、カーネルプログラムXの3回目の出力とカーネルプログラムYの入力をスワップペアとして定義し、カーネルプログラムXの処理からカーネルプログラムYの処理へ遷移する際に、出力アドレスと入力アドレスとの交換によって、出力データx,yがカーネルプログラムYに入力されるようにする。このようにして、4つの演算ステップが単一の統合プログラムとしてパッキングされる。

【0057】
なお、上記したように処理フローが或る部品プログラム(図5のカーネルプログラムX)の繰り返し処理を含む場合には、シナリオに、或る部品プログラムによる処理の繰り返し回数が定義される。この場合、繰り返し回数とインクリメントの回数とが比較され、インクリメントの回数が繰り返し回数を上回ったときに、次の部品プログラムによる処理に遷移する。

【0058】
<統合プログラムのシナリオ生成方法>
次に、統合プログラムのシナリオ生成方法の一例について説明する。複数のGPU用プログラム(カーネルプログラム)を1つのプログラムにまとめる(統合プログラムを生成する)ために、以下の手順で、スワップペアを生成し、さらに、シナリオを生成する。

【0059】
図8は統合プログラムの生成方法の手順の一例を示す図である。図8には、例として、複数のカーネルプログラムとしてのプログラム1,2,3が、プログラム1→プログラム2→プログラム3の順で実行される処理フローが示されている。プログラム1~3のそれぞれは、2つの入力と2つの出力を有し、それぞれを特定する番号(識別子)が設定される。

【0060】
すなわち、プログラム1への2つの入力には、“1.a”と“1.b”とが設定されており、プログラム1からの2つの出力には、“1.c”と“1.d”とが設定されている。同様に、プログラム2への2つの入力には、“2.a”と“2.b”とが設定されており、プログラム2からの2つの出力には、“2.c”と“2.d”とが設定されている。また、プログラム3への2つの入力には、“3.a”と“3.b”とが設定されており、プログラム3からの2つの出力には、“3.c”と“3.d”とが設定されている。当該処理フローを例に、生成手順を説明する。

【0061】
<<ステップ(1)>>
プログラム間に、或るプログラムから次のプログラムへの遷移を示す時刻番号を設定する。すなわち、複数のカーネルプログラムの実行順に従って、入出力(I/O)の接続に時刻番号を振る。図8の例を用いて説明すると、プログラム1とプログラム2の接続に関しては時刻番号“Time A”が設定され、その次の時刻である、プログラム2とプログラム3の接続に関しては時刻番号“Time B”が設定される。

【0062】
<<ステップ(2)>>
次に、それぞれの時刻に関して、スワップペアが定義される。つまり、各時刻において、プログラム間で接続されている入出力(I/O)組が、すべて列挙される。すなわち、時刻番号“Time A”及び“Time B”のそれぞれに関して、例えば、“ペア名=[出力,入力],バッファサイズ”の書式で、スワップペアが定義される。ペアをなす出力のバッファサイズと入力のバッファサイズとは、上記した入出力アドレスの交換を考慮して同じとされる。具体的には、以下のようなスワップペアの定義がなされる。
Time A:Pair 1=[1.c, 2.a], N1 及びPair 2=[1.d, 2.b], N2
Time B:Pair 1=[1.c, 2.a], N3 及びPair 2=[1.d, 2.b], N4

【0063】
ここに、バッファは、プログラムへの入力データ、及びプログラムからの出力データを格納する記憶領域を指し、バッファサイズは、バッファの記憶容量を示す。バッファは、VRAM17上に形成される。もっとも、バッファは、GPU18の内部メモリ上に形成されることもあり得る。

【0064】
<<ステップ(3)>>
次に、すべての入出力(I/O)のペアが入出力を得られるための最長の実行手順をシナリオとする。具体的には、時刻番号“Time A”では、プログラム1からプログラム2へ遷移し、時刻番号“Time B”では、プログラム2からプログラム3へ遷移している。これより、共通のプログラム2で時刻番号“Time A=[1→2]”と時刻番号“Time B=[2→3]”とを結ぶと、最長のフロー(1→2→3)が得られ、当該フローがシナリオとして決定される。このように、ステップ(3)では、最長の処理フローが得られるように、時刻番号を合成することによって統合プログラムのシナリオが生成される。

【0065】
<<ステップ(4)>>
次に、スワップペアをなす入力及び出力を記憶するための記憶容量(バッファサイズ)に基づいて、時刻番号間のスワップペアをなす入力同士及び出力同士の合成を行う。すなわち、ステップ(1)で定義した時刻に対応するスワップペアのそれぞれに対して、その次の時刻のペアの大きいか等しいバッファサイズを持つものとグループ化し、新たなペア(合成ペアと呼ぶ)を作成する。バッファサイズが小さいと、入出力アドレスの交換(スワップ)によってデータが格納できなくなるからである。このとき、合成ペアのバッファサイズとして、合成ペアをなす2つのスワップペアのバッファサイズのうち、大きいバッファサイズが採用される。一度、合成したペア(合成ペアをなすスワップペア)は、再度、他のスワップペアとの合成に使われない。残った入力のペア(1.aと1.b)及び出力のペア(3.c及び3.d)はそのままとし、次のステップへ進む。

【0066】
具体的には、ステップ(4)では、TimeAとTimeBのステップ(1)で定義したそれぞれの時刻のスワップペアを減らすため、上記したバッファの大きさに基づくステップ(4)のルールに従い、隣接する時刻間でスワップペアを合成する。例えば、バッファサイズN1,N2,N3及びN4の大小関係が“N1>N3”であり、“N2=N4”であり、“N1<N4”であると仮定する。すなわち、“N3<N1<N4=N2”であると仮定する。

【0067】
この場合、スワップペア“Pair 1”と“Pair 3”との集合が新たなスワップペア“Pair
1’=Pair 1 ∪ Pair 3 = [c’, a’], N1”として定義され、スワップペア“Pair 2”
と“Pair 4”との集合が新たなスワップペア“Pair 2’=Pair 2 ∪ Pair 4 = [d’, b’], N2”として定義される。

【0068】
<<ステップ(5)>>
次に、最初に実行されるプログラムの入力と、いずれかのスワップペアの入力との合成、及び最後に実行されるプログラムの出力と、いずれかのスワップペアの出力との合成を、各入力及び各出力のそれぞれの記憶容量(バッファサイズ)に基づいて試行する。すなわち、次に合成ペアの全てと残った入力ペア及び出力ペアとを新たな入出力(I/O)として、統合プログラムを定義する。このとき、ステップ(3)で作成したシナリオにおける、最初のプログラム(プログラム1)の入力と、合成ペアとが新たなペアを形成する場合において、入力側のバッファサイズが合成ペアのバッファサイズと等しいか小さい場合には、当該入力は合成ペアの入力と合成される。処理フロー中の最後に位置するプログラムに関しても、その出力が合成ペアと等しいか小さい場合には、当該出力は合成ペアの出力と合成される。このとき、合成は1つの入力に関して1回のみ可能である。

【0069】
具体的には、ステップ(5)では、ステップ(3)で定義したシナリオの最初のプログラム1への入力(1.a及び1.b)に関して、ステップ(4)で得られた合成ペアの入力と合成可能か否かがバッファサイズに基づき判定される。同様に、スワップペアに含まれていない、シナリオ中の最後のプログラム3の出力(3.c及び3.d)に関して、合成ペアの出力との合成が可能か否かがバッファサイズに基づき判定される。

【0070】
入力1.a及び1.bのバッファサイズがそれぞれN5,N6であり、出力3.c及び3.dのバッファサイズがそれぞれN7,N8であると仮定する。さらに、バッファサイズの大小関係が、N5=N1,N6>N2,N7=N3,N8>N4であると仮定する。

【0071】
このとき、入力1.aのバッファサイズと合成ペア“Pair 1'”のバッファサイズN1
とは等しいので、入力1.aは合成ペア“Pair 1'”の入力“a'”と合成される。一方、入力1.bのバッファサイズN6は、合成ペア“Pair 2'”のバッファサイズN2より大
きいので、入力1.bは合成できず、そのまま統合プログラムの入力の一つとなる。

【0072】
入力1.aのバッファサイズと合成ペア“Pair 1'”の入力“a'”のバッファサイズN1とは等しいので、入力1.aは合成ペア“Pair 1'”の入力“a'”と合成される。一方、入力1.bのバッファサイズN6は、合成ペア“Pair 2'”の入力“b'”のバッファサイズN2より大きい。このため、入力1.bは合成できず、そのまま残される。

【0073】
出力3.cのバッファサイズN7と合成ペア“Pair 1'”の出力“c'”のバッファサイN3とは等しいので、入力3.cは出力“c'”と合成される。一方、入力3.dのバッ
ファサイズN8は、合成ペア“Pair 2'”の出力“d'”のバッファサイズN4より大きい。このため、出力3.dは合成できず、そのまま残る。

【0074】
<<ステップ(6)>>
最後に、最終的に残った入出力と、合成ペアの入出力を部品プログラム(プログラム1,2,3)がパッキングされた統合プログラムの入出力として定義したものを作成する。このとき、シナリオ及び入出力シナリオインデックスも設定される。

【0075】
具体的には、図8に示すように、統合プログラムの入力として、データa'と、データ
1.bと、データb'と、シナリオと、入力シナリオインデックスとが定義される。一方
、統合プログラムの出力として、データc'と、データd'と、データ3.dと、出力シナリオインデックスとが定義される。入力a'と出力c'、入力b'と出力d'とのそれぞれはスワップペアであり、部品プログラムの変更に際して入出力の交換が行われる。

【0076】
上述したステップ(1)~(6)を実行するプログラム及び各ステップで使用されるデータ(少なくとも、各プログラムの入力及び出力を示す情報(入力、出力の番号)、入力及び出力のバッファサイズを示す情報、プログラム間の接続(出力と入力との接続)を示す情報)は、図1に示した補助記憶装置13に記憶される。CPU11は、当該プログラムを主記憶装置12にロードしてステップ(1)~(6)を実行することにより、統合プログラムを自動的に作成することができる。

【0077】
図9は、GPU用のプログラム(例えば、Open CL)によって記述された統合プログラ
ムの一例を示す。図9の一行目は、GPU18が備える複数のプロセッサのうち、プログラムを実行するプロセッサ番号(プロセッサID)を特定する。ここでは、プロセッサバ番号“0”のプロセッサが指定されている。

【0078】
次の行は、スイッチ指示を示す。すなわち、シナリオとして、カーネルプログラムA,B,Cを、A→B→Cの順で、シナリオインデックスのインクリメントに応じて、実行対象のカーネルプログラムを切り替えることで実行することを指示する。その次には、異なる演算を行うカーネルプログラムA,B,及びCが記述されており、例えば、カーネルプログラムAは、入力データd,e,f及びApによって所定の演算を行うことが指示されている。カーネルプログラムの次には、カーネルプログラムA,B,Cが同一のプロセッサで実行されることを指定している。そして、最終行は、シナリオインデックス値のインクリメントの指示である。このような統合プログラムが、CPU11のコンパイルによって主記憶装置12上に展開され、VRAM17にマッピングされる。

【0079】
図10は、フローモデル(flow-model)と呼ばれる、パイプライン処理のモデルを定義したモデル定義情報と、所定の記述言語で記述されたパイプライン処理で行われる演算を指示するプログラム(カーネルプログラム)とが所定の記述言語で記述されたファイルの例を示す。フローモデルのファイルは、補助記憶装置13に記憶される。ファイル形式として、図10に示すように、例えばXMLが適用される。

【0080】
図10に示すように、フローモデルは、入力データストリーム(例えばa及びb)の定義と、出力データストリーム(例えばc)の定義とを含む。さらに、カーネルプログラムの記述部分を含む。当該記述部分に、図9に示したような複数のカーネルプログラムがパッキングされた統合プログラム(単一プログラム)が記述される。さらに、フローモデルは、ターゲット機能の名称の記述部分と、下位レイヤのランタイム(Runtime、例えば、
GPUで実行されるOpenCL)を特定する部分と、スレッドブロック及び1つのスレッドのサイズの定義部分とを含む。

【0081】
図11は、“CarSh(カーシュ)”と呼ばれる、上記したフローモデルを実行形式に変
換するプログラム(実行支援プログラム)によって変換された統合プログラムの実行形式の例を示す。実行形式において、図10に示したようなフローモデルのファイルが特定さ
れる。さらに、フローモデルに含まれたカーネルプログラム(統合プログラム)の実行に際して使用されるデータを含んだデータファイルが定義される。

【0082】
さらに、フローモデルにおける入力(Input)及び出力(Output)の後に、スワップペ
アの定義部分(<SwapPair>)が含まれる。スワップペアとして、入力シナリオインデックスと出力シナリオインデックスの他、上述した出力データと入力データとのスワップペアが定義される。また、スワップペアの定義部分には、シナリオにおける入出力のスワップ回数を定義することもできる。例えば、自然数N個のカーネルプログラムが統合されている場合には、N-1回のスワップ回数が指定されることで、すべての出力データのタイミングを合わせることができる。

【0083】
CPU11は、実行支援プログラムの実行時に、例えば入力装置14から入力されるフローモデルの指定情報を受け付け、指定情報に応じたフローモデルのファイルを補助記憶装置13から読みだすとともに、フローモデルファイルに応じたデータファイルを補助記憶装置13から読みだす。

【0084】
続いてCPU11は、フローモデルのファイルを用いて、図11に示したような統合プログラムの実行形式を生成し、カーネルプログラムのコンパイル、VRAM17へのマッピング(ダウンロード)、データファイルを用いたVRAM17への入出力セッティングを行う。マッピング及び入出力セッティングが終了すると、CPU11は、カーネルプログラム(統合プログラム)の実行をGPU18に指示する。

【0085】
GPU18は、カーネルプログラム(統合プログラム)の実行によって、N回、CPU11とのデータ転送を行うことなく、複数のカーネルプログラムを実行することができる。したがって、統合プログラムの最終的な出力を得るまでの時間の短縮化を図り、GPU18の性能を十分に引き出すことができる。
【符号の説明】
【0086】
10・・・情報処理装置(コンピュータ)
11・・・CPU(プロセッサ)
12・・・主記憶装置
13・・・補助記憶装置
14・・・入力装置
15・・・出力装置
16・・・通信I/F
17・・・VRAM(記憶装置)
18・・・GPU(アクセラレータ)
図面
【図1】
0
【図2】
1
【図3】
2
【図4】
3
【図5】
4
【図6】
5
【図7】
6
【図8】
7
【図9】
8
【図10】
9
【図11】
10