説明

タスクベースの並列プログラミング言語

【課題】タスクの依存性を単純に入力することができるプログラムを提供する。
【解決手段】第1の側面は,メモリを含むプログラムに関する。特に,高級言語に関する。プログラムは,タスク及び依存性を読み込む入力のみを要求する。その時,プログラムは,すべてのタスクをエラーなくスケジュールできるように,すべてのタスクと依存性を決定する。その後,すべてのタスクは,プログラムにより決定された依存性によって,スケジュールされる。各タスクは,他の言語又はハードウェアの手段により実行されてもよい。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は,タスクベースの並列プログラミング言語に関する。特にゲーム又はグラフィックに関して,様々なタスクの依存性をコンピュータにより考慮することができるシステム又はソフトウェアに関する。
【背景技術】
【0002】
いくつかのライブラリ及びフレームワークは,依存性や連続性などのスケジューリング機能を多数含むことにより,タスクの並列化を拡張する。タスクの並列化の例として知られているものとして,メニーコアハードウェアをプログラミングするための,効果的で拡張可能な取り組みがあるが,そのようなライブラリやフレームワークなどをC++言語及び他の命令型言語で使用する場合に,いくつかの問題点がある。
【0003】
Cilkは,タスクの生成と同期化のキーワードを加えることにより,C言語又は,C++言語を拡張した言語である。Cilkは,高度なタスクスケジューラを含む。タスクは,他のタスクを順に生み出すことができる関数として特定される。Cilkは,タスク並列化プログラムの生成をより単純にするが,プログラマーは,子タスクを同期化する(子タスクが完了するまで待つ)ことにより,手作業で依存性に対処しなければならない。Cilk++は,C++言語と非常に深く関係しているため(事実,言語の上位集合である),そのため,依存性情報を自動的に計算するのは難しくなっている。これは,C++言語のリファレンス及びポインタでは,コンパイラとランタイムシステムが,タスクの入出力と一致するデータについて予測できないことを意味している。
【先行技術文献】
【非特許文献】
【0004】
【非特許文献1】FRIGO,M.,LEISERSON,C.E.,AND RANDALL,K.H.1998.The implementation of the cilk−5 multithreaded language.Proceedings of the ACM SIGPLAN ’98 Conference on Programing Lauguage Design and Implementation(June).
【発明の概要】
【発明が解決しようとする課題】
【0005】
本発明の目的の1つは,タスクの依存性を単純に入力できるプログラムを提供することである。プログラムは,タスクの依存性のみを処理する高級言語であってもよく,各タスクは,低級言語によって実行されてもよい。
【0006】
本発明の目的の1つは,タスクの依存性を自動的に決定することができるプログラムを提供することである。
【0007】
本発明の他の目的は,タスクの依存性を自動的に決定した後に,並列タスクを実行することができるプログラムを提供することである。
【課題を解決するための手段】
【0008】
本発明の第1の側面は,プログラムに関する。特に,高級言語に関する。プログラムは,タスクと依存性に関する入力のみを要求する。そのとき,プログラムは,エラーのないタスクのすべてをスケジュールできるように,すべてのタスクと依存性を決定してもよい。その後,すべてのタスクは,本発明のプログラムにより決定された依存性によって,スケジュリングされる。各タスクは,他のプログラム又はハードウェアによって実行されてもよい。
【0009】
本発明のプログラムは,複数のタスクを入力する手段と,それらのタスクの依存性を入力する手段と,入力されたタスクの依存性により,入力されたすべてのタスクの依存性を自動的に決定する手段とをコンピュータに行わせる。
【0010】
プログラムに要求される入力は,単純である。しかし,本プログラムは,コンピュータにタスクの依存性を,自動的に,どんなエラーもなく,決定させることができる。繰り返しになるが,本プログラムが,コンピュータにタスクの依存性を決定させた後,他のプログラムが,依存性により決定したスケジュールに基づいて,各タスクを実行してもよい。
【0011】
下記は,代入文の例である。

out_buffer:=my_task(in_buffer,param1)

