(57)【要約】【課題】  ＧＰＵを用いた処理を実現するために作成するプログラムを、より簡便に作成する為の技術を提供すること。【解決手段】  ＣＰＵ１０１は、関数nt_parallel_for()が記されたソースプログラムをコンパイルすることで得られるコンピュータプログラムを取得し、関数nt_parallel_for()の引数である文字列を取得する。ＣＰＵ１０１は、ＧＰＵ用のドライバが解釈可能な中間コードを文字列から生成し、中間コードからドライバが生成した実行形式のコードを専用メモリに転送し、転送したコードをＧＰＵが実行することでＧＰＵが生成したデータを取得する。【選択図】  図１
2012022580.tif 000002
【特許請求の範囲】
【請求項１】
ＣＰＵを有する情報処理装置であって、
前記ＣＰＵよりも処理能力が高い機器に実行させる処理の内容を示す文字列を引数として受け取り可能な関数について予め作成されたライブラリであって、前記ＣＰＵに、前記処理を前記機器に実行させるために前記機器用のドライバが解釈可能な中間コードを前記文字列から生成させ、該中間コードから該ドライバが生成した実行形式のコードを前記機器に転送させ、該転送したコードを前記機器が実行することで該機器が生成したデータを取得させる前記ライブラリを保持する保持手段と、
ユーザが編集可能なソースプログラムであって、前記関数が記された該ソースプログラムを前記ＣＰＵ用のコンパイラを用いてコンパイルすることで得られる前記ＣＰＵ用のコンピュータプログラムを取得する第１の取得手段と、
前記文字列を取得する第２の取得手段と、
前記ＣＰＵ用のコンピュータプログラムを実行する際、前記ＣＰＵに前記ライブラリを実行させることで、前記ＣＰＵに、前記処理を前記機器に実行させるために前記ドライバが解釈可能な中間コードを前記文字列から生成させ、該中間コードから該ドライバが生成した実行形式のコードを前記機器に転送させ、該転送したコードを前記機器が実行することで該機器が生成したデータを取得させる処理手段と、
前記処理手段が取得したデータを、前記関数の実行結果として出力する出力手段と
を備えることを特徴とする情報処理装置。
【請求項２】
前記第１の取得手段は、
前記文字列が前記関数の引数として前記ソースプログラム中に記述されている該ソースプログラムを、前記文字列以外の記述をバイナリ形式、該文字列を文字列形式、とするコンピュータプログラムにコンパイルしたものを前記ＣＰＵ用のコンピュータプログラムとして取得することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記第２の取得手段は、前記ＣＰＵ用のコンピュータプログラムにおいて文字列形式で記されている文字列を取得することを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記第２の取得手段は、前記ＣＰＵ用のコンピュータプログラムとは別個のテキストファイルとして前記文字列を取得することを特徴とする請求項１に記載の情報処理装置。
【請求項５】
前記第２の取得手段は、前記ＣＰＵ用のコンピュータプログラム内で生成される文字列を取得することを特徴とする請求項１に記載の情報処理装置。
【請求項６】
前記機器は、前記ＣＰＵの制御下で動作し且つ該ＣＰＵとは独立した専用メモリを有するＧＰＵであることを特徴とする請求項１乃至５の何れか１項に記載の情報処理装置。
【請求項７】
前記機器は、複数台のコンピュータであることを特徴とする請求項１乃至５の何れか１項に記載の情報処理装置。
【請求項８】
ＣＰＵを有する情報処理装置が行う情報処理方法であって、
前記情報処理装置が有する保持手段が、前記ＣＰＵよりも処理能力が高い機器に実行させる処理の内容を示す文字列を引数として受け取り可能な関数について予め作成されたライブラリであって、前記ＣＰＵに、前記処理を前記機器に実行させるために前記機器用のドライバが解釈可能な中間コードを前記文字列から生成させ、該中間コードから該ドライバが生成した実行形式のコードを前記機器に転送させ、該転送したコードを前記機器が実行することで該機器が生成したデータを取得させる前記ライブラリを保持する保持工程と、
前記情報処理装置が有する第１の取得手段が、ユーザが編集可能なソースプログラムであって、前記関数が記された該ソースプログラムを前記ＣＰＵ用のコンパイラを用いてコンパイルすることで得られる前記ＣＰＵ用のコンピュータプログラムを取得する第１の取得工程と、
前記情報処理装置が有する第２の取得手段が、前記文字列を取得する第２の取得工程と、
前記情報処理装置が有する処理手段が、前記ＣＰＵ用のコンピュータプログラムを実行する際、前記ＣＰＵに前記ライブラリを実行させることで、前記ＣＰＵに、前記処理を前記機器に実行させるために前記ドライバが解釈可能な中間コードを前記文字列から生成させ、該中間コードから該ドライバが生成した実行形式のコードを前記機器に転送させ、該転送したコードを前記機器が実行することで該機器が生成したデータを取得させる処理工程と、
前記情報処理装置が有する出力手段が、前記処理工程で取得したデータを、前記関数の実行結果として出力する出力工程と
ことを特徴とする情報処理方法。
【請求項９】
コンピュータを、請求項１乃至７の何れか１項に記載の情報処理装置が有する各手段として機能させる為のコンピュータプログラム。
【請求項１０】
請求項９に記載のコンピュータプログラムを格納した、コンピュータ読み取り可能な記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータプログラムを取り扱う技術に関するものである。
【背景技術】
【０００２】
ソフトウェア処理を高速化する手法として、GPGPU（General Purpose Graphic Processing Unit）が（特にHPC（High Performance Computing）の分野で）注目されている（非特許文献１）。GPGPUによって得られる高速化についてはある程度認知はされていると思われる。
【先行技術文献】
【非特許文献】
【０００３】
【非特許文献１】「ＡＳＣＩＩ．ｔｅｃｈｎｏｌｏｇｉｅｓ」  アスキー・メディアワークス出版  ２０１０年８月号
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかし、ベンダーから提供されている開発環境は、使用するGPUのアーキテクチャをよく理解していないとその使用が難しく、また使用できたとしてもGPUの性能を十分に引き出すことは難しい。そのため、現段階では多くの人が簡単に使用できるという状況ではない。
【０００５】
このように、ＧＰＧＰＵの技術を使うにはまだハードルが高く、一般に広く普及しているとは言い難い。
【０００６】
本発明は、以上の問題に鑑みてなされたものであり、ＧＰＵを用いた処理を実現するために作成するプログラムを、より簡便に作成する為の技術を提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の目的を達成するために、例えば、本発明の情報処理装置は以下の構成を備える。即ち、ＣＰＵを有する情報処理装置であって、前記ＣＰＵよりも処理能力が高い機器に実行させる処理の内容を示す文字列を引数として受け取り可能な関数について予め作成されたライブラリであって、前記ＣＰＵに、前記処理を前記機器に実行させるために前記機器用のドライバが解釈可能な中間コードを前記文字列から生成させ、該中間コードから該ドライバが生成した実行形式のコードを前記機器に転送させ、該転送したコードを前記機器が実行することで該機器が生成したデータを取得させる前記ライブラリを保持する保持手段と、ユーザが編集可能なソースプログラムであって、前記関数が記された該ソースプログラムを前記ＣＰＵ用のコンパイラを用いてコンパイルすることで得られる前記ＣＰＵ用のコンピュータプログラムを取得する第１の取得手段と、前記文字列を取得する第２の取得手段と、前記ＣＰＵ用のコンピュータプログラムを実行する際、前記ＣＰＵに前記ライブラリを実行させることで、前記ＣＰＵに、前記処理を前記機器に実行させるために前記ドライバが解釈可能な中間コードを前記文字列から生成させ、該中間コードから該ドライバが生成した実行形式のコードを前記機器に転送させ、該転送したコードを前記機器が実行することで該機器が生成したデータを取得させる処理手段と、前記処理手段が取得したデータを、前記関数の実行結果として出力する出力手段とを備えることを特徴とする。
【発明の効果】
【０００８】
本発明によれば、ＧＰＵを用いた処理を実現するために作成するプログラムを、より簡便に作成することができる。
【図面の簡単な説明】
【０００９】
【図１】情報処理装置のハードウェア構成例を示すブロック図。
【図２】ＣＰＵ１０１用のソースプログラムの一例を示す図。
【図３】ＧＰＵ１０８用のソースプログラムの一例を示す図
【図４】ＣＰＵ１０１用のソースプログラムの一例を示す図。
【図５】（ａ）、（ｂ）は、実行形式のコンピュータプログラムを作成する手順を示す図。
【図６】ＤＬＬの機能構成例を示すブロック図。
【図７】ＣＰＵ１０１が行う処理のフローチャート。
【発明を実施するための形態】
【００１０】
以下、添付図面を参照し、本発明の好適な実施形態について説明する。なお、以下説明する実施形態は、本発明を具体的に実施した場合の一例を示すもので、特許請求の範囲に記載の構成の具体的な実施例の１つである。
【００１１】
［第１の実施形態］
先ず、本実施形態に係る情報処理装置のハードウェア構成例について、図１のブロック図を用いて説明する。
【００１２】
ＣＰＵ１０１は、ＲＡＭ１０２やＲＯＭ１０３に格納されているコンピュータプログラムやデータを用いて情報処理装置全体の動作制御を行うと共に、ＣＰＵ１０１が行うものとして後述する各処理を実行する。
【００１３】
ＲＡＭ１０２は、ＨＤＤ（ハードディスクドライブ）１０６からロードされた様々な情報を一時的に記憶するためのエリアや、ＣＰＵ１０１が各種の処理を実行するために用いるワークエリアを有する。即ち、ＲＡＭ１０２は、様々なエリアを適宜提供することができる。
【００１４】
ＲＯＭ１０３には、ブートプログラムや、情報処理装置の様々な設定データ等が格納されている。
【００１５】
キーボード１０４，マウス１０５は何れも、操作者が操作することで、各種の指示をＣＰＵ１０１に対して入力するためのものである。
【００１６】
ＨＤＤ１０６には、ＯＳ（オペレーティングシステム）１０６ａ、コンピュータプログラム１０６ｂ、データ１０６ｃ、そして後述するＤＬＬ（ダイナミックリンクライブラリ）１０６ｄが保存（保持）されている。ＨＤＤ１０６に保存されているこれらの情報は、ＣＰＵ１０１による制御に従って適宜ＲＡＭ１０２にロードされ、ＣＰＵ１０１による処理対象となる。
【００１７】
なお、以下の説明で、ソースプログラムや実行形式のコンピュータプログラム、コンパイラとして説明するものは何れもこのコンピュータプログラム１０６ｂに含まれているものとする。また、以下の説明でデータとして登場するものは何れも、データ１０６ｃに含まれているものとする。もちろん、新たに生成するデータについてはこの限りではない。また、以下の説明でＤＬＬとして登場するものは何れも、ＤＬＬ１０６ｄに含まれているものとする。
【００１８】
上記各部は、共通のバス１０９に接続されている。
【００１９】
更に、この共通のバス１０９には、ＧＰＵ用の専用バス１０７が接続されている。この専用バス１０７には、ＧＰＵ１０８（ＧＰＵが搭載されたＧＰＵボードでも良い）が接続されており、ＧＰＵ１０８はこの専用バス１０７を介してバス１０９に接続されているＲＡＭ１０２やＣＰＵ１０１等とのデータ通信を行うことができる。ＧＰＵ１０８は、ＣＰＵ１０１の制御下で動作するもので、ＣＰＵ１０１が使用するメモリ（ＣＰＵ１０１の内部メモリやＲＡＭ１０２等）とは独立した専用メモリ１０８ａを有しており、ＧＰＵ１０８はこの専用メモリ１０８ａに格納されたコンピュータプログラムやデータを用いて処理を実行する。
【００２０】
なお、上記の通り、図１に示した構成はあくまで構成例に過ぎず、以下に説明する各処理を実行可能な構成であれば、如何なる構成を採用しても良い。
【００２１】
次に、ＧＰＵ１０８を用いて処理を実行する場合について説明する。描画処理やマトリクス演算処理など、処理によっては全てをＣＰＵ１０１が行うのではなく、ＧＰＵ１０８に任せた方が、全体として処理を高速に行うことができる。以下では、ＣＰＵ１０１側で用意したデータをＧＰＵ１０８側に転送して、このデータを用いた演算処理をＧＰＵ１０８に行わせ、この演算処理の結果をＣＰＵ１０１がＧＰＵ１０８から取得する、という一連の処理を実現する場合を例に取って説明する。
【００２２】
この演算処理をＧＰＵを用いて実現する場合、従来では、ＣＰＵ１０１用のソースプログラムと、ＧＰＵ１０８用のソースプログラムとを用意する必要があった。図２にＣＰＵ１０１用のソースプログラム、図３にＧＰＵ１０８用のソースプログラムを示す。
【００２３】
ＣＰＵ１０１は図２に示したソースプログラム（実際にはこのソースプログラムをＣＰＵ１０１用のコンパイラを用いてコンパイルした実行形式のコンピュータプログラム）を実行すると、各種の数値設定の他、主に次のような処理を行う。
【００２４】
先ず、ＲＡＭ１０２内にエリア（h_idata）を確保し、確保したエリアh_idata内にＧＰＵ１０８が処理対象とするデータを格納する。そして、ＧＰＵ１０８が処理対象とする全てのデータをエリアh_idata内に格納すると、ＣＰＵ１０１はこの全てのデータを、バス１０９、専用バス１０７、を介して専用メモリ１０８ａ内に転送するので、ＣＰＵ１０１は事前にこの専用メモリ１０８ａ内に、この転送された全てのデータを格納するためのエリア（d_idata）を確保する。エリアd_idataを確保すると、エリアh_idata内に格納された全てのデータをエリアd_idataに転送する。そしてＣＰＵ１０１は、グリッドサイズやスレッドサイズなど、ＧＰＵ１０８側で処理を行うために必要な設定を行った後、ＧＰＵ１０８に対してこの転送されたデータを用いた処理の実行を指示する。これによりＧＰＵ１０８は、この転送されたデータを用いた処理を実行する。なお、ＧＰＵ１０８は、処理の実行結果としてのデータを一旦、専用メモリ１０８ａ内に格納するので、ＣＰＵ１０１は事前にこの専用メモリ１０８ａ内にこのデータを格納するためのエリア（d_odata）を確保する。これによりＧＰＵ１０８は、処理結果としてのデータをこのエリアd_odataに格納することができる。全ての処理結果としてのデータがこのエリアd_odata内に格納されると、ＣＰＵ１０１は、エリアd_odata内に格納されている全てのデータを、ＲＡＭ１０２内に転送するので、ＣＰＵ１０１は事前にＲＡＭ１０２内にこのデータを格納するためのエリア（h_odata）を確保する。これにより、ＣＰＵ１０１は、エリアd_odataから転送された全てのデータを、エリアh_odata内に格納することができる。そして最後にＣＰＵ１０１は、確保した全てのエリアを解放する。
【００２５】
一方、ＧＰＵ１０８は図３に示したソースプログラム（実際にはこのソースプログラムをＧＰＵ１０８用のコンパイラを用いてコンパイルした実行形式のコンピュータプログラム）を実行すると、エリアd_idata内に転送されたデータが示す数値に対して自分のスレッド番号を乗じ、その演算結果をエリアd_odata内に格納する。
【００２６】
図５（ａ）に、図２に示したようなＣＰＵ１０１用のソースプログラムと、図３に示したようなＧＰＵ１０８用のソースプログラムと、を用いて実行形式のコンピュータプログラム（Ｅｘｅファイル）を作成する手順を示す。図５（ａ）に示す如く、ＣＰＵ用のソースプログラム（ホスト側のコード）は、一般のＣＰＵ用のコンパイラを用いてコンパイルする。ＧＰＵ用のソースプログラム（ＧＰＵ側のコード）は、ＧＰＵ用のコンパイラ（例えばｎｖｃｃコンパイラ）を用いてコンパイルする（ｎｖｃｃコンパイラを用いた場合、Ｃｕｂｉｎファイルが生成される）。そしてリンカによって、それぞれのコンパイラを用いて生成されたファイルから１つのＥｘｅファイルを生成する。
【００２７】
このように、従来では、ＧＰＵ１０８を用いるためには、ＣＰＵ１０１とＧＰＵ１０８とで別個のソースプログラムを作成する必要があるし、最終的な実行形式のコンピュータプログラムを生成する為には複数段階の手順が必要となる。また、グリッド数やスレッド数など、ＧＰＵ１０８を使用するためには様々なパラメータの設定が必要であり、これらのパラメータはＧＰＵ１０８のパフォーマンスに大きく影響するため、その設定にはＧＰＵ１０８に関する多くの知識を必要とした。また、ＧＰＵ１０８用のソースプログラムは、アーキテクチャをよく理解した上でメモリを適切に使用するように記述する必要があり、ＧＰＵ１０８用のソースプログラムの作成は容易ではない。
【００２８】
即ち、ＧＰＵ１０８に対する十分な知識がないユーザにとって、ＧＰＵ１０８を用いること自体、困難なものであった。本実施形態では、図２，３に示したソースプログラムを１つのＣＰＵ１０１用のソースプログラムとして記述するだけで、同様の目的を実現させる。
【００２９】
図４に、図２，３に示したソースプログラムと同等の機能を実現させる、本実施形態に係る、ＣＰＵ１０１用のソースプログラムを示す。このソースプログラムも図２のソースプログラムと同様、ＲＡＭ１０２内にエリア（h_idata）及びエリア（h_odata）を確保するのであるが、ＧＰＵ１０８用については明示的にはエリアの確保は行っていないし、グリッド数やスレッド数等の指定も行っていない。即ち、図４に示したソースプログラムは、nt_parallel_for()という関数をコールするだけで、図２，３に示したソースプログラムにおいてＧＰＵ１０８を使用する為の記述部分と同等の機能を実現させることができる。なお、グリッド数やスレッド数等についてはＤＬＬ内部で自動的に決定し、処理を実行する。
【００３０】
この関数nt_parallel_for()の第１引数は「”」で括られた部分であり、ＧＰＵ１０８に行わせたい処理の内容（式）を文字列として与えている。第２引数は処理の繰り返し数または並列実行数、第３引数はエリアh_odataの先頭アドレス、第４引数はh_idataの先頭アドレス、である。この関数をＣＰＵ１０１が実行することで、エリアh_idataに格納されているデータをＧＰＵ１０８に与えて、第１引数としての文字列が示す処理を第２引数の繰り返し数だけ繰り返してＧＰＵ１０８に実行させ、その実行結果をエリアh_odataに格納する、という一連の処理を実現させる。
【００３１】
図５（ｂ）に、図４に示したようなＣＰＵ１０１用のソースプログラムを用いて実行形式のコンピュータプログラム（Ｅｘｅファイル）を作成する手順を示す。図５（ｂ）に示す如く、ＣＰＵ用のソースプログラム（ホスト側のコード）は、一般のＣＰＵ用のコンパイラを用いてコンパイルする。その際、ソースプログラムにおいて関数内の第１引数は文字列のまま（文字列形式で）コンパイル結果に含められ、ソースプログラムにおいて第１引数以外の部分については周知の通りバイナリ形式でコンパイル結果に含められる。
【００３２】
このように、図４に示したようなＣＰＵ１０１用のソースプログラムでは、図５（ｂ）に示すとおり、実行形式のコンピュータプログラムを生成するための手順も、従来よりも簡単となる。
【００３３】
次に、図４に示したソースプログラムのコンパイル結果である実行形式のコンピュータプログラムをＣＰＵ１０１が実行する場合について説明する。ここで、図４に示したソースプログラム中に登場する関数nt_parallel_for()に対しては、対応するＤＬＬが予め作成されており、ＣＰＵ１０１は図４に示したソースプログラムを実行すると、このＤＬＬをも実行する。このＤＬＬはＨＤＤ１０６内に保存されている。このＤＬＬの機能構成例を図６に示す。
【００３４】
上記の通り、実行形式のコンピュータプログラム６００は、ＧＰＵ１０８に行わせる処理の内容を示す文字列（式）６０１と、ソースプログラムにおいてこの文字列以外の部分のコンパイル結果であるバイナリ形式のデータ部分６０２と、で構成されている。
【００３５】
本実施形態に係るＤＬＬ６１０は、構文解析部６１１、コード生成部６１２、処理実行部６１３、結果転送部６１４、により構成されている。
【００３６】
構文解析部６１１は、コンピュータプログラム６００から文字列６０１を取得し、取得した文字列６０１の構文解析を行うことで、この文字列６０１が示す式の構文木を生成する。この一連の処理については周知の技術であるため、これについての説明は省略する。
【００３７】
コード生成部６１２は、この構文木から、ＧＰＵ１０８のドライバのＡＰＩに引き渡し可能な中間コード（ＧＰＵ１０８のドライバが解釈可能なコード）を生成する。そしてコード生成部６１２は、この生成した中間コードを、ＧＰＵ１０８のドライバに転送する。ＧＰＵ１０８のドライバはこの中間コードから、ＧＰＵ１０８用の実行形式のコードを生成し、生成した実行形式のコードを専用メモリ１０８ａに格納する。
【００３８】
処理実行部６１３は、コンピュータプログラム６００内で入力データとして指定されているデータを適宜、専用メモリ１０８ａに転送し、ＧＰＵ１０８に対して処理の開始を指示する。これによりＧＰＵ１０８は、処理実行部６１３により専用メモリ１０８ａに転送されたデータを用いて、コンピュータプログラム６００内に文字列６０１として埋め込まれた式を実行することができる。なお、ＧＰＵ１０８は、処理を行うことで生成したデータを専用メモリ１０８ａ内に格納する。処理実行部６１３は、ＧＰＵ１０８による処理が終了するまで待機状態となる。
【００３９】
結果転送部６１４は、ＧＰＵ１０８による処理結果としてのデータを、専用メモリ１０８ａから取得する。そして結果転送部６１４は、この取得したデータを、コンピュータプログラム６００で指定されたエリアに転送する。
【００４０】
なお、周知の通り、ＧＰＵ１０８や専用メモリ１０８ａに対するアクセスはドライバを介して行う。然るに本実施形態でも、処理実行部６１３や結果転送部６１４は、実際には、ドライバを介して専用メモリ１０８ａやＧＰＵ１０８に対してアクセスすることになる。
【００４１】
また、ここでは説明を簡単にするために、構文解析部６１１、コード生成部６１２、処理実行部６１３、結果転送部６１４を処理の主体として説明したが、実際には、ＣＰＵ１０１がこれら各部を実行することで、対応する機能が実現されることになる。
【００４２】
例えば、コンピュータプログラム６００が図４のソースプログラムのコンパイル結果である場合（文字列６０１が関数nt_parallel_for()の第１引数である場合）、ＣＰＵ１０１はこのコンピュータプログラム６００を先頭から順次実行するのであるが、関数nt_parallel_for()を実行する際にはＤＬＬ６１０を実行する。これにより、構文解析部６１１が第１引数である文字列６０１の構文解析を行って構文木を生成し、コード生成部６１２がこの構文木から中間コードを生成してＧＰＵ１０８のドライバに渡す。処理実行部６１３は、エリアh_idata内のデータをＧＰＵ１０８が処理しやすいようなメモリ配置に並べ替えてから、専用メモリ１０８ａに転送する。ＧＰＵ１０８のドライバは、中間コードから実行形式のコードを生成してから専用メモリ１０８ａに転送する。更に処理実行部６１３は、ＧＰＵ１０８に対して処理の開始を指示するので、ＧＰＵ１０８は、この実行形式のコードに従って、専用メモリ１０８ａに転送されたデータを用いた処理を実行する。そして結果転送部６１４は、ＧＰＵ１０８が行った処理の結果としてのデータを、専用メモリ１０８ａから取得し、取得したデータを、エリアh_odata内に転送する。
【００４３】
なお、エリアh_odata内に転送されたデータの取り扱いについては特に限定するものではなく、ＨＤＤ１０６等のメモリ機器に対して出力しても良いし、不図示の表示装置などに表示しても良いし、不図示のネットワークを介して他の機器に対して転送しても良い。
【００４４】
図７に、ＧＰＵ１０８に実行させる処理の内容を示す文字列を引数として受け取り可能な関数が記されたソースプログラムを、文字列をそのまま残してそれ以外をバイナリ形式でコンパイルした実行形式のコンピュータプログラムを実行した場合に、ＣＰＵ１０１が行う処理について、同処理のフローチャートを示す図７を用いて説明する。
【００４５】
先ず、ステップＳ７０１では、ＧＰＵ１０８に実行させる処理の内容を示す文字列を引数として受け取り可能な関数（上記の例では関数nt_parallel_for()）が記されたソースプログラムを、この文字列をそのまま残してそれ以外をバイナリ形式でコンパイルした実行形式のコンピュータプログラム（図６ではコンピュータプログラム６００に相当）をＨＤＤ１０６からＲＡＭ１０２に取得する（第１の取得）。もちろん、このような実行形式のコンピュータプログラムをどこから取得しても良い。
【００４６】
次に、ステップＳ７０２では、このコンピュータプログラムを実行するのであるが、その際、対応するＤＬＬをＨＤＤ１０６からＲＡＭ１０２に取得し、このＤＬＬ内の構文解析部６１１により、このコンピュータプログラムから上記文字列を取得する（第２の取得）。
【００４７】
ステップＳ７０３では、構文解析部６１１により、上記文字列の構文解析を行い、構文木を生成する。
【００４８】
ステップＳ７０４では、コード生成部６１２により、この構文木から、ＧＰＵ１０８のドライバが解釈可能な中間コードを生成する。そしてコード生成部６１２は、この生成した中間コードを、ＧＰＵ１０８のドライバに転送する。
【００４９】
ＧＰＵ１０８のドライバはこの中間コードから、ＧＰＵ１０８用の実行形式のコードを生成し、生成した実行形式のコードを専用メモリ１０８ａに格納する。
【００５０】
ステップＳ７０５では、処理実行部６１３により、コンピュータプログラム６００内で入力データとして指定されているデータを適宜、専用メモリ１０８ａに転送し、ＧＰＵ１０８に対して処理の開始を指示する。
【００５１】
ステップＳ７０６では、結果転送部６１４により、ＧＰＵ１０８による処理結果としてのデータを、専用メモリ１０８ａから取得する。
【００５２】
ステップＳ７０７では、結果転送部６１４により、この取得したデータを、コンピュータプログラム６００で指定されたエリア（図４の例ではエリアh_odata）に転送（格納）する。
【００５３】
［第２の実施形態］
第１の実施形態では、関数nt_parallel_for()の第１引数に直接、文字列としての式を記していた。しかし、ＧＰＵ１０８に行わせる処理の内容を記したテキストファイルを別途作成し、第１引数には、このテキストファイルをＲＡＭ１０２に読み込んだときの、このＲＡＭ１０２におけるテキスト格納エリアのアドレスを設定しても良い。もちろん、ファイルへのポインタでも良いが、その場合には別の仕様のＡＰＩを使用することになり、ＤＬＬ内部でテキストファイルの読み込みを行った後、同様の処理が行われる。
【００５４】
この場合、このテキストファイルは、適当なテキストエディタでもって編集可能であるので、この関数nt_parallel_for()が参照するテキストファイルの内容を適宜変更することができる。これにより、実行形式のコンピュータプログラムを作成した後でも、テキストファイルの内容を変更するだけで、異なる実行結果を得ることができる。即ち、同じ実行形式のコンピュータプログラムを実行しても、テキストファイルを変更するだけで、異なる機能を実現させることができる。
【００５５】
これは、nt_parallel_for()という名称の関数だけに限られるものではなく、別名の関数についても同様である。
【００５６】
［第３の実施形態］
ＤＬＬを使用可能なアプリケーションソフトであれば、第１の実施形態で説明したＤＬＬも同様に使用することができるので、例えば、表計算ソフト上でこのＤＬＬを使用することができる。例えば、表計算ソフト上で上記関数nt_parallel_for()を用いた処理を行いたい場合には、第１引数の内容を表計算ソフト上で作成し、更に関数nt_parallel_for()を用いた処理結果の出力先（表のどの部分に出力するのか）などを指定する。そしてこの関数の実行を指示すると、関数nt_parallel_for()に対応するＤＬＬが実行されるので、上記の通り、この関数の実行結果がＧＰＵ１０８から得られ、この得た実行結果を、指定した出力先に出力することになる。
【００５７】
これは、nt_parallel_for()という名称の関数だけに限られるものではなく、別名の関数についても同様である。
【００５８】
［第４の実施形態］
第１の実施形態では、Ｃ言語で記述されたソースプログラムをコンパイルした実行形式のコンピュータプログラムと共に、ＤＬＬを使用した。しかし、このＤＬＬは使用するプログラミング言語に依存せず、ＤＬＬを使用可能な全てのプログラミング言語から使用可能である。
【００５９】
また、第１の実施形態では、全体処理の高速化のために、処理の一部をＧＰＵ１０８に転送する例を示した。しかし、転送先についてはＧＰＵ１０８に限定するものではない。そもそも全体処理の高速化のために、処理の一部をＣＰＵ１０１以外に委任するわけであるから、ＣＰＵ１０１よりも処理を高速に行うことができる転送先であれば良い。
【００６０】
例えば、複数台のコンピュータを転送先としても良い。この場合、実行形式のコード及びデータの転送先がこの複数台のコンピュータとなる。また、ＤＬＬは、これら複数台のコンピュータからの処理結果としてのデータを取得する。
【００６１】
即ち、ＣＰＵ１０１よりも処理を高速に行うことができる転送先であれば、その転送先はＧＰＵ１０８でも複数台のコンピュータでも良い。換言すれば、情報処理装置のユーザは、全体処理の高速化のために、処理の一部を外部に委託するような関数をソースプログラム中に含めておくだけで、その委託する先がどのようなものであるのかを知る必要はないし、その委託先に関する知識を持つ必要もない。即ち、情報処理装置のユーザは、ＧＰＵ１０８等の外部機器を用いて全体処理を高速化させる為のソースプログラムを、従来よりも容易に作成することができる。これは、本実施形態を含め、全ての実施形態に共通する効果である。
【００６２】
このように、処理の委託先は、ＣＰＵ１０１よりも処理能力が高い機器であれば良いので、この場合における情報処理装置の動作については次のようになる。
【００６３】
先ず、情報処理装置は、この機器に実行させる処理の内容を示す文字列を引数として受け取り可能な関数（上記の例では）関数nt_parallel_for()について予め作成されたライブラリを保持しておく必要がある。このライブラリは、ＣＰＵ１０１に、この処理をこの機器に実行させるためにこの機器用のドライバが解釈可能な中間コードをこの文字列から生成させ、中間コードからこのドライバが生成した実行形式のコードをこの機器に転送させ、転送したコードをこの機器が実行することでこの機器が生成したデータを取得させるライブラリである。
【００６４】
そして情報処理装置は、ユーザが編集可能、且つこの関数が記されたソースプログラム、をＣＰＵ１０１用のコンパイラを用いてコンパイルすることで得られるＣＰＵ１０１用のコンピュータプログラムを取得する。更に情報処理装置は、文字列を取得する。
【００６５】
そして情報処理装置は、ＣＰＵ１０１用のコンピュータプログラムを実行する際、ＣＰＵ１０１にこのライブラリを実行させることで、ＣＰＵ１０１に、この処理をこの機器に実行させるために上記ドライバが解釈可能な中間コードを上記文字列から生成させ、中間コードからドライバが生成した実行形式のコードを上記機器に転送させ、転送したコードを上記機器が実行することで上記機器が生成したデータを取得させる。そして情報処理装置は、この取得したデータを、上記関数の実行結果として出力する。
【００６６】
なお、上記の各実施形態は適宜組み合わせても良い。
【００６７】
［第５の実施形態］
ＨＤＤ１０６に格納されているものとして説明したＤＬＬやコンピュータプログラムは、ＣＰＵ１０１により実行されることで、上記実施形態で説明した様々な処理を実現するものであるため、これらＤＬＬやコンピュータプログラムもまた本発明を構成するものである。また、このようなコンピュータプログラムを格納したコンピュータ読み取り可能な記憶媒体についても同様である。このような記憶媒体には、ＣＤ−ＲＯＭやＤＶＤ−ＲＯＭなど、様々なものが考え得る。
【００６８】
［第６の実施形態］
上記の各実施形態で登場したＤＬＬの代わりに、スタティックリンクライブラリを用いても良い。即ち、上記の各実施形態は、ダイナミックリンクライブラリに限定するものではなく、スタティックリンクライブラリであっても良い。また、周知のＬｉｎｕｘにおける「so（shared object）」を代わりに用いても同じである。即ち、ＤＬＬが行うものとして上記の各実施形態で説明した機能を有するのであれば、ＤＬＬに限定するものではない。
【００６９】
［第７の実施形態］
上記の各実施形態では、情報処理装置が１個のＧＰＵを有しているものとして説明したが、情報処理装置が複数個のＧＰＵを有しても良い。
【００７０】
［第８の実施形態］
第１の実施形態では、関数nt_parallel_for()の第１引数に直接、あらかじめコンピュータプログラムに含められた文字列としての式を記していた。しかし、ＧＰＵ１０８に行わせる処理の内容を記したテキストはコンピュータプログラム中で必要に応じて生成したり、あらかじめ含めらた文字列を変更してＡＰＩに渡すことも可能である。
【図１】
2012022580.tif 000003
【図２】
2012022580.tif 000004
【図３】
2012022580.tif 000005
【図４】
2012022580.tif 000006
【図５】
2012022580.tif 000007
【図６】
2012022580.tif 000008
【図７】
2012022580.tif 000009