説明

汎用プロセッサによるリターゲティングされたグラフィックプロセッサ加速コードの実行

【課題】マルチコアグラフィックプロセッサ(マルチコアGPU)により実行するために書かれ、共有メモリをもつ汎用プロセッサにより実行するためのシステム。
【解決手段】本発明は、マルチコアGPUで実行するために並列プログラミングモデルを使用して書かれたアプリケーションプログラムを、汎用のCPUにより実行するように変換する技術について述べる。マルチコアGPUの特定の特徴に依存するアプリケーションプログラムの部分は、トランスレータにより、汎用CPUで実行するように変換される。アプリケーションプログラムは、同期独立インストラクションの領域へと区画化される。インストラクションは、収斂又は発散として分類され、領域と領域との間で共有される発散メモリ参照が複写される。汎用CPUによる実行中に種々のスレッド間でのメモリの正しい共有を保証するためにスレッドループが挿入される。

【発明の詳細な説明】
【関連出願の相互参照】
【0001】
[0001]本出願は、2008年4月9日に出願された“SystemFor Executing GPU-Accelerated Code on Multi-Core Architecture”と題する米国プロビジョナル特許出願第61/043,708号(代理人管理番号NVDA/SC−08−0007−US0)の利益を主張する。この関連出願の対象資料を参考としてここに援用する。
【技術分野】
【0002】
[0002]本発明の実施形態は、一般に、コンパイラープログラムに係り、より詳細には、マルチコアグラフィックプロセッサにより実行するために書かれ、共有メモリをもつ汎用プロセッサにより実行するためにリターゲティングされたアプリケーションプログラムに係る。
【背景技術】
【0003】
[0003]近代的なグラフィック処理システムは、典型的に、マルチスレッド的にアプリケーションを実行するように構成されたマルチコアグラフィック処理ユニット(GPU)を備えている。又、グラフィック処理システムは、実行スレッド間に共有され且つ各スレッド専用とされた部分をもつメモリも備えている。
【0004】
[0004]NVIDIAのCUDATM(コンピュート・ユニファイド・デバイス・アーキテクチャー)技術は、プログラマーや開発者が、ビデオ及びオーディオエンコーディング、油田及びガス田踏査のためのモデリング、及び医療像形成のような複雑な計算上の問題を解決するためのソフトウェアアプリケーションを書くことができるようにするC言語環境を提供する。これらのアプリケーションは、マルチコアGPUにより並列に実行するように構成され、典型的に、マルチコアGPUの特定の特徴に依存している。汎用の中央処理ユニット(CPU)には同じ特定の特徴が得られないので、CUDAを使用して書かれたソフトウェアアプリケーションは、汎用のCPUで実行するように移行できないことがある。
【発明の概要】
【発明が解決しようとする課題】
【0005】
[0005]上述したように、この技術では、マルチコアGPUで実行するために並列プログラミングモデルを使用して書かれたアプリケーションプログラムを、プログラマーにアプリケーションプログラムの変更を要求することなく、汎用CPUで実行できるようにする技術が要望されている。
【課題を解決するための手段】
【0006】
[0006]本発明の一実施形態は、変換されたアプリケーションプログラムを実行するように汎用プロセッサを構成するための方法について述べる。この方法は、マルチコアグラフィック処理システムで実行するために並列プログラミングモデルを使用して書かれたアプリケーションプログラムから変換されたものである前記変換されたアプリケーションプログラムを受け取り、そしてその変換されたアプリケーションプログラムをコンパイルして、汎用プロセッサにより実行するためのコンパイルされたコードを発生することを含む。コンパイルされたコードを実行するために利用できる汎用プロセッサ内の実行コアの数が決定され、その数の実行コアをイネーブルするように汎用プロセッサが構成される。コンパイルされたコードは、その数の実行コアを含む汎用プロセッサによって実行するために起動される。
【0007】
[0007]ここに開示する方法の1つの効果は、マルチコアGPUで実行するために並列プログラミングモデルを使用して書かれたアプリケーションプログラムを、変更せずに汎用CPUへ移行できることである。マルチコアGPUの特定の特徴に依存するアプリケーションの部分は、トランスレータにより、汎用CPUで実行するように変換される。アプリケーションプログラムは、同期独立インストラクションの領域へ区画化される。これらインストラクションは、収斂又は発散として分類され、領域間で共有される発散メモリ参照が複写される。汎用CPUにより実行される間に種々のスレッド間にメモリの正しい共有を保証するためにスレッドループが挿入される。
【0008】
[0008]上述した本発明の特徴を詳細に理解できるように、前記で簡単に要約した本発明について、幾つかを添付図面に例示した実施形態を参照して、より詳細に説明する。しかしながら、添付図面は、本発明の典型的な実施形態を例示するに過ぎず、それ故、本発明の範囲をそれに限定するものではなく、本発明は、同等の効果を発揮できる他の実施形態も包含できるものであることに注意されたい。
【図面の簡単な説明】
【0009】
【図1】コンピュータシステムを示すブロック図である。
【図2】本発明の一実施形態によるコンピュータシステムを例示するブロック図である。
【図3A】マルチコアグラフィック処理ユニットにより実行するために書かれたコードを、本発明の一実施形態により、汎用プロセッサにより実行するためのコードに変換するための方法ステップを示すフローチャートである。
【図3B】本発明の一実施形態により、入力コードを区画化されたコードに変換するところを示す概念図である。
【図3C】本発明の一実施形態により、入力コードを最適化されたコードに変換するところを示す概念図である。
【図4】本発明の一実施形態により、変換されたコードを汎用プロセッサによって実行するための方法ステップを示すフローチャートである。
【発明を実施するための形態】
【0010】
[0015]以下の説明では、本発明をより完全に理解するために多数の特定の細部について説明する。しかしながら、当業者であれば、これらの特定の細部の1つ以上がなくても、本発明を実施できることが明らかであろう。他の点について、本発明を不明瞭にしないために、良く知られた特徴は、説明しない。
【0011】
[0016]図1は、CUDAを使用して書かれたコードを実行するように構成されたコンピュータシステム100を示すブロック図である。このコンピュータシステム100は、メモリブリッジ105を含むバス経路を経て通信するCPU102及びシステムメモリ104を備えている。例えば、ノースブリッジ(Northbridge)チップでよいメモリブリッジ105は、バス又は他の通信経路106(例えば、ハイパートランスポートリンク)を経てI/O(入力/出力)ブリッジ107に接続される。例えば、サウスブリッジ(Southbridge)チップでよいI/Oブリッジ107は、1つ以上のユーザ入力装置108(例えば、キーボード、マウス)からユーザ入力を受け取り、そしてその入力を、経路106及びメモリブリッジ105を経てCPU102へ転送する。メモリブリッジ105には、バス又は他の通信経路113(例えば、PCIエクスプレス、アクセラレーテッドグラフィックポート又はハイパートランスポートリンク)を経てマルチスレッド型処理サブシステム112が結合される。一実施形態では、このマルチスレッド型処理サブシステム112は、ディスプレイ装置110(例えば、従来のCRT又はLCDベースのモニタ)へピクセルを配送するグラフィックサブシステムである。I/Oブリッジ107には、システムディスク114も接続される。スイッチ116は、I/Oブリッジ107と、他のコンポーネント、例えば、ネットワークアダプタ118及び種々のアドイン(add-in)カード120、121との間の接続をなす。又、I/Oブリッジ107には、USB又は他のポート接続部、CDドライブ、DVDドライブ、フィルムレコーディング装置、等を含む他のコンポーネント(明確に示さず)を接続することもできる。図1における種々のコンポーネントを相互接続する通信経路は、適当なプロトコル、例えば、PCI(周辺コンポーネント相互接続)、PCI−エクスプレス(PCI−E)、AGP(アクセラレーテッドグラフィックポート)、ハイパートランスポート、或いは他のバス又はポイント・ツー・ポイント通信プロトコルを使用して実施することができ、そして異なる装置間の接続は、この技術で知られたように異なるプロトコルを使用することができる。
【0012】
[0017]CPU102は、コンピュータシステム100の制御プロセッサとして動作し、他のシステムコンポーネントの動作を管理し且つ整合させる。特に、CPU102は、マルチスレッド型処理サブシステム112内の並列プロセッサ134の動作を制御するコマンドを発生する。ある実施形態では、CPU102は、並列プロセッサ134のためのコマンドのストリームをコマンドバッファ(図示せず)に書き込み、コマンドバッファは、システムメモリ104、サブシステムメモリ138、或いはCPU102及び並列プロセッサ134の両方にアクセス可能な別の記憶位置に常駐することができる。並列プロセッサ134は、コマンドバッファからコマンドストリームを読み取り、そしてCPU102のオペレーションに対して非同期でコマンドを実行する。
【0013】
[0018]システムメモリ104は、オペレーティングシステムの実行映像、装置ドライバ103、及びマルチスレッド型処理サブシステム112により実行するように構成されたCUDAコード101を備えている。CUDAコード101は、マルチスレッド型処理サブシステム112で実行されるように意図されたプログラミングインストラクションを組み込んでいる。この説明の文脈において、コードとは、コンピュータコード、インストラクション、及び/又はプロセッサを使用して実行できるファンクションを指す。例えば、種々の実施形態において、コードは、Cコード、C++コード、等を含んでもよい。一実施形態において、コードは、コンピュータ言語の言語拡張(例えば、C、C++、等の拡張)を含んでもよい。
【0014】
[0019]オペレーティングシステムは、コンピュータシステム100のオペレーションを管理し整合するための詳細なインストラクションを与える。装置ドライバ103は、マルチスレッド型処理サブシステム112、特に、並列プロセッサ134のオペレーションを管理し整合するための詳細なインストラクションを与える。更に、装置ドライバ103は、並列プロセッサ134に対して特別に最適化されたマシンコードを発生するための編集設備を備えてもよい。又、装置ドライバ103は、NVIDIA社により提供されるCUDATMフレームワークに関連して設けられてもよい。
【0015】
[0020]一実施形態では、マルチスレッド型処理サブシステム112は、1つ以上の並列プロセッサ134を組み込んでおり、これら並列プロセッサは、例えば、プログラム可能なプロセッサ、特定用途向け集積回路(ASIC)のような1つ以上の集積回路装置を使用して実施することができる。並列プロセッサ134は、グラフィック及びビデオ処理に最適な回路を含み、例えば、ビデオ出力回路、及びグラフィック処理回路(GPU)を含む。別の実施形態では、マルチスレッド型処理サブシステム112は、メモリブリッジ105、CPU102、及びI/Oブリッジ107のような1つ以上の他のシステム要素と一体化されて、システムオンチップ(SoC)を形成することができる。1つ以上の並列プロセッサ134がディスプレイ装置110へデータを出力してもよいし、又は各並列プロセッサ134が1つ以上のディスプレイ装置110にデータを出力してもよい。
【0016】
[0021]並列プロセッサ134は、1つ以上の処理コアを含む高度に並列なプロセッサを実施するのが好都合であり、各処理コアは、非常に多数のスレッドを同時に実行することができ、又、各スレッドは、コード101のようなプログラムのインスタンスである。並列プロセッサ134は、これに限定されないが、直線的及び非直線的なデータ変換、ビデオ及び/又はオーディオデータのフィルタリング、モデリングオペレーション(例えば、物理の法則を適用して、物体の位置、速度及び他の属性を決定する)、映像レンダリングオペレーション(例えば、モザイクシェーダー、頂点シェーダー、幾何学的シェーダー、及び/又はピクセルシェーダープログラム)、等を含む種々様々なアプリケーションに関連した処理タスクを実行するようにプログラムすることができる。並列プロセッサ134は、システムメモリ104及び/又はローカルサブシステムメモリ138からローカル(オンチップ)メモリへデータを転送し、データを処理し、そして結果のデータをシステムメモリ104及び/又はサブシステムメモリ138へ書き込み、そこで、このデータは、CPU102又は別のマルチスレッド型処理サブシステム112を含む他のシステムコンポーネントによってアクセスすることができる。
【0017】
[0022]並列プロセッサ134は、任意の量のサブシステムメモリ138が設けられてもよく、又、サブシステムメモリ138を含まなくてもよく、更に、サブシステムメモリ138及びシステムメモリ104を任意の組み合わせで使用してもよい。例えば、並列プロセッサ134は、一体化メモリアーキテクチャー(UMA)実施形態では、グラフィックプロセッサでよい。このような実施形態では、専用のサブシステムメモリ138は、ほとんど又は全く設けられず、そして並列プロセッサ134は、システムメモリ104を排他的に又はほぼ排他的に使用する。UMA実施形態では、並列プロセッサ134は、ブリッジチップ又はプロセッサチップに一体化されてもよいし、或いはブリッジチップ又は他の通信手段を経て並列プロセッサ134をシステムメモリ104に接続する高速リンク(例えば、PCI−E)と共に個別のチップとして設けられてもよい。
【0018】
[0023]上述したように、マルチスレッド型処理サブシステム112には、多数の並列プロセッサ134を含ませることができる。例えば、複数の並列プロセッサ134を単一のアドインカードに設けることもできるし、複数のアドインカードを通信経路113に接続することもできるし、又は1つ以上の並列プロセッサ134をブリッジチップに一体化することもできる。複数の並列プロセッサ134が存在する場合には、それらの並列プロセッサ134は、単一の並列プロセッサ134で可能である以上に高いスループットでデータを処理するように並列に動作することができる。1つ以上の並列プロセッサ134を組み込んだシステムは、デスクトップ、ラップトップ、ハンドヘルドパーソナルコンピュータ、サーバー、ワークステーション、ゲームコンソール、埋め込み型システム、等を含む種々のコンフィギュレーション及びフォームファクタで実施することができる。
【0019】
[0024]並列プロセッサ134の幾つかの実施形態では、単一インストラクション・複数データ(SIMD)インストラクション発行技術を使用して、複数の独立したインストラクションユニットを設けずに非常に多数のスレッドの並列実行をサポートする。他の実施形態では、単一インストラクション・複数スレッド(SIMT)技術を使用して、非常に多数の一般的に同期されたスレッドの並列実行をサポートする。全ての処理エンジンが典型的に同じインストラクションを実行するSIMD実行形態とは異なり、SIMTの実行は、異なるスレッドが、所与のスレッドプログラムを通して、発散する実行経路を容易にたどれるようにする。当業者であれば、SIMD処理形態は、SIMT処理形態の機能的サブセットを表すことが理解されよう。並列プロセッサ134内のファンクションユニットは、整数及び浮動小数点演算(例えば、加算及び乗算)、比較演算、ブール演算(AND、OR、XOR)、ビットシフト、及び種々の代数関数の計算(例えば、二次元補間、三角法、指数関数、対数関数、等)を含む種々のオペレーションをサポートする。
【0020】
[0025]並列プロセッサ134の処理コア(図示せず)内の特定の処理ユニット(図示せず)へ送信される一連のインストラクションは、既に定義されたスレッドを構成し、そして1つの処理コア内で処理ユニットにわたって同時に実行されるある数のスレッドの集合を、ここでは、「スレッドグループ」と称する。ここで使用される「スレッドグループ」は、異なる入力データに対して同じプログラムを実行するスレッドのグループを指し、グループの各スレッドは、処理コア内の異なる処理ユニットに指定される。1つのスレッドグループは、処理ユニットの数より少ないスレッドを含んでもよく、この場合、ある処理ユニットは、そのスレッドグループが処理されているときのサイクル中にアイドル状態となる。又、1つのスレッドグループは、処理ユニットの数より多くのスレッドを含んでもよく、この場合、処理は、複数のクロックサイクルにわたって行われる。
【0021】
[0026]各処理コアは、G個までのスレッドグループを同時にサポートできるので、並列プロセッサ134内の処理コアの数をMとすれば、所与の時間に処理コアにおいてGxM個までのスレッドグループを実行できることになる。更に、処理コア内で同時に複数の関連スレッドグループがアクティブになり得る(異なる実行段階において)。スレッドグループのこの集合を、ここでは、「協働スレッドアレイ」(CTA)と称する。CTAのサイズは、一般的に、プログラマーにより、CTAに利用できるメモリ又はレジスタのようなハードウェアリソースの量で決定される。CUDAプログラミングモデルは、GPUアクセラレータのシステムアーキテクチャーを表す。排他的ローカルアドレススペースが各スレッドに利用でき、そしてCTAごとの共有アドレススペースを使用して、CTA内のスレッド間にデータを通す。又、処理コアは、オフチップの「グローバル」メモリにアクセスすることもでき、これは、例えば、サブシステムメモリ138及び/又はシステムメモリ104を含むことができる。
【0022】
[0027]CUDAアプリケーションプログラムのホスト部分は、カーネルファンクションがCTA処理を指定する間に、従来の方法及びツールを使用してコンパイルされる。最も高いレベルにおいて、CUDAメモリモデルは、ホスト及び装置のメモリスペースを分離し、ホストコード及びカーネルコードがそれらの各メモリスペースに直接アクセスすることしかできないようにする。API(アプリケーションプログラミングインターフェイス)ファンクションは、ホスト及び装置のメモリスペース間でデータをコピーするのを許す。CUDAプログラミングモデルの共有メモリCPU実行では、制御CPUスレッドが、潜在的なデータ競合を伴わずに、並列CTAと並列に実行することができる。ホストメモリスペースは、Cプログラミング言語によって定義され、そして装置メモリスペースは、グローバル、定数、ローカル、共有及びテクスチャとして指定される。全てのスレッドは、グローバル、定数及びテクスチャメモリスペースにアクセスすることができる。上述したように、ローカルスペースへのアクセスは、単一スレッドに制限され、そして共有スペースへのアクセスは、CTA内のスレッドに制限される。このメモリモデルは、待ち時間の短いアクセスに対して小さなメモリスペースの使用を奨励し、そして典型的に待ち時間の長い大きなメモリスペースの賢明な使用を奨励する。
【0023】
[0028]コード101のようなCUDAプログラムは、典型的に、1つ、2つ又は3つの次元、例えば、x、y及びzにおいて、CTAの同期又は非同期実行のセットとして編成される。3タプルインデックスは、スレッドブロック内のスレッドを独特に識別する。スレッドブロックそれ自体は、暗示的に定義された2タプル変数により区別される。これらインデックスの範囲は、ランタイムに定義され、そしてランタイム環境は、インデックスが何らかのハードウェア制限に適合することをチェックする。各CTAは、並列プロセッサ134により他のCTAと並列に実行される。各並列プロセッサ134が1つ以上のCTAを実行するようにして、多数のCTAが並列に実行される。ランタイム環境は、CUDAコード101の実行を必要に応じて同期又は非同期で管理する役割を果たす。CTA内のスレッドは、共有メモリと、synchthreads()と称されるバリア同期プリミティブとの使用により、互いに通信し且つ同期する。CUDAは、スレッドブロック内のスレッドが同時に生きていることを保証すると共に、スレッドブロック内のスレッドが迅速なバリア同期及びローカルデータ共有を遂行するためのコンストラクトを与える。(1つ以上の次元によって定義される)CTA内の個別のスレッドブロックは、それらの生成、実行又は退出について何ら順序付けを課さない。更に、並列なCTAは、I/Oを含むシステムコールへのアクセスが許されない。CUDAプログラミングモデルは、並列なCTA間にグローバルな同期を強要するだけであり、CTA内のブロック間での限定された通信に対して固有のアトミックなオペレーションを与える。
【0024】
[0029]カーネルと称される各スレッドの本体は、メモリモデルアノテーション及びバリア同期プリミティブを用いて標準Cで表わされるCUDAを使用して指定される。CUDAプログラムのセマンティックは、バリア同期プリミティブによって暗示されるメモリの順序付けを尊重する順序でCTA内の全てのスレッドにより各カーネルが実行されるというものである。特に、バリア同期プリミティブの前に生じるCTA内の全ての共有メモリ参照は、バリア同期プリミティブの後に生じる共有メモリ参照の前に完了しなければならない。
【0025】
[0030]カーネルコードにおけるバリア同期プリミティブの各インスタンスは、概念的に個別の論理的バリアを表わし、スタティックとして取り扱われねばならない。CUDAスレッドが“if-else”コンストラクトの異なる分岐を取り得るときには、そのコンストラクトの両経路においてバリア同期プリミティブを呼び出すのは不法である。スレッドブロック内の全てのスレッドは、同期プリミティブの1つに到達するが、スレッドが全部到達するか全く到達しないかのいずれかを各々要求する別々のバリアを表わす。それ故、このようなカーネルは、正しく実行されない。より一般的には、CUDAコードは、スレッドブロック内の異なるスレッドに対して異なる振舞いをする制御フローコンストラクト内に同期プリミティブが収容される場合には、正しく実行されると保証されない。
【0026】
[0031]図2は、本発明の一実施形態によるコンピュータシステム200を示すブロック図である。コンピュータシステム100は、CPU202と、メモリブリッジ205を含むバス経路を経て通信するシステムメモリ204とを備えている。例えば、ノースブリッジ(Northbridge)チップでよいメモリブリッジ205は、バス又は他の通信経路106(例えば、ハイパートランスポートリンク)を経てI/O(入力/出力)ブリッジ107に接続される。CPU202は、ディスプレイ装置210(例えば、従来のCRT又はLCDベースのモニタ)に表示するための出力を発生する。
【0027】
[0032]マルチスレッド型処理サブシステム112は、コンピュータシステム200には含まれず、CUDAコード101は、CPU202のような汎用プロセッサによって実行するように適応されない。CUDAコード101は、マルチスレッド型処理サブシステム112によって実行するように適応され、トランスレータ220を使用して変換されて、バリア同期プリミティブを含まない変換されたコード201を発生する。CPU202がコード101により表わされたプログラムを実行するために、コード101を先ずコード201に変換しなければならない。変換されたコードは、次いで、CPU202によって実行するために、コンパイラー225によりコンパイルされる。コンパイラー225は、CPU202に対して特有の最適化を遂行することができる。コードを変換することは、第1のコンピュータ言語で書かれたコードを、第2のコンピュータ言語に変換することを指す。コードをコンパイルすることは、コンピュータ言語(例えば、ソースコード)で書かれたコードを、別のコンピュータ言語(例えば、オブジェクトコード)に変換することを指す。トランスレータ220は、図3Aを参照して説明し、コンパイラー225は、図4を参照して説明する。コンパイラー225は、コード101と、コード201と、CPU202との間をインターフェイスするように構成された装置ドライバ203内に含まれる。ランタイム環境227は、コンパイルされたコードに対するファンクション、例えば、入力及び出力、メモリ管理、等を実施するように構成される。又、ランタイム環境227は、CPU202により実行するためのコンパイルされたコードを起動する。トランスレータ220は、CUDAスレッドグループの微粒度スレッドにわたるオペレーションを単一のCPUスレッドへと直列化するための最適化変換を遂行し、一方、ランタイム環境227は、スレッドグループを、CPU202により並列処理するためのワークユニットとしてスケジュールする。
【0028】
[0033]汎用CPUにより実行するためにGPUで実行されるように設計されたCUDAアプリケーションの一次障害防止移行性は、並列性の粒度である。従来のCPUは、単一のCUDA CTAに要求される数百のハードウェアスレッドコンテクストをサポートしない。それ故、汎用CPUにおいてCUDAプログラミングモデルを実施するシステムの一次目標は、タスクレベルの並列性を、利用可能なCPUコアに分配することである。それと同時に、システムは、過剰なスケジューリングオーバーヘッド及び頻繁なコア間同期を防止するためにタスク内のマイクロスレッドを単一のCPUスレッドへと合併しなければならない。
【0029】
[0034]図3Aは、本発明の一実施形態に基づき、例えば、マルチスレッド型処理サブシステム112のようなマルチコアグラフィック処理システムにより実行するために書かれたコード101を、例えば、CPU202のような汎用プロセッサによって実行するためのコード201へ変換する方法ステップのフローチャートである。トランスレータ220は、図3Aに示されたステップの1つ以上を遂行して、コード101に使用されるバリア同期プリミティブのセマンティックを保存する。トランスレータ220は、バリア同期プリミティブの周りでコード101を区画化することによって並列スレッドを「アンロール(unroll)」し、共有状態の使用を減少し、メモリアクセスに対する参照の位置関係を改善し、そして汎用プロセッサにより実行するためのCUDA特有のコードを変換するためのスレッドループを挿入する。マルチスレッド型処理サブシステム112により実行するためにターゲットとされるCUDAコード101を変更せずにCPU202を使用してコード201を実行する良好な実行性能を得ることができる。コンパイラー225は、CPU202により与えられるベクトルインストラクション能力を利用し、そして実行のためにコード201をコンパイルするときに最適化を遂行することができる。
【0030】
[0035]ステップ300において、トランスレータ220は、マルチスレッド型処理サブシステム112、又は1つ以上の並列プロセッサ134を含むプロセッサのようなマルチコアGPUにより実行するために書かれたコード101、例えば、CUDAコード101を受け取る。ステップ300で受け取られたコードは、エッジによって接続された基本的ブロックノードより成る制御フローグラフとして表わすことができる。各々の基本的ブロックは、例えば、CPU202のようなターゲット環境により遂行されるオペレーションを指定する。ステップ305において、トランスレータ220は、バリア同期プリミティブの周りでCUDAコード101を区画化して、区画化されたコードを発生する。区画化されたコードが図3B及び3Cに示されており、これらの図を参照して区画化プロセスを説明する。同期区画は、区画内の基本的ブロックの制御フロー及びデータフロー特性によりオペレーションの順序付けが完全に決定されるところのコードの領域である。区画は、並列スレッドを実行するために区画の周りにスレッドループを挿入できるという特性を有する。制御フローグラフを使用して、各同期スレッド(synchthread)プリミティブをエッジに置き換え、基本的ブロックノードを異なる区画に分離することにより、同期区画制御フローグラフを発生することができる。
【0031】
[0036]ステップ310において、区画化されたコードを分類し、各ステートメントが収斂又は発散のいずれかとして識別されるようにする。区画化されたコードは、式及びステートメントを含むことができる。式は、定数、暗示的スレッドID、及びプログラマーにより形成される名前付き変数を伴うが、副作用や指定をもたない計算である。簡単なステートメントは、単一の指定を生じる計算式として定義される。又、一般的ステートメントは、バリア、制御フロー条件又はループコンストラクト、或いはステートメントの逐次ブロックを表すこともできる。CTA次元x、y及びzは、コードを通して伝播され、各オペレーションがCTA次元の1つ以上に依存するかどうか決定する。次元x、y及び/又はzにおいてスレッドID(threadID)(スレッド識別子)を参照するオペレーションは、発散と考えられる。というのは、CTA次元を参照するスレッドは、実行中に同じCTAの他のスレッドから発散し得るからである。例えば、スレッドID.x(threadID.x)に依存するオペレーションは、x次元に対して発散である。スレッドID.xに依存しない別のオペレーションは、x次元において収斂である。発散ステートメントは、それらが参照する各CTA次元に対してスレッドループを要求する。
【0032】
[0037]ステップ315において、区画化されたコードは、分類情報を使用して性能に対して最適化され、最適化されたコードを発生する。例えば、区画内のインストラクションは、オペレーションを融合させるように再順序付けされ、同じ分類をもつオペレーションが一緒にグループ編成されて、ステップ325で挿入される同じスレッドループ内に入ることができるようにする。分散ベクトルにおいてスレッドID次元がより少ないオペレーションが、より多くのスレッドID次元に依存するオペレーションに先行するように、オペレーションが順序付けされる。この再順序付けは、有効である。というのは、ステートメントは、それが依存するステートメントの分散ベクトルのスーパーセットである分散ベクトルを有していなければならないからである。従って、分散ベクトルに1つの次元しかもたないステートメントは、分散ベクトルに異なる次元又は2つ以上の次元をもつステートメントに依存することができない。
【0033】
[0038]ステップ320において、最適化されたコードにおけるスレッド−ローカルメモリ参照は、オブジェクトの各インスタンスが、値を記憶すべき独特の位置をもつよう保証するために、必要に応じてアレイ参照へ昇格される。特に、ある区画から別の区画へ搬送されるデータは、各区画においてそれが得られるように複写される必要がある。次の条件の1つを満足する変数は、アレイ参照へ昇格される。即ち、クロス区画依存性(ある区画において指定され、そして別の区画において参照される)を有するローカル変数。
【0034】
[0039]ステップ320において、トランスレータ220は、スレッド−ローカルメモリ参照をアレイ参照へ昇格させる。テーブル1に示すプログラムは、同期バリアプリミティブ及び発散参照を含む。
【表1】