この場合,my_taskは,入力として‘in_buffer’の出力を要求するとともに,‘param1’も要求する。‘param1’は,タスクに使用されるパラメータ又は数値でもよい。したがって,my_taskは,‘in_buffer’に依存するように決定される。その時,タスク,つまりmy_taskは,‘in_buffer’の出力に依存するいずれかのタスクを,非同期的に実行されるようにスケジュールされてもよい。
【0012】
本プログラムの好ましい態様として,依存性は,所定のタグにより入力される。上記の例として,依存性は,‘buffer’のタグが付されており,依存タスクは,かっこ内に記述されている。
【0013】
本プログラムの好ましい態様として,タスクは,‘task code’の入力,‘input data buffer’の入力,‘output data buffer’の入力,及び‘immediate parameter’の入力に従って実行される。タスクの依存性は,‘input data buffer’及び‘output data buffer’として入力され,‘input data buffer’の入力,及び‘output data buffer’の入力により決定する。
【0014】
依存性は,‘buffer’タグにより入力されるため,コンピュータは,タグの情報を読み込むことにより,入力される依存性を決定することができる。ここでいう‘task code’は,他のプログラムにより実行される各タスクを示してもよい。‘task code’の例は動画であり,あるオブジェクトの動画を生成することである。‘immediate parameter’の例は,何かの計算に使用される数字又は数値である。
【0015】
本プログラムの好ましい態様として,本プログラムは,コンピュータを,すべての入力タスクの決定された依存性を考慮して,タスクを自動的にスケジューリングする手段として,さらに機能させる。
【0016】
本プログラムの好ましい態様として,自動的に依存性を決定する手段は,親タスク及び親タスクに要求される1つ又は複数の子タスクを決定する手段と,すべての子タスクの情報を格納する手段と,親タスクに必要なすべての子タスクが実行されるか否かを決定する手段とを含む。本発明は,コンピュータの読み取り可能なメディアを含む。このメディアは,上記プログラムを含む。さらに本発明は,上記プログラムを実装するハードウェア,例えばコンピュータを含む。
【発明の効果】
【0017】
本発明のプログラムは,タスクとそれに伴う依存性の単純な入力に基づき,タスクの依存性を単純に決定することができる。この依存性により,本発明のプログラムを実装するコンピュータは,タスクのスケジュールを決定することができる。プログラムは,依存性の制御装置として使用されてもよい。
【図面の簡単な説明】
【0018】
【図1】図1は,実施例2の依存性グラフを示す。
【図2】図2は,実施例3の依存性グラフを示す。
【発明を実施するための形態】
【0019】
タスクベースの並列プログラミング言語
本発明のタスクベースの並列プログラミング言語を説明する。本発明により得られるフレームワークは,2階層システムであってもよい。高階層では,タスクと依存性を特定する簡易なスケジューリング言語を扱い,低階層では,タスクの実装を行う。タスクの実装は,タスク言語又は,例えばC++言語のどちらか一方によってなされ得る。
【0020】
本発明のプログラムは,高階層のプログラムに関する。高階層のプログラミングとして,タスクの指定は,‘task code’,‘input data buffer’,‘output data buffer’及び‘immediate parameter’から成ってもよい。つまり,プログラマーは,‘task code’
‘input data buffer’,‘output data buffer’,又は‘immediate parameter’に関する情報を,キーボード,タッチパネル及びマウスなどのポインティングデバイスによって,入力してもよい。プログラマーは,‘input data buffer’及び‘output data buffer’によりタスクの依存性を入力してもよい。言い換えると,プログラマーは,入出力データの要件に沿って,リスト操作を指示するのみである。
【0021】
プログラマーは以下のように記述することができる。
Task 1:caluculate character 1 position
Task 2:caluculate character 2 position
Task 3:draw character 1(when Task 1 is complete)
Task 4:draw character 2(when Task 2 is complete)
【0022】
上記の例において,‘caluculate’及び‘draw’は,‘task code’であり,‘when Task1 is complete’及び‘when Task2 is complete’は,‘input data buffer’に対応している。入力データは,コンピュータのメモリに格納されている。コンピュータは,依存情報を抽出し,タスクスケジューラに渡す。つまり,本プログラムが実装されるこのシステムは,‘input data buffer’を読み込むことにより,Task3がTask1に依存すること,及び‘input data buffer’を読み込むことにより,Task4がTask2に依存することを自動的に決定することができる。また,コンピュータは,メモリから入力データを読み込み,依存性を示すかっこを検索することにより,すべての依存性,つまり,Task3がTask1に依存すること,及びTask4がTask2に依存することを決定してもよい。
【0023】
本プログラムは,プログラマーに,より大きなバッファのサブ領域の指示を入力させてもよい。サブ領域の入力の表記は,[and]である。その指示により,単一のバッファでの作業を分割してもよい。そのようなデータがプログラマーにより入力される時,コンピュータはその入力をメモリに格納する。その際,コンピュータはメモリからその入力を読み込み,分析する。そして,
[and]を含むように入力が決定されると同時に,コンピュータは,サブ領域のタスクが指示されることを決定する。その後,コンピュータは単一のバッファを2つ又は2つ以上に分割する。
【0024】
本プログラムは,プログラマーに,バッファの使用に関するいくつかの制約をバイパスする指示を入力させてもよい。バイパスの入力表記の例は,<−である。本プログラムは,コンピュータに,決定された依存性を考慮して,そのようなバイパスを,自動的に決定させてもよい。
【0025】
本プログラム又は本プログラムを有するコンピュータは,親タスク及び親タスクを要件とする1つ又は複数の子タスクを決定してもよい。上記の例では,Task3をTask1の結果として実行することが要求されているので,Task3はTask1に依存している。この場合,Task3が親タスクで,Task1が子タスクとなる。本発明の好ましい態様では,すべての子タスクの情報をメモリに格納する。コンピュータは,すべての子タスクが終了するか否かを,メモリに格納される子タスクの情報により,決定する。コンピュータは,すべての子タスクが終了されると決定すると同時に,親タスクを実行してもよい。プログラムが,コンピュータに親タスクと子タスクを自動的に決定させ,子タスクが終了した後に親タスクを実行させるので,プログラマーは,タスクとランタイムをスケジューリングする必要がない。
【0026】
コンピュータのスケジューラは,タスクの依存性のすべてを考慮することにより,実行順序を決定する。コンピュータは,character1とcharacter2が独立するように決定する。コンピュータは,Task1と3及びTask2と4が並列的に実行されるように決定する。コンピュータは,低階層システムを使用して,各タスクのランタイムを決定する。
【0027】
このシステムでは,データはバッファのタグが付されてもよい。プログラムは,コンピュータの読み込み可能な媒体に格納されてもよい。そのような媒体の例としては,CD−ROM,CD,DVD,FD,MO,USBメモリ,SDカード,IPコア及びICチップがある。つまり,本発明は,上記プログラムを格納する,このようなメモリを有する。
【0028】
本発明の第2の側面は,複数のタスクの入力手段と,タスクの依存性を入力する手段と,入力されたタスクの依存性により,入力されたすべてのタスクの依存性を自動的に決定する手段,とを含むコンピュータに関する。つまり,コンピュータは,例えば上記プログラムをメインメモリに格納し,プログラムにより提供される操作手段によって,依存性を決定する。コンピュータは,入力手段,出力手段,処理ユニット,及び演算ユニットを含んでもよい。各手段及びユニットは,例えば,バスにより接続されている。
【実施例1】
【0029】
アニメーションシステムの簡単な実施例として,下記のコードは,2つのアニメーションのアンパックとそれらを操作する混合タスクを,正確な依存性でスケジュールする。
【0030】
buffer<Animation>anim1
anim1:=unpackanim_task(input1)

