(57)【特許請求の範囲】
【請求項１】
コンピュータシステムのプロセッサで実行されているコンパイラを用いて、バイトスワップ処理を特定する段階と、
前記コンパイラを用いて、前記バイトスワップ処理、および、他のスワップ耐性表現を含むドメインを構築して、前記ドメインに対応付けられているドメインエグジット、および、ドメインエントリを特定する段階と、
前記コンパイラを用いて、前記ドメインのスワップを実行することによって効果が得られるという判断を下して、前記判断に応じて前記ドメインの前記スワップを実行する段階と、
前記コンピュータシステムの格納媒体にスワップされた前記ドメインを格納する段階と
を備え、
前記ドメインの前記スワップを実行する段階は、前記ドメインから削除したコードの量から前記ドメインに挿入したコードの量を引いた結果がしきい値よりも大きいと判断することによって前記効果を算出する段階を有する、方法。
【請求項２】
前記ドメインの前記スワップを実行する段階は、対応付けられている前記ドメインエントリおよび前記ドメインエグジットのうち少なくとも一部のバイト順序を変更して、前記ドメインに含まれている表現を、異なるバイト順序で処理されるカウンターパート処理と置き換える段階を有する請求項１に記載の方法。
【請求項３】
前記ドメインへのドメインエントリのバイト順序を変更する段階は、前記ドメインエントリがバイトスワップ処理を含む場合は前記バイトスワップ処理を削除して、前記ドメインエントリがバイトスワップ処理を含まない場合には前記バイトスワップ処理を挿入する段階を含む請求項２に記載の方法。
【請求項４】
前記ドメインからのドメインエグジットのバイト順序を変更する段階は、前記ドメインエグジットがバイトスワップ処理を含む場合は前記バイトスワップ処理を削除して、前記ドメインエグジットがバイトスワップ処理を含まない場合には前記バイトスワップ処理を挿入する段階を含む請求項２に記載の方法。
【請求項５】
第１の表現からバイトスワップ処理を削除して、第２の表現にバイトスワップ処理を挿入する段階とさらに備え、
前記第１の表現の経路は、前記第２の表現の経路よりもホットである請求項２に記載の方法。
【請求項６】
前記効果を算出する段階は、前記挿入したコードおよび前記削除したコードを重み付けして、前記挿入したコードおよび前記削除したコードに対応付けられている実行カウンタを分析する段階を有する請求項１から請求項５のいずれか１つに記載の方法。
【請求項７】
前記ドメインの前記スワップを実行する段階は、前記ドメインの複数の組み合わせられた表現を単一のパスで最適化する段階を有する請求項１から請求項６のいずれか１つに記載の方法。
【請求項８】
コンピュータシステムのプロセッサでのコードの実行に関する統計情報であって、前記コンピュータシステムの統計値ストレージに格納されている統計情報を取得する段階と、
前記プロセッサで実行されているコンパイラにおいて、前記コードによって演算が施されるデータを解析して、前記コードを適切に実行するためのバイト順序が同じであるデータを含む複数のグループに分割する段階と、
前記コンパイラにおいて、前記複数のグループのそれぞれについて、グループのデータのバイト順序がプログラマに可視であるか否かを判断する段階と、
前記バイト順序が不可視である各グループについて、前記コンパイラにおいて、前記バイト順序を変更することによって性能に関して効果が得られるか否かを判断する段階と、
前記バイト順序を変更することによって性能に関して効果が得られる各グループについて、対応するグループのバイト順序を変更して修正済みグループとする段階と、
前記修正済みグループをそれぞれ、前記コンピュータシステムの格納媒体に格納する段階と
を備える方法。
【請求項９】
第１のポインタが第２のポインタに対してソースとなっている場合に、前記第１のポインタのデスティネーションリストを更新し、別のポインタが前記第１のポインタに対してソースとなっている場合に、前記第１のポインタのソースリストを更新する段階をさらに備える請求項８に記載の方法。
【請求項１０】
アクセスのサイズを持つ第３のポインタについてのアクセスリストを、前記第３のポインタに対応付けられているメモリアクセスが発見されると更新する段階をさらに備える請求項９に記載の方法。
【請求項１１】
前記コードの所与の表現のバイト順序を変更することによって性能に関する効果が変化することに基づき、前記所与の表現の効果カウンタを更新する段階をさらに備える請求項１０に記載の方法。
【請求項１２】
前記ソースリストおよび前記デスティネーションリストによって過渡的に実現可能なポインタのリストを構築する段階をさらに備える請求項９に記載の方法。
【請求項１３】
前記ソースリストおよび前記デスティネーションリストによって過渡的に実現可能なポインタのリストのユニオンは、ゼロでない要素を１個以下含み、過渡的にアクセス可能なポインタ全てについて算出された効果の合計は正の値である場合には、前記バイト順序を変更することによって前記性能に関する効果が得られると判断する段階をさらに備える請求項１２に記載の方法。
【請求項１４】
請求項１から請求項１３のいずれか１つに記載の方法をコンピュータに実行させるためのプログラム。
【請求項１５】
命令を実行するプロセッサと、
ストレージと
を備えるシステムであって、
前記プロセッサは、
コンパイラを実行して、前記プロセッサでのコードの実行に関する統計情報を取得して、
前記コードによって演算が施されるデータを解析して複数のグループに分割して、
前記複数のグループのそれぞれに含まれるデータは、前記コードを適切に実行するためのバイト順序が同じであり、
前記バイト順序がプログラマに不可視である各グループについて、前記バイト順序を変更することによって性能に関して効果が得られるか否かを判断して、
前記効果が得られる場合には、対応するグループのバイト順序を変更して修正済みグループとして、
前記修正済みグループはそれぞれ、前記システムの第１の格納媒体に格納し、
前記ストレージは、前記コードの各ポインタについてソースリスト、デスティネーションリスト、および、アクセスリストを格納するシステム。
【請求項１６】
前記コンパイラは、第１のポインタが第２のポインタに対してソースとなっている場合に、前記第１のポインタの前記デスティネーションリストを更新し、別のポインタが前記第１のポインタに対してソースとなっている場合に、前記第１のポインタの前記ソースリストを更新し、アクセスのサイズを持つ第３のポインタについての前記アクセスリストを、前記第３のポインタに対応付けられているメモリアクセスが発見されると、更新する請求項１５に記載のシステム。
【請求項１７】
前記ストレージはさらに、表現のバイト順序を変更することによって性能に関する効果が変化することに基づき更新可能な効果カウンタを有する請求項１６に記載のシステム。
【請求項１８】
前記コンパイラは、バイトスワップ処理を特定して、前記バイトスワップ処理、および、他のスワップ耐性表現を含むドメインを構築して、前記ドメインに対応付けられているドメインエントリおよびドメインイグジットを特定して、前記ドメインのスワップを実行することによって効果が得られるという判断を下す請求項１５から請求項１７のいずれか１つに記載のシステム。
【請求項１９】
前記コンパイラは、前記判断に応じて、前記ドメインの前記スワップを実行して、スワップされた前記ドメインを前記第１の格納媒体に格納する請求項１８に記載のシステム。
【請求項２０】
命令を実行するプロセッサを備えるシステムであって、
前記プロセッサは、
コンパイラを実行して、バイトスワップ処理を特定し、
前記コンパイラを実行して、前記バイトスワップ処理、および、他のスワップ耐性表現を含むドメインを構築して、前記ドメインに対応付けられているドメインエグジット、および、ドメインエントリを特定し、
前記コンパイラを実行して、前記ドメインのスワップを実行することによって効果が得られるという判断を下して、前記判断に応じて前記ドメインの前記スワップを実行し、
前記システムの格納媒体にスワップされた前記ドメインを格納し、
前記プロセッサは、前記ドメインから削除したコードの量から前記ドメインに挿入したコードの量を引いた結果がしきい値よりも大きいと判断することによって前記効果を算出する、システム。
【請求項２１】
前記プロセッサは、対応付けられている前記ドメインエントリおよび前記ドメインエグジットのうち少なくとも一部のバイト順序を変更して、前記ドメインに含まれている表現を、異なるバイト順序で処理されるカウンターパート処理と置き換えることにより、前記ドメインの前記スワップを実行する、請求項２０に記載のシステム。
【請求項２２】
前記プロセッサは、前記ドメインエントリがバイトスワップ処理を含む場合は前記バイトスワップ処理を削除して、前記ドメインエントリがバイトスワップ処理を含まない場合には前記バイトスワップ処理を挿入することにより、前記ドメインへのドメインエントリのバイト順序を変更する、請求項２１に記載のシステム。
【請求項２３】
前記プロセッサは、前記ドメインエグジットがバイトスワップ処理を含む場合は前記バイトスワップ処理を削除して、前記ドメインエグジットがバイトスワップ処理を含まない場合には前記バイトスワップ処理を挿入することにより、前記ドメインからのドメインエグジットのバイト順序を変更する、請求項２１に記載のシステム。
【請求項２４】
前記プロセッサは、第１の表現からバイトスワップ処理を削除して、第２の表現にバイトスワップ処理を挿入し、
前記第１の表現の経路は、前記第２の表現の経路よりもホットである、請求項２１に記載のシステム。
【請求項２５】
前記プロセッサは、前記挿入したコードおよび前記削除したコードを重み付けして、前記挿入したコードおよび前記削除したコードに対応付けられている実行カウンタを分析することにより、前記効果を算出する、請求項２０から請求項２４のいずれか１つに記載のシステム。
【請求項２６】
前記プロセッサは、前記ドメインの複数の組み合わせられた表現を単一のパスで最適化することで、前記ドメインの前記スワップを実行する、請求項２０から請求項２５のいずれか１つに記載のシステム。
【発明の詳細な説明】
【背景技術】
【０００１】
バイトのエンディアンとは、サポートするアクセスサイズが複数ある場合のデータの格納および検索に関する属性である（例えば、８ビット、１６ビット、３２ビット、６４ビット）。アクセスの粒度が細かくなると、プログラマは、サイズが大きいアクセスがメモリ内でバイトを格納する順序を見るようになる。ビッグ・エンディアンとリトル・エンディアンとでは、メモリ内で変数を格納するバイト順序が逆になる。リトル・エンディアンでは、最下位バイトをメモリの最低位バイトアドレスに入れて変数を格納する。ビッグ・エンディアンおよびリトル・エンディアンでは、同じ値を含む変数はプロセッサのレジスタにおいては同一である。異なるのは、メモリ内での順序のみである。
【０００２】
プログラマは、１６ビット、３２ビット、および、６４ビットのデータ内でのバイトの順序を見ることができる。Ｃプログラミング言語では、プログラマは、オーバーレイデータ構造の一種であるユニオンを用いて、または、複数のバイトのデータに対するポインタを１バイトに対するポインタにキャストすることによって、バイトにアクセスすることができる。歴史的に見ると、このような技術を用いて性能を改善してきた。このため、エンディアンが異なるアーキテクチャで同じＣ／Ｃ＋＋型コードが実行されると、結果が異なり得る。例えば、ｉｎｔ  ｉ＝０ｘ１２３４５６７８、および、ｃｈａｒ  ｃ＝＊（（ｃｈａｒ＊）＆ｉ）というＣコードの場合、ビッグ・エンディアンのアーキテクチャでコンパイルされて実行されると、「ｃ」の値が０ｘ１２となり、リトル・エンディアンのアーキテクチャでコンパイルされて実行されると、０ｘ７８となる。
【０００３】
バイ・エンディアン方式を用いるコンパイラによれば、本来はビッグ・エンディアン・アーキテクチャ用に開発されたソースコードをリトル・エンディアン・アーキテクチャで実行できるようにコンパイルすることが可能となる。コードを特別なモードでコンパイルすると、大抵の場合はビッグ・エンディアン・アーキテクチャでコンパイルされて実行されるのと同様の結果をもたらす。つまり、上記の例では、「ｃ」は０ｘ１２となる。このような結果は、仕様がビッグ・エンディアンであるデータをメモリへロードおよびストアする前に「バイトスワップ」処理を追加することによって得られる。
【０００４】
バイ・エンディアン方式のコンパイラは通常、レガシーコードを最新型のリトル・エンディアン・アーキテクチャで実行できるようにコンパイルする際に用いられる。プログラマは通常、特定のデータ毎にビッグ・エンディアンまたはリトル・エンディアンのいずれでなければならないかを判断するのではなく、全てのレガシーコードをビッグ・エンディアンとマーキングする。このため、コンパイラは、プログラマにとってエンディアンが重要な問題でない場合でも、データのロードおよびストアの前にバイトスワップを追加する。これは、性能に悪影響を及ぼす。
【図面の簡単な説明】
【０００５】
【図１】本発明の一実施形態に係る、バイトスワップ除去を実行する方法を説明するためのフローチャートである。
【０００６】
【図２】本発明の一実施形態に係る、データのバイト順序を制御することによってコードを最適化する方法を説明するためのフローチャートである。
【０００７】
【図３】本発明の一実施形態に係る、性能統計値を格納するさまざまなデータストレージを示すブロック図である。
【０００８】
【図４】本発明の一実施形態に係るシステムを示すブロック図である。
【発明を実施するための形態】
【０００９】
実施形態では、ドメインスワップの概念に基づき、バイトスワップ処理の削除／よりコールドな経路への移動によって、生成したコードの性能を改善するとしてよい。またさらに、実施形態では、性能を改善することが可能な場合には、データバイトの順序の種類の選択を無効化するとしてもよい。
【００１０】
「スワップ耐性表現」は、本明細書で用いる場合、異なるバイト順序の一部（または全て）の引数に対して演算を行い、同じまたは異なるバイト順序での有効な結果を生成するカウンターパート表現と置き換えが可能なコンパイルされるコード表現を意味する。例を挙げると、定数（例えば、ｘ＝＝０ｘ１２３４５６７８）に対する比較は、スワップされた引数が与えられるとＳＷＡＰ（ｘ）が元と同じ結果を生成するカウンターパート（ｙ＝＝０ｘ７８５６３４１２）を持つので、スワップ耐性がある。尚、ＳＷＡＰは、バイトスワップ処理を実行することを意味する。ビットＡＮＤ処理は、スワップした引数を取ることで正しいが異なるバイト順序の結果を生成するような処理（同じビットＡＮＤ）があるので、スワップ耐性を持つ。しかし、算術（例えば、＋、−、×および÷）演算は、特定のバイト順序のデータを厳密に必要とし、スワップされた引数を取得すると間違った結果が得られるので、スワップ耐性を持たない。
【００１１】
ドメインは、コンパイル中の一連のコード表現である。一方、ドメインエントリは、ドメイン外の表現であり、その結果はドメインに属する表現によって引数として取得される。ドメインエグジットは、ドメインに属している式の結果を引数として取得するドメイン外の表現である。スワップ耐性ドメインは、一部（または全て）のドメインエントリが異なるバイト順序のデータと置き換えられると全てのドメインエグジットが同じまたは異なるバイトオーダの有効な結果となるようにカウンターパート表現と置き換えが可能である一連のスワップ耐性表現である。
【００１２】
ドメインのスワップは、コンパイル中のコードの変換であり、（１）必要なドメインエントリおよびドメインエグジットにおいてバイトスワップ処理を挿入または削除することによってドメインエントリおよびドメインエグジットの一部または全てのバイト順序を変更し、（２）当該ドメインの表現を全て、異なるバイト順序で処理されるカウンターパート表現と置換してコードの意味論を維持する。エントリおよびエグジットに関するドメインスワップについて、バイトスワップは、エントリ表現またはエグジット表現がバイトスワップである場合には削除することができ、そうでない場合には挿入することができる。
【００１３】
一例を挙げる。
Ｔ１＝ＳＷＡＰ（Ａ）
Ｔ２＝ＳＷＡＰ（Ｂ）
ＲＥＳ＝Ｔ１＝＝Ｔ２
「Ｔ１＝＝Ｔ２」という表現はスワップ耐性ドメインを意味し、「ＳＷＡＰ（Ａ）」および「ＳＷＡＰ（Ｂ）」という表現はドメインエントリであり、代入「ＲＥＳ＝・・・」はドメインエグジットである。このコードに対するドメインスワップがどのようになるかを以下に示す。
Ｔ１＝Ａ  ／／バイトスワップ削除
Ｔ２＝Ｂ  ／／バイトスワップ削除
ＲＥＳ＝Ｔ１＝＝Ｔ２  ／／結果のバイト順序は同じ、追加または削除無し
【００１４】
このため、各スワップ耐性表現について、ドメインスワップが実行されるとエントリ（つまり、引数）およびエグジット（つまり、結果）のうちどれがバイト順序を変更するかが分かる。例えば、「Ｘ？Ｙ：Ｚ」（ＸであればＹ、そうでなければＺ）という表現では、ＹおよびＺのバイト順序を変更して、Ｘのバイト順序は維持する「Ｘ？Ｙ'：Ｚ'」。このため、ドメインのうちどのエントリおよびエグジットがバイト順序を変更して、これらのエントリおよびエグジットのみについてバイトスワップ処理（ＳＷＡＰ）が挿入／削除されることが分かる。
【００１５】
「ドメインスワップ効果」は、ドメインスワップによって性能がどれくらい効果を得るかを表し、挿入されたコードの量から削除されたコードの量を引いた結果が（挿入／削除された特定の命令の重みおよび実行カウンタの推定値を考慮する）正の数になることを意味する。
【００１６】
一例を挙げる。
Ｔ１＝Ａ
Ｔ２＝ＳＷＡＰ（Ｂ）
ＲＥＳ＝Ｔ１＝＝Ｔ２
ドメインスワップは以下のようになる。
Ｔ１＝ＳＷＡＰ（Ａ）  ／／バイトスワップ挿入
Ｔ２＝Ｂ  ／／バイトスワップ削除
ＲＥＳ＝Ｔ１＝＝Ｔ２  ／／追加または削除無しドメインスワップ効果は、元コードの「Ｔ１＝Ａ」が「Ｔ２＝ＳＷＡＰ（Ｂ）」よりもコールドである場合に、正となる。尚、「コールド」および「ホット」という用語は、所与のコードセグメントの相対的な頻度または利用を意味する。「コールド」なコードセグメントは、別のコードセグメントに比べて、利用頻度が低いか、または、時間的により遠い。このため、本例に示すように、ドメインスワップでは、コード内でＳＷＡＰを移動させる場合もあるとしてよい。
【００１７】
図１は、本発明の一実施形態に係る、バイトスワップ削除を実行する方法を示すフローチャートである。方法１０は、コンピュータシステムの１以上のプロセッサで実行されるコンパイラによって実行されるとしてよい。本発明の範囲はこれに限定されないが、一部の実施形態は、ビッグ・エンディアン・アーキテクチャ用に書かれたコードをリトル・エンディアン・アーキテクチャ用に最適化するべく実行されるとしてよい。つまり、コンパイラは、リトル・エンディアン・アーキテクチャのプロセッサで実行されるとしてよい。
【００１８】
図１から分かるように、方法１０は、最適化されるべきコードの表現がバイトスワップ処理を含むか否かを判断すること（ひし形２０）から開始されるとしてよい。含まない場合、次の表現に移って同じ処理を行なうとしてよい（ブロック３０）。バイトスワップ表現を発見すると、ブロック４０に進んで、この表現を含むドメインを構築するとしてよい。本発明の範囲はこれに限定されないが、実施形態は、ドメインの範囲を拡大して、１つのパスに含まれている複数の表現の最適化を可能とするとしてよい。ドメインの構築の詳細については後述する。ドメインの構築においては、可能であれば、表現を追加してドメインを拡張するとしてよい（ブロック５０）。さらに、ドメインの拡張の詳細についても、以下で説明する。ドメインの構築が完了すると、当該ドメインについて、バイト順序を変更するさまざまなエントリおよびエグジットを特定するとしてよい（ブロック６０）。上述したように、ドメインエントリはドメインに対して入力となる引数であってよく、ドメインエグジットはドメインの外部で引数として利用される結果であってよい。
【００１９】
再度図１を参照して説明すると、ひし形７０において、バイトスワップを削除することで効果が得られるか否かを判断するとしてよい（ひし形７０）。上述したように、この判断は、例えば、コード中に挿入された表現の量とコードから削除された表現の量との間の差分の特定を含むさまざまな分析情報、および、これらの表現に対応付けられているさまざまな実行カウント値に関する分析情報に基づいて、コンパイラで実行されるとしてよい。さらに、この効果がしきい値よりも多きいか否かを決定するとしてよい。一実施形態によると、効果が得られる旨を示すこのしきい値は、効果を判断した結果が正の数であれば、効果が得られるものとして、ゼロに設定されるとしてもよい。尚、バイトスワップを削除しても効果が得られない場合には、バイトスワップ削除は実行せず、コンパイラは次の表現に移動するとしてよい（上述したブロック３０）。
【００２０】
逆に、削除することによって効果が得られると判断される場合には、ブロック８０に進む。ブロック８０において、バイトスワップ表現を削除するので、この表現に代えてカウンターパート表現を挿入するとしてよい。さらに、ドメイン内の他の位置において、１以上のバイトスワップを追加で挿入／削除するとしてよい（ブロック８０）。また、このようなバイトスワップ表現は同様に、ドメインエントリおよび／またはドメインエグジットのうち１以上において挿入または削除するとしてよい。その後、修正したコードを、修正したコードを含むプログラムが後に呼び出された場合に実行できるように、システムメモリまたは不揮発性ストレージ等の適切なストレージに格納するとしてよい。図１に示す実施形態で具体的な実施例を説明しているが、本発明の範囲はこれに限定されず、他の実施例も可能であると理解されたい。
【００２１】
スワップ耐性ドメインを構築する場合、任意のスワップ耐性表現で開始するか、または、削除が望ましいバイトスワップから開始して、スワップ耐性表現を組み合わせることでドメインを拡張するとしてよい。さらなるドメイン拡張が不可能であるか、または、性能の点から意味を為さない場合は、ドメインスワップを実行して、他のドメインを構築するとしてよい。ドメイン拡張は、スワップ耐性表現が隣接している場合に、可能である。さらに、隣接するスワップ耐性表現毎に、当該スワップ耐性表現を現在のドメインに追加しないように判断されるので、複数のドメインを構築するとしてよい。尚、複数のドメインはそれぞれ、ドメインスワップによる効果が異なる。このため、構築が最も上手くいったドメインを発見するべく、全検索を実行するとしてもよいし、または、ヒューリスティック検索を適用するとしてもよい。特定の実施形態は、ヒューリスティック方式に基づくとしてよい。バイトスワップ削除ではこのように、上述したように、スワップによって効果が得られるスワップ耐性ドメインを全て特定してスワップするとしてよい。
【００２２】
このように、さまざまな実施形態によると、あるバイト順序のデータに対する演算に代えて、別のバイト順序の同じデータに対する同等の演算を利用する。また、組み合わせた複数の表現および組み合わせた複数のデータは、１回のパスで一度に最適化することができる。この最適化の結果、バイトスワップのうち一部を削除するだけでなく、よりコールドな経路に移動させる。このように、表現を、バイト順序が異なるデータに対して演算を行なうカウンターパート表現で置換するとしてよく、コード内でスワップを移動させるとしてよく、組み合わせられた複数のデータはバイト順序を変更するとしてよい。このように、バイトスワップは、あるバイト順序のデータに対して演算を行なうコードを、別のバイト順序のデータに対して演算を行なう同等のコードで置換することによって、削除することができる。
【００２３】
ここで表１に、本発明の一実施形態に係る、アルゴリズムの実装例を表す擬似コードを示す。表１に示すように、バイトスワップ削除およびドメイン構築のために複数の関数を用いるとしてよい。表１から分かるように、バイトスワップ関数は、ドメイン構築関数を呼び出す。また、バイトスワップ表現を削除することで効果が得られるか否か判断する際には、ＢＥＮＥＦＩＴと示す別の関数を実行するとしてよい。上述したように、この関数では、計算結果が正の値となる場合には効果があると判断するとしてよい。このように正の値が得られる場合には、ＳＷＡＰ＿ＤＯＭＡＩＮと呼ばれる別の関数を実行して、ドメイン、ならびに、ドメインエントリおよびドメインエグジット内の適切な位置においてバイトスワップ処理を実際に削除および挿入するとしてよい。尚、この擬似コードは一例に過ぎず、他の実施例も可能である。
【表１】
0005392689.tif 000002
【００２４】
実施形態ではさらに、データのバイト順序の選択を制御するとしてよい。つまり、コンパイラは、プログラマが規定したようにデータのバイト順序を選択するのではなく、特定のデータ毎にバイト順序がプログラムの意味論に影響を与えるか否かを確認して、影響を与えない場合には、この特定のデータのバイト順序を性能の観点から見て設定するとしてよい。
【００２５】
本明細書で用いる場合、データのバイト順序（例えば、変数、データ構造、ヒープデータ、関数の引数等）は、データの格納および検索が全て同じサイズで行なわれる場合、プログラマには不可視である。コンパイラは、データの格納および検索が全て同じサイズで行なわれることを証明するためには、以下の点を確認する。データに対するアクセスは、サイズが異なる他の変数（例えば、ユニオンメンバ）を介しては行なえないこと、データのアドレス（取得されれば）は、外部から直接は見えないこと（つまり、コンパイル中のコードの外部）、または外部から見える変数には格納されないこと、または外部の関数に渡されたり外部の関数から取得されないこと、またはコンパイラが追従できない表現では取得されないこと／組み込まれないこと、および、データのアドレスが取得されてサイズが異なるデータへのポインタにキャストされると、このポインタによる読み書きは行なわれないことを確認する。しかし、コンパイラは、ｍａｌｏｃ／ｆｒｅｅ／ｅｔｃ等の外部関数についてはこれらの必要条件を周知のように免除するとしても、全ての検索および格納が同じサイズで行なわれる事を保証するとしてよい。
【００２６】
データのバイト順序が可視であるか否かは、従来通りの方法で算出されるとしてよい。例えば、バイト順序は、そうでないと証明されない限りは、可視として処理することができる。コンパイラはさらに、関数の引数のバイト順序の可視性を定めるために、関数の呼び出しが全て（直接的でない呼び出しも含めて）周知となるようにする。例を挙げると、アドレスが取得されることはない上位レベルの静的変数のバイト順序は、プログラマには不可視であるが、モジュール毎のコンパイルでのグローバル変数のバイト順序はプログラマに可視であると見なされる。
【００２７】
複数のデータは、同じバイト順序でなければならない場合には、グループを構成する。以下の例では、変数「ａ」および「ｂ」が、同じバイト順序でなければならないので、コンパイラはこの順序に従わなければならない。
ｉｎｔ＊ｐｔｒ＝ｃｏｎｄｉｔｉｏｎ？＆ａ：＆ｂ
ｐｔｒ［３］＝１０
【００２８】
本発明の一実施形態に係るコンパイラは、特定のデータについてどのバイト順序が性能の観点から見てより意味があるのかを判断するべく、どのようにデータが利用されるかを確認する。コンパイラは、実行カウンタによるとデータがビッグ・エンディアン・コンテクストで用いられる頻度の方が高い場合、可能な場合にはこのデータをビッグ・エンディアン方式に準拠したものとする。コンテクストのバイト順序が分からない場合もある（例えば、当該データがある変数から別の変数へとコピーされており、コンパイラが両変数のバイト順序について特定していない場合）。この場合、ヒューリスティック方式で、確率がより高い方のエンディアンを選択することができる。
【００２９】
このように、本発明の実施形態に係るコンパイラは、以下のステップを実行するとしてよい。（１）プログラムの実行対象であるデータを全て、バイト順序が同じでなければならないグループ単位で分割し、（２）グループ内のデータは全てバイト順序がプログラマに不可視であるグループを選択して、（３）バイト順序が変更されると性能に良い影響があるグループのみを選定することによって選択結果を絞り込み、（４）選択されたグループのデータの読み書きを全て調整することによって、選択されたグループのバイト順序を変更する。
【００３０】
図２は、本発明の一実施形態に係る、データのバイト順序を制御するコードを最適化する方法を示すフローチャートである。図２に示すように、方法１００は、システムのプロセッサ、例えば、リトル・エンディアン・アーキテクチャのプロセッサで実行されるバイ・エンディアン方式のコンパイラを用いて実施するとしてよい。図２に示すように、方法１００は、コードを実行することによって、または、ヒューリスティック方式を適用することによって、所与のコードセグメントに関する統計情報を取得することによって開始されるとしてよい（ブロック１１０）。このような統計情報は、コンパイラが第１のパスを実行することによって取得されるとしてよい。第１のパスを実行する場合には、コードを実行するか、または、その他の処理を実行して、統計情報を取得するとしてよい。この後、データを解析して複数のグループに分けるとしてよい（ブロック１２０）。より具体的に説明すると、データを解析して、同じバイト順序のデータを含むグループに分割するとしてよい。つまり、一のグループのデータは全て、ビッグ・エンディアンまたはリトル・エンディアンのいずれかであるとしてよい。
【００３１】
この後、各グループについて、当該グループのバイト順序はプログラマに可視であるか否かを判断するとしてよい（ひし形１３０）。以下でさらに説明するが、さまざまな分析を実行してバイト順序が可視であるか否かを判断するとしてよい。この分析は、第１のパスで取得された統計情報に少なくとも部分的に基づいて行なわれるとしてよい。バイト順序が可視である場合、このデータグループについては最適化が不可能であるので、ブロック１４０に進み、次のグループを選択するとしてよい。
【００３２】
可視でない場合、ひし形１３０からひし形１５０へと進み、当該グループのデータについてバイト順序を変更すると性能の観点から効果があるか否かを判断するとしてよい。さまざまな実施例に関して以下でさらに説明するが、異なる計算を実行して性能の観点から効果があるか否かを判断するとしてもよい。効果が得られない場合には、最適化を実行せずに、次のグループを選択するとしてよい（ブロック１４０）。バイト順序を変更することで性能の観点から効果が得られる場合には、ブロック１６０に進み、当該グループのバイト順序を変更するとしてよい。そして、修正後のコードを、修正後のコードを含むプログラムが後に呼び出されると実行できるように、システムメモリまたは非電圧型ストレージ等の適切なストレージに格納するとしてよい。図２の実施形態で具体的な実施例を示すが、本発明の範囲はこれに限定されない。
【００３３】
一実施例によると、コンパイラ最適化は、２つのコンパイルパスで実行されるとしてよい。第１のパスでは、データの利用に関する情報を蓄積して、優先すべきバイト順序を性能の観点から算出する。第２のパスでは、特定のデータ毎に選択されたバイト順序に応じてデータの利用を調整する。このため、特定のデータについてのバイト順序が可視であるか否かを判断するとしてよい。続いて、性能の観点からより良いバイト順序を特定するとしてよい。最後に、特定のデータのバイト順序を変換するとしてよい。
【００３４】
各データ（変数、関数の引数、関数等）は、当該データのアドレスを含む通常のポインタのように扱われるＤＡＴＡ＿ＡＤＤＲＥＳＳフェイクポインタを持つ。一実施形態によると、各ポインタ（およびＤＡＴＡ＿ＡＤＤＲＥＳＳフェイクポインタ）はさまざまなデータ構造を維持する。
【００３５】
一実施形態によると、これらの構造は、図３に示すような性能監視テーブル１５０に格納されるとしてよい。図３は、本発明の一実施形態に係る、性能統計値を格納するさまざまなストレージを示すブロック図である。一部の実施形態によると、テーブル１５０は、システムメモリに格納されるとしてよいが、他の実施例では、コンパイラが実行されているプロセッサのキャッシュメモリに格納されるとしてもよい。図３に示すように、テーブル１５０は、ポインタおよびデータアドレスフェイクポインタ毎に、当該ポインタがコピーされるポインタのリストを格納しているデスティネーションリストを１６０を含むとしてよい。同様に、ソースリスト１６５は、対応するポインタに対応付けられているソースのリストを格納している。また、アクセスサイズリスト１７０は、対応するポインタに対応付けられている読み書きのサイズを格納しているとしてよい。効果カウンタ１７５は、ポインタに対応付けられている表現に関して、バイト順序の変更によって性能に（正または負の）影響があるか否かに応じて、インクリメント／デクリメントされるとしてよい。このため、ポインタおよびフェイクポインタ毎に、上記のリストを維持するとしてよい。一実施形態によると、ＶＡＬＵＥ＿ＣＯＰＩＥＤ＿ＴＯリストおよびＶＡＬＵＥ＿ＣＯＰＩＥＤ＿ＦＲＯＭリスト（デスティネーションリスト１６０およびソースリスト１６５に対応）は他のポインタを含むとしてよく、ＡＣＣＥＳＳ＿ＳＩＺＥリスト（アクセスリスト１７０に対応する）は整数を含み、効果カウンタ１７５はデータ利用統計値を蓄積する。初期状態では、他の変数（例えば、ユニオンメンバ）を介してアクセス可能な変数およびサイズが異なる当該他の変数と同様に、外部に可視であるシンボル（変数、関数）に対応するＤＡＴＡ＿ＡＤＤＲＥＳＳフェイクポインタのＡＣＣＥＳＳ＿ＳＩＺＥリストは、（アクセスサイズが「０」とはバイト順序が可視である一実施形態によると）値がゼロである。その他のリストは、初期状態では、空であり、効果カウンタは、初期状態では、ゼロに設定される。
【００３６】
第１のパスでは、コンパイラは、これらのリストに実際のデータを入れる。あるポインタから別のポインタに値がコピーされる度に、ソースのＶＡＬＵＥ＿ＣＯＰＩＥＤ＿ＴＯリストおよびデスティネーションのＶＡＬＵＥ＿ＣＯＰＩＥＤ＿ＦＲＯＭリストを適宜拡張する。データのアドレスが格納される度に、ソースのＡＤＤＲＥＳＳ＿ＤＡＴＡのＶＡＬＵＥ＿ＣＯＰＩＥＤ＿ＴＯおよびデスティネーションのＶＡＬＵＥ＿ＣＯＰＩＥＤ＿ＦＲＯＭを適宜拡張する。
【００３７】
読み書きが発見される度に、対応するＡＣＣＥＳＳ＿ＳＩＺＥリストのエントリをこの読み書きサイズで拡張する。この場合に、効果カウンタを、バイト順序の変更によって表現がどのように修正されるかに応じて、現在の表現のヒューリスティック実行カウンタによって増減させるか、または、そのままとする。以下に示す例では、さまざまな表現の変更は、変数Ａのバイト順序の変更を反映している。
Ａ＝ＳＷＡＰ（Ｂ）→Ａ＝Ｂ／／効果カウンタ増
Ａ＝０ｘ１２３４５６７８→Ａ＝０ｘ７８５６３４１２／／効果カウンタ変更なし
Ａ＝Ｂ→Ａ＝ＳＷＡＰ（Ｂ）／／効果カウンタ減
【００３８】
ポインタまたはデータアドレスに対してサポートされていない処理が発見される度に、対応するＡＣＣＥＳＳ＿ＳＩＺＥリストを「０」の値で拡張する。第１のパスの終了時点において、全てのリストが構築されており、コンパイラはバイト順序の可視性を判断するのに十分な情報を持っている。所与のデータについて、ＡＤＤＲＥＳＳ＿ＤＡＴＡのＶＡＬＵＥ＿ＣＯＰＩＥＤ＿ＴＯリストを介して過渡的に実現可能なポインタ変数全てのＡＣＣＥＳＳ＿ＳＩＺＥリストのユニオンが含む要素が１個以下である（そして、この要素がゼロでない）場合、当該データの読み書きは全て、この特定のサイズであるので、このデータのバイト順序はプログラマには不可視である。
【００３９】
コンパイラは、所与のデータとして同じバイト順序を持たなければならないのはどのデータ部分か（つまり、どのデータ部分がグループを構成するか）を発見するべく、ＶＡＬＵＥ＿ＣＯＰＩＥＤ＿ＴＯリストおよびＶＡＬＵＥ＿ＣＯＰＩＥＤ＿ＦＲＯＭリストを介して過渡的に実現可能なＡＤＤＲＥＳ＿ＤＡＴＡポインタのリストを構築する。グループ全体に対する最適化は、ＶＡＬＵＥ＿ＣＯＰＩＥＤ＿ＴＯリストおよびＶＡＬＵＥ＿ＣＯＰＩＥＤ＿ＦＲＯＭリストを介して過渡的に実現可能なポインタ全てのＡＣＣＥＳＳ＿ＳＩＺＥリストのユニオンが１個以下の要素を含みこの要素がゼロでない場合に、可能である。
【００４０】
コンパイラは、グループ全体のバイト順序がプログラマに不可視であってグループ全体について別のバイト順序を選択すると性能の観点から効果が得られる場合（例えば、過渡的にアクセス可能なポインタ全てのＢＥＮＥＦＩＴの合計が正の値である場合）、スワップを実行してデータの利用を調整する。
【００４１】
このため、実施形態では、それぞれの特定データがどのように利用されるかを確認して、実行カウンタおよびデータの利用に基づいてバイト順序に関して判断を下す。また、実施形態は、特定のクラスのデータ（例えば、リターン値のみ）ではなく、基準を満たす全てのデータに適用が可能である。バイト順序は、コンパイル中のアプリケーションにおいてデータをどのように利用するかに基づいて選択される。この選択は、「万能」モデルではなく、特定アプリケーション毎に、特定データ毎に行われる。このように、ユーザの決定に依存するのではなく、コンパイラがどのデータのバイト順序を変更すべきかを決定することができるので、高性能のコードを生成することができる。
【００４２】
表２は、本発明の一実施形態に係る、上述した２つのパスを提供する簡略化した擬似コードを示す。表２に示すように、この２つのパスは、コンパイラによって実行されると、特定データのバイト順序の選択を制御する。表２から分かるように、第１のパスは、コードのポインタおよび変数に対応付けられているさまざまなリストの更新を含む利用統計値を集めることを目的として、当該コードを実行するためまたは別のヒューリスティック方式を実行するために用いられるとしてよい。そして、第２のパスは、集めた利用統計値に基づいてコードを最適化するために実行される。バイト順序を変更することでコードが最適化されると判断されると、バイトスワップ処理をコードに挿入／コードから削除する。
【表２】
0005392689.tif 000003
【００４３】
表２に示すように、総効果が正の値であるので、ここに示すスワップは以下に記載する変換のうちいずれか１つを用いて最適化され得る。
ＳＷＡＰ（ＳＷＡＰ（Ｘ））→Ｘ
ＳＷＡＰ（ｃｏｎｓｔ）→ｃｏｎｓｔ＿ｓｗａｐｐｅｄ
このため、以下のような表現となる。
Ｘ：＝ＳＷＡＰ（ＳＷＡＰ（Ｘ）＋１）／／Ｘはビッグ・エンディアンで最初に以下のように変換される：
Ｘ：＝ＳＷＡＰ（ＳＷＡＰ（ＳＷＡＰ（ＳＷＡＰ（Ｘ））＋１）））／／Ｘはリトル・エンディアンで後に以下のように最適化される
Ｘ：Ｘ＋１
【００４４】
実施形態はさまざまな種類のシステムで実現するとしてよい。図４には、本発明の一実施形態に係るシステムを示すブロック図を図示する。図４に示すように、マルチプロセッサシステム３００は、ポイント・ツー・ポイント・インターコネクト・システムであり、ポイント・ツー・ポイント・インターコネクト３５０を介して結合されている第１のプロセッサ３７０および第２のプロセッサ３８０を備える。図４に示すように、プロセッサ３７０およびプロセッサ３８０はそれぞれ、マルチコアプロセッサであってよく、第１のプロセッサコアおよび第２のプロセッサコア（つまり、プロセッサコア３７４ａおよび３７４ｂ、ならびに、プロセッサコア３８４ａおよび３８４ｂ）を有する。
【００４５】
さらに図４を参照しつつ説明を続けると、第１のプロセッサ３７０はさらに、メモリコントローラハブ（ＭＣＨ）３７２、ならびに、ポイント・ツー・ポイント（Ｐ−Ｐ）インターフェース３７６および３７８を有する。同様に、第２のプロセッサ３８０は、ＭＣＨ３８２、ならびに、Ｐ−Ｐインターフェース３８６および３８８を有する。図４に示すように、ＭＣＨ３７２および３８２はそれぞれ、プロセッサを対応するメモリ、つまり、メモリ３３２およびメモリ３３４に結合する。メモリ３３２およびメモリ３３４は、メインメモリ（例えば、ダイナミック・ランダム・アクセス・メモリ（ＤＲＡＭ））のうち対応するプロセッサにローカルに取り付けられている一部分であってよい。第１のプロセッサ３７０および第２のプロセッサ３８０はそれぞれ、Ｐ−Ｐインターコネクト３５２および３５４を介してチップセット３９０に結合されているとしてよい。図４に示すように、チップセット３９０は、Ｐ−Ｐインターフェース３９４および３９８を有する。
【００４６】
チップセット３９０はさらに、チップセット３９０を高性能グラフィクスエンジン３３８に結合するインターフェース３９２を有する。また、チップセット３９０は、インターフェース３９６を介して第１のバス３１６に結合されるとしてよい。図４に示すように、さまざまなＩ／Ｏデバイス３１４は、第１のバス３１６を第２のバス３２０に結合しているバスブリッジ３１８と共に、第１のバス３１６に結合されているとしてよい。一実施形態によると、第２のバス３２０には、例えば、キーボード／マウス３２２、通信デバイス３２６、および、コード３３０を含むディスクドライブ等の大容量格納装置であるデータ格納部３２８を含むさまざまなデバイスが結合されているとしてよい。このようなコードは、プロセッサ３７０および３８０のうち１以上で実行され得る、本発明の一実施形態に係るコンパイラを含むとしてよい。また、オーディオＩ／Ｏ３２４が第２のバス３２０に結合されているとしてよい。
【００４７】
実施形態は、コードで実装されるとしてよく、命令を格納している格納媒体に格納されるとしてよい。当該命令は、当該命令を実行するようにシステムをプログラミングするために利用することができる。格納媒体は、これらに限定されないが、フロッピー（登録商標）ディスク、光ディスク、ソリッド・ステート・ドライブ（ＳＳＤ）、コンパクト・ディスク・リード・オンリー・メモリ（ＣＤ−ＲＯＭ）、コンパクト・ディスク・リライタブル（ＣＤ−ＲＷ）、および、光磁気ディスクを含む任意の種類のディスク、リード・オンリー・メモリ（ＲＯＭ）、ダイナミック・ランダム・アクセス・メモリ（ＤＲＡＭ）等のランダム・アクセス・メモリ（ＲＡＭ）、スタティック・ランダム・アクセス・メモリ（ＳＲＡＭ）、消去可能プログラム可能リード・オンリー・メモリ（ＥＰＲＯＭ）、フラッシュ・メモリ、電気的消去可能プログラム可能リード・オンリー・メモリ（ＥＥＰＲＯＭ）等の半導体デバイス、磁気カードあるいは光カード、または、電子的に命令を格納するのに適している任意のその他の種類の媒体を含むとしてよい。
【００４８】
限られた数の実施形態を参照しつつ本発明を説明してきたが、当業者であれば、多くの点で変形および変更し得ることに想到するであろう。特許請求の範囲では、このような変形例および変更例も全て本発明の真の意図および範囲に入るものとする。
【図１】
0005392689.tif 000004
【図２】
0005392689.tif 000005
【図３】
0005392689.tif 000006
【図４】
0005392689.tif 000007