【0035】
[0040]テーブル1に示すプログラムは、同期スレッドプリミティブの前に第1区画へそして同期スレッドプリミティブの後に第2区画へと区画化される。第2区画は、第1区画で計算された参照(左インデックス(leftIndex)及び右インデックス(rightIndex))を含み、CTA次元から従属する。発散参照が昇格されない場合には、第2区画は、第1区画の最後の繰り返しにより計算された値を誤って使用する。第2区画は、第1区画のthreadId.xの各対応する繰り返しに対して計算された値を使用しなければならない。計算が正しいことを保証するために、発散参照は、テーブル2に示すように昇格される。
【表2】

【0036】
[0041]ステップ325において、スレッドID次元を分散ベクトルに含むステートメントに対してスレッドループが発生される。ループ交換、ループ分裂及びループ不変量除去と同等の変換を同時に評価して、最良の冗長性除去を達成するために、適応ループネストが使用される。ネスト状のループは、アプリケーションに最も適するようにスレッドIDタプルの各次元の値に対して動的に発生されるのであって、特定のループネストを仮定して、そのネストに基づいてアプリケーションを評価するのではない。ステップ315においてステートメントが順序付けされた後に、分散ベクトルに次元を含むステートメントの周りのみでスレッドID次元に対してループを発生することができる。ループのオーバーヘッドを除去するために、トランスレータ220は、あるものが他のもののサブセットである分散ベクトルを有するような隣接ステートメントグループを融合することができる。
【0037】
[0042]図3Bは、本発明の一実施形態により、入力コード101を区画されたコード350へ変換するところを示す概念図である。入力コード330は、マルチスレッド型処理サブシステム112により実行するように構成され、同期バリアインストラクション336で分離されたコードシーケンス331及び332を含む。CTAにおける全てのスレッドは、いずれか1つのスレッドがコードシーケンス332の実行を開始する前にコードシーケンス331の実行を完了する。トランスレータ220は、入力コード330を区画化して、区画化されたコード350を発生し、区画351は、コードシーケンス331により表わされたインストラクションを含み、そして区画352は、コードシーケンス332により表わされたインストラクションを含む。区画化されたコード350が、同期バリアインストラクションを本来サポートしない汎用プロセッサにより実行されるときに、同期セマンティックが維持されるように保証するために、スレッドループ353が区画352の周りに挿入される。この実施例では、コード区画351が収斂参照を含み、区画352が発散参照を含む。それ故、スレッドループ353が区画352の周りに挿入される。
【0038】
[0043]図3Aのステップ325において、トランスレータ220は、(スレッドループ353のような)スレッドループを、最適化されたコードに挿入し、CPU202により実行するために変換されたコード201を発生する。各区画は、各CTA次元に対して挿入されたスレッドループを有することができる。同期区画化及びスレッドループ挿入の一実施例がテーブル3及び4に示されている。テーブル3に示されたプログラムは、テーブル4に示されたプログラムへと変換される。
【表3】