buffer<Animation>anim2
anim2:=unpackanim_task(input2)

buffer<Animation>final
final:=unpackanim_task(anim1,anim2)

【0031】
上記では,タスクと依存性が入力されている。つまり,要件となる各タスクの情報は,かっこ内に表示されている。その要件情報は,依存性に関する。従って,コンピュータは,上記入力データを受けとったときに,タスク及び依存性を決定する。コンピュータは,buffer<Animation>finalから,タスクがanim1及びanim2を要件とすること決定する。すなわち,このタスクは上記2つのタスクに依存している。
【0032】
適切に定義されている‘Animation’データオブジェクトと要件となるタスクコードを考えると,プログラマーは,唯一,データがシステムを移動する方法を特定する必要がある。その時,ランタイムフレームワークは,2つの’unpackanim_task’操作を並列に実行できるように決定することができる。アンパックと混合タスクは以下の関数を実装することによりC++言語によって記述することできる。
【0033】
void_tl_blend_task(tlcontext_t tlctx,
buffer_t anim1,
buffer_t anim2,
buffer_t output1);
【0034】
この実装コードは,スケジューリング又はバッファのロッキングの詳細を配慮することなく行われるように,計算のみに焦点を当てることになる。また,実装コードは,コード型とデータ型の最小集合にのみ依存することになるため,すべてのデータは,関数の引数として渡される必要がある。
【0035】
ここにあるように,このアニメーションのタイプは,C++言語クラスになるだろうが,意図的にunpack()メソッドを組み込んでいない。それどころか,これはタスクのあるデータコンテナであって,メソッドは作動しない。このアーキテクチャ(メソッドは,データアクセスを提供するのであって,作動しない)は,演算関数の依存性を軽減するのに役立つ(そのような依存性は,既存コードをタスクにリファクタリングする時よく問題を起こす)。これにより,より多くの並列化が,最小の努力でより少ないエラーにより導入される。
【実施例2】
【0036】
今後グラフィックアプリケーションとなりえる,ほんの少し高度な実施例を以下に示す。初めに,位置データが復元され,その後,それは,以下の2つの目的に使用される。第1に,位置データは,詳細なバウンディング形状を計算するボクセル構造を満たすように使用される。第2に,位置データは,光のタンジェントデータと標準データを計算するのに使用される。
【0037】
posBuf:=decomp_pos(compbuffer,numVerts)
tanBuf:=calc_tangents(posBuf,numVerts)
norBuf:=calc_normals(posBuf,tanbuf,numVerts)
voxelBuf:=calc_voxel(posBuf,numVerts)
【0038】
上記では,タスクと依存性が入力されている。つまり,要件となる各タスクの情報が,かっこ内に表示されている。コンピュータは,入力によりすべてのタスクと依存性を決定する。タスクの‘tanBuf’は,‘posBuf’,つまり‘decomp_pos’に依存している。タスクの‘voxelBuf’は,‘posBuf’,つまり‘decomp_pos’に依存している。タスク‘norBuf’は,‘posBuf’,つまり‘decomp_pos’及び‘tanBuf’,つまり‘calc_tangents’に依存している。次に,コンピュータは,すべてのタスク又はタスクのスケジューリングにランタイムを割り当てる。つまり,コンピュータは,初めに‘decomp_pos’タスクを実行するよう手配し,その時,‘calc_tangent’タスクと‘calc_voxel’タスクを並列に実行し,その後,‘calc_normals’も実行する。
【0039】
図1の依存性グラフは,設定されたランタイムスケジューラにより,コード実行時に生成された。これは,システムが,タスク間の依存性を正確に抽出していることを示している。
【実施例3】
【0040】
この実施例では,より高度な検証として,再帰ソーティングアルゴリズムを使用した。ピボット(通常,右端の値)を選択し,バッファのファストパスを行う整数型バッファから始めて,ピボットが正しい位置になるよう配列し直すために,ピボットの左側へのすべてのエントリーは,より少ない値か等しい値とし,ピボットの右側へのすべてのエントリーは,そのピボットよりもすべて大きな値とする。
【0041】
この段階では,左側と右側はソートされていないが,同じアルゴリズムをこれらのサブバッファに,再帰的に適用することができる。サブバッファは,結局は,完全にソートされた整数リストになる。
【0042】
この実施において,再帰‘ソート’タスクは,タスク言語により実装され,‘doSort()’関数(C言語により実装される)の使用により,実際のデータ操作が行われる。‘sort’関数のコードは,以下に示される。
【0043】
task buffer<unit32_t>output::
sort(size_t entries,
buffer<unit32_t>input)

