【文献】
The CUDA Compiler Driver NVCC,米国,NVIDIA Corporation,2008年 4月24日,pp.1-28,URL,http://www.nvidia.com/object/io_1213955090354.html
【文献】
岡田 賢治,CUDA 高速GPUプログラミング入門,株式会社秀和システム,2010年 3月25日,第1版,pp.34-37
【文献】
John R. Levine,Linkers & Loaders,株式会社オーム社,2001年 9月25日,第1版,pp.59-62
(58)【調査した分野】(Int.Cl.,DB名)
【発明を実施するための形態】
【0013】
以下で述べるアプリケーションとは、コンパイルされる以前の原始コード又はソースコード(Source Code)を含む応用プログラムを意味する。この場合、上記ソースコードはCPU演算を実行させるためのCPUソースコード又はGPU演算を実行させるためのGPUソースコードを含むことができる。
【0014】
また、本発明の実行ファイルとは、コンパイラー(Compiler)によって上記アプリケーションがコンパイルされ生成されたファイルを意味する。
【0015】
以下、添付された図面を参照して本発明の好ましい実施例を詳しく説明する。この時、 添付された図面で同一の構成要素はできるだけ同一の番号を付けることに留意すべきである。なお、本発明の要旨を濁すことができる公知機能及び構成に対する詳細な説明は省略であろう。
【0016】
アプリケーション(又は、応用プログラム)でGPUを使用する方法には2つの方法が存在することができる。まず、第1の方法はOSのようなシステムプログラムでライブラリを提供し、上記ライブラリをアプリケーションが呼出して使用する方法である。そして第2の方法はGPUを使用するためのコードをアプリケーションに含ませてプログラム実行時間(runtime)にGPUで直接実行する方法である。
【0017】
図1は、システムプログラム(OS)でライブラリを提供してGPUを使用する方法に対するシステム構造を示す図面である。
【0018】
図1によるシステムは大きく、実際応用プログラムを含むアプリケーション階層(Application Layer)、 CPU又はGPUのような物理的なプロセッシングユニットを含むハードウェア階層(Hardware Layer)、上記アプリケーション階層とハードウェア階層の間に位置するミドルウェア階層(Middleware Layer)、及びオペレーティングシステム(Operating system、 OS)に区分されることができる。このようなシステムによればOSでGPUライブラリを提供し、アプリケーションが上記GPUライブラリを直接呼出して当該の機能を遂行する。
【0019】
上記
図1と同様の方法を遂行する代表的なシステムとして「OpenGL」を例示することができる。「OpenGL」は応用プログラムが3Dグラフィックを使用するためにOpenGL API(Application Programming Interface、関数)を呼出する方式でGPUを使用する。 OpenGL APIは標準に指定されており、応用プログラムはこの標準によって開発される。代表的な例はOpenGLを用いたゲームプログラムを挙げることができる。しかし、このような方式は標準で提供された機能だけ使用することができるという短所がある。
【0020】
例えば、顔面認識演算のためにGPUを使用しようとすれば顔面認識に対するAPIが標準に指定されており、 これが当該のシステムにライブラリに具現されていなければならない。もし、顔認識演算のためのライブラリが具現されていない場合、プログラム開発者はこのような演算を遂行することができないという問題点がある。
【0021】
一方、
図2はGPUを使用するコードを応用プログラムに含ませてプログラム実行時間(runtime)にGPUで実行する方法を使用するシステム構造を示す図面である。
【0022】
同様に
図2によるシステムは大きく、実際応用プログラムを含むアプリケーション階層、 CPU又はGPUのような物理的なプロセッシングユニットを含むハードウェア階層、 上記アプリケーション階層とハードウェア階層の間に位置するミドルウェア階層、 システムを運営するオペレーティングシステムに区分されることができる。ただ、
図2のシステムと
図1のシステムとの相異点はGPUを動作させるためのGPUコードがアプリケーションに直接挿入されるということである。
【0023】
上記
図2と同様の方法を使用する代表的なシステムとして「OpenGL」を挙げることができる。「OpenGL」に対する具体的な説明は下記の
図3を参考して説明する。
【0024】
図3は「OpenGL」の応用プログラム実行過程を示すフローチャートである。
【0025】
図3に示すように、応用プログラム、すなわちアプリケーションがS305段階で実行される。ここで実行とはアプリケーションがコンパイル(Compile)されて生成された実行ファイルを実行(run)する意味として使用されることができる。
【0026】
アプリケーション実行後、S310段階で実行ファイルにあるCPU機械語(CPU Machine Code)が実行される。そして実行ファイルの実行が進行されながら、GPUを使用すべき場合はS315段階のように、明示的にGPUを使用するためのソースコード(Source Code)レベルのコードをコンパイルするようになる。そしてS320段階で、上記コンパイル結果、生成されたGPU機械語(Machine Code)を実行する。そしてGPU機械語の実行が完了されればS325段階で、さらにCPU機械語実行を遂行する。
【0027】
一方、S315段階に示すようにGPUソースコードは実行時間(runtime)にコンパイルするようになり、具体的な過程は
図3の右側に示すフローチャートのようである。
【0028】
すなわち、S330段階でGPUソースコードコンパイルが開示されれば、S335段階の語彙分析段階(lexical-syntax analysis)、S340段階の先処理段階(PreproceSsing)、S345段階の構文分析段階(Syntax Analysis)、S350段階の分析段階(Analysis)、 S355段階の最適化段階(Optimization)、S360段階のコード生成段階(Code Generation)を経て S365段階でGPU機械語が生成される。
【0029】
上記方法の長所はGPU種類(製造社等)に構わずに、すべてのGPUに対して当該のGPUソースコードを実行することができるということである。すなわち、この場合には共通的なGPUソースコードを配布して実行時間(runtime)にコンパイルされて特定 GPU機械語で動作するようになる。
【0030】
以下では「OpenGL」方式を適用したコード例題を通じて「OpenGL」を説明する。
【0031】
図4は「OpenGL」方式を適用したコード例題を示す図面である。
【0032】
上記
図4に示すアプリケーションはCPUとGPUで動作するためのコードを同時に有するようになる。この場合、「main」で表示されるコードが一般的にCPUで動作するコードであり、「KernelSource」に表示されるコードがGPUで動作するコードである。
【0033】
図4に示すコードをコンパイルするようになるとCPUコード部分は機械語(Machine Code)に変換される。しかし、GPUコード部分はコンパイルされなくそのまま実行ファイルに文字列に挿入されたり外部ソースファイルに貯蔵される。上記のように、GPUソースコードは当該の応用プログラムが実行される際、コンパイルされ実行される。
【0034】
このように、「OpenGL」過程を遂行することができる実行ファイル(Binary Image)構造が
図5に示す。
【0035】
図2のシステム、すなわちGPUを使用するコードを応用プログラムに含ませてプログラム実行時間(runtime)にGPUで実行するシステムで使用する実行ファイルはヘッダーのようなメタデータ(図示せず)、CPU機械語及びGPUソースコードを含む。この場合、上記GPUソースコードは実行ファイルのデータ領域に挿入510されたり、又は実行ファイルと独立的な外部スクリプトソースファイル形式で参照520されることができる。
【0036】
上記では応用プログラムでGPUを使用する2つの方法に対して説明した。
【0037】
ところが、最近GPU機能が重要な役目を遂行することによって標準化されたAPIだけ使用してGPUを使用する上記の第1方法から脱して自由にGPUを使用する方法に対する重要性が浮き彫りにされている 。これによって、本発明ではアプリケーションがGPUを活用する方法に対して提案しようとする。
【0038】
より具体的に説明すれば、「OpenGL」のような技術の問題点は実行時間(runtime)にGPUソースコードに対するコンパイルを遂行するから、実行速度が顕著に落ちるということである。コンパイル作業は中間過程が多くて複雑で計算パワー(Computing Power)が相対的に不足なエンベデッドシステム(embedded)には致命的な問題点として作用することができる。
【0039】
ここで、GPUソースコードに対するコンパイル過程を単純化すれば、 最適化されたGPU機械語を生成し難く、反対にGPU機械語最適化のためにはコンパイル演算量が増加するようになる矛盾した状況が発生する。また、「OpenGL」のような方式はGPUソースコードが
図5に示すように、 実行ファイルのデータ領域に挿入されたり又は外部スクリプトファイル形式で存在するようになる。したがって、GPUソースコードが外部にそのまま露出して保安に脆弱であるという問題がある。
【0040】
本発明は上記のような問題点を解決し、 CPU及びGPUを效率的に使用することができる方法及び装置を提供する。すなわち、 本発明は時間がたくさん所要されて複雑なGPUコンパイル過程を最小化し、保安に問題になったGPUソースコード露出を制御し、特定GPUだけでなくすべての種類のGPUで実行可能なコンパイルされた仮想のGPU機械語を提供することをその目的とする。
【0041】
これを解決するため、本発明ではGPU動作のためにソースコードレベル(Source Code Level)ではない命令語レベル(Instruction Level)(又は、 機械語レベル、 Machine Code Level)にコンパイルされたコードを使用する。本発明ではGPUソースコードが命令語レベルにコンパイルされたことをGPU仮想命令語(GPU Virtual Instruction)と名付ける事にする。上記GPU仮想命令語は実際GPUハードウェアで動作する機械語ではない仮想の命令語である。上記GPU仮想命令語は実行時間(runtime)にGPU機械語(GPU Machine Code)でリアルタイム変換(Binary TranSlation)されて実行される。また、上記GPU仮想命令語は特定GPUハードウェアでばかり動作するのではなく、すべての種類のGPUハードウェアで動作することができる。
【0042】
本発明によるGPU仮想命令語はコンパイルの時、仮想の命令語にコンパイルされるから実行時間(runtime)に遂行速度が早く保安にも強いという長所を有する。
【0043】
図6は 「OpenGL」と本発明によるアプリケーションの実行方法の差異を比較する図面である。
【0044】
上記のように「OpenGL」によればGPUソースコードはアプリケーションのコンパイルの時、別にコンパイルされない。代わり、実行ファイル(Binary Image)の実行時間(runtime)の間、GPUソースコードが語彙分析段階、先-処理段階、構文分析段階、最適化段階、コード生成段階等を経てコンパイルされ、上記コンパイル結果生成されるGPU機械語が実行された。
【0045】
しかし、本発明ではアプリケーションのコンパイルの時、GPUソースコードは命令語レベル(instruction level)であるGPU仮想命令語でコンパイルされる。そして実行ファイルの実行時間(runtime)の間、上記GPU仮想命令語がGPU機械語に変換(Translation)され、上記変換されたGPU機械語が実行される。
【0046】
すなわち、GPUソースコードが実行すべき時点で、従来方法はGPUソースコードからコンパイルする過程を経なければならないが、 本発明の実施例によれば予めコンパイルされたGPU仮想命令語が単純にGPU機械語に変換される過程だけ進行する。
【0047】
以下では本発明の実施例によるシステム構造及び動作手順を添付された図面を参考して詳細に説明する。
【0048】
図7は本発明の実施例によってCPUとGPUを使用する異種コンピュータシステム構造を示す図面である。
図7に示すように、本発明の異種コンピュータシステムはアプリケーション710、コンパイラー720、ハイブリッド仮想化ブロック730を含むことができる。
【0049】
アプリケーション710はアプリケーション階層に位置し、 CPUソースコードとGPUソースコードを共に含む応用プログラムである。このような応用プログラムの例題を図 4に示した事がある。
【0050】
コンパイラー(Compiler)720はアプリケーション710に含まれたCPU ソースコードとGPUソースコードを機械語(Machine Code)にコンパイルする。この場合、コンパイラー720はCPUソースコードの場合、上記CPUソースコードをCPU機械語にすぐコンパイルするが、GPUソースコードの場合には、上記GPUソースコードを本発明で提案するGPU仮想命令語(GPU Virtual Instruction)にコンパイルする。そして上記コンパイラー720は上記CPU機械語及び GPU仮想命令語を含む実行ファイルを生成する。以下では上記のような過程によって生成された実行ファイルをハイブリッド実行ファイル(Hybrid Binary Image)だと名付けることにする。上記ハイブリッド実行ファイルに対する具体的な構造は
図8で後述するようにする。
【0051】
ハイブリッド仮想化(Hybrid Virtualization)ブロック730はアプリケーション階層(Application Layer)とハードウェア階層(Hardware Layer)の間の仮想化階層(Virtualization Layer)に位置して実行時間(runtime)にGPU仮想命令語を感知し、感知の時、上記GPU仮想命令語をGPU機械語に変換(TranSlation)する。だけでなく、 上記ハイブリッド仮想化ブロック730はアプリケーションの実行全般過程を調律する。
【0052】
オペレーティングシステム740は少なくとも1つ以上の互いに異なる種類のオペレーティングシステムを含むことができ、システムの全般的な動作を制御する。
【0053】
図8は本発明の実施例によるハイブリッド実行ファイル(Hybrid Binary Image)の構造を示す図面である。ハイブリッド実行ファイルは従来システムとの互換性のために実行イメージ(Binary Image)の形式による。
【0054】
図8に示すように、ハイブリッド実行ファイルはCPU機械語(CPU Machine Code)と、GPU仮想命令語を含む仮想セクション(Virtual Section)810を含むことができる。ここでGPU仮想セクションはさらに仮想セクションヘッダー820、CPU機械語830、GPU仮想命令語840を含むことができる。
【0055】
上記仮想セクションヘッダー820は当該のセクションが仮想セクションなのかを識別するウォーターマーク(water-mark)と、CPU又はGPU実行時間などに対する動作情報を含むことができる。
【0056】
CPU機械語領域830は当該のシステムにGPUがなかったり又はGPUが異なる作業を遂行しておりCPUで動作することが正しいことと判断される際、実行するCPU機械語を含む。
【0057】
一方、GPU仮想命令語領域840はGPUで動作する命令語を含む。上記GPU仮想命令語領域840は仮想命令語ヘッダー850と仮想命令語コード860を含むことができる。上記仮想命令語ヘッダー850はGPU演算を遂行するためのデータが入力又は出力されるメモリーのアドレス情報、推薦されるプロセッシング要素(Processing Element、PE)の個数情報などを含むことができる。GPU仮想命令語コードはGPUで実行されるコードの仮想化された情報を含む。すなわち、上記GPU仮想命令語コードは実質的に実行時間(runtime)にGPU機械語に変換されるコードである。
【0058】
図9は本発明の実施例による、アプリケーションのコンパイル過程を示すフローチャートである。
【0059】
まず、S910段階で、CPUソースコードとGPUソースコードを含むアプリケーションが生成されたことを仮定する。そして上記アプリケーションに対するコンパイルが要請される場合、コンパイラー720はCPUソースコードとGPUソースコードを区分してコンパイルする。
【0060】
より具体的に、コンパイラーはCPUソースコード検出の時、S920段階でCPUソースコードをコンパイルし、S930段階でCPUで動作することができるCPU機械語(CPU Machine Code)を生成する。一方、コンパイラーはGPUソースコード検出の時、S940段階でGPUソースコードをコンパイルし、S950段階で仮想の GPUで動作することができるGPU仮想命令語(GPU Virtual Instruction)を生成する。上記GPU仮想命令語に対する具体的な構造は
図8に示されている
【0061】
そしてコンパイラーはS960段階で、上記生成されたCPU機械語とGPU仮想命令語をリンクさせ、S970段階でハイブリッド実行ファイル(Hybrid Binary Image)を生成する。
【0062】
上記のように、ハイブリッド実行ファイルはCPU機械語と仮想セクションを含む。上記ハイブリッド実行ファイルが実行される際、CPU部分とGPU部分が仮想化階層(Virtualization Layer)の調律によってそれぞれ実行されるところ、 これに対しては下記の
図10を参考して説明する。
【0063】
図10は本発明の実施例によって、 仮想化階層(Virtualization Layer)のハイブリッド仮想化ブロック730がハイブリッド実行ファイルを実行する過程を示すフローチャートである。
【0064】
上記の
図10ではシステムの階層的分類の時、本発明の仮想化階層(Virtualization Layer)の上に一般OSが位置する構造を仮定する。後述するが、 本発明の仮想化階層を使用しなくてもハイブリッド実行ファイルを実行させることができるところ、これに対しては
図12で詳しく記述する。
【0065】
図10に示す実施例において、 OSはOS自分だけ実行されると感知しながらシステムを使用する。まず、ハイブリッド実行ファイルの一般的な駆動はOSを通して成るのでS1010段階でOSが実行される。それではOSはS1015段階でGPU仮想命令語が挿入されたハイブリッド実行ファイルを実行する。そうする間、S1020段階で、仮想セクションが実行されればCPUで例外(exception)が発生する。それではシステムに対する制御権がOSで仮想化階層のハイブリッド仮想化ブロック730に移動する。
【0066】
ハイブリッド仮想化ブロック730はS1030段階で、 仮想セクション内部のウォーターマークを通して仮想セクションなのか否かを判断する。もし、仮想セクションではなければ、ハイブリッド仮想化ブロック730はS1050段階で進行して既存の例外処理を遂行し、S1055段階でさらにシステム制御権をOSに移動させる。もし、仮想セクションであれば、ハイブリッド仮想化ブロック730はS1035段階でGPU仮想命令語(GPU Virtual Instruction)をGPU機械語(GPU Machine Code)に変換する。そしてハイブリッド仮想化ブロック730はS1040段階で、上記変換されたGPU機械語を
図11のようにメモリー(又はファイル)実行領域に挿入する。
【0067】
上記の過程を遂行したハイブリッド仮想化ブロック730はS1045段階で制御権をさらにOSに越す。その後、OSはS1070段階で、当該のGPU機械語をGPUを通じて実行させる。
【0068】
一方、S1020段階で、例外が発生したのではなければ、S1060段階でGPU機械語実行なのか否かを判断し、GPU機械語実行の場合にはS1070段階でGPU機械語を実行し、GPU機械語ではない場合にはS1065段階でCPU機械語を遂行する。この場合、S1060段階及びS1070段階を通して実行されるGPU機械語はS1035段階で変換されてメモリー(又はファイル)上に存在するGPU機械語として、別途の変換過程無しに直ちに実行されることができる。
【0069】
図12は本発明のさらにの実施例によってシステムOSがハイブリッド実行ファイルを実行する過程を示すフローチャートである。
【0070】
上記の
図10では仮想化階層(Virtualization Layer)のハイブリッド仮想化ブロック730がハイブリッド実行ファイルを実行(run)する実施例に対して記述した。
【0071】
一方、
図12では別途の仮想化階層を導入せず、OSがハイブリッド実行ファイルを実行する実施例に対して記述する。この場合、 GPU仮想化命令語を生成するコンパイル過程は仮想化階層を導入するか否かに関係なく同一であるのでこれに対する説明を省略することにする。
【0072】
まず、S1205段階でハイブリッド実行ファイルが実行されれば、S1210段階で CPUで例外(exception)が発生する。それではOSはS1215段階で、仮想セクション内部のウォーターマークを通して仮想セクションなのか否かを判断する。もし、仮想セクションではなければ、OSはS11235段階で進行して既存の例外処理を遂行し、S1204段階でCPU機械語を実行する。
【0073】
もし、仮想セクションであれば、OSはS1220段階でGPU仮想命令語(GPU Virtual Instruction)をGPU機械語(GPU Machine Code)に変換する。そしてOSはS1225段階で、上記変換されたGPU機械語を
図11のようにメモリー(又はファイル)実行領域に挿入する。
【0074】
上記の過程を遂行したOSはS1230段階で、当該のGPU機械語をGPUを通して実行させる。
【0075】
一方、S1210段階で、例外が発生したのではなければ、OSはS1245段階でGPU機械語実行なのか否かを判断し、GPU機械語実行の場合にはS1230段階でGPU機械語を実行し、 GPU機械語ではない場合にはS1240段階でCPU機械語を遂行する。この場合、S1245段階及びS1230段階を通して実行されるGPU機械語は S1220段階で変換されてメモリー(又はファイル)上に存在するGPU機械語として、 別途の変換過程無しに直ちに実行されることができる。
【0076】
以下では上記の本初明の2つの実施例の機能上の差異に対して記述する。
【0077】
まず、本発明の第1実施例によれば、実行時間(runtime)の間、GPU仮想命令語がGPU機械語に変換される過程は仮想化階層に位置するハイブリッド仮想化ブロック730によって遂行される。上記第1実施例によるシステム構造が
図13に具体的に図示される。
【0078】
図13に示すように、 ハイブリッド仮想化ブロック730はアプリケーション階層とハードウェア階層の間に、そしてOS下位に位置する。上記ハイブリッド仮想化ブロック730でよって、上位に位置したOSは現在実行されるハイブリッド実行ファイルが既存の実行ファイルと同様であると認識する。すなわち、第1実施例によれば上位OSを修正する必要無しにGPU仮想命令語を実行することができる。
【0079】
一方、本発明の第2実施例によれば、 実行時間(runtime)の間GPU仮想命令語が GPU機械語に変換される過程はOSによって直接遂行される。上記第2実施例によるシステム構造が
図14及び
図15に示す。
【0080】
図14及び
図15に示すように、 ハイブリッド実行ファイルを実行するためのハイブリッド仮想化ブロックはOS内部に含まれる。ここで
図14に示す第1オペレーティングシステムは例えば、マイクロソフト社の「MS」であることを例示することができ、
図15で示す第2オペレーティングシステムは例えば、アップル謝意「Apple OS」であることを例示することができる。このような第2 実施例によれば実行時間の間の例外発生の時、GPU仮想命令語をGPU機械語で変換する手続きはOSによって直接処理される。
【0081】
上記の本発明によれば、CPUとGPUを同時に效率的に使用することができ、GPU使用のためのリアルタイムコンパイル方式の問題点を補ってGPU実行效率を向上させることができる。
【0082】
本明細書及び図面に開示された本発明の実施例は本発明の記述内容を容易に説明し、発明の理解を助けるために特定例を提示したことに過ぎず、 本発明の範囲を限定しようとすることではない。ここに開示された実施例以外にも本発明の技術的思想に基づいて他の変形例が実施可能であるということは本発明が属する技術分野で通常の知識を有する者に自明なものである。