"複数のコアブロックからなるプロセッサと、前記プロセッサに接続され、コマンドキューとタスク管理構造情報とを格納するメモリと、を具備する情報処理装置であって、前記コマンドキューには複数のカーネル関数を束ねた一連のカーネル関数がセットされ、前記タスク管理構造情報は先行するカーネル関数の返り値と後続のカーネル関数の引数とをつなぐことによりカーネル関数の実行順序を規定する情報であり、前記プロセッサのコアブロックは異なるカーネル関数を実行可能である情報処理装置。前記コマンドキューの一連のカーネル関数のエントリーアドレスにはインタープリタが配置される請求項1記載の情報処理装置。前記複数のコアブロックの各々の所定のコアが前記インタープリタを実行し、残りのコアはカーネル関数の実行待ち状態と、カーネル関数の実行状態とを繰り返す請求項2記載の情報処理装置。前記インタープリタがカーネル関数を読み出すと、前記複数のコアブロックの所定のコアブロックの所定のコアはカーネル関数に関するデータを前記タスク管理構造情報に追加し、カーネル関数の実行に必要な数のコアブロックを確保し、インタープリタの処理を次のコアブロックに引き継ぐ請求項3記載の情報処理装置。前記インタープリタが読み出したカーネル関数の引数が計算済みではない場合は、カーソル関数の実行待ち状態とされる請求項4記載の情報処理装置。複数のコアブロックからなるプロセッサと、前記プロセッサに接続されるメモリとを具備する情報処理装置の情報処理方法であって、前記メモリに設けられたコマンドキューに複数のカーネル関数を束ねた一連のカーネル関数をセットし、先行するカーネル関数の返り値と後続のカーネル関数の引数とをつなぐことによりカーネル関数の実行順序を規定するタスク管理構造情報を前記メモリに格納し、前記プロセッサのコアブロックが異なるカーネル関数を実行可能である情報処理方法。従来のタスク並列処理の情報処理装置は十分な並列度が達成できないことが多いという課題があった。本発明の目的は十分な並列度を達成できる情報処理装置及び情報処理方法を提供することである。実施形態によれば、情報処理装置は複数のコアブロックからなるプロセッサと、プロセッサに接続され、コマンドキューとタスク管理構造情報とを格納するメモリとを具備する。コマンドキューには複数のカーネル関数を束ねた一連のカーネル関数がセットされる。タスク管理構造情報は先行するカーネル関数の返り値と後続のカーネル関数の引数とをつなぐことによりカーネル関数の実行順序を規定する情報である。プロセッサのコアブロックは異なるカーネル関数を実行可能である。第1の実施形態以下、第1の実施形態について図面を参照して説明する。図1に実施形態のシステム全体の構成の一例を示す。例えば、GPU等である計算デバイス10はホストCPU12により制御される。計算デバイス10はマルチコアプロセッサからなり、多数のコアブロックに分割されている。図1の例では、計算デバイス10は8つのコアブロック34に分割される。計算デバイス10はコアブロック34単位に別のコンテキストを管理できる。コアブロックは16個のコアからなる。コアブロックあるいはコアを並列に動作させることにより、高速なタスク並列処理が可能となる。コアブロック34はブロックIDにより識別され、図1の例では、ブロックIDは0~7である。ブロック内の16個のコアはローカルIDにより識別され、ローカルIDは0~15である。ローカルIDが0のコアはブロックの代表コア32と称される。ホストCPU12もマルチコアプロセッサであってもよい。図1の例では、デュアルコアプロセッサとする。ホストCPU12は3段階のキャッシュメモリ階層を持つ。メインメモリ16と接続されるL1キャッシュ22はホストCPU12内に設けられ、L2キャッシュ26a、26bと接続される。L2キャッシュ26a、26bはそれぞれCPUコア24a、24bに接続される。L1キャッシュ22とL2キャッシュ26a、26bはハードウェアによる同期機構を持ち、同一アドレスへのアクセスの際に必要な同期処理が行われる。L2キャッシュ26a、26bはL1キャッシュ22で参照されるアドレスのデータを保持し、キャッシュミスが生じた場合などにはハードウェアによる同期機構により、メインメモリ16との間で必要な同期処理が行われる。計算デバイス10によりアクセスできるデバイスメモリ14が計算デバイス10に接続され、ホストCPU12にメインメモリ16が接続される。メインメモリ16とデバイスメモリ14の2つのメモリが接続されているので、計算デバイス10で処理を実行する前後で、デバイスメモリ14とメインメモリ16とでデータのコピー同期化を行う。このため、メインメモリ16とデバイスメモリ14とが互いに接続されている。しかし、複数の処理を連続して実行する場合、1つの処理毎にコピーを実行する必要はない。図2はシステム構成の他の例を示す図である。ここでは、デバイスメモリ14を単独で設けずに、計算デバイス10とホストCPU12がメインメモリ16を共有し、メインメモリ16内に図1のデバイスメモリ14と等価なデバイスメモリ領域14Bが設けられる。この場合は、デバイスメモリとメインメモリとでデータのコピーを行う必要がない。図3に並列処理の概略を示す。複数のカーネルを並列処理するプログラム並列コードは以下に示すようにデータフロー言語で記述される。この例ではif文の実装例を示しており、カーネル関数Kr0,Kr1,Kr2,Kr3,Kr4,Kr5の呼び出しシーケンスで構成され、引数と返り値で順序関係が規定されている。A[0]の値によって、呼び出されるカーネル関数がKr3かKr4か切り替わる。A=Kr0L,M,P;B=Kr1Q;C=Kr2A,B;ifA[0]==0D=Kr3R;elseD=Kr4S;E=Kr5D,C;この並列コードをコンパイルした例が図3のバイトコードであり、バイトコードはデバイスメモリ10に転送される。カーネル関数Kr0に関するバイトコードは6バイトである。バイトコードはインタープリタにより解釈され、実行される。バイトコードはマシン非依存であり、異なるアーキテクチャの計算デバイスでもシームレスに並列処理が可能である。計算デバイス10で1つのデータ要素の演算を実行する処理単位であるカーネルはカーネルコードの束としてまとめられ、デバイスメモリ14内に設けられるコマンドキュー18に投入される。カーネルコードKr0の束はカーネル関数Kr0の実態、計算デバイス上で実行する計算プログラムの本体例えば行列の掛け算やベクトルの内積等である。バイトコードは、これらのカーネル関数を計算デバイスのブロックに割り当てて実行するための手順を実行するためのプログラムである。このカーネルコードの束は1つの命令シーケンスプログラムであり、図3の並列処理はデータ並列処理であり、SPMDモデルである。カーネルコードの束のエントリアドレスにはインタープリタプログラムが配置される。デバイスメモリ14にはタスク管理構造グラフ構造も格納される。タスク管理構造はバイトコードに基づいて計算デバイス10により作成されるもので、先行するカーネル関数の返り値と、後続のカーネル関数の引数とを繋ぐことによってカーネル関数の実行の前後関係を表現するものである。これにより、本来の並列アルゴリズムのデータフローを自然な形で表現するとともに、プログラム実行時に最大限の並列性を引き出すことが可能となる。計算デバイス10上の並列処理の一例のフローチャートを図4に示す。処理シーケンスは計算デバイス10のどのコアで処理されるかに応じて異なる。図4の左側のシーケンスはブロックIDが0のコアブロック34の代表コア32のシーケンスであり、中央はブロックIDが0以外1~7のコアブロック34の代表コア32のシーケンスであり、右側は代表コア32以外のコアのシーケンスである。各コアブロックの代表コア32がインタープリタのコードを交互に実行する。ブロックID=0のコアブロック34の代表コア32はブロック100でプログラムカウンタをエントリポイントにセットする。すなわち、カーネル関数Kr0に関するバイトコードの位置にエントリポイントがセットされる。ブロックID=0のコアブロック34の代表コア32がプログラムカウンタに従い、ブロック104でバイトコードを読み出す。ここでは、カーネル関数Kr0に関するバイトコードKr0、A、I、M、P、rangeAが読み出される。読み出したバイトコードがカーネル関数であるか否かブロック106で判定する。カーネル関数である場合、ブロック108でデバイスメモリ14上にカーネル関数に関するタスク管理構造図3参照を作成し、タスクをブロックに割り当てる。タスクはブロック単位でタスク管理構造に登録されてもよい。次に、バイトコードの実行を退避し、自分のブロックIDここでは、0カーネル関数の実行に必要なブロックサイズここでは、3つの引数I、M、P分の3、この情報はバイトコードのrangeAというオペランドから取得をnextIDに設定することで、カーネル関数Kr0の実行に必要なコアブロックの数=3を確保する。バイトコードのインクリメントは、ブロック124またはブロック110で実行される。この時のインクリメントサイズは、現在実行しているバイトコードのサイズ最初の命令の場合は、6バイトとなる。ブロックID=0~3の3つのコアブロックがカーネル関数Kr0に割り当てられる。タスク管理構造はタスクの実行順序を制御し、デバイスメモリ上で一連の処理を遂行する。タスク管理構造はタスクの実行順序を保証するためにキューまたはグラフ構造を持つ。ここでは、グラフ構造が採用されている。キューの場合はインオーダーで実行制御ができ、グラフ構造の場合はアウトオブオーダーで実行制御ができる。言い換えると、キューではタスクをキューにつないだ順でのみタスクの開始の順序が制御できないが、グラフ構造の場合は後から登録したものでも、実行開始可能になったものからブロックを割り当てて処理を開始することができる。ブロック110でプログラムカウンタをインクリメント1し、次の命令のアドレスカーネル関数Kr1に関するバイトコードの位置に設定する。ブロック112でインタープリタの実行状態インタープリタのコンテキストをメモリに退避する。ブロック114でnextIDのスレッドを起動する。ここで、スレッドID、ブロックID、ローカルID、ブロックサイズについて説明する。OpenCLではブロックのことをワークグループと称する。まず、通常、計算デバイスでのカーネル実行では、スレッドサイズを指定する。スレッドサイズ分のスレッドが起動される。図の例では、たとえば16×8=128スレッドで起動したとする。この時、128個のスレッドは、スレッドIDが0~127のIDが割り当てられる。最初の0~15の16個がブロックID=0のブロックで実行開始され、次の16~31の16個のスレッドがブロックID=1のブロックで実行開始される。この16~31のスレッドは、ローカルIDは0~15で、ブロックサイズは16である。このとき、スレッドID=ブロックID×ブロックサイズローカルIDという関係になる。代表コアと表現しているスレッドはローカルIDが0のスレッドである。nextIDのスレッドとは、実施例でいえばスレッドIDが16×3=48のスレッドである。ブロック116で自分のブロックIDからnextID-1のブロックIDに含まれるスレッドを起動し、ブロックIDがnextIDここでは、3であるコアブロックの代表コア32にインタープリタの処理を引き継ぐ。ブロック118で引数L、M、PからデータIDを取得し、自分のブロックIDから必要なブロック数=3のコアブロックを用いてカーネル関数Kr0の処理を実行する。ブロック116の後、ブロック150でローカルIDが0代表コアであるか否かを判定する。ローカルIDが0代表コアである場合は、ブロック130でインタープリタのロックを待ち、ブロック132でカーネル関数が実行できる状態引数のデータが全て計算済みであるか否かを判定する。カーネル関数が実行できる状態の場合は、ブロック134でカーネル関数が実行される。その後、ブロック130に戻る。カーネル関数が実行できる状態ではない場合は、ブロック102に戻り、インタープリタをロードする。ブロック116でインタープリタの処理を引き継いだ次のコアブロックここでは、ブロックID=3の代表コアは、バイトコードの解釈実行を続け、実行可能なカーネル関数ここでは、カーネル関数Kr1を見つけると、最初の代表コアと同様にタスク管理構造にデータを追加し、必要なブロックを確保し、インタープリタ処理を次の代表コアに引き継ぎ、カーネル関数Kr1の実行ブロック134に遷移する。ブロック111で、カーネル関数に相当するバイトコードの実行を続けるか否か判定し、実行を続ける実行可能ある場合は、ブロック104に戻り、実行可能でない場合引数のデータすべてが計算済みでないは、タスク管理構造に必要なデータを追加してバイトコードの実行を続ける。カーネル関数の実行を完了すると、最初に起動した代表コアは、ブロック135でタスク管理構造のデータをアップデートし、実行可能なカーネル関数が見つかれば、引き続きカーネル関数の実行を行う。ブロック150で非代表コアであると判定されたコアは、カーネル関数の実行待ちブロック140とカーネル関数実行ブロック142の状態を行き来する。ブロック106でバイトコードがカーネル関数ではないと判定された場合は、ブロック122でバイトコードを実行し、ブロック124でプログラムカウンタをインクリメントし、ブロック104に戻る。このように、計算デバイス14のブロックIDが0のコアブロックはバイトコードを読み出して、インタープリタを実行し、実行可能なカーネル関数を見つけると、タスク管理構造を生成し、カーネル関数の実行に必要な数のコアブロックを確保した後、インタープリタの処理を次のコアブロックに引き継ぐとともに、確保したコアブロックに対応するスレッドと共にカーネル関数の実行を始める。ただし、カーネル関数の引数のデータ全てが計算済みではない場合カーネル関数に相当するバイトコードが実行可能ではない場合は、タスク管理構造に必要なデータを追加して、バイトコードの実行を続ける。インタープリタの処理を引き継いだコアブロックも最初のコアブロックと同様な動作を実行する。実施形態は、並列コードをバイトコードに変換することによりホストCPU/計算デバイスのシームレスな並列処理を達成したが、計算デバイスのみで処理する場合は、バイトコードではなく特定のデータ構造に変換して処理することも可能である。以上説明したように、第1の実施形態によれば、計算デバイスはデバイスメモリ上に先行するカーネル関数の返り値と、後続のカーネル関数の引数とを繋ぐことによってカーネル関数の実行の前後関係を表現するタスク管理構造を定義することにより、計算デバイスのコアブロックに適切にカーネル関数を割り振ることができ、カーネル関数を並列に実行することができ、プログラム実行時に最大限の並列性を引き出すことが可能となる。計算デバイスがカーネル関数の実行順序をホストCPUの介在なしに自律的に制御するので、SPMDのAPIのみしかサポートしていない計算デバイスにおいても、またデータ並列性が十分でないアルゴリズムであっても、計算デバイスを有効に活用して高い性能を得ることができる。計算デバイスが要求する並列度に満たない複雑なアルゴリズムであっても、並列処理に起因するタイミングバグの発生を防ぐと同時に、タスク並列実行によって計算デバイスの利用効率を高めることが可能となる。なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合せにより種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。更に、異なる実施形態に亘る構成要素を適宜組み合せてもよい。"