#Divide using the pivot
size_t pivIdx
pivIdx
pivIdx=doSort(entries,output)

#Sort LEFT buffer
if pivIdx>1 then
buffer IBuf=output[0,pivIdx]
IBuf<−sort(pivIdx,IBuf)
end

#Sort RIGHT buffer
if pivotIdx<entries−2 then
buffer rBuf =output[pivIdx+1,entries]
size_t rEntries =entries−pivIdx−1
rBuf <− sort(rEntries,rBuf)
end
end
【0044】
このコードは,いくつかの言語機能を示している。‘sub−buffer’,つまり,[and]表記は,より大きなバッファのサブ領域を参照する新しいバッファオブジェクトを生成するのに使用される。この機能は,依存性を追跡させたまま,単一のバッファの作業を分割させる。‘in−place buffer assignments’,つまり,<−の表記は,バッファ使用時のいくつかの制約を,バイパスするのに使用される。これは,各段階での中間バッファの割り当てを回避するという,実行上の理由で,使用される。
‘continuations’については,左右のサブバッファの子タスクを起動した後,親タスクのソートが終了する。その時,通常ならば,いずれの依存タスクも実行され得るが,子タスクが完了していなかったために,バッファは完全にソートされないかもしれない。これを克服するために,本システムは,子タスクを連続的に起動する。そのため,依存タスクは,子タスクが完了するまで実行されなくてもよい。
【0045】
図2は,あるテストデータでアルゴリズムを実行することにより生成される依存性グラフを示す。(赤い)ノードはソートプロセスで同時に生成される子タスクを示す。この場合,チェックタスク(Check Task)は,ソートタスクが完了するまでスケジュールされない。
【産業上の利用可能性】
【0046】
本発明は,コンピュータ産業,特に,アミューズメント産業において利用可能である。
【符号の説明】
【0047】
1 タスク
2 バッファ
3 ソート