【0039】
[0044]テーブル3のプログラムは、CTAにおける種々のスレッド間でのメモリの正しい共有を保証するために明確な同期を使用する。トランスレータ220は、プログラムを、xCTA次元に各々依存する2つの区画に区画化する。それ故、スレッドループは、変換されたプログラムがオペレーションを正しい順序で遂行するよう保証するために2つの区画の各々の周りに挿入される。
【表4】

【0040】
[0045]汎用プロセッサにより実行するためのプログラムを挿入するより簡単な技術は、各CTA次元に対して明確なスレッドループを挿入し、同じ区画内の参照に対する次元依存性を決定する必要がないようにすることである。例えば、テーブル5に示すプログラムは、テーブル6に示すプログラムへ変換される。次元の依存性を決定することなくプログラムが形成されるので、テーブル5において挿入されるスレッドループの1つ以上が不必要であることに注意されたい。
【表5】


【表6】

【0041】
[0046]図3Cは、本発明の一実施形態により、入力コード333を、最適化されたコード360へ変換するところを示す概念図である。入力コード333は、マルチスレッド型処理サブシステム112により実行するように構成され、同期バリアインストラクション335で分離されたコードシーケンス334及び338を含む。CTAにおける全てのスレッドは、いずれか1つのスレッドがコードシーケンス338の実行を開始する前にコードシーケンス334の実行を完了する。トランスレータ220は、入力コード333を区画化して、区画化されたコード360を発生し、区画361は、コードシーケンス334により表わされたインストラクションを含み、そして区画362、364及び365は、コードシーケンス338により表わされたインストラクションを含む。
【0042】
[0047]区画362は、第1のCTA次元において発散であるインストラクションの第1部分を含む。区画364は、収斂であるインストラクションの第2部分を含む。区画365は、第2のCTA次元において発散であるインストラクションの第3部分を含む。同期バリアインストラクションを本来サポートしない汎用プロセッサによって区画化されたコード360が実行されるときに同期セマンティックが維持されるように保証するために、区画362の周りにスレッドループ363が挿入される。第1のCTA次元に対してスレッドループ363が繰り返される。スレッドループ366が、第2のCTA次元に対して繰り返されるように区画365の周りに挿入される。
【0043】
[0048]テーブル7は、例示的CUDAカーネルを示し、テーブル8は、汎用プロセッサにより実行するためのCUDAカーネルの変換を示す。例示的カーネルは、小さなマトリクスのリストを乗算する。各スレッドブロックは、リストから1つの小さなマトリクス乗算を計算し、一方、各スレッドは、そのブロックに対して結果のマトリクスの1つのエレメントを計算する。
【表7】

