(57)【特許請求の範囲】
【請求項１】
複数の命令を含む計算カーネル内の位置であって、前記計算カーネルの実行中に前記計算カーネルの実行が移行可能な位置を、前記計算カーネルのコンパイル中に特定するステップと、
前記計算カーネルのコンテキストを維持及び移行するためのデータ構造を作成するステップと、
第１のマイクロアーキテクチャを有する第１のプロセッサコア上で実行するために、前記位置前の前記計算カーネル内のコードをスケジュールするステップと、
移行条件を満たしているという指標を受信したことに応じて、
前記コンテキストを、前記第１のマイクロアーキテクチャとは異なる第２のマイクロアーキテクチャを有する第２のプロセッサコアがアクセス可能な位置に移動させるステップと、
前記位置後の前記計算カーネル内のコードを、前記第２のプロセッサコアにスケジュールするステップと、
を含み、
前記移行条件を満たしていることを判定するために、出口点に到達した前記計算カーネルの並列実行反復回数が所与の閾値を超えているか判定するステップをさらに含む、
方法。
【請求項２】
前記第１のプロセッサコアに対応する前記計算カーネルの第１のバージョンのコードを生成するステップと、
前記第２のプロセッサコアに対応する前記計算カーネルの第２のバージョンのコードを生成するステップと、をさらに含む、請求項１に記載の方法。
【請求項３】
前記第１のマイクロアーキテクチャは、単一命令複数データ（ＳＩＭＤ）マイクロアーキテクチャであり、前記第２のマイクロアーキテクチャは、汎用マイクロアーキテクチャである、請求項２に記載の方法。
【請求項４】
プロファイルランタイム情報及び静的情報の少なくとも１つに基づいて前記特定を行うステップをさらに含む、請求項２に記載の方法。
【請求項５】
前記移行条件を満たしているか否かを判定する命令を用いて、前記第１のプロセッサコアの第１のバージョンのコードを計測するステップと、
前記データ構造によって示された位置でライブ値を検出するとともに実行を開始する命令を用いて、前記第２のプロセッサコアの第２のバージョンのコードを計測するステップと、
をさらに含む、請求項２に記載の方法。
【請求項６】
前記位置は、条件付き分岐命令の直前である、請求項１に記載の方法。
【請求項７】
異種マルチコアアーキテクチャを含むコンピューティングシステムであって、
第１のマイクロアーキテクチャを有する第１のプロセッサコアと、
前記第１のマイクロアーキテクチャとは異なる第２のマイクロアーキテクチャを有する第２のプロセッサコアと、
複数の命令を含む計算カーネルであって、前記計算カーネルの実行中に前記計算カーネルの実行が移行可能な位置を含む計算カーネルと、
前記計算カーネルのコンテキストの維持及び移行に使用可能なデータ構造と、
スケジューラを含むオペレーティングシステムと、を備え、
前記スケジューラは、
第１のマイクロアーキテクチャを有する第１のプロセッサコア上で実行するために、前記位置前の前記計算カーネル内のコードをスケジュールし、
移行条件を満たしたという指標を受信したことに応じて、
前記コンテキストを、前記第１のマイクロアーキテクチャとは異なる第２のマイクロアーキテクチャを有する第２のプロセッサコアがアクセス可能な位置に移動させ、
前記位置後の前記計算カーネル内のコードを、前記第２のプロセッサコアにスケジュールするように構成されており、
前記第１のプロセッサコア及び前記第２のプロセッサコアの各々は、前記移行条件を満たしていることを判定するために、出口点に到達した前記計算カーネルの並列実行反復回数が所与の閾値を超えているか判定するように構成されている、
コンピューティングシステム。
【請求項８】
前記第１のプロセッサコアに対応する前記計算カーネルの第１のバージョンのコードを生成し、前記第２のプロセッサコアに対応する前記計算カーネルの第２のバージョンのコードを生成するように構成されたコンパイラをさらに含む、
請求項７に記載のコンピューティングシステム。
【請求項９】
前記第１のマイクロアーキテクチャは、単一命令複数データ（ＳＩＭＤ）マイクロアーキテクチャであり、前記第２のマイクロアーキテクチャは、汎用マイクロアーキテクチャである、請求項８に記載のコンピューティングシステム。
【請求項１０】
前記コンパイラは、プロファイルランタイム情報及び静的情報の少なくとも１つに基づいて前記移行可能な位置の特定を行うように構成されている、請求項８に記載のコンピューティングシステム。
【請求項１１】
前記コンパイラは、
前記移行条件を満たしているか否かを判定する命令を用いて、前記第１のプロセッサコアの第１のバージョンのコードを計測し、
前記データ構造によって示された位置でライブ値を検出するとともに実行を開始する命令を用いて、前記第２のプロセッサコアの第２のバージョンのコードを計測するように構成されている、
請求項８に記載のコンピューティングシステム。
【請求項１２】
前記コンパイラは、
前記計算カーネルの後の並列実行反復回数が前記移行条件を満たすという予測に応じて、前記計算カーネルを前記位置で２つの計算サブカーネルに分割し、
前記位置前のコードを含む第１の計算サブカーネルを、前記第１のプロセッサコアにスケジュールし、
前記位置後のコードを含む第２の計算サブカーネルを、前記第２のプロセッサコアにスケジュールするように構成されている、
請求項８に記載のコンピューティングシステム。
【請求項１３】
前記位置は、条件付き分岐命令の直前である、請求項７に記載のコンピューティングシステム。
【請求項１４】
プログラム命令を記憶するコンピュータ可読記憶媒体であって、
前記プログラム命令は、
複数の命令を含む計算カーネル内の位置であって、前記計算カーネルの実行中に前記計算カーネルの実行が移行可能な位置を、前記計算カーネルのコンパイル中に特定し、
前記計算カーネルのコンテキストを維持及び移行するためのデータ構造を作成し、
第１のマイクロアーキテクチャを有する第１のプロセッサコア上で実行するために、前記位置前の前記計算カーネル内のコードをスケジュールし、
移行条件を満たしているという指標を受信したことに応じて、
前記コンテキストを、前記第１のマイクロアーキテクチャとは異なる第２のマイクロアーキテクチャを有する第２のプロセッサコアがアクセス可能な位置に移動させ、
前記位置後の前記計算カーネル内のコードを、前記第２のプロセッサコアにスケジュールし、
前記移行条件を満たしていることを判定するために、出口点に到達した前記計算カーネルの並列実行反復回数が所与の閾値を超えているか判定するように実行可能である、
コンピュータ可読記憶媒体。
【請求項１５】
前記プログラム命令は、前記第１のプロセッサコアに対応する前記計算カーネルの第１のバージョンのコードを生成し、前記第２のプロセッサコアに対応する前記計算カーネルの第２のバージョンのコードを生成するように実行可能である、請求項１４に記載のコンピュータ可読記憶媒体。
【請求項１６】
前記プログラム命令は、
前記移行条件を満たしているか否かを判定する命令を用いて、前記第１のプロセッサコアの第１のバージョンのコードを前記位置で計測し、
前記データ構造によって示された位置でライブ値を検出するとともに実行を開始する命令を用いて、前記第２のプロセッサコアの第２のバージョンのコードを前記位置で計測するように実行可能である、
請求項１４に記載のコンピュータ可読記憶媒体。
【請求項１７】
複数の命令を含む計算カーネル内の位置であって、前記計算カーネルの実行中に前記計算カーネルの実行が移行可能な位置を、前記計算カーネルのコンパイル中に特定するステップと、
前記計算カーネルのコンテキストを維持及び移行するためのデータ構造を作成するステップと、
前記計算カーネルの後の並列実行反復回数が移動条件を満たすという予測に応じて、前記計算カーネルを前記位置で２つの計算サブカーネルに分割するステップと、
前記位置前のコードを含む第１の計算サブカーネルを、第１のプロセッサコアにスケジュールするステップと、
前記位置後のコードを含む第２の計算サブカーネルを、第２のプロセッサコアにスケジュールするステップと、
を含む、方法。
【請求項１８】
異種マルチコアアーキテクチャを含むコンピューティングシステムであって、
第１のマイクロアーキテクチャを有する第１のプロセッサコアと、
前記第１のマイクロアーキテクチャとは異なる第２のマイクロアーキテクチャを有する第２のプロセッサコアと、
複数の命令を含む計算カーネルであって、前記計算カーネルの実行中に前記計算カーネルの実行が移行可能な位置を含む計算カーネルと、
前記計算カーネルのコンテキストの維持及び移行に使用可能なデータ構造と、
前記計算カーネルの後の並列実行反復回数が移動条件を満たすという予測に応じて、前記計算カーネルを前記位置で２つの計算サブカーネルに分割するように構成されたコンパイラと、
スケジューラを含むオペレーティングシステムと、を備え、
前記スケジューラは、
前記位置前のコードを含む第１の計算サブカーネルを、第１のプロセッサコアにスケジュールし、
前記位置後のコードを含む第２の計算サブカーネルを、第２のプロセッサコアにスケジュールする、ように構成されている、
コンピューティングシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピューティングシステム、より具体的には、複数の異種コア間で作業単位の実行を自動的に移行させることに関する。
【背景技術】
【０００２】
コンピュータシステムのスループットを増加させるために、タスクの並列化が用いられている。この目的を達成するために、コンパイラは、プログラムコードから並列化タスクを抽出し、システムハードウェア上で並行して実行し得る。単一コアアーキテクチャでは、単一のコアは、マルチスレッディングを行うように構成されたディープパイプラインを含んでもよい。ハードウェア上での並列実行をさらに増加させるために、マルチコアアーキテクチャは、複数の汎用コアを含んでもよい。この種類のアーキテクチャは、同種マルチコアアーキテクチャと呼ばれてもよく、単一コアアーキテクチャよりも高い命令スループットを提供し得る。
【０００３】
いくつかのソフトウェアアプリケーションは、度々、並列タスクに分割されない場合がある。加えて、特定のタスクは、汎用コア上で効率的に実行しない場合がある。計算集約的タスクの特定の命令は、共有リソースの不均衡な配分を引き起こし得、共有リソースの割り当て解除を遅延する。そのような特定のタスクの例には、暗号作成、ビデオグラフィックスレンダリング、およびガーベジコレクションが挙げられ得る。
【０００４】
従来の汎用コアの性能限界を打開するために、コンピュータシステムは、特定のタスクを特殊用途のハードウェアにオフロードし得る。このハードウェアは、単一命令複数データ（ＳＩＭＤ）並列アーキテクチャ、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）および他の特殊のコアを含み得る。異なる種類のコアを有する一種のアーキテクチャは、異種マルチコアアーキテクチャと称され得る。この種のアーキテクチャは、タスクのスケジューリングに応じて、同種マルチコアアーキテクチャよりも高い命令スループットを提供し得る。
【０００５】
多くの場合、特定のソフトウェアアプリケーションは、それぞれの作業項目または並列関数呼び出しの実行がその内部でデータ依存性である、データ並列性を有する。例えば、第１の作業項目は、第２の作業項目から独立したデータであってよく、第１の作業項目および第２の作業項目の各々は、ＳＩＭＤマイクロアーキテクチャを有するコア内の別々のパス上にスケジュールされる。しかしながら、第１の作業項目および第２の作業項目の各々で実行される命令の量は、データ依存性があり得る。分岐命令として実装される条件付きテストは、第１の作業項目を通過し得るが、それぞれの作業項目のデータに依存した第２の作業項目に対して失敗し得る。
【０００６】
第２の作業項目が実行を停止して待機し、第１の作業項目が進行中の実行を続けるため、並列実行の効率性は低減するおそれがある。わずかな作業項目のみがテスト通過のために実行を継続する一方で、大半の作業項目がテスト失敗のために休止状態にあるときに、非効率性が増大する。異種マルチコアアーキテクチャにおけるＯＳスケジューラによる作業項目の効率的な機能性一致割り当て後に、システム性能は、特定のソフトウェアアプリケーションのデータ依存性挙動のために、さらに低減するおそれがある。
【発明の概要】
【０００７】
複数の異種コア間で作業単位の実行を自動的に移行させるためのシステムおよび方法が企図される。
【０００８】
一実施形態において、コンピューティングシステムは、第１のマイクロアーキテクチャを有する第１のプロセッサコアと、第１のマイクロアーキテクチャとは異なる第２のマイクロアーキテクチャを有する第２のプロセッサコアとを含む。一実施形態において、第１のマイクロアーキテクチャは、単一命令複数データ（ＳＩＭＤ）マイクロアーキテクチャであって、第２のマイクロアーキテクチャは、汎用マイクロアーキテクチャである。コンピューティングシステムは、第１および第２のプロセッサコアの各々に接続されたメモリを含む。メモリは、１つ以上の計算カーネルまたは関数呼び出しを含むコンピュータプログラムを記憶する。コンパイラが所与の関数呼び出しの命令をトラバース（ｔｒａｖｅｒｓｅ）するときに、コンパイラは、関数呼び出しの実行が、所与の位置で異なるプロセッサコアに移行することを予測するように構成されている。コンパイラは、所与の位置での関数呼び出しの実行と関連付けられたライブ値の移動を支援するデータ構造を作成する。そのようなライブ値は、「コンテキスト」と称され得る。
【０００９】
オペレーティングシステム（ＯＳ）内のスケジューラは、プログラム順における所与の位置前に、少なくともコードを第１のプロセッサコアにスケジュールする。移行条件が満たされているという指標の受信に応じて、ＯＳスケジューラは、第２のプロセッサコアによるアクセスのために、データ構造によって示された位置にライブ値を移動させ、且つ、プログラム順における所与の位置後に、コードを第２のプロセッサにスケジュールする。移行条件が満たされているか否かを判定するために、第１および第２のプロセッサコアの各々は、出口点に到達した関数呼び出しの反復の並列実行数が所与の閾値を超えるか否かを判定するように構成されている。
【００１０】
これらおよび他の実施形態は、以下の説明および図面を参照してさらに理解される。
【図面の簡単な説明】
【００１１】
【図１】異種マルチコアアーキテクチャを備えた例示的な処理ノードの一実施形態の一般化されたブロック図である。
【図２】計算カーネルを定義するソースコードの一実施形態の一般化されたブロック図である。
【図３】条件文を有する計算カーネルを定義するソースコードの一実施形態の一般化されたブロック図である。
【図４】ハードウェアリソースと計算カーネルとの間でスケジュールされた割り当ての一実施形態の一般化されたブロック図である。
【図５】２種類のプロセッサコアのマイクロアーキテクチャの論理レイアウトの一実施形態の一般化されたブロック図である。
【図６】汎用パイプライン実行フローの一実施形態の一般化されたブロック図である。
【図７Ａ】ＳＩＭＤパイプライン実行フローの一実施形態の一般化されたブロック図である。
【図７Ｂ】ＳＩＭＤパイプライン実行フローの一実施形態の別の一般化されたブロック図である。
【図８】移行タグ付け分岐を有するプログラムコードの一実施形態の一般化されたブロック図である。
【図９】計算カーネル移行のためにコードを計測する方法の一実施形態を説明する一般化されたフロー図である。
【図１０】プログラム実行中に計算カーネルを移行させる方法の一実施形態を説明する一般化されたフロー図である。
【００１２】
本発明の様々な修正および代替形態が可能であるが、特定の実施形態は、図面において一例として示されており、本明細書において詳細に説明される。しかしながら、図面および図面の詳細説明が、本発明を開示された特定の形態に限定するように意図されず、それとは逆に、本発明は、添付の特許請求の範囲によって定義される本発明の精神および範囲内に収まるすべての修正、等価物および代替物を包含すると理解されるべきである。
【発明を実施するための形態】
【００１３】
以下の説明では、本発明の完全なる理解を提供するために、多数の具体的詳細が記載されている。しかしながら、当業者であれば、これらの具体的詳細を伴わずに、本発明が実践され得ることを認識するはずである。場合によっては、本発明を曖昧にすることを回避するために、周知の回路、構造および技法が詳細に示されていない。
【００１４】
図１を参照すると、異種マルチコアアーキテクチャを備えた例示的な処理ノード１１０の一実施形態が示されている。処理ノード１１０は、１つ以上のプロセッサコア１１２と、関連キャッシュメモリサブシステム１１４とを含み得る１つ以上の処理ユニット１１５を含んでもよい。一実施形態では、プロセッサコア１１２は、汎用マイクロアーキテクチャを利用する。
【００１５】
また、処理ノード１１０は、１つ以上のプロセッサコア１７２と、データ記憶バッファ１７４とを備え得る１つ以上の処理ユニット１７０を含んでもよい。プロセッサコア１７２は、プロセッサコア１１２のミラーリングされたシリコンイメージでなくてもよい。プロセッサコア１７２は、プロセッサコア１１２によって用いられるマイクロアーキテクチャとは異なるマイクロアーキテクチャを有し得る。一実施形態では、プロセッサコア１７２は、プロセッサコア１１２と同一のプロセッサ群の異なる世代のものであってもよい。別の実施形態では、プロセッサコア１７２は、プロセッサコア１１２の電圧および／または周波数を拡大／縮小したものであってもよい。言い換えれば、プロセッサコア１７２は、同一の機能性および命令セットアーキテクチャ（ＩＳＡ）、同一のクロック周波数、同一のキャッシュサイズ、同一のメモリモデル等を備えたプロセッサコア１１２のシリコンコピーではない。
【００１６】
プロセッサコア１７２のマイクロアーキテクチャの参照を続けると、さらに別の実施形態では、プロセッサコア１７２は、計算集約的タスクのための高い命令スループットを提供するマイクロアーキテクチャを備えてもよい。プロセッサコア１７２は、並列アーキテクチャを有し得る。例えば、プロセッサコア１７２は、単一命令複数データ（ＳＩＭＤ）コアであってもよい。ＳＩＭＤコアの例は、グラフィックス処理ユニット（ＧＰＵ）、デジタル信号処理（ＤＳＰ）コア等を含む。一実施形態では、処理ノード１１０は、単一命令セットアーキテクチャ（ＩＳＡ）を備える。典型的には、当技術分野において周知であるように、単一ＩＳＡマルチコアアーキテクチャは、チップマルチプロセッサ（ＣＭＰ）のためにより高い出力およびスループット性能を提供することが示されている。
【００１７】
処理ノード１１０上の高い命令スループットは、ソフトウェアアプリケーションのスレッドが効率的にスケジューリングされたときに、所与の電力限界内の測定された電力消費とともに達成されてもよい。スレッドは、プロセッサコア１１２および１７２のランタイムのハードウェアリソースの少なくとも一部に基づき、各スレッドが最高命令スループットを有する方式で、プロセッサコア１１２および１７２のうち１つでスケジューリングされてもよい。
【００１８】
処理ノード１１０内の構成要素の参照を続けると、処理ノード１１０は、メモリコントローラ１２０と、インターフェース論理１４０とを含んでもよい。一実施形態では、処理ノード１１０の説明される機能性は、単一の集積回路に組み込まれる。一実施形態では、プロセッサコア１１２は、所定の汎用命令セットに従って命令を実行するための回路を含む。例えば、ＳＰＡＲＣ（登録商標）命令セットアーキテクチャ（ＩＳＡ）が選択されてもよい。代替として、ｘ８６、ｘ８６−６４（登録商標）、Ａｌｐｈａ（登録商標）、ＰｏｗｅｒＰＣ（登録商標）、ＭＩＰＳ（登録商標）、ＰＡ−ＲＩＳＣ（登録商標）または任意の他の命令セットアーキテクチャが選択されてもよい。概して、プロセッサコア１１２は、データおよび命令のそれぞれのために、キャッシュメモリサブシステム１１４にアクセスする。要求されたブロックが、キャッシュメモリサブシステム１１４内または共有キャッシュメモリサブシステム１１８内で検出されない場合には、読取要求が生成され、欠落したブロックがマップされたノード内のメモリコントローラに当該読取要求が伝送されてもよい。
【００１９】
一実施形態では、処理ユニット１７０は、グラフィックス処理ユニット（ＧＰＵ）である。現代のＧＰＵは、コンピュータグラフィックスを操作および表示することに非常に有能である。ＧＰＵの高度並列構造は、様々な複雑なアルゴリズムに対して、処理ユニット１１５等の汎用中央処理ユニット（ＣＰＵ）よりも効果的である。典型的には、ＧＰＵは、グラフィックスおよびビデオに使用される計算を実行し、ＣＰＵは、グラフィックス単独よりもより多くのシステムプロセスのための計算を実行する。従来のＧＰＵは、画像レンダリングアプリケーションにおいて高いスループットを達成するために、非常に幅広い単一命令複数データ（ＳＩＭＤ）アーキテクチャを利用している。そのようなアプリケーションは、概して、多数のオブジェクト（頂点またはピクセル）上で、頂点シェーダまたはピクセルシェーダ等の同一のプログラムを実行することを必要とする。各オブジェクトは、他のオブジェクトとは独立して処理されるが、同一の一連の演算が使用されるため、ＳＩＭＤアーキテクチャは、相当の性能強化を提供する。また、ＧＰＵは、非図式計算のためにも考慮されている。
【００２０】
一実施形態では、ＧＰＵ１７０は、ビデオカード上に配置され得る。別の実施形態では、ＧＰＵ１７０は、マザーボード上に統合されてもよい。さらに別の実施形態では、処理ノード１１０の説明される機能性は、単一の集積回路上に組み込まれてもよい。そのような実施形態では、ＣＰＵ１１５およびＧＰＵ１７０は、異なる設計センターからの専有コアであってもよい。また、ＧＰＵ１７０は、現在、インターフェース１４０を介してオフチップでメモリアクセスを行うよりも、処理ノード１１０からメモリコントローラ１２０を介して、ローカルメモリ１１４および１１８と、メインメモリとの両方に直接アクセスすることが可能であってもよい。この実施形態は、ＧＰＵ１７０のメモリアクセスの待ち時間をより低下させてもよく、それが、より高い性能につながり得る。
【００２１】
図１の処理ノード１１０の構成要素の参照を続けると、キャッシュサブシステム１１４および１１８は、データのブロックを記憶するように構成された高速キャッシュメモリを備えてもよい。キャッシュメモリサブシステム１１４は、個々のプロセッサコア１１２内に統合されてもよい。代替として、キャッシュメモリサブシステム１１４は、所望に応じて、バックサイドキャッシュ構成またはインライン構成で、プロセッサコア１１４に連結されてもよい。さらにまた、キャッシュメモリサブシステム１１４は、キャッシュの階層として実装されてもよい。（階層内で）プロセッサコア１１２に最も近く位置するキャッシュは、所望であれば、プロセッサコア１１２内に統合されてもよい。一実施形態では、キャッシュメモリサブシステム１１４の各々はＬ２キャッシュ構造を表し、共有キャッシュサブシステム１１８はＬ３キャッシュ構造を表す。キャッシュメモリサブシステム１１４および共有キャッシュメモリサブシステム１１８の両方は、対応するキャッシュコントローラに連結されたキャッシュメモリを含んでもよい。
【００２２】
概して、パケット処理論理１１６は、処理ノード１１０が連結されたリンク上で受信した制御パケットに応答するように構成されており、プロセッサコア１１２および／またはキャッシュメモリサブシステム１１４に応じて制御パケットを生成するように構成されており、サービスのためのメモリコントローラ１２０によって選択されたトランザクションに応じてプローブコマンドおよび応答パケットを生成するように構成されており、ノード１１０が中間ノードであるパケットを、インターフェース論理１４０を通して他のノードへ送るように構成されている。インターフェース論理１４０は、パケットを受信し、パケットを、パケット処理論理１１６によって使用される内部クロックに同期させる論理を含んでもよい。
【００２３】
ここで図２を参照すると、計算カーネルを利用するソースコードの一実施形態が示されている。ＯｐｅｎＣＬ（登録商標）（Ｏｐｅｎ  Ｃｏｍｐｕｔｉｎｇ  Ｌａｎｇｕａｇｅ）は、異種計算のためのアプリケーションプログラミングインターフェース（ＡＰＩ）の一例である。ＯｐｅｎＣＬ（登録商標）は、それぞれＯｐｅｎＣＬ（登録商標）デバイスと関連付けられた実行待ち行列を定義するＣ風の言語を含む。ＯｐｅｎＣＬ（登録商標）デバイスは、ＣＰＵ、ＧＰＵ、または異種マルチコアアーキテクチャ内の少なくとも１つのプロセッサコアを備えた他のユニットであってもよい。関数呼び出しは、ＯｐｅｎＣＬ（登録商標）カーネル、または単に「計算カーネル」と呼ばれてもよい。ＯｐｅｎＣＬ（登録商標）フレームワークは、ゲーム、娯楽、科学および医療分野で使用される多種多様のデータ並列アプリケーションの計算性能を向上させてもよい。異種アーキテクチャについては、コンピュータプログラムは、典型的に、計算カーネルおよび内部関数の集合を備える。ソフトウェアプログラマは、計算カーネルを定義し得る一方で、内部関数は、所与のライブラリ内で定義されてもよい。
【００２４】
データ並列ソフトウェアアプリケーションについては、Ｎ次元計算ドメインは、「実行ドメイン」の組織化を定義し得る。また、Ｎ次元計算ドメインは、Ｎ次元グリッドまたはＮ次元範囲（「ＮＤＲａｎｇｅ」）と呼ばれてもよい。ＮＤＲａｎｇｅは、１、２または３次元空間であってもよい。いくつかの実施形態が、３次元を超えるデータを可能にし得ることに留意する。この次元空間は、インデックス空間と呼ばれてもよい。例えば、ソフトウェアアプリケーションは、画像ファイル等のデータの２次元（２Ｄ）アレイのデータにデータ処理を行ってもよい。ソフトウェアアプリケーションは、２次元画像のピクセルごとに、または２次元マトリックスの要素ごとに、ソフトウェアプログラマによって開発されたアルゴリズムを行い得る。所与の計算カーネルは、インデックス空間（ＮＤＲａｎｇｅ）にわたって呼び出され得る。他の実施形態において、ソフトウェアアプリケーションは、３次元格子上での静電電位マッピングおよび高分子モデリングに使用される直接クーロン総和のために、データ並列プログラミングを利用するアルゴリズムを含み得る。
【００２５】
典型的には、コンパイル後、各計算カーネルの引数およびパラメータが設定される。加えて、関連メモリオブジェクトおよびバッファが作成される。計算カーネルの所与のインスタンスは、独自のソフトウェアスレッドとして実行されてもよい。しかしながら、計算カーネルは、フォークを作成する制御フロー転送命令を含み得るが、コンピュータプログラム内のフォークは、典型的に、共通の定義によって、ソフトウェアスレッドを作成する。インデックス空間内の所与の点における計算カーネルの所与のインスタンスは、「作業項目」と呼ばれてもよい。また、作業項目は、作業単位と呼ばれてもよい。作業単位は、２次元画像の所与のピクセル（所与のインデックス）に対応するデータのレコード上で、計算カーネル内の１つ以上の命令とともに動作し得る。典型的には、作業単位は、関連する一意の識別子（ＩＤ）を有する。別の実施例では、「Ｈｅｌｌｏ  Ｗｏｒｌｄ」という文字列を処理する入門コンピュータプログラムは、文字列内の各文字を計算するための１つの作業単位を有し得る。
【００２６】
ＮＤＲａｎｇｅは、十分なハードウェアサポートがある場合に並行して実行する作業単位の総数を定義し得る。例えば、ＮＤＲａｎｇｅは、２８０の作業単位を定義し得るが、ＧＰＵは、任意の所与の時に６４個の作業単位の同時実行をサポートし得る。作業単位の総数は、全体的な作業サイズを定義し得る。当業者に周知であるように、作業単位は、作業グループにさらにグループ化されてもよい。各作業グループは、一意の識別子（ＩＤ）を有し得る。所与の作業グループ内の作業単位は、相互に通信し、実行を同期させ、メモリアクセスを協調させることが可能であってもよい。いくつかの作業単位が、ＳＩＭＤ方式で、ＧＰＵ上の同時実行のためのウェーブフロントに分けられ（クラスタ化され）てもよい。合計２８０個の作業単位についての上記の実施例に関して、ウェーブフロントは、６４個の作業単位を含んでもよい。
【００２７】
ＯｐｅｎＣＬ（登録商標）フレームワークは、種々の計算デバイス、またはＯｐｅｎＣＬ（登録商標）デバイス用のオープンプログラミング標準である。ソフトウェアプログラマは、ベンダ特有のコードを書くことを回避してもよく、それが向上したコード移植性をもたらし得る。他のフレームワークが利用可能であり、当該他のフレームワークは、よりベンダ特有のコーディングを異種アーキテクチャに提供し得る。例えば、ＮＶＩＤＩＡは、Ｃｏｍｐｕｔｅ  Ｕｎｉｆｉｅｄ  Ｄｅｖｉｃｅ  Ａｒｃｈｉｔｅｃｔｕｒｅ（ＣＵＤＡ（登録商標））を提供し、ＡＭＤは、ＡＴＩ  Ｓｔｒｅａｍ（登録商標）を提供する。ＣＵＤＡ（登録商標）フレームワークを用いると、計算カーネルは、典型的には、コンピュータプログラムがコンパイルされたときに、静的にコンパイルされる。ＯｐｅｎＣＬ（登録商標）フレームワークを用いると、計算カーネルは、典型的には、ジャストインタイム（ＪＩＴ）方法でコンパイルされる。ＪＩＴ方法は、システム構成を取得した後に、適切なバイナリコードを生成し得る。ＪＩＴコンパイル方法を用いると、コンパイル時間が総実行時間とともに含まれる。したがって、コンパイラ最適化は、実行時間を増加させ得る。加えて、ランタイムに、ＯｐｅｎＣＬコンパイラは、計算カーネルの複数のバージョンを生成し得る。計算カーネルの１つのバージョンは、汎用ＣＰＵ、ＳＩＭＤ  ＧＰＵ等の各種のＯｐｅｎＣＬ（登録商標）デバイス種類のために生成されてもよい。
【００２８】
ＯｐｅｎＣＬ（登録商標）およびＣＵＤＡ（登録商標）といった２つのフレームワークは、それぞれの実行モデル間で用語の違いを有する。例えば、ＯｐｅｎＣＬ（登録商標）における作業単位、作業グループ、ウェーブフロントおよびＮＤＲａｎｇｅは、スレッド、スレッドブロック、ワープおよびグリップ等のＣＵＤＡ（登録商標）における対応する用語を有する。残りの説明の全体を通して、ＯｐｅｎＣＬ（登録商標）に対応する用語が使用される。しかしながら、説明されるシステムおよび方法は、ＣＵＤＡ（登録商標）、ＡＴＩ  Ｓｔｒｅａｍおよび他のフレームワークに適用されてもよい。
【００２９】
図２に示されるように、コード２１０は、一般に「ｄｏＷｏｒｋＡ」および「ｄｏＷｏｒｋＢ」という、２つの関数呼び出しを定義する。各関数呼び出しは、「計算カーネル」と呼ばれてもよい。計算カーネルは、１つ以上の計算の作業単位を生じさせるために、１つ以上のデータのレコードと合致させられてもよい。したがって、２つ以上の作業単位は、単一の関数呼び出しの同一の命令を利用し得るが、異なるデータのレコードに作用する。例えば、コード２２０内の関数呼び出し「Ｐｏｗｅｒ２」は、アレイ「ＩＮＰＵＴ」内の各データ値に１つずつ、１０個の作業単位を実行するために使用されてもよい。ここで、レコードは、単一のデータ値を備える。他の実施例では、レコードは、それぞれデータ値を含む２つ以上のフィールドを備えてもよい。ＳＩＭＤマイクロアーキテクチャは、カーネル「Ｐｏｗｅｒ２」の命令を効率的に実行し、ＩＮＰＵＴアレイ内の値について２の累乗を計算し、ＲＥＳＵＬＴアレイに出力を書いてもよい。
【００３０】
ＯｐｅｎＣＬ（登録商標）フレームワークは、並行して複数回、計算カーネルのインスタンスを呼び出し得る。計算カーネルの呼び出しは、ｇｅｔ＿ｇｌｏｂａｌ＿ｉｄ（０）と名付けられた内部関数を呼び出すことによって取り出され得る、１つの関連する一意のＩＤ（作業単位ＩＤ）を有する。コード２２０における上記の例に関して、計算カーネル「Ｐｏｗｅｒ２」は、ＩＮＰＵＴアレイ内の各データ値に対して１回呼び出される。この場合、計算カーネル「Ｐｏｗｅｒ２」は、１０回呼び出される。したがって、１０個の一意の作業単位ＩＤが取り出される。ＪＩＴコンパイル方法を用いて、これらのインスタンスはランタイムに呼び出される。ＯｐｅｎＣＬ（登録商標）フレームワークは、一意の作業単位ＩＤを利用することによって、これらの異なるインスタンスを区別し得る。また、ＩＮＰＵＴアレイ内の特定のデータ値等が作用するデータ（レコード）が特定されてもよい。したがって、ランタイムに、関連付けられた計算カーネルがスケジュールされると、作業単位は、デフォルト設定で同一のＯｐｅｎＣＬ（登録商標）デバイスへスケジュールされてもよい。
【００３１】
ここで図３を参照すると、条件文を有する計算カーネルを定義するソースコードの一実施形態が示されている。コード２１０と同様に、図３に示されるコード２３０は、一般に「ｄｏＷｏｒｋＡ」および「ｄｏＷｏｒｋＢ」という、２つの関数呼び出しを定義する。この場合においても、各関数呼び出しは、「計算カーネル」と呼ばれてよい。ここで、２つの計算カーネルのうち１つのみが、ランタイム中に実行される。いずれの計算カーネルが実行されるかという選択は、関数呼び出し「ＥｖａｌｕａｔｅＦｕｎｃｔｉｏｎ」によって提供される条件付きテストに基づいて実行される。所与の命令の結果、または所与の命令が実行されるか否かは、以前の命令の実行と、関連付けられたレコードに対応するデータとにデータ依存している。条件付きテストの結果が作業単位のウェーブフロントの間で一致していない場合、ＳＩＭＤマイクロアーキテクチャの利益が低減する場合がある。例えば、所与のＳＩＭＤコアは、６４個の作業単位の同時実行に利用可能な６４個の並列計算ユニットを有し得る。しかしながら、６４個の作業単位の半分が条件付きテストを通過する一方で、他の半分が条件付きテストに失敗する場合には、並列計算ユニットの半分のみが、所与の処理段階中に利用される。
【００３２】
ここで図４を参照すると、ハードウェアリソースと計算カーネルとの間でスケジュールされた割り当て４００の一実施形態を図示する一般化されたブロック図が示されている。ここで、ハードウェアおよびソフトウェアリソースの分割と、１つ以上のソフトウェアアプリケーション４３０の実行中のハードウェアおよびソフトウェアリソースの相互関係および割り当てが示されている。一実施形態では、オペレーティングシステム４２０は、計算カーネル４４０ａ〜４４０ｊおよび４４０ｋ〜４４０ｑのためのメモリの領域を割り付ける。アプリケーション４３０またはコンピュータプログラムが実行される場合、各アプリケーションは、複数の計算カーネルを備えてもよい。例えば、第１の実行アプリケーションは、計算カーネル４４０ａ〜４４０ｊを備えてもよく、第２の実行アプリケーションは、計算カーネル４４０ｋ〜４４０ｑを備えてもよい。カーネル４４０ａ〜４４０ｑを１つずつ用いて、１つ以上のデータレコード（図示されず）と組み合わせることによって、１つ以上の作業単位を生成することができる。例えば、計算カーネル４４０ａは、作業単位４４２ａ〜４４２ｄをもたらし、計算カーネル４４０ｊは、作業単位４４２ｅ〜４４２ｈをもたらし、計算カーネル４４０ｋは、４４２ｊ〜４４２ｍをもたらし、計算カーネル４４０ｑは、作業単位４４２ｎ〜４４２ｑをもたらし得る。作業単位は、他の作業単位とは独立して実行され、且つ、他の作業単位と同時に実行され得る。
【００３３】
図４に示される計算カーネルのそれぞれは、メモリのイメージ等の独自のリソース、またはアプリケーション実行前の命令およびデータのインスタンスを所有し得る。また、計算カーネルのそれぞれは、例えばコード、データ、ならびに可能性としてヒープおよびスタックをアドレスするアドレス空間等のプロセス特有の情報と、例えばスタックポインタ、汎用および浮動小数点レジスタ、プログラムカウンタおよびその他等のデータおよび制御レジスタ内の変数と、例えばｓｔｄｉｎ、ｓｔｄｏｕｔおよびその他等のオペレーティングシステム記述子と、例えば一式の許可等のセキュリティ属性とを備えてもよい。
【００３４】
一実施形態では、ハードウェアコンピュータシステム４１０は、それぞれ１つ以上の作業単位を処理するように構成された汎用プロセッサコア１１２およびＳＩＭＤプロセッサコア１７２を組み込む。別の実施形態では、システム４１０は、２つの他の異種プロセッサコアを含む。一般に、所与のアプリケーションについては、オペレーティングシステム４２０は、当該アプリケーション用のアドレス空間を設定し、当該アプリケーションのコードをメモリにロードし、プログラム用のスタックを設定し、アプリケーション内の所与の位置に分岐し、当該アプリケーションの実行を開始する。典型的には、オペレーティングシステム４２０のうち、そのようなアクティビティを管理する部分は、オペレーティングシステム（ＯＳ）カーネル４２２である。ＯＳカーネル４２２は、計算カーネルまたは関数呼び出しと混同しないために、「ＯＳカーネル」と呼ばれる。さらに、ＯＳカーネル４２２は、アプリケーションの実行に利用可能なメモリが不十分であるときに、一連の行動を決定し得る。前述のように、アプリケーションは、２つ以上の計算カーネルに分割されてもよく、システム４１０は、２つ以上のアプリケーションを実行していてもよい。したがって、並行して起動するいくつかの計算カーネルが存在し得る。ＯＳカーネル４２２は、任意の時点で、どの同時実行計算カーネルがプロセッサコア１１２および１７２に割り付けられるかを判定し得る。ＯＳカーネル４２２は、タイムスライスと呼ばれる所与の時間にわたって、１つ以上のコアを有し得るプロセッサのコア上で、プロセスが起動することを可能にし得る。オペレーティングシステム４２０内のＯＳスケジューラ４２４は、計算カーネルをコアに割り当てるための決定論理を備えてもよい。
【００３５】
一実施形態では、１つだけの計算カーネルが、任意の時点で、ハードウェア計算ユニット４１２ａ〜４１２ｇおよび４１２ｈ〜４１２ｒのうち何れか１つで実行することができる。これらのハードウェア計算ユニットは、関連付けられたデータを用いて所与の作業単位の所与の命令の実行を取り扱うことが可能なハードウェアを備える。このハードウェアは、加算、乗算、ゼロ検出、ビット単位シフト、除算、ビデオグラフィックスおよびマルチメディア命令、またはプロセッサ設計の当業者に公知である他の演算を行うように構成された算術論理演算ユニットを含んでもよい。これらのハードウェア計算ユニットは、マルチスレッドプロセッサ内のハードウェアスレッド、ＳＩＭＤマイクロアーキテクチャ内の並列ハードウェアカラム等を含んでもよい。
【００３６】
図４の破線は、割り当てを表し、必ずしも直接物理接続を表すとは限らない。したがって、例えば、ハードウェア計算ユニット４１２ａは、作業単位４４２ｄを実行するように割り当てられてもよい。しかしながら、以降で（例えば、コンテキスト切り替え後に）、ハードウェア計算ユニット４１２ａは、作業単位４４２ｈを実行するように割り当てられてもよい。一実施形態では、ＯＳスケジューラ４２４は、ラウンドロビン方式を用いて、ハードウェア計算ユニット４１２ａ〜４１２ｒへ作業単位４４２ａ〜４４２ｑをスケジューリングしてもよい。代替として、ＯＳスケジューラ４２４は、ラウンドロビン方式を用いて、コア１１２および１７２へ作業単位４４２ａ〜４４２ｑをスケジューリングしてもよい。所与のハードウェア計算ユニットへの所与の作業単位の割り当ては、関連付けられたプロセッサコアによって行われてもよい。別の実施形態では、ＯＳスケジューラ４２４は、プロセッサコア１１２および１７２の可用性に基づいてスケジューリングを行ってもよい。さらに別の実施形態では、ＯＳスケジューラ４２４は、ＯｐｅｎＣＬ（登録商標）ＡＰＩまたは別の類似ＡＰＩを利用して、プログラマによって作成された割り当てに従ってスケジューリングを行ってもよい。これらのスケジューリング方式は、作業単位割り当てとハードウェアリソースとの間に不一致があるときに、移植性および性能を制限する場合がある。
【００３７】
図５を参照すると、２種類のプロセッサコア用のマイクロアーキテクチャの論理レイアウトの一実施形態を示す一般化ブロック図が示されている。汎用コア５１０および単一命令複数データ（ＳＩＭＤ）コア５６０のそれぞれが示されているが、他の種類の異種コアも可能であり、考慮される。コア５１０および５６０のそれぞれは、データおよび命令の記憶のために、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）５５０ａおよび５５０ｂを有する。一実施形態では、コア５１０および５６０は、同一のＤＲＡＭを共有する。別の実施形態では、ＤＲＡＭに加えて、所与のレベルのキャッシュメモリサブシステム（図示せず）が共有される。例えば、再び図１を参照すると、キャッシュメモリサブシステム１１８は、コア１１２および１７２によって共有される。
【００３８】
コア５１０および５６０のそれぞれは、キャッシュメモリサブシステム５３０を含んでもよい。示されるように、汎用コア５１０は、制御論理５２０および算術論理演算ユニット（ＡＬＵ）５４０とは別にキャッシュメモリサブシステム５３０を論理的に有する。コア５１０内のデータフローは、パイプライン型であり得るが、パイプラインレジスタ等の記憶要素は、説明を簡略化するために示されていない。所与のパイプライン段階で、この段階での命令がある種類のＡＬＵを利用しない場合、または別の作業単位（あるいは汎用コアのための別のスレッド）がこの段階中にＡＬＵを消費する場合には、ＡＬＵは未使用であってもよい。
【００３９】
示されるように、ＳＩＭＤコア５６０は、計算ユニット５４２の各行ごとの制御論理５２０とグループ化されたキャッシュメモリサブシステム５３０を有する。コア５６０内のデータフローは、パイプライン型であり得るが、パイプラインレジスタ等の記憶要素は、説明を簡略化するために示されていない。所与のパイプライン段階で、この段階での関連付けられた命令が、例えば分岐しない等のように事前に失敗したテストに基づいて実行されない場合には、計算ユニットは未使用であってもよい。
【００４０】
ここで図６を参照すると、汎用パイプライン実行フロー６００の一実施形態を示す一般化されたブロック図が示されている。命令６０２〜６０８が取り出され、汎用パイプラインに入力し得る。命令６０６は、計算集約的命令であってもよい。パイプライン実行フローの特定の段階中に、命令６０２〜６０８のうち１つ以上の命令が、例えばデコーダ論理、命令スケジューラ入力、リオーダバッファ入力、ＡＬＵ、レジスタファイル入力、分岐予測ユニット等の汎用プロセッサコア１１２内のリソースを消費する。
【００４１】
均衡のとれたスキームにおいて、命令６０２〜６０８のそれぞれは、各段階で等量のリソースを消費する。しかしながら、典型的には、汎用コアは、半導体不動産費用、電力消費および他の設計配慮により、各命令用のリソースを複製しない。したがって、作業負荷が不均衡になり得る。例えば、命令６０６は、その計算集約的挙動により、１つ以上のパイプ段階のためにより多くのリソースを消費し得る。示されるように、この命令によって消費されるリソース６３０は、他の命令によって消費されるリソースよりもはるかに大きくなり得る。実際に、計算集約的命令は、他の命令によるハードウェアリソースの使用を阻止し得る。
【００４２】
いくつかの計算集約的タスクは、図１に示された汎用コア１１２内の共有リソースに圧力を加え得る。したがって、スループット損失が、計算集約的プロセスと、共有リソースを待つ他のプロセスとの両方に起こる。加えて、いくつかの命令は、共有リソース上で行われている計算をサポートするように、共有リソースおよび他のリソースを占有する。そのような長い待ち時間の命令は、長い待ち時間の間に、他のプロセスがいくつかのリソースを使用することを同時に阻止し得る。
【００４３】
ここで図７Ａを参照すると、ＳＩＭＤパイプライン実行フロー７００の一実施形態を示す一般化されたブロック図が示されている。命令７０２〜７０８が取り出され、関連付けられたデータを有するＳＩＭＤパイプラインに入力し得る。命令７０４は、条件付き分岐等の制御フロー転送命令であってもよい。命令７０６は、条件が真であるときに実行されるパスにおける第１の命令であってもよい。命令７０８は、条件が偽であるときに実行されるパスにおける第１の命令であってもよい。例えば、分岐命令７０４は、高レベル言語プログラム内のＩＦ文と関連付けられてもよい。命令７０６は、高レベル言語プログラム内のＴＨＥＮ文と関連付けられてもよい。命令７０８は、高レベル言語プログラム内のＥＬＳＥ文と関連付けられてもよい。
【００４４】
所与の行内の計算ユニットのそれぞれは、同一の計算ユニットであってもよい。これらの計算ユニットのそれぞれは、同一の命令に動作し得るが、異なる作業単位と関連付けられた異なるデータ上では動作しなくてもよい。示されるように、いくつかの作業単位は、条件付き分岐命令７０４によって提供されるテストを通過し、他の作業単位はテストに失敗する。ＳＩＭＤコア１７２は、利用可能なパスのそれぞれを実行し、現在のパスを選択しなかった作業項目に対応する計算ユニット等の実行単位を選択的に無効にし得る。例えば、Ｉｆ−Ｔｈｅｎ−Ｅｌｓｅ構築文の実行中に、ＳＩＭＤアーキテクチャの各列内に「Ｔｈｅｎ」（パスＡ）および「Ｅｌｓｅ」（パスＢ）パスを実行するように構成された実行単位がある。第１および第２の作業単位が実行を停止して待機し、第３の作業単位が継続中の実行を続ける際に、並列実行の効率性が低減し得る。したがって、計算ユニットの全てが、分岐命令７０４の実行後に、所与の行内で動作中の計算ユニット７１０であるわけではない。示されるように、１つ以上の計算ユニットは、実行が無効にされた、動作していない計算ユニット７１１である。多数の計算ユニットが所与のパイプ段階中で動作していない場合、ＳＩＭＤコアの効率性およびスループットが低減する。
【００４５】
一実施形態において、「Ｅｌｓｅ」パスは、計算カーネルへの戻りである。計算カーネルの実行が終了し、対応する作業単位が休止状態になる。しかしながら、ＳＩＭＤコア内の隣接する作業単位は、実行を継続し得る。ここで図７Ｂを参照すると、ＳＩＭＤパイプライン実行フロー７２０の別の実施形態を説明する一般化されたブロック図が示されている。実行フロー７００と同様に、命令７０２〜７０６は、１つ以上の計算ユニットを、ＳＩＭＤコアの特定の列内で無効にし得る。ここで、各「Ｅｌｓｅ」パスは、計算カーネルへの戻りであり得る。したがって、所与の作業単位について、分岐しない方向に決定する分岐は、所与の作業単位に計算カーネルのさらなる実行を中止させ得る。実行フロー７２０では、説明の簡略化のために、１つのみの命令が、第１の分岐命令７０４と第２の分岐命令７１２との間に示されている。しかしながら、分岐命令７０４と７１２との間には、複数の命令が存在し得る。分岐７０４と７１２との間の命令数にかかわらず、分岐しない方向に第１の分岐７０４を決定する作業単位は、実行を完了し得る。分岐７１２も同様に、分岐しない方向に第２の分岐を決定する作業単位は、実行を完了し得る。ＳＩＭＤコアの後の段階の計算ユニットは、これらの作業単位のために無効にされ得る。多数の計算ユニットが所与のパイプ段階中に動作しない場合、ＳＩＭＤコアの効率性およびスループットは低減する。
【００４６】
隣接する作業単位が継続し得るが、複数の作業単位にテストを失敗させ、かつ実行を停止させ得るアプリケーションの一例は、顔検出である。当業者に既知であるように、ＯｐｅｎＣｖ（オープンコンピュータビジョンライブラリ）において実装される顔検出は、Ｖｉｏｌａ−Ｊｏｎｅｓオブジェクト検出アルゴリズムの１つのアプリケーションである。Ｖｉｏｌａ−Ｊｏｎｅｓアルゴリズムは、データ依存性の実行パターンを示す。検索計算カーネルは、１つ以上のピクセルを含み得るデータレコードに適用される。検索計算カーネルは、２次元または３次元画像のサブウィンドウ内で顔を検索する。計算カーネル内で、分岐命令等の制御フロー転送命令として実装される一連のテストが存在し得る。１つの典型的な例において、一連のテストは、２２段階、または２２個のテストを含む。この一連のテストは、入力ウィンドウが顔を含むか否かを判定し得る。
【００４７】
Ｖｉｏｌａ−Ｊｏｎｅｓアルゴリズムにおける一連のテストは、見込みのないパスを素早く取り除くように設計され得る。したがって、ほとんどの作業単位は、顔の不在を決定し、終了し得る。作業単位の実行は、顔を含有する可能性の高い残りのピクセル上で続けられる。ほんのわずかのピクセル（すなわち、作業単位実行）は、２２段階にわたって続けられ得るが、ほとんどのピクセルは、最初の数段階のテスト後に顔を含有しないことが判明する。かなりのタスク並列性を伴っても、ウェーブフロント上での数個の継続中の作業単位の存在は、ＳＩＭＤコア利用の低下を引き起こし得る。以下に記載の１つの方法は、さらなる処理のためにＳＩＭＤコアを解除しながら、別々の異種コアを利用する。この方法は、少しのＳＩＭＤ並列性が存在することが検出されるときに、全体の計算性能を増大させ得る。
【００４８】
ここで図８を参照すると、移行点を定義するタグ付けされた分岐を含むコード８００の一実施形態が示される。コード８００は、一般に「ｆｏｏ」と題される計算カーネルを含む。実行中、コード８００の一部は、別々の異種コアに移動し得る。示される例において、外側ループはデータ依存性である。一実施形態において、コンパイラは、「ｗｈｉｌｅ」ループテストに対応する分岐命令においてタグビットを用いることによって、データ依存性のＳＩＭＤコアに情報提供する。実行中、移行条件が検出されるとき、例えば、測定されたＳＩＭＤ利用が所与の閾値を下回るとき、中間局所値は、別々の異種コアによってアクセスされるように、メモリ内のデータ構造に移動し得る。例えば、汎用コアは、タグ付けされた分岐点から移行点まで計算カーネルの実行を継続し得る。例えば、ｗｈｉｌｅ文における黙示的な条件付き分岐は、「ｓｅｃｏｎｄａｒｙ＿ｅｎｔｒｙ」というラベルでタグ付けされる。別々の異種コアは、コンパイラによって生成されたデータ構造を使用し得る。別の実施形態において、このデータは、キャッシュされてもよく、移行コストを軽減する。一例において、ライブデータは、「ｔｍｐ」アレイのローカルスライスと、ｌｏｃａｌ＿ｔｅｍｐ変数の現在の値との両方を含み得る。移動中、このデータは、計算カーネルの継続実行を、「ｓｅｃｏｎｄａｒｙ＿ｅｎｔｒｙ」というラベルによって表示される二次エントリポイントに指向するランタイム環境に伝達され得る。
【００４９】
ここで図９を参照すると、プリランタイムデータ情報を利用してプロセッサ内の複数の作業単位の並列実行を最適化するための方法９００の一実施形態が示されている。処理ノード１１０内に統合されるコンポーネントおよび上述の図４に示されたハードウェアリソース割り当ては、概して、方法９００に従って動作し得る。考察目的のために、この実施形態および後に説明される方法の後続の実施形態におけるステップは、起こった順に示される。しかしながら、他の実施形態において、いくつかのステップは、示された順序とは異なる順序で起こってもよく、いくつかのステップは、同時に行われてもよく、いくつかのステップは、他のステップと組み合わせられてもよく、いくつかのステップは、行われなくてもよい。
【００５０】
ブロック９０２において、ソフトウェアプログラムまたはサブルーチンが特定され、分析され得る。このソフトウェアプログラムは、異種マルチコアアーキテクチャ上でのコンパイルおよび実行のために書き込まれ得る。プログラムコードは、ソフトウェアアプリケーション、サブルーチン、動的なリンクされたライブラリまたはその他の任意の部分を参照し得る。パス名は、ユーザによるコマンドプロンプトにおいて入力されてもよく、ソースコードのコンパイルを開始するために、所与のディレクトリ位置またはその他から読み出され得る。プログラムコードは、Ｃ等の高水準言語、ＯｐｅｎＣＬ（登録商標）等のＣ風の言語等で設計者によって書き込まれ得る。一実施形態において、ソースコードは、静的にコンパイルされる。そのような実施形態において、静的なフロントエンドコンパイル中に、ソースコードは、中間表現（ＩＲ）に変換され得る。バックエンドコンパイルステップは、ＩＲを機械コードに変換し得る。静的バックエンドコンパイルは、より多くの変換および最適化を行い得る。別の実施形態において、ソースコードは、ジャストインタイム（ＪＩＴ）方法でコンパイルされる。ＪＩＴ方法は、システム構成を取得した後に、適切なバイナリコードを生成し得る。いずれかの方法を用いて、コンパイラは、プログラムコード内の計算カーネルを識別し得る。一実施形態において、ＯｐｅｎＣＬ（登録商標）コンパイラ等のコンパイラは、複数のバージョンの計算カーネルを生成し得る。計算カーネルの１つのバージョンが、汎用ＣＰＵ、ＳＩＭＤ  ＧＰＵ等の各種のＯｐｅｎＣＬ（登録商標）デバイス種類のために生成され得る。
【００５１】
ブロック９０４では、コンパイラは、計算カーネルの１つ以上の命令を読み取り、それらを分析し得る。条件文は、分岐等の制御フロー転送命令であってもよい。異なる種類の制御フロー転送命令は、フォワード／バックワード分岐、直接／間接分岐、ジャンプ等を含み得る。コンパイラまたは他のツールが分岐方向および／または分岐先を静的に決定することが可能であり得る。しかしながら、一実施形態において、関連付けられたデータ上でランタイム中に通常行われたいくつかの処理は、コンパイル中に行われ得る。例えば、分岐の方向（分岐する、分岐しない）を決定する単純なテストが行われて得る。コンパイルは「静的コンパイル」と称され得るが、１つ以上の小さい動的演算が行われ得る。このコンパイルは、「プリランタイムコンパイル」とも称され得る。この時点で行われる動的ステップの別の例は、Ｉｆ−Ｔｈｅｎ−ＥｌｓｅＩｆ−Ｅｌｓｅ構築文のＴＨＥＮ、ＥＬＳＥＩＦおよびＥＬＳＥブロックのそれぞれにおいて実行される次の命令を識別することである。例えば、条件付き分岐が失敗した場合、ｒｅｔｕｒｎ文が実行され得る。したがって、コンパイラは、実行中、このコンピュータカーネルの対応する作業単位が、分岐テストが失敗するときに休止状態になり得ることを認識する。
【００５２】
ブロック９０６において、計算カーネルにおける特定のコードラインは、移行点を作成するために選択される。移行点は、インフライトの実行が異なる異種コアに転送するコンピュータカーネル内の位置であり得る。一実施形態において、この計算サブカーネル移行は、プロセス移行に類似した機構によって達成されてよく、実行状態は、第１の異種コアから第１のコアとは異なる可能性のあるマイクロアーキテクチャを有する第２の異種コアに移動する。別の実施形態において、この計算サブカーネル移行は、後に送信される複数の計算サブカーネルを作成することによって達成され得る。
【００５３】
一実施形態において、コンパイラは、移行点を自動的に識別し得る。本明細書で使用されるとき、移行点は、切替点とも称され得る。コンパイラは、制御フロー分析を使用し得る。移行点の識別は、計算カーネルの出口または戻りにつながるデータ依存性ループを見つけ出すために、静的制御フロー分析の利用を含み得る。出口または戻りを含むパスでそれぞれの分岐を識別するのではなく、コンパイラは、いくつかの移行点を減少させるためにカウントを使用し得る。例えば、計算カーネルにおいて見つけられた第１の５つの分岐は、移行点としてタグ付けするための候補ではない場合がある。第１の５つの分岐後のあらゆる第３の分岐は、移行点としてタグ付けするための候補であり得る。カウントに基づく他のフィルタリングアルゴリズムが可能であり、企図される。
【００５４】
加えて、コンパイラは、以前の実行からのプロファイル入力を用いて、移行点を識別し得る。例えば、所与の分岐と関連付けられた条件付きテストは、いくつかのデータレコードが所与の閾値を上回るため失敗し得る。したがって、この分岐は、移行点として識別され得る。さらに、移行点を示すプログラムマ注釈は、「ｐｒａｇｍａｓ」として、またはＯｐｅｎＣＬ（登録商標）フレームワークの拡張子として追加され得る。
【００５５】
ブロック９０８において、コンパイラは、コンパイルされたコードのバージョンごとに、コード内の選択された点をタグ付けし得る。それぞれのバージョンは、各ＯｐｅｎＣＬ（登録商標）デバイスに対する送り先計算カーネルと称され得る。この場合もやはり、コンパイラは、識別された計算カーネルをコンパイルして、コンパイルされたコードの２つ以上のバージョンをもたらしてよく、それぞれは、ＯｐｅｎＣＬデバイスのうち１つの上で起動することができる。再び図９のコード８００を参照すると、「ｓｅｃｏｎｄａｒｙ＿ｅｎｔｒｙ」というラベルによって表示された二次エントリポイントは、分岐に対する移行タグの例である。コンパイラ内のコードジェネレータは、タグを挿入し、他のコードを挿入して、移行中にライブ値を呼び出し得る。ライブ値の呼び出しは、ライブ値の送り先ＯｐｅｎＣＬ（登録商標）デバイスへの移動、およびその値の送り先ＯｐｅｎＣＬ（登録商標）デバイス上での初期化を含み得る。コード生成および挿入プロセスは、デビュー点で挿入されるデバッガコードおよび動的挙動を測定するための計測に類似し得る。
【００５６】
一実施形態において、計算カーネルは、上述のように、タグ付けされ、移行点を識別し得る。別の実施形態において、計算カーネルは、独立してスケジュールおよび送信される複数の計算サブカーネルに分割され得る。ランタイムプロファイル情報またはコンパイラ静的推定を用いて、分岐命令によって実装される条件付きテストの通過／失敗統計を決定することができる。「ホット」実行パスは、複数のデータレコードの条件付きテストの所与の閾値を上回る多数のパスを含み得る。「コールド」実行パスは、複数のデータレコードの条件付きテストの第２の所与の閾値を下回る少数のパスを含み得る。計算カーネルは、「ホット」および「コールド」実行パスに基づいて計算サブカーネルに分割され得る。
【００５７】
対応する計算サブカーネルの生成は、汎用コア上で実行を継続する「コールド」実行パス等のそれらの計算サブカーネルに対応する実行範囲（ＮＤＲａｎｇｅ）の生成に加えて、同様のランタイムコード生成機構を利用し得る。これは、汎用コア上で実行されるように、ＯｐｅｎＣＬ（登録商標）指定を利用し得る計算サブカーネル識別子（ＩＤ）を含有する潜在的に希薄なアレイを作成することによって行われ得る。所与の計算カーネルは、適切な計算サブカーネルおよび後の作業単位を識別するために、このアレイへの間接アクセスを利用し得る。あるいは、コンパイラは、これらのＩＤのリストを生成してもよく、対応する計算サブカーネルは、実行作業単位のそれぞれに対して呼び出しおよびマッピングされる。
【００５８】
プロファイル起動または静的推定後、「ホット」実行パスに対応する計算サブカーネルは、ＳＩＭＤコアにコンパイルされ得る。「コールド」実行パスに対応する計算サブカーネルは、汎用コアにコンパイルされ得る。一連のテストの初期段階は、通過する可能性が高くあり得る。したがって、これらの実行パスは、ＳＩＭＤコア上で実行される「ホット」計算サブカーネルにおいて実装され得る。これらの特定の「ホット」計算サブカーネルの実行後、関連付けられた生成データは、メモリ内を移動し得る。このデータ移動は、グローバルデータに対してライブであるローカルデータを促進する。「ホット」計算サブカーネルに対応する作業単位は、関連付けられた「コールド」計算サブカーネルがその後汎用コア上で実行し続けるか否かを示すために、その作業単位ＩＤに基づいてビットアレイに書き込み得る。
【００５９】
ブロック９１０において、コンパイラは、識別された移行点で一組のライブ値を識別する。ライブ値は、中間計算値およびローカルアレイを含み得る。再び図８のコード８００を参照すると、ライブデータは、コード内の「ｔｍｐ」アレイのローカルスライスと、ｌｏｃａｌ＿ｔｅｍｐ変数の現在の値との両方を含み得る。移行が後の関連付けられた作業単位の実行中に生じた場合、ライブ値は転送され、送り先ＯｐｅｎＣＬ（登録商標）デバイス上で初期化され得る。上述のように、コンパイラ内のコードジェネレータは、タグを挿入し、他のコードを挿入して、移動中にライブ値を呼び出し得る。送り先ＯｐｅｎＣＬ（登録商標）デバイスにおいて、移行エントリポイントのコードジェネレータは、ライブ値を含有するデータ構造を初期化し、カーネル実行を始める。あるいは、コンパイラは、上述のように、計算サブカーネルを作成して、実行を始め得る。ブロック９１２において、コンパイラは、少なくとも２つの異種プロセッサコアに対して計算カーネルのコンパイルを終了する。他のデバッグおよび計測コードが挿入され得る。
【００６０】
一実施形態において、コンパイラは、複数のデータ構造を生成する。２つ以上のデータ構造は、汎用コアおよびＳＩＭＤコア等の所与のターゲットＯｐｅｎＣＬデバイス上の計算サブカーネルごとに、実行可能なオブジェクトコードを含む。別のデータ構造は、移行時に転送およびアクセスされるライブデータを含む。計算カーネルにおける潜在的な移行点を表すラベルを考慮して、コンパイラは、データフロー分析を利用して、転送され得るライブ値を決定する。実行時に定義されないライブ値、例えば、レジスタでキャッシュされるライブ値は、ランタイム環境にアクセス可能な位置に配置される。これらの位置の例には、保存されるコンテンツを保持する、関連付けられた最初のメモリ位置およびレジスタが挙げられる。一実施形態において、ヒューリスティックチェックを利用して、データ転送のサイズが異種コア間の有益な変化実行を可能にするか否かを判定することができる。
【００６１】
さらに、コンパイラは、ランタイム環境によって解釈される別のデータ構造を生成して、ライブデータを、関連付けられた送り先ＯｐｅｎＣＬ（登録商標）デバイスに転送し得る。このデータ構造は、転送されるライブデータの位置およびサイズ、ならびにソースおよび送り先ＯｐｅｎＣＬ（登録商標）デバイスの両方のアドレス空間におけるそれらの位置を提供し得る。また、コンパイラは、送り先デバイスに対応するバージョンのカーネルを生成する。ＯｐｅｎＣＬデバイスのそれぞれに対する各コンパイルされたコードは、指定された位置でライブデータにアクセスし、移行点で実行を開始する。
【００６２】
ここで図１０を参照すると、プリランタイムデータ情報を利用することによって、プロセッサにおける複数の作業単位の並列実行を最適化するための方法１０００の一実施形態が示されている。処理ノード１１０内に統合されるコンポーネントおよび上述の図４に示されるハードウェアリソース割り当ては、概して、方法１０００に従って動作し得る。考察目的のために、この実施形態および後に説明される方法の後続の実施形態におけるステップは、起こった順に示される。しかしながら、いくつかのステップは、示された順序とは異なる順序で起こってもよく、いくつかのステップは、同時に行われてもよく、いくつかのステップは、他のステップと組み合わせられてもよく、いくつかのステップは、別の実施形態では不在であり得る。
【００６３】
ブロック１００２において、関連付けられたデータレコードは、所与の計算カーネルのそれぞれの作業単位に割り当てられる。ブロック１００４において、ＯＳスケジューラ４２４は、作業単位を異種コアにスケジュールする。ブロック１００６において、異種プロセッサコアは、対応するスケジュールされた作業単位を実行する。
【００６４】
ブロック１００８において、所与のタグ付けされた移行点に到達する。一実施形態において、現在使用されるＯｐｅｎＣＬ（登録商標）デバイスの利用の測定が行われ得る。測定結果が、利用または性能が所与の閾値を下回ることを示す場合、関連付けられた計算カーネルまたは計算サブカーネルは、異なるマイクロアーキテクチャを有する異種コア等の別のＯｐｅｎＣＬ（登録商標）デバイスに移動し得る。一実施形態において、この測定結果は、関連付けられた計算カーネルまたは計算サブカーネル内で出口または戻りに到達したＳＩＭＤコア上のいくつかの現在実行している作業単位のカウントである。あるいは、ウェーブフロントにおけるいくつかの無効にされた計算ユニットのカウントは、同一の数を提供し得る。このカウントが所与の閾値を超える場合、まだ出口点に到達していない作業単位は、汎用コア等の別の異種コアに移行し得る。その後、ＳＩＭＤコア上のウェーブフロントは解放されてよく、他のスケジュールされた作業単位に使用可能である。
【００６５】
他の実施形態において、上述の技法は、ＳＩＭＤコア上のウェーブフロントにおいて作業単位を実行する並列の大部分が休止状態であることが決定され、且つ、残りの作業単位が実質的な実行を継続することが見込まれる任意の状況において、移行を開始するまでに拡大され得る。例えば、生成されたデータ構造は、共有メモリおよび１つ以上のキャッシュ内に存在し得る。仮想メモリ支援を有するシステムにおいて、作業単位のサブセットは、キャッシュをヒットし得るが、残りの作業単位は、長い待ち時間イベントである仮想メモリミスを経験する。この場合、全体の計算性能は、さらなる実行が、現在の実行によって有効にされるプリフェッチ技法の恩恵を受け得るため、汎用コア上での継続的な実行を伴ってより改善し得る。
【００６６】
実行効率性が所与の閾値を下回ると判定されない場合（条件付きブロック１０１０）、方法１０００の制御フローは、ブロック１００６に戻り、実行が続く。実行効率性が所与の閾値を下回ると判定された場合（条件付きブロック１０１０）、ブロック１０１２において、１つ以上の作業単位が識別されて、第１のプロセッサコアのマイクロアーキテクチャとは異なるマイクロアーキテクチャを有する第２のプロセッサコアに移行する。識別された作業単位は、上述の測定結果を、所与の閾値未満にする可能性がある。ブロック１０１４において、第１のプロセッサコアによって生成される関連付けられたローカルデータは、グローバルデータに昇格する。ブロック１０１６において、コンパイルされたバージョンの移行した作業単位は、移行タグ付け点で開始する第２のプロセッサコア上で実行されるようにスケジュールされる。
【００６７】
上述の実施形態がソフトウェアを備え得ることに留意する。そのような実施形態において、方法および／または機構を実装するプログラム命令は、コンピュータ可読媒体上で伝達または記憶され得る。プログラム命令を記憶するように構成される多くの種類の媒体が利用可能であり、ハードディスク、フロッピー（登録商標）ディスク、ＣＤ−ＲＯＭ、ＤＶＤ、フラッシュメモリ、プログラム可能なＲＯＭ（ＰＲＯＭ）、ランダムアクセスメモリ（ＲＡＭ）および様々な他の形態の揮発性または不揮発性記憶装置を含む。一般的に言えば、コンピュータアクセス可能な記憶媒体は、命令および／またはデータをコンピュータに提供するために、使用するときにコンピュータによってアクセス可能な任意の記憶媒体を含み得る。例えば、コンピュータアクセス可能な記憶媒体は、磁気または光学媒体等の記憶媒体、例えば、ディスク（固定もしくは取り外し可能）、テープ、ＣＤ−ＲＯＭもしくはＤＶＤ−ＲＯＭ、ＣＤ−Ｒ、ＣＤ−ＲＷ、ＤＶＤ−Ｒ、ＤＶＤ−ＲＷ、またはブルーレイを含み得る。記憶媒体は、ユニバーサルシリアルバス（ＵＳＢ）インターフェース等の周辺インターフェースを介してアクセス可能なＲＡＭ（例えば、同期ダイナミックＲＡＭ（ＳＤＲＡＭ）、ダブルデータレート（ＤＤＲ、ＤＤＲ２、ＤＤＲ３等）ＳＤＲＡＭ、低出力ＤＤＲ（ＬＰＤＤＲ２等）ＳＤＲＡＭ、Ｒａｍｂｕｓ  ＤＲＡＭ（ＲＤＲＡＭ）、スタティックＲＡＭ（ＳＲＡＭ）等）、ＲＯＭ、フラッシュメモリ、不揮発性メモリ（例えば、フラッシュメモリ）等の揮発性もしくは不揮発性メモリ媒体をさらに含み得る。記憶媒体は、微小電気機械システム（ＭＥＭＳ）、ならびにネットワークおよび／または無線リンク等の通信媒体を介してアクセス可能な記憶媒体を含み得る。
【００６８】
さらに、プログラム命令は、Ｃ等の高レベルプログラミング言語、またはＶｅｒｉｌｏｇ、ＶＨＤＬ若しくはＧＤＳ  ＩＩストリームフォーマット（ＧＤＳＩＩ）等のデータベースフォーマット等の設計言語（ＨＤＬ）で、ハードウェア機能性の挙動レベル記述またはレジスタ転送レベル（ＲＴＬ）記述を含み得る。いくつかの場合において、記述は、合成ライブラリからのゲートのリストを備えるネットリストを生成するように記述を合成し得る合成ツールによって読み取られてもよい。ネットリストは、システムを含むハードウェアの機能性も表す一組のゲートを含む。次いで、ネットリストは、マスクに適用される幾何学形状を描写するデータセットを生成するように配置され、ルートされ得る。次いで、マスクは、システムに対応する１つまたは複数の半導体回路を生成するために、様々な半導体製造ステップで使用され得る。あるいは、コンピュータアクセス可能記憶媒体上の命令は、所望に応じて、ネットリスト（合成ライブラリを有する、または有しない）またはデータセットであり得る。さらに、命令は、Ｃａｄｅｎｃｅ（登録商標）、ＥＶＥ（登録商標）およびＭｅｎｔｏｒ  Ｇｒａｐｈｉｃｓ（登録商標）等のベンダからのハードウェアベース型のエミュレータによって、エミュレーションの目的で利用され得る。
【００６９】
上述の実施形態がかなり詳細に説明されているが、上述の開示が完全に理解されるときに、多数の変形および修正が当業者に明らかになるであろう。以下の特許請求の範囲が、すべてのそのような変形および修正を包含すると解釈されることが意図される。
【図１】
0005711853.tif 000002
【図２】
0005711853.tif 000003
【図３】
0005711853.tif 000004
【図４】
0005711853.tif 000005
【図５】
0005711853.tif 000006
【図６】
0005711853.tif 000007
【図７Ａ】
0005711853.tif 000008
【図７Ｂ】
0005711853.tif 000009
【図８】
0005711853.tif 000010
【図９】
0005711853.tif 000011
【図１０】
0005711853.tif 000012