【特許請求の範囲】
【請求項1】
複数のタスクを入力する手段と,
前記タスクの依存性を入力する手段と,
前記タスクの前記入力された依存性を用いることにより,すべての前記入力されたタスクの依存性を,自動的に決定する手段として,コンピュータを機能させる,
プログラム。

【請求項2】
前記依存性は,所定のタグにより入力される,請求項1に記載のプログラム。

【請求項3】
前記タスクは,‘task code’の入力,‘input data buffer’の入力,‘output data buffer’の入力,及び‘immediate parameter’の入力により実行され,
前記タスクの前記依存性は,‘input data buffer’及び‘output data buffer’として入力され,
前記タスクの前記依存性は,‘input data buffer’の入力及び‘output data buffer’の入力により決定される,
請求項1に記載のプログラム。

【請求項4】
前記コンピュータを,さらに,
すべての前記入力されたタスクの前記決定された依存性を考慮して,タスクを自動的にスケジューリングする手段として,機能させる
請求項1に記載のプログラム。

【請求項5】
前記依存性を自動的に決定する手段は,
親タスク,及び前記親タスクに必要な一又は複数の子タスクを決定する手段と,
すべての前記子タスクの情報を格納する手段と,
前記親タスクに必要なすべての前記子タスクが実行されるか否かを決定する手段とを含む,
請求項1に記載のプログラム。











【図1】
image rotate

【図2】
image rotate


【公開番号】特開2012−128551(P2012−128551A)
【公開日】平成24年7月5日(2012.7.5)
【国際特許分類】
【外国語出願】
【出願番号】特願2010−277812(P2010−277812)
【出願日】平成22年12月14日(2010.12.14)
【出願人】(308033283)株式会社スクウェア・エニックス (173)