【0044】
[0049]テーブル7の行(9)のステートメントは、列がx次元に依存し、行がy次元に依存するので、(x、y)の分散ベクトルを有することに注意されたい。z次元は決して使用されず、従って、zに対して繰り返されるループが挿入されることはない。テーブル7に示す例示的カーネルにおいてステートメント5及び6のようなケースを決定するために、典型的なコスト分析技術を使用することができる。各々が1つのスレッドID次元にしか依存しないので、x及びyインデックスループのいずれかのネスト順序を選択することで、ステートメントの冗長な実行、又は区画のメインループネストの外部の冗長なループのいずれかが強制される。
【表8】

【0045】
[0050]図4は、本発明の一実施形態に基づき、CPU202のような汎用プロセッサにより、変換されたコード201を実行するための方法ステップのフローチャートである。ステップ400において、コンパイラー225は、CPU特有の最適化を任意に遂行する変換されたコード201をコンパイルして、コンパイルされたコードを発生する。ステップ405において、CPU202に得られる実行コア400の数は、装置ドライバ203により決定される。変換されたコード201は、性能改善のために利用可能な実行コアにおいて実行するように自動的にスケーリングされる。ステップ410において、ランタイム環境227又は装置ドライバ203は、変換されたコード201を実行する実行コアの数をイネーブルするようにCPU202を構成する。
【0046】
[0051]ランタイム環境227は、環境変数により制御できる多数のオペレーティングシステム(OS)ランタイムスレッドを生成することができる。デフォールトとして、システム内のコアの数を、OSランタイムスレッドの数として使用してもよい。ステップ410において、起動されるべきCUDAスレッドの数を評価して、ランタイムスレッドの数に統計学的に区画化することができる。各ランタイムスレッドは、コンパイルされたコードの一部分を逐次に実行し、バリアにおいて待機する。全てのランタイムスレッドがバリアに到達したときに、CTAが完了となる。ステップ415では、ランタイム環境227又は装置ドライバ203が、CPU202により実行するためにコンパイルされたコードを起動する。
【0047】
[0052]トランスレータ220、コンパイラー225及びランタイム環境227は、CUDAアプリケーションプログラムを、汎用CPUにより実行するためのコードへ変換するのに使用される。CUDAプログラミングモデルは、バルク同期タスクの並列性をサポートし、各タスクは、微粒度のSPMDスレッドより成る。CUDAプログラミングモデルの使用は、GPUにより実行するための特殊なコードを書き込もうとするプログラマーに制限される。この特殊なコードは、プログラマーがCUDAアプリケーションプログラムをリライトすることを要求せずに、汎用CPUにより実行するように変換することができる。CUDAによりサポートされる3つの重要なアブストラクションは、SPMDスレッドブロック、バリア同期、及び共有メモリである。トランスレータ220は、CUDAスレッドブロックの微粒度スレッドにわたるオペレーションを、単一のCPUスレッドへと直列化し、そしてCUDAアプリケーションプログラムを変換するための最適化変換を遂行する。
【0048】
[0053]以上、本発明の実施形態を説明したが、本発明の基本的な範囲から逸脱せずに、本発明の他の実施形態及び更に別の実施形態を案出することもできる。例えば、本発明の態様は、ハードウェア、又はソフトウェア、或いはハードウェアとソフトウェアの組合せで実施することもできる。本発明の一実施形態は、コンピュータシステムに使用するためのプログラム製品として実施することができる。プログラム製品のプログラム(1つ又は複数)は、(ここに述べる方法を含む)実施形態の機能を定義し、そして種々のコンピュータ読み取り可能な記憶媒体に含ませることができる。ここに例示するコンピュータ読み取り可能な記憶媒体は、(i)情報が永久的に記憶される書き込み不能の記憶媒体(例えば、コンピュータ内のリードオンリメモリ装置、例えば、CD−ROMドライブにより読み取り可能なCD−ROMディスク、フラッシュメモリ、ROMチップ、又は任意の形式のソリッドステート不揮発性半導体メモリ)、及び(ii)変更可能な情報が記憶される書き込み可能な記憶媒体(例えば、ディスケットドライブ又はハードディスクドライブ内のフロッピーディスク、又は任意の形式のソリッドステートランダムアクセス半導体メモリ)を含むが、これらに限定されない。このようなコンピュータ読み取り可能な記憶媒体は、本発明のファンクションを指令するコンピュータ読み取り可能なインストラクションを搬送するとき、本発明の実施形態となる。それ故、本発明の範囲は、特許請求の範囲によって決定される。
【符号の説明】
【0049】
100・・・コンピュータシステム、101・・・コード、102・・・CPU、103・・・装置ドライバ、104・・・システムメモリ、105・・・メモリブリッジ、106・・・通信経路、107・・・I/Oブリッジ、108・・・入力装置、110・・・ディスプレイ装置、112・・・マルチスレッド型処理サブシステム、113・・・通信経路、114・・・システムディスク、116・・・スイッチ、118・・・ネットワークアダプタ、120・・・アドインカード、121・・・アドインカード、134・・・並列プロセッサ、138・・・サブシステムメモリ、200・・・コンピュータシステム、201・・・コード、202・・・CPU、203・・・装置ドライバ、204・・・システムメモリ、205・・・メモリブリッジ、210・・・ディスプレイ装置、220・・・トランスレータ、225・・・コンパイラー、227・・・ランタイム環境

