(57)【要約】      （修正有）【課題】ソフトウェアアプリケーションのメモリ待ち時間を低減する方法及び装置を提供する。【解決手段】パフォーマンス解析ツール２０８は、ソフトウェアアプリケーション２１０のリソース使用量をプロファイルすべく使用され、パフォーマンスボトルネックを受けるソフトウェアアプリケーションのエリアを特定する。コンパイラランタイム命令は、ヘルパースレッドを生成して管理すべく、ソフトウェアアプリケーション内に生成される。ヘルパースレッドは、パフォーマンスボトルネックを受けるソフトウェアアプリケーションの特定されたエリア内データをプリフェッチする。プリフェッチされたデータをメインスレッドが利用可能になる前にプリフェッチされたデータがキャッシュから削除されないようにすべく、カウントメカニズムがヘルパースレッドに挿入され、かつカウントメカニズムがメインスレッドに挿入される。【選択図】図２
2011090705.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェアアプリケーションにおけるメモリ待ち時間を低減する方法であって、
前記ソフトウェアアプリケーションを解析して、キャッシュミスが生じる、複数のソフトウェア命令の第１エリアを特定する段階と、
１つのヘルパースレッドを生成する段階と、
複数のコンパイラランタイム命令の第１セットを生成して、複数のコンパイラランタイム命令の前記第１セットを１つのメインスレッドに挿入する段階と、
複数のコンパイラランタイム命令の第２セットを生成して、複数のコンパイラランタイム命令の前記第２セットを前記ヘルパースレッドに挿入する段階と、
前記メインスレッド及び前記ヘルパースレッドにカウンティングメカニズムを挿入する段階であって、前記カウンティングメカニズムは、前記メインスレッド及び前記ヘルパースレッドの相対的な実行ポイントを調整すべく構成されている段階と
を備える方法。
【請求項２】
前記ソフトウェアアプリケーションを解析して、メモリロード待ち時間が生じる、複数のソフトウェア命令の第２エリアを特定する段階
をさらに備える請求項１に記載の方法。
【請求項３】
複数のソフトウェア命令の前記第１エリアは、複数のソフトウェア命令の前記第２エリアと異なる
請求項２に記載の方法。
【請求項４】
複数のソフトウェア命令の前記第１エリアは、複数のソフトウェア命令の前記第２エリアを有する
請求項２に記載の方法。
【請求項５】
前記ソフトウェアアプリケーションを解析する段階は、
１つのパフォーマンス解析ツールを用いて、前記ソフトウェアアプリケーションに関するキャッシュミス率を計測する段階と、
前記パフォーマンス解析ツールを用いて、前記ソフトウェアアプリケーションに関するメモリロード待ち時間を計測する段階と、
前記キャッシュミスが生じる、複数のソフトウェア命令の前記第１エリアを、１つのコンパイラにレポートする段階と、
前記メモリロード待ち時間が生じる、複数のソフトウェア命令の前記第２エリアを、レポートする段階と
を有する請求項２に記載の方法。
【請求項６】
ヘルパースレッドを生成する段階は、１つのスレッドグラフを生成する段階を有する
請求項１に記載の方法。
【請求項７】
前記スレッドグラフは、前記メインスレッド及び前記ヘルパースレッドの間の関係を示す１つのデータ構造を提供する
請求項６に記載の方法。
【請求項８】
前記スレッドグラフは、コードの再利用を促進する
請求項６に記載の方法。
【請求項９】
複数のコンパイラランタイム命令の前記第１セットの少なくとも一部は、複数のコンパイラランタイム命令の前記第２セットの少なくとも一部を有する
請求項１に記載の方法。
【請求項１０】
前記メインスレッドに挿入された、複数のコンパイラランタイム命令の前記第１セットは、前記ヘルパースレッドを生成し、前記ヘルパースレッドを終了させ、前記ヘルパースレッド及び前記メインスレッドの実行を調整する複数の命令を有する
請求項１に記載の方法。
【請求項１１】
前記ヘルパースレッドに挿入された、複数のコンパイラランタイム命令の前記第２セットは、前記ヘルパースレッド及び前記メインスレッドの実行を調整する複数の命令を有する
請求項１に記載の方法。
【請求項１２】
前記カウンティングメカニズムは、１つのソフトウェアカウンタを有する
請求項１に記載の方法。
【請求項１３】
複数のコンパイラランタイム命令の前記第１セットの少なくとも１つ及び複数のコンパイラランタイム命令の前記第２セットの少なくとも１つは、前記ソフトウェアカウンタに関する１つの値に基づいて前記ヘルパースレッドの実行速度を制御する複数の命令を有する
請求項１２に記載の方法。
【請求項１４】
複数のコンパイラランタイム命令の前記第１セットの少なくとも１つ及び複数のコンパイラランタイム命令の前記第２セットの少なくとも１つは、前記ソフトウェアカウンタに関する１つの値に基づいて前記メインスレッドの実行速度を制御する複数の命令を有する
請求項１２に記載の方法。
【請求項１５】
複数の実行速度を制御する前記複数のコンパイラランタイム命令は、１つのディレイ命令、１つのキャッチアップ命令、及び実行を強いる１つの命令を有する
請求項１４に記載の方法。
【請求項１６】
メモリ待ち時間を低減するシステムであって、
１つのプロセッサと、
前記プロセッサに機能的に結合された１つのメモリであって、
データキャッシュミスを受ける１つのアプリケーションプログラムにおける１つのコード領域を特定すべく構成された１つのソフトウェアツールを記憶するメモリと、
前記ソフトウェアツールに機能的に結合された１つのコンパイラであって、前記ソフトウェアツールから情報を受け取り、１つのヘルパースレッドを生成すべく構成されたコンパイラと、
前記ヘルパースレッドを管理し、かつ、１つのメインスレッドを管理すべく、生成されて前記アプリケーションプログラムに挿入される、複数のコンパイラランタイム命令の１つのセットと、
前記メインスレッド及び前記ヘルパースレッドに挿入され、前記ヘルパースレッド及び前記メインスレッドに関する実行ポイントの調整を促進する１つのカウンティングメカニズムと
を備えるシステム。
【請求項１７】
前記ソフトウェアツールは、ＶＴｕｎｅ（登録商標）パフォーマンス・アナライザを有する
請求項１６に記載のシステム。
【請求項１８】
前記コンパイラが前記ソフトウェアツールから受け取る前記情報は、前記特定されたコード領域に関する複数のデータキャッシュミス率を有する
請求項１６に記載のシステム。
【請求項１９】
前記コンパイラが前記ソフトウェアツールから受け取る前記情報は、前記特定されたコード領域に関するメモリロード待ち時間を有する
請求項１６に記載のシステム。
【請求項２０】
前記ヘルパースレッドは、前記特定されたコード領域に含まれる複数の変数をプリフェッチすべく構成される
請求項１６に記載のシステム。
【請求項２１】
複数のコンパイラランタイム命令の前記セットは、前記ヘルパースレッドを生成し、前記ヘルパースレッドを終了させ、前記ヘルパースレッドの実行を遅延させ、前記ヘルパースレッドをアクティベートさせる複数の命令を有する
請求項１６に記載のシステム。
【請求項２２】
複数のコンパイラランタイム命令の前記セットは、前記ヘルパースレッド及び前記メインスレッドの実行を調整する複数の命令を有する
請求項１６に記載のシステム。
【請求項２３】
複数の命令を記憶する機械可読メディアであって、前記複数の命令は、１つの装置に、
１つのメインスレッドを有する１つのソフトウェアアプリケーションを解析させ、
前記ソフトウェアアプリケーションにおける１つのコード領域を特定させ、
１つのヘルパースレッドを生成させ、
前記ヘルパースレッド及び前記メインスレッドを管理すべく、複数のコンパイラランタイム命令の第１セットを生成させて前記メインスレッドに挿入させ、
前記ヘルパースレッド及び前記メインスレッドを管理すべく、複数のコンパイラランタイム命令の第２セットを生成させて前記ヘルパースレッドに挿入させ、
前記ヘルパースレッド及び前記メインスレッドの実行ポイントを管理させる
機械可読メディア。
【請求項２４】
前記記憶された複数の命令は、前記装置に、複数のキャッシュミス率に基づいて前記コード領域を特定させる
請求項２２に記載の機械可読メディア。
【請求項２５】
前記記憶された複数の命令は、前記装置に、メモリロード待ち時間に基づいて前記コード領域を特定させる
請求項２２に記載の機械可読メディア。
【請求項２６】
前記記憶された複数の命令は、前記装置に、前記特定されたコード領域内の複数の命令をプリフェッチする前記ヘルパースレッドを生成させる
請求項２２に記載の機械可読メディア。
【請求項２７】
前記記憶された複数の命令は、前記装置に、前記ヘルパースレッドを生成し、前記ヘルパースレッドを終了させ、前記ヘルパースレッド及び前記メインスレッドの実行を調整する複数のコンパイラランタイム命令を生成させる
請求項２２に記載の機械可読メディア。
【請求項２８】
前記記憶された複数の命令は、前記装置に、１つのカウンティングメカニズムの第１部分を前記メインスレッドに挿入して、１つのカウンティングメカニズムの第２部分を前記ヘルパースレッドに挿入することによって、前記メインスレッド及び前記ヘルパースレッドの前記実行を管理させる
請求項２２に記載の機械可読メディア。
【請求項２９】
メモリ待ち時間を低減する装置であって、
データキャッシュミスを受ける１つのアプリケーションプログラムにおける１つのコード領域を特定すべく構成された１つのソフトウェアツールと、
前記ソフトウェアツールに機能的に結合された１つのコンパイラであって、前記ソフトウェアツールから情報を受け取り、１つのヘルパースレッドを生成すべく構成された、コンパイラと、
前記ヘルパースレッドを管理し、かつ、１つのメインスレッドを管理すべく、生成されて前記アプリケーションプログラムに挿入される、複数のコンパイラランタイム命令の１つのセットと、
前記メインスレッド及び前記ヘルパースレッドに挿入され、前記ヘルパースレッド及び前記メインスレッドに関する実行ポイントの調整を促進する１つのカウンティングメカニズムと
を備える装置。
【請求項３０】
前記コンパイラが前記ソフトウェアツールから受け取る前記情報は、前記特定されたコード領域に関する複数のデータキャッシュミス率を含む
請求項２９に記載の装置。
【請求項３１】
前記コンパイラが前記ソフトウェアツールから受け取る前記情報は、前記特定されたコード領域に関する複数のメモリロード待ち時間を含む
請求項２９に記載の装置。
【請求項３２】
前記ヘルパースレッドは、前記特定されたコード領域に含まれる複数の変数をプリフェッチすべく構成される
請求項２９に記載の装置。
【請求項３３】
複数のコンパイラランタイム命令の前記セットは、前記ヘルパースレッドを生成し、前記ヘルパースレッドを終了させ、前記ヘルパースレッドの実行を遅延させ、前記ヘルパースレッドをアクティベートさせる複数の命令を有する
請求項２９に記載の装置。
【請求項３４】
複数のコンパイラランタイム命令の前記セットは、前記ヘルパースレッド及び前記メインスレッドの実行を調整する複数の命令を有する
請求項２９に記載の装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この開示は、複数のヘルパースレッドに関し、より詳しくは、ソフトウェアアプリケーションにおけるメモリ待ち時間を低減するための方法及び装置に関する。
【背景技術】
【０００２】
コンシューマはより高速なコンピュータを要求し続けている。同時マルチスレッディング（ＳＭＴ）のようなマルチスレッディング技術は、１つのプロセッサダイ領域に対する限られたインパクトで、スループットパフォーマンスを増大させる１つの効果的な方法である。ＳＭＴは、複数のプロセッシングスレッドをパラレルに実行することによって、プロセッサのスループットを増加させる。しかしながら、多くのソフトウェアアプリケーションはシングルスレッドであって、それゆえマルチスレッディング技術を利用しないので、ＳＭＴの恩恵を受けない。
【０００３】
さらに、プロセッサ速度とメモリ速度との間のギャップは、プロセッサ速度がメモリ速度を超えて広がり続けている。その結果、コンピュータ性能は、次第にプロセッサキャッシュ層の効率によって決定されようになっている。複数の命令がシステムメモリからキャッシュメモリに転送される処理であるプリフェッチングは、キャッシュ層の効率を向上させるための良く知られた効果的な技術である。しかしながら、プリフェッチングだけでは、ソフトウェアアプリケーションがキャッシュメモリのスピードから恩恵を受けることが可能となることを保証し得ない。さらに、プリフェッチされた変数をソフトウェアアプリケーションが使用することができるようになる前にプリフェッチされた変数がキャッシュから削除されることを防ぐためには、いくつかの努力が必要である。
【図面の簡単な説明】
【０００４】
【図１】開示されたシステムのための使用環境を示すコンピュータシステムの一例のブロック図である。
【０００５】
【図２】開示されたシステムのための使用環境を示すコンピュータシステムの他の例のブロック図である。
【０００６】
【図３】ソフトウェアアプリケーションにおけるメモリ待ち時間を低減する方法の一例を実装すべく１つのデバイスによって実行され得る機械可読命令の例を代表するフローチャートである。
【０００７】
【図４】１つのヘルパースレッドに対して１つのメインスレッドの実行を管理する方法の一例を実装すべく１つのデバイスによって実行され得る機械可読命令の例を代表するフローチャートである。
【０００８】
【図５】１つのメインレッドに対して１つのヘルパースレッドの実行を管理する方法の一例を実装すべく１つのデバイスによって実行され得る機械可読命令の例を代表するフローチャートである。
【発明を実施するための最良の形態】
【０００９】
全般的に、開示されたシステムは、メモリ待ち時間を低減することを目的として、ソフトウェアアプリケーションのメインスレッド内の複数の変数及び／又は複数の命令をプリフェッチする複数のヘルパースレッドを使用する。ソフトウェアアプリケーションは、キャッシュミス及び長いメモリ待ち時間のために解析され、ヘルパースレッドを生成してヘルパースレッド及びメインスレッドを管理すべく、コンパイラランタイム命令がソフトウェアアプリケーションに加えられる。ヘルパースレッドは、複数の変数及び／又は複数の命令をプリフェッチすべくメインスレッドから生成され、プリフェッチされた複数の変数及び／又は複数の命令をメインスレッドがアクセスするためにキャッシュする。キャッシュされた複数の変数及び／又は複数の命令が、メインスレッドがキャッシュにアクセス可能になる前にキャッシュから削除されることを防ぐべく、メインスレッド及びヘルパースレッドの実行を調整するカウンティングメカニズムがメインスレッド及びヘルパースレッドに加えられる。
【００１０】
図１は、開示されたシステムのための使用環境を示すコンピュータシステムの一例のブロック図を示す。コンピュータシステム１００は、パーソナルコンピュータ（ＰＣ）又は他の任意のコンピューティングデバイスであってよい。図示された例では、コンピュータシステム１００は、電源１０４によって給電されるメインプロセッシングユニット１０２を備える。メインプロセッシングユニット１０２は、システム相互接続１０８によってメインメモリデバイス１１０、フラッシュメモリデバイス１１２、及び１以上のインタフェース回路１１４に電気的に結合された１つのプロセッサ１０６を含んでよい。一例では、システム相互接続１０８は、アドレス／データバスである。無論、当業者は、プロセッサ１０６を他の複数のデバイス１１０、１１２、及び１１４に接続すべくバス以外の複数の相互接続が使用され得ることを容易に理解するだろう。例えば、１以上の専用線及び／又はクロスバが、プロセッサ１０６を他の複数のデバイス１１０、１１２、及び１１４に接続すべく使用されてよい。
【００１１】
プロセッサ１０６は、Ｉｎｔｅｌ  Ｐｅｎｔｉｕｍ（登録商標）ファミリのマイクロプロセッサ、Ｉｎｔｅｌ  Ｉｔａｎｉｕｍ（登録商標）ファミリのマイクロプロセッサ、Ｉｎｔｅｌ  Ｃｅｎｔｒｉｎｏ（登録商標）ファミリのマイクロプロセッサ、及び／又はＩｎｔｅｌ  ＸＳｃａｌｅ（登録商標）ファミリのマイクロプロセッサからのプロセッサのような、よく知られた任意のタイプのプロセッサを含む。さらに、プロセッサ１０６は、スタティックランダムアクセスメモリ（ＳＲＡＭ）のような、よく知られた任意のタイプのキャッシュメモリを有してよい。メインメモリデバイス１１０は、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）及び／又は任意の他の形式のランダムアクセスメモリを有してよい。例えば、メインメモリデバイス１１０は、ダブルデータレートランダムアクセスメモリ（ＤＤＲＡＭ）を有してよい。メインメモリデバイス１１０は、不揮発性メモリを有してもよい。一例では、メインメモリデバイス１１０は、よく知られた方法でプロセッサ１０６によって実行されるソフトウェアプログラムを記憶する。フラッシュメモリデバイス１１２は、任意のタイプのフラッシュメモリデバイスであってよい。フラッシュメモリデバイス１１２は、コンピュータシステム１００をブートするために使用されるファームウェアを記憶してよい。
【００１２】
（複数の）インタフェース回路１１４は、イーサネット（登録商標）インタフェース及び／又はユニバーサルシリアルバス（ＵＳＢ）インタフェースのような、よく知られた任意のタイプのインタフェース規格を用いて実装されてよい。１以上の入力デバイス１１６が、データ及びコマンドをメインプロセッシングユニット１０２に入力すべく複数のインタフェース回路１１４に接続されてよい。例えば、入力デバイス１１６は、キーボード、マウス、タッチスクリーン、トラックパッド、トラックボール、アイソポイント、及び／又は音声認識システムであってよい。
【００１３】
１以上のディスプレイ、プリンタ、スピーカ、及び／又は他の出力デバイス１１８が、１以上のインタフェース回路１１４を介してメインプロセッシングユニット１０２に接続されてもよい。ディスプレイ１１８は、陰極線管（ＣＲＴ）、液晶表示装置（ＬＣＤ）、又は任意の他のタイプのディスプレイであってよい。ディプレイ１１８は、メインプロセッシングユニット１０２の動作中に生成されたデータの視覚的な指示を生成する。その視覚的な指示は、人間オペレータの入力用のプロンプト、計算された値、検出されたデータ等を含む。
【００１４】
コンピュータシステム１００は、１以上の記憶デバイス１２０を備える。例えば、コンピュータシステム１００は、１以上のハードドライブ、コンパクトディスク（ＣＤ）ドライブ、デジタル多目的ディスクドライブ（ＤＶＤ）、及び／又は他の複数のコンピュータメディア入出力（Ｉ／Ｏ）デバイスを備える。
【００１５】
コンピュータシステム１００は、ネットワーク１２４への接続を介して、他の複数のデバイス１２２とデータを交換してもよい。ネットワーク接続は、イーサネット（登録商標）接続、デジタル加入者線（ＤＳＬ）、電話線、同軸ケーブル等のような、任意のタイプのネットワーク接続であってよい。ネットワーク１２４は、インターネット、電話ネットワーク、ケーブルネットワーク、及び／又は無線ネットワークのような、任意のタイプのネットワークであってよい。ネットワークデバイス１２２は、任意のタイプのネットワークデバイス１２２であってよい。例えば、ネットワークデバイス１２２は、クライアント、サーバ、ハードドライブ等であってよい。
【００１６】
コンピュータシステム１００は、複数のソフトウェアアプリケーションを実行すべく使用されてよい。ワードプロセッサ、コンピュータゲーム、及び／又は技術開発ツールのような種々のタイプのソフトウェアアプリケーションが、コンピュータシステム１００上で使用され得る。さらに、ソフトウェアプロファイラ及び／又はソフトウェアパフォーマンス解析が、ソフトウェアアプリケーションがいかに適切に実行されているかを判断すべくコンピュータシステム１００によって実行され得る。コンピュータシステム１００は、コンピュータシステム１００上において向上されたパフォーマンスを得るために最適化された複数のソフトウェアアプリケーションを実行してもよい。
【００１７】
図２は、開示されたシステムのための使用環境を示すコンピュータシステムの他の例のブロック図を示す。この例では、コンピュータシステム２００は、１つのプロセッサ２０２、１つのコンパイラ２０４、１つのメインメモリ２０６、１つのパフォーマンス解析ツール２０８、及び１つのソフトウェアアプリケーション２１０を備える。
【００１８】
繰り返すと、プロセッサ２０２は、Ｉｎｔｅｌ  Ｐｅｎｔｉｕｍ（登録商標）ファミリのマイクロプロセッサ、Ｉｎｔｅｌ  Ｉｔａｎｉｕｍ（登録商標）ファミリのマイクロプロセッサ、Ｉｎｔｅｌ  Ｃｅｎｔｒｉｎｏ（登録商標）ファミリのマイクロプロセッサ、及び／又はＩｎｔｅｌ  ＸＳｃａｌｅ（登録商標）ファミリのマイクロプロセッサからのプロセッサのような、よく知られた任意のタイプのプロセッサを含む。メインメモリデバイス２０６は、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）及び／又は任意の他の形式のランダムアクセスメモリを有してよい。メインメモリデバイス２０６はまた、キャッシュ層のためのメモリを有してよい。キャッシュ層は、１つのキャッシュを有してよいし、異なるサイズ及び／又はアクセス速度を持ついくつかのレベルのキャッシュであってもよい。例えば、キャッシュ層は、３レベルのオンボードキャッシュメモリを有してよい。第１レベルのキャッシュは、最速のアクセス時間を持つ、最小のキャッシュであってよい。追加のレベルのキャッシュは、サイズ及びアクセス時間が劇的に増大している。
【００１９】
典型的には、コンパイラ２０４は、Ｃ、Ｃ＋＋、Ｊａｖａ（登録商標）、又はＢａｓｉｃのような任意のタイプのプログラミング言語を解釈する、任意のタイプのコンパイラであってよい。コンパイラ２０４は、ソフトウェアアプリケーションのコードリストを読んで、プロセッサ２０２及び／又はコンピュータシステム２００が解釈して実行することができる複数の命令を生成することによって、ソフトウェアアプリケーションのコードリストからソフトウェアアプリケーション２１０を生成する。
【００２０】
パフォーマンス解析ツール２０８は、ソフトウェアアプリケーションのランタイムパフォーマンスに関するフィードバックを提供する装置である。パフォーマンス解析ツール２０８は、プロセッサ２０２及び／又はコンピュータシステム２００がソフトウェアアプリケーション２１０を実行している間におけるコンピュータシステムの使用量（例えば、プロセッサ使用量、メモリ使用量、タイマ、データバス等）をモニタする。パフォーマンス解析ツール２０８は、ソフトウェアアプリケーションのパフォーマンスのボトルネック及び／又はリソース使用量に関するフィードバックを提供する。例えば、フィードバックは、ソフトウェアアプリケーション２１０のそれぞれのセクションにおけるキャッシュヒット率、キャッシュミス率、プロセッサ使用量、メモリ待ち時間、メモリ使用量、及び消費時間を含んでよい。
【００２１】
図３は、ソフトウェアアプリケーションにおけるメモリ待ち時間を低減する方法の一例を実装すべく１つのデバイスによって実行され得る機械可読命令の代表的な一フローチャートを示す。好ましくは、図示されたプロセス３００は、１以上のメモリ（例えば、フラッシュメモリ１１２及び／又はハードディスク１２０）に記憶されて１以上のプロセッサ（例えば、プロセッサ１０６及び／又は２０２）によってよく知られた方法で実行される、１以上のソフトウェアプログラムで実施されてよい。一方で、プロセス３００のいくつか又は全てのブロックは、手動及び／又はいくつかの他のデバイスによって実行されてよい。プロセス３００が図３に示されたフローチャートを参照して説明されるが、当業者は、プロセス３００を実行する多くの他の方法を使用し得ることを容易に理解できるだろう。例えば、多くのブロックの順番が変更され、１以上のブロックのオペレーションが変えられ、複数のブロックが結合され、及び／又は複数のブロックが削除されてよい。
【００２２】
全般的に、プロセス例３００は、メモリアクセス時間及び／又はキャッシュミスによりパフォーマンスボトルネックを持つソフトウェアアプリケーション２１０のエリアを特定する、パフォーマンス解析ツール２０８を使用する。このパフォーマンス情報を用いて、コンパイラ２０４は、複数のコンパイラランタイム命令を生成して、当該複数の命令をソフトウェアアプリケーション２１０に挿入する。複数のコンパイラランタイム命令は、ボトルネックをもたらしているとパフォーマンス解析ツール２０８により特定された複数の変数をプリフェッチすることによってパフォーマンスボトルネックを緩和するヘルパースレッドを生成する。コンパイラ２０４は、ヘルパースレッドの実行ポイントがメインスレッドの実行ポイントの前に進みすぎたり後に遅れすぎたりすることを防ぐことを目的として、ヘルパースレッド内にカウンティングメカニズムの一部を挿入し、かつ、メインスレッド内にカウンティングメカニズムの一部を挿入する。
【００２３】
プロセス例３００は、ソフトウェアアプリケーション２１０を解析することによって開始する（ブロック３０２）。パフォーマンス解析ツール２０８は、キャッシュミス及び／又はメモリ待ち時間によりパフォーマンスボトルネックが発生するソフトウェアアプリケーション２１０のエリアを特定する。パフォーマンス解析ツール２０８の一例は、Ｖｔｕｎｅ（登録商標）パフォーマンス・アナライザツールである。Ｖｔｕｎｅ（登録商標）パフォーマンス・アナライザツールは、ソフトウェアの複数のエリアでどれだけ時間が費やされたか、ソフトウェアアプリケーション２１０内のソフトウェアファンクション間の結びつき、リソース使用量（例えば、ソフトウェアアプリケーション２１０がどれだけＲＡＭを使用しているか、又はソフトウェアアプリケーション２１０が使用しているＣＰＵ時間のパーセンテージ）、及び巨大なマルチスレッドアプリケーションにおける個々のスレッドのパフォーマンスについての情報をユーザに提供する。
【００２４】
パフォーマンス解析ツール２０８がソフトウェアアプリケーション２１０の解析を終了した後、プロファイリング情報がコンパイラ２０４（ブロック３０４）に送られる。コンパイラ２０４は、パフォーマンス解析ツール２０８からのプロファイリング情報を処理して、パフォーマンスボトルネックを緩和するためにコンパイラ２０４がソフトウェアアプリケーション２１０のいずれの複数のエリアを修正するかを決定する。一実装例では、コンパイラ２０４は、キャッシュミス及び／又はメモリ待ち時間によりパフォーマンスボトルネックになっているソフトウェアアプリケーションの複数のエリアを特定するリストを受け取ってよい。コンパイラ２０４は、それから、最も高いキャッシュミス率及び／又は最大のメモリアクセス時間を持つ複数のコードエリアを特定して、ソフトウェアアプリケーション２１０のこれらのエリアを変更する。
【００２５】
コンパイラ２０４は、パフォーマンス解析ツール２０８によって特定されたソフトウェアアプリケーション２１０のエリア内の複数の変数をプリフェッチするためにヘルパースレッドを生成して管理すべく、複数のコンパイラランタイム命令を生成して当該命令をメインスレッドに挿入することによって、パフォーマンスボトルネックを緩和することを試みる（ブロック３０６）。ヘルパースレッドの生成を実装する方法の一例は、１つの命令_ssp_beginを生成して、メインスレッド内にその命令を挿入することである。この命令は、初期にはメインスレッドのみが存在する、１つのスレッドチーム（例えば、スレッド及びそのスレッドによって生まれたヘルパースレッド）を生成する。コンピュータシステム２００によって維持されるスレッドプールからヘルパースレッドを生むべく、１つの第２コンパイラランタイム命令_ssp_spawn_helperも生成されてメインスレッドに挿入される。１つの第３コンパイラランタイム命令_ssp_endが、メインスレッドに関連する全てのヘルパースレッドを終了すべくソフトウェアアプリケーション２１０内で生成される。
【００２６】
コンパイラがコンパイラランタイム命令を生成して、ヘルパースレッドを生むべくメインスレッド内に命令を挿入した後、そのヘルパースレッドコード（例えば、ヘルパースレッドを構成する複数のソフトウェア命令）が生成される。ヘルパースレッドコードを生成する方法の一例は、パフォーマンス解析ツール２０８から受け取ったプロファイリング情報をコンパイラ２０４に使用させ、キャッシュミスをひき起こすソフトウェアアプリケーションの複数のエリア内の複数の変数を特定することである。キャッシュミスを招く複数の変数が特定された後、コンパイラは、複数の変数にアクセスして（例えば、変数をレジスタにアサインして）複数の変数をキャッシュすべく、ヘルパースレッドのボディー内で複数の命令を生成する。
【００２７】
ヘルパースレッドコードを生成する方法の他の例は、ヘルパースレッドコードを生成して、ヘルパースレッド及びメインスレッドを管理する（例えば、新しい複数のスレッドを生成したり、メインスレッド及び／又はヘルパースレッドの実行を制御したりする等）複数のプラグマステートメントを使用することをソフトウェア開発者に許容することである。１つのスレッドグラフが、ヘルパースレッドコードを生成することをソフトウェア開発者に可能にするメソッドと、ヘルパースレッドコードを生成することをコンパイラに可能にするメソッドとの間でのコードの再利用を可能にするために使用されてよい。スレッドグラフは、１つの命令シーケンス又は１つのコード領域を表現したものであり、１つのスレッドと１つのヘルパースレッドとの間のスレッドスポーニングを示す。ユーザによって挿入されたプラグマステートメント及びコンパイラによって生成された複数のコンパイラランタイム命令はスレッドグラフを共有して、ヘルパースレッドコード生成モジュールが共有されることを可能にする。
【００２８】
コンパイラ２０４はまた、ヘルパースレッド及びメインスレッドにカウンティングメカニズムを挿入する（ブロック３０８）。カウンティングメカニズムは、ヘルパースレッド及びメインスレッドのパラレルな実行が、１つのスレッドの実行が他方のスレッドの実行の前に進みすぎたり後に遅れすぎたりすることを防ぐように調整されることを可能にする。メインスレッド及び複数のヘルパースレッドの相対的な同期化は、変数が、ヘルパースレッドによってプリフェッチされてキャッシュされ、メインスレッドが当該変数にアクセスする機会を得る前にキャッシュから削除されることを防ぐのに役立つ。その結果、メインスレッド及び複数のヘルパースレッドの相対的な同期化は、ヘルパースレッドが防ぐべく生成したキャッシュミスにメインスレッドが直面する機会を低減する。
【００２９】
プロセス例３００の結果、コンピュータシステム１００で実行され得る最適化されたソフトウェアアプリケーションが生成される。最適化されたソフトウェアアプリケーションは、マルチスレッディング技術を利用すべく最適化され、複数の変数をプリフェッチするヘルパースレッドを生成する複数の命令及びヘルパースレッド及びメインスレッドの実行を調整するカウンティングメカニズムを含む。
【００３０】
図４及び５は、複数のソフトウェアカウンタ及当該複数のカウンタの値に応答してヘルパースレッド及びメインスレッドの実行を制御する複数のコンパイラランタイム命令を用いて、カウンティングメカニズムをヘルパースレッド及びメインスレッド内に実装する方法の一例を示す。当業者は、カウンティングメカニズムを実装する他の多くの方法が使用し得ることを容易に理解するだろう。例えば、カウンタの数は変更可能であり、ヘルパースレッド及びメインスレッドの実行を調整すべくメールボックスシステムが使用され得る。カウンティングメカニズムを実装する方法例では、カウンティングメカニズムはパラレルに動作する２つの部分を含む。カウンティングメカニズムの第１部分は、メインスレッドの実行を制御すべく使用され（例えば、プロセス４００）、図４に示される。カウンティングメカニズムの第２部分は、ヘルパースレッドの実行を制御すべく使用され（例えば、プロセス５００）、図５に示される。
【００３１】
全般的に、カウンティングメカニズムは、メインスレッド及びヘルパースレッドの相対的な実行を制御することを試みる。カウンタのペアは、変数がプリフェッチされるために十分な量の時間を可能にすべく、メインスレッドの実行ポイントをヘルパースレッドの実行ポイントの後にいくらかの間隔で保つことを目的として、メインスレッドによって使用される。カウンタの第２ペアは、メインスレッドがプリフェッチングの恩恵を受けることを可能にすべく、ヘルパースレッドの実行ポイントをメインスレッドの実行ポイントから予め定められた間隔で保つことを目的として、ヘルパースレッドによって使用される。
【００３２】
図４は、メインスレッドの実行を制御すべくメインスレッドに実装される、カウンティングメカニズム４００の第１部分を示す。まず、ランアヘッド値（例えば、Ｘ）が決定される（ブロック４０２）。ランアヘッド値は、メイン及びヘルパースレッドが実行において互いにどれだけ進んで又は遅れて動作してよいかを指示する、予め定められた閾値である。ランアヘッド値は、プロファイリング情報の解析を通じて経験的に決定されてよいし、コンパイラ２０４内のオプションにより設定されてよい。２つのカウンタ（例えば、ｍｃ及びＭ）がメインスレッドに挿入されて、初期化（例えば、ｍｃ＝Ｘ及びＭ＝１）される（ブロック４０４）。
【００３３】
メインスレッドは、典型的には、ループ内でパフォーマンスボトルネックをひき起こす複数の変数を含む、いくつかのデータ処理（例えば、計算、変数の操作、ソーティング等）を実行するループを含んでいる。メインスレッドは、処理されるべき残りのデータが存在するか否かを確認する（ブロック４０６）。残りのデータがない場合、メインスレッドは、メインスレッドに関連する他の複数のヘルパースレッドを終了させる１つのコンパイラランタイム命令を呼び出す（ブロック４０８）。
【００３４】
残りのデータがある場合（ブロック４０６）、メインスレッドはデータ処理を実行して（ブロック４１０）、それからカウンタｍｃをインクリメントする（ブロック４１２）。カウンタｍｃは、ランアヘッド閾値によってスケールされたカウンタＭ（例えば、Ｍ＊Ｘ）と比較され、スケールされたカウンタＭよりカウンタｍｃが大きいか判断する（例えば、ｍｃ＞Ｍ＊Ｘ）（ブロック４１４）。
【００３５】
カウンタｍｃがＭ＊Ｘより大きい場合、それはメインスレッドの実行がヘルパースレッドの実行の前に進みすぎていることを意味する。その場合、カウンタＭはインクリメントされ（ブロック４１６）、ヘルパースレッドをアクティベートすべく１つのコンパイラランタイム命令が呼び出される（ブロック４１８）。メインスレッドは、次のデータ要素を取得し（ブロック４２０）、データ処理ループ（ブロック４０６、４０８、４１０、４１２、４１４，４１６、４１８、及び４２０）にわたって繰り返して実行を続ける。
【００３６】
カウンタｍｃがＭ＊Ｘ以下である場合、それはメインスレッドの実行が予め定められたランアヘッド閾値の内であることを意味する。メインスレッドは次のデータ要素を取得（ブロック４２０）ことによって継続し、データ処理ループ（ブロック４０６、４０８、４１０、４１２、４１４，４１６、４１８、及び４２０）にわたって繰り返しを続ける。
【００３７】
図５は、ヘルパースレッドの実行を制御すべくヘルパースレッドに実装されるカウンティングメカニズム５００の第２部分を示す。カウンティングメカニズム５００の第２部分の最初において、２つのカウンタ（ｈｃ及びＨ）が初期化され（ｈｃ＝０及びＨ＝１）（ブロック５０２）、その後ヘルパースレッドは、プリフェッチされるべき残りのデータがあるかを確認する（ブロック５０４）。残りのデータがない場合、ヘルパースレッドは終了する。
【００３８】
プリフェッチされるべき残りのデータがある場合（ブロック５０４）、ヘルパースレッドは、データをプリフェッチする（例えば、変数を読み込んで変数の値をキャッシュにプットする命令が実行される）（ブロック５０６）。カウンタｈｃの値がインクリメントされ、メインスレッドのカウンタｍｃの値が取得される（ブロック５０８）。
【００３９】
カウンタｈｃは、ランアヘッド値ＸによってスケールされたカウンタＨと比較され（例えば、ｈｃ＞Ｈ＊Ｘ）、カウンタｈｃはカウンタｍｃの値と比較される（ｈｃ＞ｍｃ）（ブロック５１０）。両方の条件が満たされた場合、ヘルパースレッドはメインスレッドの前に進み過ぎている。ヘルパースレッドは、カウンタＨをインクリメントして（ブロック５１２）継続し、ウェイトしてメインスレッドが追いつくことを可能にする１つのコンパイラランタイム命令を実行する（例えば、_ssp_wait）（ブロック５１４）。その後、ヘルパースレッドは、次のデータ要素を取得してプリフェッチし（ブロック５１６）、ループにわたって繰り返しを続ける。
【００４０】
両方の条件（ｈｃ＞Ｈ＊Ｘかつｈｃ＞ｍｃ）が満たされない場合（ブロック５１０）、ヘルパースレッドは、カウンタｈｃをカウンタｍｃと比較する（例えば、ｈｃ＜＝ｍｃ）（ブロック５１８）。ｈｃがｍｃより小さい場合、ヘルパースレッドはメインスレッドより遅れている。その場合、ヘルパースレッドは、１つのコンパイラランタイム命令を実行して、ヘルパースレッドが追いつくのを可能にする（例えば、_ssp_catchup）（ブロック５２０）。キャッチアップ命令を実装する１つの方法は、カウンタｈｃ、カウンタＨ、及びプリフェッチされるデータの値を、それぞれカウンタｍｃ、カウンタＭ、及びメインスレッドで処理されているデータに一致するようキャッチアップ命令にセットさせることである。そのように複数のカウンタ値を変更することによって、ヘルパースレッドは、メインスレッドによって既にフェッチされた複数の変数をプリフェッチすることをスキップする。その後、次のデータ要素が取得されて（ブロック５１６）、ヘルパースレッドは、ループにわたって繰り返しを続ける（ブロック５０４、５０６、５０８、５１０、５１２、５１４、及び５１６）。
【００４１】
上記は、特にハードウェア上で実行されるソフトウェアを含むシステムの例を開示しているが、そのようなシステムは単に実例に過ぎず、限定するものとして見なされるべきではない。例えば、開示されたハードウェア及びソフトウェアコンポーネントのいくつか又は全ては、専用ハードウェアのみ、ソフトウェアのみ、ファームウェアのみ、或いはハードウェア、ファームウェア、及び／又はソフトウェアのある組み合わせで実施可能であること考えられる。
【００４２】
さらに、ある方法、装置、及び製品がここで記載されているが、本特許の有効範囲はそれに限定されない。対照的に、本特許は、文言上又は均等主義のもとに、添付のクレームの範囲内に適正に属する全ての装置、方法、及び製品をカバーする。
【図１】
2011090705.tif 000003
【図２】
2011090705.tif 000004
【図３】
2011090705.tif 000005
【図４】
2011090705.tif 000006
【図５】
2011090705.tif 000007
【手続補正書】
【提出日】平成23年1月20日(2011.1.20)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
スレッドの同期を管理するためにコンピュータが実行する方法であって、
メインスレッドとヘルパースレッドとの間で実行を同期するためのランアヘッド値を決定する段階と、
前記メインスレッドに対応づけられた第１カウンタを、第１の値に初期化する段階と、
前記メインスレッドに対応づけられた、前記ランアヘッド値によってスケールされる第２カウンタを初期化する段階と、
前記メインスレッドでの第１データのデータ処理に応じて、前記第１カウンタをインクリメントして第２の値にする段階と、
前記メインスレッドと前記ヘルパースレッドとの間の実行の同期を管理すべく前記ヘルパースレッドをアクティベートする段階と
を備え、
前記第１カウンタおよび前記第２カウンタは前記メインスレッドと前記ヘルパースレッドとの間の実行の隔たりを示し、前記ヘルパースレッドをアクティベートする段階は、前記ランアヘッド値によって前記スケールされた第１のスケール化値よりも前記第１カウンタが大きい場合に、前記ヘルパースレッドをアクティベートする
方法。
【請求項２】
前記メインスレッドで第２のデータ要素を取得する段階
をさらに備える請求項１に記載の方法。
【請求項３】
前記メインスレッドで処理すべきデータがない場合に、前記ヘルパースレッドを終了させる段階
をさらに備える請求項１または２に記載の方法。
【請求項４】
前記第１カウンタが前記第１のスケール化値よりも大きい場合に、前記第２カウンタをインクリメントする段階
をさらに備える請求項１から３のいずれか一項に記載の方法。
【請求項５】
前記第１カウンタが前記第１のスケール化値以下である場合に、前記ヘルパースレッドをアクティベートすることを避ける段階
をさらに備える請求項１から４のいずれか一項に記載の方法。
【請求項６】
前記メインスレッドからの前記隔たりの大きさが前記ヘルパースレッドで定められる
請求項１から５のいずれか一項に記載の方法。
【請求項７】
前記ヘルパースレッドが前記メインスレッドに対して閾値の分だけ前に進んで実行されている場合に、前記ヘルパースレッドでウェイト命令を実行する段階
をさらに備える請求項６に記載の方法。
【請求項８】
前記ヘルパースレッドが前記メインスレッドに対して閾値の分だけ遅れて実行されている場合に、前記ヘルパースレッドでキャッチアップ命令を実行する段階
をさらに備える請求項６または７に記載の方法。
【請求項９】
スレッドの同期を管理するためのプログラムであって、コンピュータに、
メインスレッドとヘルパースレッドとの間で実行を同期するためのランアヘッド値を決定する手順と、
前記メインスレッドに対応づけられた第１カウンタを、第１の値に初期化する手順と、
前記メインスレッドに対応づけられた、前記ランアヘッド値によってスケールされる第２カウンタを、初期化する手順と、
前記メインスレッドでの第１データのデータ処理に応じて、前記第１カウンタをインクリメントして第２の値にする手順と、
前記メインスレッドと前記ヘルパースレッドとの間の実行の同期を管理すべく前記ヘルパースレッドをアクティベートする手順と
を実行させ、
前記第１カウンタおよび前記第２カウンタは前記メインスレッドと前記ヘルパースレッドとの間の実行の隔たりを示し、前記ヘルパースレッドをアクティベートする手順は、前記第１カウンタが、前記ランアヘッド値によって前記スケールされた第１のスケール化値よりも大きい場合に、前記ヘルパースレッドをアクティベートする
プログラム。
【請求項１０】
前記コンピュータに、
前記メインスレッドで第２のデータ要素を取得する手順
をさらに実行させる請求項９に記載のプログラム。
【請求項１１】
前記コンピュータに、
前記メインスレッドで処理すべきデータがない場合に、前記ヘルパースレッドを終了させる手順
をさらに実行させる請求項９または１０に記載のプログラム。
【請求項１２】
前記コンピュータに、
前記第１カウンタが前記第１のスケール化値よりも大きい場合に、前記第２カウンタをインクリメントする手順
をさらに実行させる請求項９から１１のいずれか一項に記載のプログラム。
【請求項１３】
前記コンピュータに、
前記第１カウンタが前記第１のスケール化値以下である場合に、前記ヘルパースレッドをアクティベートすることを避ける手順
をさらに実行させる請求項９から１２のいずれか一項に記載のプログラム。
【請求項１４】
前記コンピュータに、
前記メインスレッドからの前記隔たりの大きさを定める手順
をさらに実行させる請求項９から１３のいずれか一項に記載のプログラム。
【請求項１５】
前記コンピュータに、
前記ヘルパースレッドが前記メインスレッドに対して閾値の分だけ前に進んで実行されている場合に、前記ヘルパースレッドでウェイト命令を実行する手順
をさらに実行させる請求項１４に記載のプログラム。
【請求項１６】
前記コンピュータに、
前記ヘルパースレッドが前記メインスレッドに対して閾値の分だけ遅れて実行されている場合に、前記ヘルパースレッドでキャッチアップ命令を実行する手順
をさらに実行させる請求項１４または１５に記載のプログラム。
【外国語明細書】
2011090705000001.pdf