【特許請求の範囲】
【請求項1】
変換されたアプリケーションプログラムを実行するように構成されたコンピューティングシステムであって、
コンパイラーを実行するように構成された汎用プロセッサと、
前記プロセッサに結合され、前記変換されたアプリケーションプログラム及びコンパイルされたコードを記憶するように構成されたシステムメモリと、
を備え、前記コンパイラーは、
マルチコアグラフィック処理ユニットで実行するために並列プログラミングモデルを使用して書かれたアプリケーションプログラムから変換されたものである前記変換されたアプリケーションプログラムを受け取り、
前記変換されたアプリケーションプログラムをコンパイルして、前記汎用プロセッサにより実行するためのコンパイルされたコードを発生する、
というように構成され、更に、
装置ドライバであって、
前記変換されたアプリケーションプログラムを実行するのに利用できる前記汎用プロセッサ内の実行コアの数を決定し、
前記数の実行コアをイネーブルするように前記汎用プロセッサを構成する、
というように構成された装置ドライバと、
前記数の実行コアを含む前記汎用プロセッサにより実行するために前記コンパイルされたコードを起動するように構成されたランタイム環境と、
を備えるコンピューティングシステム。
【請求項2】
前記変換されたアプリケーションプログラムは、協働スレッドアレイにおけるスレッドのいずれか1つが前記変換されたアプリケーションプログラムの第2領域の実行を開始する前にその協働スレッドアレイにおける全てのスレッドが区画化されたアプリケーションプログラムの第1領域の実行を完了するよう保証するために、前記区画化されたアプリケーションプログラムの第1領域の周りに第1ループネストを含む、請求項1に記載のコンピューティングシステム。
【請求項3】
前記第1ループは、前記協働スレッドアレイの1つ以上の次元に対して繰り返される、請求項2に記載のコンピュータシステム。
【請求項4】
前記変換されたアプリケーションプログラムは、前記アプリケーションプログラムを、同期独立インストラクションの領域へと区画化して、区画化されたアプリケーションプログラムを発生し、そしてその区画化されたアプリケーションプログラムの少なくとも1つの領域の周りにループを挿入することにより発生され、前記ループは、前記マルチコアグラフィック処理ユニット内の並列プロセッサにより同時に実行される多数のスレッドに対応する協働スレッドアレイ次元に対して繰り返される、請求項1に記載のコンピューティングシステム。
【請求項5】
前記区画化されたアプリケーションプログラムの第1領域は、同期バリアインストラクションの前にあるインストラクションを含み、前記区画化されたアプリケーションプログラムの第2領域は、前記同期バリアインストラクションの後にあるインストラクションを含む、請求項4に記載のコンピューティングシステム。
【請求項6】
前記区画化されたアプリケーションプログラムの少なくとも1つの領域の周りに付加的なループを挿入して、前記変換されたアプリケーションプログラムを発生し、前記付加的なループは、異なる協働スレッドアレイ次元に対して繰り返される、請求項5に記載のコンピューティングシステム。
【請求項7】
前記区画化されたアプリケーションプログラムは、各ステートメントを、前記協働スレッドアレイ次元に対して収斂又は発散のいずれかとして識別するように分類される、請求項4に記載のコンピューティングシステム。
【請求項8】
前記汎用プロセッサは、更に、前記コンパイルされたコードを実行するように構成される、請求項1に記載のコンピュータシステム。
【請求項9】
前記汎用プロセッサは、更に、前記汎用プロセッサに特有の最適化を遂行するように構成される、請求項1に記載のコンピュータシステム。
【請求項10】
マルチコアグラフィック処理ユニットで実行するために並列プログラミングモデルを使用して書かれた前記アプリケーションプログラムは、CUDA(コンピュート・ユニファイド・デバイス・アーキテクチャー)アプリケーションプログラムである、請求項1に記載のコンピューティングシステム。

【図1】
image rotate

【図2】
image rotate

【図3A】
image rotate

【図3B】
image rotate

【図3C】
image rotate

【図4】
image rotate


【公開番号】特開2009−259241(P2009−259241A)
【公開日】平成21年11月5日(2009.11.5)
【国際特許分類】
【外国語出願】
【出願番号】特願2009−88972(P2009−88972)
【出願日】平成21年4月1日(2009.4.1)
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.フロッピー
【出願人】(501261300)エヌヴィディア コーポレイション (166)
【Fターム(参考)】