(57)【要約】  方法が、第１のプログラマブルプロセッサを用いて、第１のプロセッサの第１のキャッシュのキャッシュラインに共有変数データを記憶することを含む。本方法は、第１のプログラマブルプロセッサを用いて、ストアウィズリリース動作を実行することと、第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行することと、第２のプログラマブルプロセッサを用いて、第２のプログラマブルプロセッサのキャッシュから共有変数データの値をロードすることとをさらに含む。
2015524597.tif 000002
【特許請求の範囲】
【請求項１】
第１のプログラマブルプロセッサを用いて、前記第１のプロセッサの第１のキャッシュのキャッシュラインに共有変数データを記憶することと、
前記第１のプログラマブルプロセッサを用いて、ストアウィズリリース動作を実行することと、
第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行することと、
前記第２のプログラマブルプロセッサを用いて、前記第２のプログラマブルプロセッサのキャッシュから前記共有変数データの値をロードすることと
を備える方法。
【請求項２】
前記ストアウィズリリース動作を実行することが、
前記第１のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第１のキャッシュのキャッシュラインをフラッシュすることと、
前記第１のプログラマブルプロセッサを用いて、任意の前のストアが完了するのを待つことと
をさらに備える、請求項１に記載の方法。
【請求項３】
前記ロードウィズアクワイア動作を実行することは、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のプログラマブルプロセッサのキャッシュラインを無効にすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する第２のキャッシュのキャッシュラインを充填することと、
前記第２のプログラマブルプロセッサを用いて、前記ロードウィズアクワイア動作が実行を完了するまで、後続の命令が発行されるのを防ぐことと
をさらに備える、請求項１に記載の方法。
【請求項４】
前記第２のプロセッサを用いて、前記第１のプログラマブルプロセッサの前記キャッシュをスヌープすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データの更新された値に関連するキャッシュヒットを検出することと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記キャッシュヒットを検出したことに応答して、前記共有変数データの前記更新された値を前記第２のプログラマブルプロセッサの前記キャッシュに書き込むことと
をさらに備える、請求項３に記載の方法。
【請求項５】
前記ストアウィズリリース動作を実行することが、
前記第１のキャッシュよりも高いレベルを有する高レベルキャッシュ、システムメモリ、および前記第２のプロセッサの前記第２のキャッシュのうちの１つに前記共有変数データを書き込むこと
をさらに備える、請求項１に記載の方法。
【請求項６】
前記第１のプロセッサが中央処理ユニット（ＣＰＵ）を備え、前記第２のプロセッサがグラフィックス処理ユニット（ＧＰＵ）を備える、請求項１に記載の方法。
【請求項７】
前記第１のプロセッサの前記キャッシュラインのすべておよび前記第２のプロセッサの前記キャッシュラインのすべてが共有され、
ここにおいて、前記ストアウィズリリース動作を実行することが、前記第１のプロセッサの前記キャッシュラインのすべてをフラッシュすることをさらに備え、
ここにおいて、前記ロードウィズアクワイア動作を実行することが、前記第２の第１のプロセッサの前記キャッシュラインのすべてを無効にすることをさらに備える、
請求項１に記載の方法。
【請求項８】
前記第１のプロセッサの前記キャッシュラインのすべてうちの１サブセットが共有され、第２のプロセッサの前記キャッシュラインのすべてのうちの１サブセットが共有され、
ここにおいて、前記ストアウィズリリース動作を実行することが、前記第１のプロセッサの前記キャッシュラインの前記共有サブセットのみをフラッシュすることをさらに備え、
ここにおいて、前記ロードウィズアクワイア動作を実行することが、前記第２のプロセッサの前記キャッシュラインのすべて前記共有サブセットのみを無効にすることをさらに備える、
請求項１に記載の方法。
【請求項９】
前記第１のプロセッサの前記キャッシュラインの前記共有サブセットの少なくとも１つの共有ラインが第１の共有可能性属性によって示され、
ここにおいて、前記第２のプロセッサの前記キャッシュラインの前記共有サブセットの各共有ラインが第２の共有可能性属性によって示される、
請求項８に記載の方法。
【請求項１０】
キャッシュフィル動作を実行することと、
前記キャッシュフィル動作を実行したことに応答して、ページテーブルから前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つを読み取ることと
をさらに備える、請求項９に記載の方法。
【請求項１１】
コンパイラが、ロード命令およびストア命令のうちの少なくとも１つを発行すること、ここにおいて、前記ロード命令および前記ストア命令のうちの前記少なくとも１つが前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを示す、
をさらに備える、請求項９に記載の方法。
【請求項１２】
前記ロード命令が共有ロード命令を備え、前記ストア命令が共有ストア命令を備える、請求項１１に記載の方法。
【請求項１３】
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つを示す複数のアドレスポインタの１つまたは複数のビットを読み取ることをさらに備える、請求項９に記載の方法。
【請求項１４】
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つは、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが非共有状態にあることを示し、前記方法は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、
前記キャッシュ動作を実行したことに応答して、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが共有状態にあることを示すように、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを変更することと
をさらに備える、請求項９に記載の方法。
【請求項１５】
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つは、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが共有状態にあることを示し、前記方法は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、
前記キャッシュ動作を実行したことに応答して、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが、非共有共有状態にあることを示すように、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを変更することと
をさらに備える、請求項９に記載の方法。
【請求項１６】
前記第１のキャッシュおよび前記第２のキャッシュのうちの前記少なくとも１つのアドレス領域を判断するために、アドレスが記憶された１つまたは複数のレジスタを前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つのアドレスと比較することと、
前記アドレス領域が共有されているか共有されていないかを判断することと
をさらに備える、請求項１に記載の方法。
【請求項１７】
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つのダーティーバイトを判断することと、
キャッシュエビクションおよびキャッシュフラッシュのうちの少なくとも１つを実行することと、
前記キャッシュエビクションおよび前記キャッシュフラッシュのうちの前記少なくとも１つ中に前記ダーティーバイトのみをキャッシュまたはシステムメモリに書き込むことと
をさらに備える、請求項１に記載の方法。
【請求項１８】
前記第１のプロセッサを用いて、前記ストアウィズリリース動作を実行することが、
割込みを受信すること、レジスタ読取り、レジスタ書込み、およびプログラマブル遅延のうちの少なくとも１つに応答して、前記第１のプロセッサを用いて、前記第１のプロセッサの前記キャッシュをフラッシュすること
をさらに備える、請求項１に記載の方法。
【請求項１９】
前記第１のプロセッサを用いて、前記ストアウィズリリース動作を実行することが、
キャッシュプレッシャ、タイムアウト、および明示的ソフトウェアキャッシュメンテナンスのうちの少なくとも１つに応答して、前記第１のプロセッサを用いて、前記第１のキャッシュをフラッシュすること
をさらに備える、請求項１に記載の方法。
【請求項２０】
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが仮想的にタグ付けされる、請求項１に記載の方法。
【請求項２１】
前記ストアウィズリリース動作を実行することが、前記第１のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、
前記物理アドレスに基づいて、前記仮想アドレスを前記物理アドレスに変換した後に、前記第１のキャッシュの前記キャッシュラインをフラッシュすることと
をさらに備える、請求項１に記載の方法。
【請求項２２】
前記ロードウィズアクワイア動作を実行することが、前記第２のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、
前記物理アドレスに基づいて、前記仮想アドレスを前記物理アドレスに変換した後に、前記第２のキャッシュの前記キャッシュラインを無効にすることと
をさらに備える、請求項１に記載の方法。
【請求項２３】
第１のプログラマブルプロセッサを用いて、前記第１のプロセッサの第１のキャッシュのキャッシュラインに共有変数データを記憶するための手段と、
前記第１のプログラマブルプロセッサを用いて、ストアウィズリリース動作を実行するための手段と、
第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行するための手段と、
前記第２のプログラマブルプロセッサを用いて、前記第２のプログラマブルプロセッサのキャッシュから前記共有変数データの値をロードするための手段と
を備える装置。
【請求項２４】
前記ストアウィズリリース動作を実行するための前記手段は、
前記第１のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第１のキャッシュのキャッシュラインをフラッシュするための手段と、
前記第１のプログラマブルプロセッサを用いて、任意の前のストアが完了するのを待つための手段と
をさらに備える、請求項２３に記載の装置。
【請求項２５】
前記ロードウィズアクワイア動作を実行するための前記手段は、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のプログラマブルプロセッサのキャッシュラインを無効にするための手段と、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する第２のキャッシュのキャッシュラインを充填するための手段と、
前記第２のプログラマブルプロセッサを用いて、前記ロードウィズアクワイア動作が実行を完了するまで、後続の命令が発行されるのを防ぐための手段と
をさらに備える、請求項２３に記載の装置。
【請求項２６】
前記第２のプロセッサを用いて、前記第１のプログラマブルプロセッサの前記キャッシュをスヌープするための手段と、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データの更新された値に関連するキャッシュヒットを検出するための手段と、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記キャッシュヒットを検出したことに応答して、前記共有変数データの前記更新された値を前記第２のプログラマブルプロセッサの前記キャッシュに書き込むための手段と
をさらに備える、請求項２５に記載の装置。
【請求項２７】
第１のキャッシュを有する第１のプログラマブルプロセッサと、
第２のキャッシュを有する第２のプログラマブルプロセッサと
を備える装置であって、前記デバイスが、
前記第１のプログラマブルプロセッサを用いて、前記第１のプロセッサの前記第１のキャッシュのキャッシュラインに共有変数データを記憶することと、
前記第１のプログラマブルプロセッサを用いて、ストアウィズリリース動作を実行することと、
前記第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行することと、
前記第２のプログラマブルプロセッサを用いて、前記第２のプログラマブルプロセッサの前記キャッシュから前記共有変数データの値をロードすることと
を行うように構成された、装置。
【請求項２８】
前記ストアウィズリリース動作を実行するために、前記装置が、
前記第１のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第１のキャッシュのキャッシュラインをフラッシュすることと、
前記第１のプログラマブルプロセッサを用いて、任意の前のストアが完了するのを待つことと
を行うようにさらに構成された、請求項２７に記載の装置。
【請求項２９】
前記ロードウィズアクワイア動作を実行するために、前記装置は、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のプログラマブルプロセッサのキャッシュラインを無効にすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のキャッシュのキャッシュラインを充填することと、
前記第２のプログラマブルプロセッサを用いて、前記ロードウィズアクワイア動作が実行を完了するまで、後続の命令が発行されるのを防ぐことと
を行うようにさらに構成された、請求項２７に記載の装置。
【請求項３０】
前記装置が、
前記第２のプロセッサを用いて、前記第１のプログラマブルプロセッサの前記キャッシュをスヌープすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データの更新された値に関連するキャッシュヒットを検出することと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記キャッシュヒットを検出したことに応答して、前記共有変数データの前記更新された値を前記第２のプログラマブルプロセッサの前記キャッシュに書き込むことと
を行うようにさらに構成された、請求項２９に記載の装置。
【請求項３１】
前記ストアウィズリリース動作を実行するために、前記装置が、
前記第１のキャッシュよりも高いレベルを有する高レベルキャッシュ、システムメモリ、および前記第２のプロセッサの前記第２のキャッシュのうちの１つに前記共有変数データを書き込むこと
を行うようにさらに構成された、請求項２７に記載の装置。
【請求項３２】
前記第１のプロセッサが中央処理ユニット（ＣＰＵ）を備え、前記第２のプロセッサがグラフィックス処理ユニット（ＧＰＵ）を備える、請求項２７に記載の装置。
【請求項３３】
前記第１のプロセッサの前記キャッシュラインのすべておよび前記第２のプロセッサの前記キャッシュラインのすべてが共有され、
ここにおいて、前記ストアウィズリリース動作を実行するために、前記装置が、前記第１のプロセッサの前記キャッシュラインのすべてをフラッシュするようにさらに構成され、
ここにおいて、前記ロードウィズアクワイア動作を実行するために、前記装置が、前記第２の第１のプロセッサの前記キャッシュラインのすべてを無効にするようにさらに構成された、
請求項２７に記載の装置。
【請求項３４】
前記第１のプロセッサの前記キャッシュラインのすべての１サブセットが共有され、第２のプロセッサの前記キャッシュラインのすべてのうちの１サブセットが共有され、
ここにおいて、前記ストアウィズリリース動作を実行するために、前記装置が、前記第１のプロセッサの前記キャッシュラインの前記共有サブセットのみをフラッシュするようにさらに構成され、
ここにおいて、前記ロードウィズアクワイア動作を実行するために、前記装置が、前記第２のプロセッサの前記キャッシュラインのすべて前記共有サブセットのみを無効にするようにさらに構成された、
請求項２７に記載の装置。
【請求項３５】
前記第１のプロセッサの前記キャッシュラインの前記共有サブセットの少なくとも１つの共有ラインが第１の共有可能性属性によって示され、
ここにおいて、前記第２のプロセッサの前記キャッシュラインの前記共有サブセットの各共有ラインが第２の共有可能性属性によって示される、
請求項３４に記載の装置。
【請求項３６】
前記装置が、
キャッシュフィル動作を実行することと、
前記キャッシュフィル動作を実行したことに応答して、ページテーブルから前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つを読み取ることと
を行うようにさらに構成された、請求項３５に記載の装置。
【請求項３７】
前記装置は、
コンパイラが、ロード命令およびストア命令のうちの少なくとも１つを発行すること、ここにおいて、前記ロード命令および前記ストア命令のうちの前記少なくとも１つが前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを示す、
を行うようにさらに構成された、請求項３５に記載の装置。
【請求項３８】
前記ロード命令が共有ロード命令を備え、前記ストア命令が共有ストア命令を備える、請求項３７に記載の装置。
【請求項３９】
前記装置が、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つを示す複数のアドレスポインタの１つまたは複数のビットを読み取ることを行うようにさらに構成された、請求項３５に記載の装置。
【請求項４０】
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つは、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが非共有状態にあることを示し、前記装置は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、
前記キャッシュ動作を実行したことに応答して、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが共有状態にあることを示すように、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを変更することと
を行うようにさらに構成された、請求項３５に記載の装置。
【請求項４１】
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つは、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが共有状態にあることを示し、前記装置は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、
前記キャッシュ動作を実行したことに応答して、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが非共有共有状態にあることを示すように、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを変更することと
を行うようにさらに構成された、請求項３５に記載の装置。
【請求項４２】
前記装置は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの前記少なくとも１つのアドレス領域を判断するために、アドレスが記憶された１つまたは複数のレジスタを前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つのアドレスと比較することと、
前記アドレス領域が共有されているか共有されていないかを判断することと
を行うようにさらに構成された、請求項２７に記載の装置。
【請求項４３】
前記装置が、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つのダーティーバイトを判断することと、
キャッシュエビクションおよびキャッシュフラッシュのうちの少なくとも１つを実行することと、
前記キャッシュエビクションおよび前記キャッシュフラッシュのうちの前記少なくとも１つ中に前記ダーティーバイトのみをキャッシュまたはシステムメモリに書き込むことと
を行うようにさらに構成された、請求項２７に記載の装置。
【請求項４４】
前記第１のプロセッサを用いて、前記ストアウィズリリース動作を実行するために、前記装置が、
割込みを受信すること、レジスタ読取り、レジスタ書込み、およびプログラマブル遅延のうちの少なくとも１つに応答して、前記第１のプロセッサを用いて、前記第１のプロセッサの前記キャッシュをフラッシュすること
を行うようにさらに構成された、請求項２７に記載の装置。
【請求項４５】
前記第１のプロセッサを用いて、前記ストアウィズリリース動作を実行するために、前記装置が、
キャッシュプレッシャ、タイムアウト、および明示的ソフトウェアキャッシュメンテナンスのうちの少なくとも１つに応答して、前記第１のプロセッサを用いて、前記第１のキャッシュをフラッシュすること
を行うようにさらに構成された、請求項２７に記載の装置。
【請求項４６】
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが仮想的にタグ付けされる、請求項２７に記載の装置。
【請求項４７】
前記ストアウィズリリース動作を実行するために、前記装置が、
前記第１のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、
前記物理アドレスに基づいて、前記仮想アドレスを前記物理アドレスに変換した後に、前記第１のキャッシュの前記キャッシュラインをフラッシュすることと
を行うようにさらに構成された、請求項２７に記載の装置。
【請求項４８】
前記ロードウィズアクワイア動作を実行するために、前記装置が、前記第２のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、
前記物理アドレスに基づいて、前記仮想アドレスを前記物理アドレスに変換した後に、前記第２のキャッシュの前記キャッシュラインを無効にすることと
を行うようにさらに構成された、請求項２７に記載の装置。
【請求項４９】
実行されたとき、１つまたは複数のプロセッサに、
第１のプログラマブルプロセッサを用いて、前記第１のプロセッサの第１のキャッシュのキャッシュラインに共有変数データを記憶することと、
前記第１のプログラマブルプロセッサを用いて、ストアウィズリリース動作を実行することと、
第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行することと、
前記第２のプログラマブルプロセッサを用いて、前記第２のプログラマブルプロセッサのキャッシュから前記共有変数データの値をロードすることと
を行わせる命令を記憶した非一時的コンピュータ可読記憶媒体。
【請求項５０】
前記１つまたは複数のプロセッサに前記ストアウィズリリース動作を実行させる前記命令は、実行されたとき、前記１つまたは複数のプロセッサに、
前記第１のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第１のキャッシュのキャッシュラインをフラッシュすることと、
前記第１のプログラマブルプロセッサを用いて、任意の前のストアが完了するのを待つことと
を行わせる命令をさらに備える、請求項４９に記載の非一時的コンピュータ可読記憶媒体。
【請求項５１】
前記１つまたは複数のプロセッサに前記ロードウィズアクワイア動作を実行させる前記命令は、実行されたとき、前記１つまたは複数のプロセッサに、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のプログラマブルプロセッサのキャッシュラインを無効にすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する第２のキャッシュのキャッシュラインを充填することと、
前記第２のプログラマブルプロセッサを用いて、前記ロードウィズアクワイア動作が実行を完了するまで、後続の命令が発行されるのを防ぐことと
を行わせる命令をさらに備える、請求項４９に記載の非一時的コンピュータ可読記憶媒体。
【請求項５２】
実行されたとき、前記１つまたは複数のプロセッサに、
前記第２のプロセッサを用いて、前記第１のプログラマブルプロセッサの前記キャッシュをスヌープすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データの更新された値に関連するキャッシュヒットを検出することと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記キャッシュヒットを検出したことに応答して、前記共有変数データの前記更新された値を前記第２のプログラマブルプロセッサの前記キャッシュに書き込むことと
を行わせる命令をさらに備える、請求項４９に記載の非一時的コンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
[0001]  本出願は、その内容全体が参照により組み込まれる、２０１２年８月６日に出願された米国仮特許出願第６１／６８０，２０１号および２０１３年３月１５日に出願された米国仮特許出願第６１／８００，４４１号の利益を主張する。
【０００２】
[0002]  本開示は、異種コンピューティングに関係する技法を対象とし、より詳細には、異種コンピューティングにおけるキャッシュコヒーレンシ（cache coherency）に関係する技法を対象とする。
【背景技術】
【０００３】
[0003]  最近、複数のプロセッサが１つのシステムに相互接続される、いわゆる異種コンピューティングへの動きがある。いくつかの事例では、タスクがプロセッサの間で共有され得る。ジョブのうちのいくつかは、中央処理ユニット（ＣＰＵ）、グラフィックス処理ユニット（ＧＰＵ：graphics processing unit）、またはデジタル信号プロセッサ（ＤＳＰ）など、特定のタイプのプロセッサにより良く適し得る。異種タスクを実行することに関与する各プロセッサは、１つまたは複数のキャッシュを有し得る。各キャッシュは、複数のプロセッサの間で共有される変数データのコピーを含み得る。キャッシュは、キャッシュされたデータを、プロセッサの１つまたは複数の実行ユニットにとってより迅速にアクセス可能にすることによって、プロセッサがプログラム実行の速度を上げることを可能にし得る。１つのプロセッサが、システムのプロセッサの２つ以上のキャッシュの間で共有される共有変数データ（shared variable data）にアクセスするとき、プロセッサキャッシュに記憶された共有変数データのコピーがシステムのすべてのプロセッサの間で一貫していることと、共有変数データの変更が、タイムリーで一貫した形で、これらの変数を共有しているすべてのプロセッサにとって観測可能にされることとを、「キャッシュコヒーレンシシステム（cache coherency system）」と呼ばれる機構が保証する。
【発明の概要】
【０００４】
[0004]  概して、本開示で説明する技法は、場合によっては異なるタイプの複数のプロセッサコアを含むマルチコアコンピューティングシステム、たとえば、異種コンピューティングシステムにおいて、キャッシュコヒーレンシ、すなわち、複数のキャッシュおよびシステムメモリの間でのデータ一貫性（data consistency）を維持するための技法を対象とする。本開示の技法の１つによれば、中央処理ユニット（ＣＰＵ）、グラフィックス処理ユニット（ＧＰＵ）、デジタル信号プロセッサ（ＤＳＰ）、または別のタイプの処理コアが、マルチコアコンピューティングシステムのプロセッサのすべての間で共有される変数を取得するかまたは変数に書き込むとき、命令を実行し得る。（「プロセッサ（processor）」と呼ばれる）プロセッサコアが共有変数データにアクセスしようと試みるとき、プロセッサコアは、共有変数データに適用されるいかなる動作も順序付きコヒーレント方式で行われることを保証するために、ロードウィズアクワイア動作（load-with-acquire operation）および／またはストアウィズリリース動作（store-with-release operation）など、同期動作（synchronization operation）を実行し得る。
【０００５】
[0005]  マルチコアシステム中のプロセッサの一部または全部がキャッシュを含み得る。キャッシュは、頻繁に使用されるデータのローカルワーキングセットを備え得る。場合によっては、キャッシュは、マルチコアシステムの１つまたは複数の他のプロセッサの間で共有される共有変数データのローカルコピーを含み得る。本開示の技法によれば、他のプロセッサの各々は、同様に、共有変数データのローカルコピーを含むキャッシュを含み得る。
【０００６】
[0006]  複数のプロセッサ、たとえば、第１のプロセッサと第２のプロセッサとをもつマルチコアシステムにおいて、第１のプロセッサは一部の共有変数データの値を変更し得る。第１のプロセッサは、次いで、共有変数データの値をフラッシュ（flush）し得る。共有変数データをフラッシュすることは、第１のプロセッサに、更新された共有変数データ値を、たとえばシステムメモリに、書き込ませ得る。他のプロセッサが共有変数データの更新された値を参照することを保証するために、キャッシュフラッシュ（cache flush）に応答して、第１または第２のプロセッサは、第２のプロセッサのキャッシュ中の共有変数データに対応するキャッシュエントリ（cache entry）を無効にし得る。第２のプロセッサが、共有変数データの値を前に含んでいたキャッシュライン（cache line）を読み取るとき、キャッシュラインは無効とマークされる。第２のプロセッサのキャッシュラインが無効とマークされるので、第２のプロセッサは、第２のプロセッサのキャッシュから共有変数データの古い値（outdated value）を読み取るのではなく、システムメモリから共有変数データの新しい値を取り出し、共有変数データに対応する第２のプロセッサのキャッシュを更新する。このようにして、本開示の技法は、キャッシュ無効化およびフラッシュの使用によって、共有変数データがコヒーレントであることを保証する。
【０００７】
[0007]  一例では、方法は、第１のプログラマブルプロセッサを用いて、第１のプロセッサの第１のキャッシュのキャッシュラインに共有変数データを記憶することと、第１のプログラマブルプロセッサを用いて、ストアウィズリリース動作を実行することと、第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行することと、第２のプログラマブルプロセッサを用いて、第２のプログラマブルプロセッサのキャッシュから共有変数データの値をロードすることとを含む。
【０００８】
[0008]  別の例では、本開示は、第１のキャッシュを有する第１のプログラマブルプロセッサと、第２のキャッシュを有する第２のプログラマブルプロセッサとを含むデバイスについて説明し、ここにおいて、本デバイスは、第１のプログラマブルプロセッサを用いて、第１のプロセッサの第１のキャッシュのキャッシュラインに共有変数データを記憶することと、第１のプログラマブルプロセッサを用いて、ストアウィズリリース動作を実行することと、第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行することと、第２のプログラマブルプロセッサを用いて、第２のプログラマブルプロセッサのキャッシュから共有変数データの値をロードすることとを行うように構成される。
【０００９】
[0009]  別の例では、本開示は、第１のプログラマブルプロセッサを用いて、第１のプロセッサの第１のキャッシュのキャッシュラインに共有変数データを記憶するための手段と、第１のプログラマブルプロセッサを用いて、ストアウィズリリース動作を実行するための手段と、第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行するための手段と、第２のプログラマブルプロセッサを用いて、第２のプログラマブルプロセッサのキャッシュから共有変数データの値をロードするための手段とを含むデバイスについて説明する。
【００１０】
[0010]  別の例では、本開示は、実行時に、第１のプログラマブルプロセッサを用いて、第１のプロセッサの第１のキャッシュのキャッシュラインに共有変数データを記憶することと、第１のプログラマブルプロセッサを用いて、ストアウィズリリース動作を実行することと、第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行することと、第２のプログラマブルプロセッサを用いて、第２のプログラマブルプロセッサのキャッシュから共有変数データの値をロードすることとを、プログラマブルプロセッサに行わせる命令を記憶した非一時的コンピュータ可読記憶媒体（non-transitory computer-readable storage medium）について説明する。
【００１１】
[0011]  １つまたは複数の例の詳細を添付の図面および以下の説明に記載する。他の特徴、目的、および利点は、その説明および図面、ならびに特許請求の範囲から明らかになろう。
【図面の簡単な説明】
【００１２】
【図１】[0012]  本開示で説明する１つまたは複数の例による、マルチコアコンピューティングシステムの例を示すブロック図。
【図２】[0013]  グラフィックス処理ユニット（ＧＰＵ）がオンデマンドキャッシュコヒーレンスをサポートすることを可能にする命令を実行することが可能なグラフィックス処理パイプラインを実装し得るＧＰＵの別の例を示すブロック図。
【図３Ａ】[0014]  キャッシュ無効化およびフラッシュ命令を含み得る、ＧＰＵカーネル中の同期動作を実行するように構成されたＧＰＵを示す概念図。
【図３Ｂ】[0015]  同期動作のための命令をＧＰＵカーネルに挿入するコンパイラ／ドライバを示す概念図。
【図４Ａ】[0016]  陳腐な共有変数（stale）を含んでいるキャッシュを示す概念図。
【図４Ｂ】[0017]  無効とマークされたキャッシュラインから読み取ることにより、メインメモリからキャッシュを更新することを示す概念図。
【図５Ａ】[0018]  陳腐な共有変数を含んでいるメインメモリを示す概念図。
【図５Ｂ】[0019]  キャッシュフラッシュを実行した後のシステムメモリの状態を示す概念図。
【図６】[0020]  本開示の技法による、ＧＰＵおよびＣＰＵのキャッシュおよびメモリ管理ユニットを示す概念図。
【図７】[0021]  本開示の技法による、属性ビットを実装するキャッシュラインを示す概念図。
【図８】[0022]  本開示の技法による、ＧＰＵキャッシュを示す概念図。
【図９】[0023]  本開示で説明する１つまたは複数の例による、マルチコアシステムにおいてキャッシュコヒーレンシを維持するためのプロセスを示すフローチャート。
【発明を実施するための形態】
【００１３】
[0024]  最近、複数のプロセッサまたはプロセッサコア（「コア（core）」）が１つのシステムに相互接続されるいわゆる異種コンピューティングへの動きがある。しかしながら、異種コンピューティングシステムに関連する多くの課題がある。いくつかのコアは特定のタスクに適し得る。一例として、ＣＰＵは、かなりの量の条件付きロジック（たとえば、ブランチおよびジャンプ）をもつプログラムを実行することにより適し得る。グラフィックス処理ユニット（ＧＰＵ）など、他のプロセッサは、ベクトル処理など、超並列演算、および浮動小数点演算を実行することにより適し得る。さらに、デジタル信号プロセッサ（ＤＳＰ）など、他のプロセッサは、デジタル信号処理など、特定の数学演算を実行することを含み得る特定の適用例に適し得る。そのような演算としては、高速フーリエ変換（ＦＦＴ）、および離散コサイン変換（ＤＣＴ：discrete cosine transform）があり得る。
【００１４】
[0025]  ますます、ＧＰＵなど、Ｉ／Ｏ処理コアの能力は、より汎用なＣＰＵの機能と同様の機能を含むように増強された。多くのＧＰＵは、ブランチおよびジャンプなど、条件付きロジックを含むより汎用なアプリケーションを実行する能力を含む。さらに、Ｋｈｒｏｎｏｓ  ＧｒｏｕｐによるＯｐｅｎＣＬまたはマイクロソフトによるＤｉｒｅｃｔＣｏｍｐｕｔｅなど、汎用コンピューティング言語はアプリケーションプログラミングインターフェース（ＡＰＩ：application programming interface）を提供し、ＡＰＩは、プログラムがそのような汎用コンピューティング言語と互換性がある処理コア上で実行することが可能であるように、プログラマーが１つの言語で単一のプログラムを書くことを可能にし得る。
【００１５】
[0026]  プログラミング言語における進歩とＧＰＵおよびＤＳＰなどのプロセッサの処理能力の増大とにもかかわらず、異種マルチコアコンピューティングはいくつかの課題を依然として提示する。１つのそのような課題は、共有変数データなど、異種コンピューティングシステムの複数のコアの間で共有されるデータが、プロセッサの間でコヒーレントのままであることを保証することである。本開示の技法は、共有変数の変更がシステムのプロセッサのすべての間で、タイムリーで、順序付けられた形で伝搬（propagate）されることを保証する、キャッシュコヒーレンシシステムを対象とする。
【００１６】
[0027]  図１は、本開示で説明する１つまたは複数の例による、マルチコアコンピューティングシステムの例を示すブロック図である。図１に、ＣＰＵ１６と、ＧＰＵ２０と、ＤＳＰ２４とを含む異種マルチコアシステム２を示す。分割不可能なユニットであるものとして示されたＣＰＵ１６、ＧＰＵ２０、およびＤＳＰにかかわらず、ＣＰＵ１６、ＧＰＵ２０、およびＤＳＰ２４の各々は、複数のプロセッサおよび／または複数のプロセッサコアを表し得る。一例として、マルチコアシステム２は、複数のＣＰＵ、ＧＰＵ、ＤＳＰ、および／または他のタイプのプロセッサを有し得る。ＣＰＵ１６はキャッシュ１８を含み、ＧＰＵ２０はキャッシュ２２を含み、ＤＳＰ２４はキャッシュ２６を含む（まとめて「キャッシュ１８、２２、および２６」）。キャッシュ１８、２２、および２６は、システムメモリ１４から命令および／またはデータを取り出すことに関連する命令データの高速取出しのために、頻繁に使用される命令および／またはデータを各々記憶し得る。キャッシュ１８、２２、および２６は命令および／またはデータを含み得るが、本開示の技法は、共有データのキャッシュコヒーレンシを対象とし、共有命令を対象としない。したがって、本開示は、キャッシュ１８、２２、および２６からの共有変数など、データのみの取出しおよび記憶に関する。キャッシュ１８、２２、および２６の各々は、レベル１（「Ｌ１」）キャッシュ、およびレベル２（「Ｌ２」）キャッシュなど、１つまたは複数の「レベル（level）」のキャッシュを含み得る。Ｌ１キャッシュは、Ｌ２キャッシュと同じくらいのデータを保持することができないことがあるが、プロセッサは、Ｌ２キャッシュよりも迅速に（すなわち、より小さいアクセスレイテンシ（ccess latency）で）Ｌ１から読み取り、Ｌ１に書き込み得る。
【００１７】
[0028]  ＣＰＵ１６、ＧＰＵ２０、およびＤＳＰ２４は、たとえばシステムバスを介して、システムメモリ１４に接続される。システムメモリ１４は、いくつかの共有変数データ２８を含み得るダイナミックランダムアクセスメモリ（ＤＲＡＭ）を備え得る。共有変数データ２８は、たとえば、共有された命令語、変数、バッファ、データ構造、ジョブなどを備え得る。ＣＰＵ１６、ＧＰＵ２０、およびＤＳＰ２４は、分割不可能なユニットであるものとして示されているが、システムメモリ１４は、１つまたは複数の（「チップ（chip）」とも呼ばれる）物理集積回路を備え得る。システムメモリ１４は、システムメモリ１４とは別個であり、ＣＰＵ１６、ＧＰＵ２０、およびＤＳＰ２４の各々の間で共有される（すなわち、各々によってアクセス可能な）レベル３（「Ｌ３」）キャッシュなど、別のレベルのキャッシュをも含み得る。
【００１８】
[0029]  本開示の技法は、異種コアおよび／またはプロセッサ（たとえば、ＣＰＵ１６、ＧＰＵ２０、およびＤＳＰ２４）からなり得るマルチコアシステム２が、マルチコアシステム２のコアにわたるキャッシュコヒーレンシを維持するために、同期動作に応答してキャッシュ管理を実行することを可能にする。同期動作は、いわゆる明示的完全および部分バリア（partial barrier）、フェンス（fence）、ならびにロード（store）およびストア（store）と完全および部分バリアとの複合形態を備え得る。いくつかの例では、同期動作は、ストアウィズリリース（store-with-release）およびロードウィズアクワイア（load-with-acquire）動作を含み得る。
【００１９】
[0030]  本開示の技法は、キャッシュ１８、キャッシュ２２、およびキャッシュ２６のうちの１つまたは複数にそれの様々なコピーが記憶され得る共有変数データ２８の変更が、マルチコアシステム２の他のプロセッサ（すなわち、ＣＰＵ１６、ＧＰＵ２０、およびＤＳＰ２４）のキャッシュに伝搬されることを可能にする。ＣＰＵ１６、ＧＰＵ２０、およびＤＳＰ２４が「オンデマンドキャッシュコヒーレンスモデル（on-demand cache coherence model）」と呼ばれるキャッシュコヒーレンスモードを実装することを可能にするために。オンデマンドキャッシュコヒーレンスモデルでは、共有変数データ２８を読み取りまたは書き込むプロセッサ、たとえば、ＧＰＵ２０が、共有変数データ２８に関連するストアウィズリリース動作および／またはロードウィズアクワイア動作を実行することなど、同期動作を実行し得る。マルチコアシステム２の他のプロセッサ、ＣＰＵ１６、およびＤＳＰ２４も、共有変数データ２８を読み取りまたは書き込むことに関連するとき、ストアウィズリリース動作および／またはロードウィズアクワイア動作を実行し得る。
【００２０】
[0031]  ストアウィズリリース動作およびロードウィズアクワイア動作は、メモリ順序付けモデル（memory ordering model）を定義するために使用され得る（「同期動作（synchronization operation）」とも呼ばれる）アトミック動作（atomic operation）である。アトミック動作は、コンピューティングシステムの残部（たとえば、コア、プロセッサ、メモリなど）にとって、あたかもそれが瞬時に行われたかのように見える動作である。ロードウィズアクワイアおよびストアウィズリリース同期動作を実行するとき、プロセッサは、アクワイア／リリースメモリモデル・セマンティクス（acquire / release memory model semantics）を表すためにロードおよびストアを部分バリアと組み合わせる。Ｃ＋＋１１規格は、アクワイア／リリースメモリモデルの一実装形態を定義するプログラミング言語の一例である。
【００２１】
[0032]  ロードウィズアクワイア動作およびストアウィズリリース動作に関連するセマンティクスおよび制約は、第１のスレッド（thread）中の共有変数データ２８など、共有変数からの読取りが、第２のスレッド中の同じ共有変数に対する書込みが完了した後に行われることを保証するために、すなわち、共有変数の読取りと書込みとの間の依存性または順序付けを強制するために使用され得る。特に、アクワイア／リリースモードは、ロードウィズアクワイア動作を使用した第１のスレッド中の共有変数に対する読取りが、第２のスレッド中の同じ共有変数に対してストアウィズリリース動作を実行した後に行われるように、読取り／書込み依存性をエンフォース（enforce）する。
【００２２】
[0033]  本開示のオンデマンドキャッシュコヒーレンシ技法は、アクワイア／リリースメモリ順序付きモデルを実装するために、複数のプロセッサが同期動作、たとえば、ロードウィズアクワイア動作およびストアウィズリリース動作を実行することを可能にするために、たとえば、異種マルチコアシステム２において利用され得るキャッシュコヒーレンシ技法について説明する。第１のプロセッサコア、たとえば、ＧＰＵ２０が、共有変数データ２８を読み取り、同期動作を実行するときはいつでも、ＧＰＵ２０または別のプロセッサが、共有変数データ２８の値を含んでいる第２のコアのキャッシュの少なくとも一部分（「キャッシュライン（cache line）」と呼ばれる）、たとえば、ＣＰＵ１６のキャッシュ１８の１つまたは複数のラインを無効にし得るように、本開示のオンデマンドコヒーレンシモデルは機能する。ＧＰＵ２０は、同期動作を実行することの一部として、キャッシュ１８のキャッシュラインの無効化を自動的に引き起こし得る。
【００２３】
[0034]  代替的に、プログラムコードがロードウィズアクワイア動作およびストアウィズリリース動作を含むとき、コンパイラ３０など、コンパイラがキャッシュ２２の無効化を自動的に引き起こし得る。コンパイラ３０は、ドライバおよび／またはコンパイラを備え得、ＣＰＵ１６、ＧＰＵ２０、およびＤＳＰ２４のうちの１つまたは複数のためのコードを生成、コンパイル、および／または修正し得る。いくつかの例では、コンパイラ３０は、ＣＰＵ１６、ＧＰＵ２０、およびＤＳＰ２４のうちの１つまたは複数を実行するオペレーティングシステムのアプリケーションまたはプロセスであり得る。コンパイラ３０は、同期動作を含むコード中のロケーションにおいてコンパイル時または実行時に低レベルキャッシュ無効化命令をプログラムコード中に挿入することによって、キャッシュ無効化を自動的に引き起こし得る。第２のコアは、次いで、キャッシュ無効化命令を含む修正されたコードを実行する。第１のコアが共有変数データ２８を含んでいるキャッシュ１８のキャッシュラインを無効にすると、ＣＰＵ１６は、次いで、システムから（たとえば、システムメモリ１４、高レベルキャッシュ、または別のプロセッサのキャッシュから）共有データの新しいコピーを取得し、それにより、ＣＰＵ１６が読み取る共有変数データ２８の値が「陳腐（stale）」でないまたは古く（outdated）ないことを保証する。
【００２４】
[0035]  ＣＰＵ１６など、プロセッサがロードウィズアクワイア動作を実行するとき、ＣＰＵ１６は、たとえば、キャッシュ１８の、共有変数データ２８を含んでいるキャッシュラインを無効にし得る。ＣＰＵ１６が無効なキャッシュラインから読み取ることを試みるとき、キャッシュミスが発生し、ＣＰＵ１６は、次いで、無効にされたキャッシュラインの新しい値をキャッシュ１８に読み込み、共有変数データ２８のダーティー値（dirty value）をマージする。このようにして、ロードウィズアクワイア動作は、ロードウィズアクワイア動作を実行することの一部としてロードされた値が、現在、メモリ階層、たとえば、システムメモリ１４、キャッシュ１８、キャッシュ２２、およびキャッシュ２６における最も最新（most up-to-date）の値であることを保証する。
【００２５】
[0036]  上記で説明したように、ストアウィズアクワイア動作は、第２のプロセッサが共有変数のロードを実行する前に、第１のプロセッサが共有変数値のストアを実行することを完了することを保証するために、ロードウィズアクワイア動作とペアリングされ得る。ストアの後にロードが実行することを保証するために、ＣＰＵ１６または別のプロセッサは、ＧＰＵ２０が実行するロードウィズアクワイア命令など、ストアウィズリリース動作に続く命令に同期ビットを付加し得る。後続の命令に同期ビットを付加することは、事実上、ＣＰＵ１６が実行し始めたすべての前のストアが完了するまで後続の命令が出ないバリアを、ＣＰＵ１６に実行させる。
【００２６】
[0037]  プロセッサは、オンデマンドキャッシュコヒーレンスを実装するプロセッサと相互動作するためにオンデマンドキャッシュコヒーレンスを実装する必要がない。むしろ、Ｉ／Ｏコヒーレンス、すなわち、何らかの形態のキャッシュコヒーレンスをサポートするプロセッサは、ロードウィズアクワイア命令およびストアウィズリリース命令を使用して実装され得るオンデマンドキャッシュコヒーレンスを実装するプロセッサと対話し得る。たとえば、システム２のいくつかのプロセッサはオンデマンドキャッシュコヒーレンスをサポートし得、他は、ＭＥＳＩ（修正、排他、共有、無効：Modified, Exclusive, Shared, Invalid）プロトコル、およびＭＯＥＳＩ（修正、所有、排他、共有、無効：Modified, Owned, Exclusive, Shared, Invalid）プロトコルなど、より旧式のキャッシュコヒーレンシプロトコルをサポートし得る。いくつかの例では、キャッシュなしのプロセッサが、オンデマンドキャッシュコヒーレントプロセッサと相互動作し得る。
【００２７】
[0038]  一例として、ＣＰＵ１６など、プロセッサは、本開示の技法によるオンデマンドキャッシュコヒーレンシを実装し得ないが、Ｉ／Ｏコヒーレンスまたはキャッシュコヒーレンスを実装し得る。ＣＰＵ１６は非キャッシュであり得、すなわち、キャッシュを含み得ず、または、ＭＥＳＩまたはＭＯＥＳＩなど、別のキャッシュコヒーレンスプロトコルを実装し得る。ＧＰＵ２０および／またはＤＳＰ２４は、オンデマンドキャッシュコヒーレンスを実装し得、ＣＰＵ１６が何らかの形態のＩ／Ｏコヒーレンスをサポートする限り、ＣＰＵ１６と相互動作し得る。
【００２８】
[0039]  本開示の技法によれば、第１のプロセッサおよび第２のプロセッサは、アクワイア／リリースメモリ順序付けモデルを実装するために、オンデマンドキャッシュコヒーレンシと呼ばれる様々なキャッシュ管理技法を実行し得る。本開示の技法による一例として、第１のプログラマブルプロセッサ、たとえばＣＰＵ１６は、キャッシュ１８のキャッシュラインに共有変数データを記憶し得る。ＣＰＵ１６は、次いで、ストアウィズリリース動作を実行し得る。第２のプロセッサ、たとえばＧＰＵ２０は、ロードウィズアクワイア動作を実行し得る。第２のプロセッサは、次いで、ＧＰＵ２０のキャッシュ、たとえばキャッシュ２２から共有変数データの値をロードし得る。
【００２９】
[0040]  様々な他の実施例では、ストアウィズリリース動作がキャッシュフラッシュを生じさせないことがある。むしろ、コンパイラまたはドライバは、ＣＰＵ１６に共有変数データ２８の更新された値に対応するキャッシュラインをフラッシュさせる、キャッシュフラッシュ命令プログラムの実行を挿入し得る。ＣＰＵ１６は、また、キャッシュプレッシャ、タイムアウト、および明示的ソフトウェアキャッシュメンテナンスのうちの少なくとも１つに応答して、キャッシュ１８をフラッシュし得る。別の例では、ＣＰＵ１６は、割込みの受信、レジスタ読取り、レジスタ書込み、およびプログラマブル遅延のうちの少なくとも１つに応答して、ストアウィズリリース動作を実行し得る。
【００３０】
[0041]  いくつかの例では、ストアウィズリリース動作はさらに、他のプロセッサのキャッシュラインにスヌープ（snoop）することと、共有変数データ２８を含んでいるキャッシュラインを更新することとよって、ＣＰＵ１６または別のプロセッサに、共有変数データ２８の古い値を含んでいる別のプロセッサの１つまたは複数のキャッシュライン、たとえば、キャッシュ２２またはキャッシュ２６を無効にさせ得る。また、コンパイラまたはドライバは、ＣＰＵ１６またはＧＰＵ２０に共有変数データ２８の古い値に対応するキャッシュ２２のラインを無効にさせる、キャッシュ無効化命令を挿入し得る。
【００３１】
[0042]  いくつかの例では、マルチコアシステム２中のいくつかのプロセッサは、他のプロセッサに対して可視（visible）であるキャッシュを有し得ない。それにもかかわらず、これらのプロセッサは、可視キャッシュを有するプロセッサから共有変数の最新の値を読み取るための能力を含み得る。また、可視キャッシュを有しないこれらのプロセッサは、書込み動作を介して新しい値を共有変数に与え得る。本開示の技法によれば、非可視キャッシュをもつプロセッサの書込みは、すでに観測された共有変数データ２８に対するシステムにおけるすべての書込みの後ろにスケジュールされ得る。可視キャッシュを有しないプロセッサが上述の方法で読み取ることおよび書き込むことを可能にする機構は、一般に、ＩＯキャッシュコヒーレンシと呼ばれる。
【００３２】
[0043]  代替例では、第１のプロセッサは、また、ストアウィズリリースに関連する書込み動作から値を一時的にバッファまたはキャッシュし、正しいセマンティクスを依然として維持しながら、後でその値をシステムメモリ（たとえば、高レベルのキャッシュ、別のプロセッサのキャッシュ、またはシステムメモリ）に書き込むことを選択し得る。
【００３３】
[0044]  本開示の技法によれば、ＣＰＵ１６は、キャッシュ１８のキャッシュラインに共有変数データ２８を記憶するように構成され得る。ＣＰＵ１６は、ストアウィズリリース動作を実行するようにさらに構成され得る。ＧＰＵ２０など、第２のプログラマブルプロセッサは、ロードウィズアクワイア動作を実行するように構成され得る。ＧＰＵ２０はさらに、ＧＰＵ２０のキャッシュ２２から共有変数データ２８の値をロードし得る。
【００３４】
[0045]  同期動作、たとえば、ストアウィズリリース動作に応答して、ＣＰＵ１６は、共有変数データ２８に関連するキャッシュ１８のキャッシュラインをフラッシュし得る。第２のプログラマブルプロセッサ、たとえば、第２のキャッシュ２２を有するＧＰＵ２０は、次いでロードウィズアクワイア動作を実行し得、それにより、ロードウィズアクワイア動作が実行を完了した後にロード命令が発行されることを保証する。ロードウィズアクワイア動作は、また、共有変数データ２８に対応するキャッシュ２２のキャッシュラインを無効にし、別のキャッシュまたはシステムメモリ１４からのキャッシュフィルを生じさせ得る。ロードウィズアクワイア動作の実行に続くロードは、ＧＰＵ２０のキャッシュ２２から共有変数データ２８の最新の値を読み取ることになる。
【００３５】
[0046]  図２は、本開示で説明する１つまたは複数の例による、グラフィックス処理ユニット（ＧＰＵ）がオンデマンドキャッシュコヒーレンスをサポートすることを可能にする命令を実行することが可能なグラフィックス処理パイプラインを実装し得るＧＰＵの別の例を示すブロック図である。図２に、ＧＰＵ１２と、システムメモリ１４と、キャッシュ１８をさらに含むＣＰＵ１６とを含むマルチコアシステム２を示す。マルチコアシステム２を含み得るデバイスの例としては、限定はしないが、モバイルワイヤレス電話、ビデオ表示を含むビデオゲームコンソール、モバイルビデオ会議ユニット、ラップトップコンピュータ、デスクトップコンピュータ、タブレットコンピュータ、テレビジョンセットトップボックスなどがあり得る。
【００３６】
[0047]  ＣＰＵ１６は、様々なタイプのアプリケーションを実行し得る。アプリケーションの例としては、ウェブブラウザ、電子メールアプリケーション、スプレッドシート、ビデオゲーム、または表示のために閲覧可能オブジェクトを生成する他のアプリケーション、ならびに汎用コンピューティングジョブがあり得る。１つまたは複数のアプリケーションの実行のための命令は、システムメモリ１４内に記憶され得る。ＣＰＵ１６は、処理ジョブ、ならびに生成された閲覧可能オブジェクトのグラフィックスデータをさらなる処理のために、ＧＰＵ２０に送信し得る。
【００３７】
[0048]  たとえば、ＧＰＵ２０は、グラフィックスデータを処理するため、ならびに様々なシミュレーションおよび数学的集約ジョブなど、並列可能タスクのためにうまく機能する超並列処理を可能にする専用ハードウェアであり得る。このようにして、ＣＰＵ１６は、ＧＰＵ２０によってより良く扱われる処理をオフロード（offload）し得る。ＣＰＵ１６は、特定のＡＰＩに従ってＧＰＵ２０と通信し得る。そのようなＡＰＩの例としては、マイクロソフト（登録商標）によるＤｉｒｅｃｔＸ（登録商標）ＡＰＩ、およびＫｈｒｏｎｏｓ  ＧｒｏｕｐによるＯｐｅｎＧＬ（登録商標）があるが、本開示の態様は、ＤｉｒｅｃｔＸ  ＡＰＩおよびＯｐｅｎＧＬ  ＡＰＩに限定されず、開発されたか、現在開発されているか、または将来開発される他のタイプのＡＰＩに拡張され得る。
【００３８】
[0049]  ＧＰＵ２０がそのようにＣＰＵ１６からグラフィックスデータを受信すべきである方法を定義することに加えて、ＡＰＩは、ＧＰＵ２０が実装すべき特定のグラフィックス処理パイプラインを定義し得る。パイプラインセットアップのいくつかの態様は、ＧＰＵドライバと、コンパイラ３０など、ＣＰＵ１６上で実行しているシェーダコードコンパイラとによって扱われ得る。ＧＰＵドライバは、ＣＰＵ１６上で実行しているアプリケーションとは別個であり得る。ドライバは、一般にＣＰＵ１６およびＧＰＵ２０上で実行される、Ｗｉｎｄｏｗｓ（登録商標）またはＬｉｎｕｘ（登録商標）など、オペレーティングシステムとの間の相互作用（interaction）を処理し得る。シェーダコードコンパイラは、ＯｐｅｎＣＬまたはＤｉｒｅｃｔＣｏｍｐｕｔｅなど、言語で書かれたコードを、ＧＰＵ２０が解釈し、実行し得るアセンブリ命令にコンパイルし得る。ＧＰＵ２０は、図１において、Ｄｉｒｅｃｔ３Ｄ  １１  ＡＰＩによって定義されたグラフィックス処理パイプラインを示す。ＧＰＵ２０のパイプラインについて、ＤｉｒｅｃｔＸパイプラインに関して説明するが、ＧＰＵ２０は、ＯｐｅｎＧＬ４．ｘパイプラインまたは別のグラフィックスパイプラインにも従って実装され得る。
【００３９】
[0050]  ＣＰＵ１６およびＧＰＵ２０の例としては、限定はしないが、デジタル信号プロセッサ（ＤＳＰ）、汎用マイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブル論理アレイ（ＦＰＧＡ）、あるいは他の等価な集積回路またはディスクリート論理回路がある。いくつかの例では、ＧＰＵ２０は、グラフィックス処理に好適な超並列処理能力をＧＰＵ２０に与える集積回路および／またはディスクリート論理回路を含む専用ハードウェアであり得る。いくつかの事例では、ＧＰＵ２０は、汎用処理をも含み得、汎用ＧＰＵ（ＧＰＧＰＵ：general purpose GPU）と呼ばれることがある。本開示で説明する技法は、ＧＰＵ２０がＧＰＧＰＵである例にも適用可能であり得る。
【００４０】
[0051]  システムメモリ１４は１つまたは複数のコンピュータ可読記憶媒体を備え得る。システムメモリ１４の例としては、限定はしないが、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、電気消去可能プログラマブル読取り専用メモリ（ＥＥＰＲＯＭ（登録商標））、フラッシュメモリ、あるいは命令および／またはデータ構造の形態で所望のプログラムコードを搬送または記憶するために使用され得、コンピュータまたはプロセッサによってアクセスされ得る任意の他の媒体がある。上記で説明したように、システムメモリ１４は１つまたは複数のレベルのキャッシュをも含み得る。
【００４１】
[0052]  いくつかの態様では、システムメモリ１４は、共有変数データ２８に関連する同期動作を実行するための命令など、本開示におけるＣＰＵ１６およびＧＰＵ２０に起因する機能を実行することをＣＰＵ１６および／またはＧＰＵ２０に行わせる命令を含み得る。いくつかの例では、命令は、キャッシュ、たとえばキャッシュ１８またはキャッシュ２２に、キャッシュ無効化および／またはキャッシュフラッシングを実行させ得る、ロードウィズアクワイア動作およびストアウィズリリース動作を含み得る。したがって、システムメモリ１４は、１つまたは複数のプロセッサ、たとえば、ＣＰＵ１６およびＧＰＵ２０に様々な機能を実行させる命令を備えるコンピュータ可読記憶媒体であり得る。
【００４２】
[0053]  システムメモリ１４は、いくつかの例では、非一時的記憶媒体と見なされ得る。「非一時的（non-transitory）」という用語は、記憶媒体が、搬送波または伝搬信号では実施されないことを示し得る。ただし、「非一時的」という用語は、システムメモリ１４が非可動であることを意味するものと解釈されるべきでない。一例として、システムメモリ１４は、マルチコアシステム２のデバイスから取り外され、別のデバイスに移され得る。別の例として、システムメモリ１４と実質的に同様のシステムメモリが、マルチコアシステム２のデバイスに挿入され得る。いくつかの例では、非一時的記憶媒体は、経時的に変動し得るデータを（たとえば、ＲＡＭに）記憶し得る。
【００４３】
[0054]  ＣＰＵ１６上でのアプリケーションの実行は、ＣＰＵ１６にＧＰＵ２０上での実行のためのジョブ、プロセスまたはスレッドを生成させる。ジョブは、ＧＰＵ２０の１つまたは複数のコアまたは実行ユニット上で実行し得る。さらに、ＧＰＵ２０は、また、閲覧可能コンテンツを一緒に形成する複数のプリミティブ（primitive）をレンダリングし得る。プリミティブの例としては、点、線、三角形、正方形、または他のタイプの多角形がある。ＣＰＵ１６は、これらのプリミティブをそれらのそれぞれの頂点によって定義し得る。たとえば、ＣＰＵ１６は頂点についての座標と色値とを定義し得る。座標値は３次元（３Ｄ）座標または２Ｄ座標であり得る。
【００４４】
[0055]  ＧＰＵ２０は、グラフィカル出力をレンダリングするのではなくＧＰＧＰＵプログラムまたは「カーネル（kernel）」を実行するために、ＧＰＵ２０の浮動小数点ユニットなどの機能ユニット、シェーダ、キャッシュなどを利用し得る。図２に示されたグラフィックスパイプラインは３Ｄグラフィックス処理パイプラインである。しかしながら、本開示の技法は、ＧＰＧＰＵパイプラインを含む任意のタイプのパイプライン、またはＧＰＵ２０上で実行しているアプリケーション上での使用のために適用可能である。グラフィックス処理パイプラインは、ＧＰＵ２０上で実行しているソフトウェアまたはファームウェアによって定義された機能を実行することと、特定の機能を実行するように配線接続された固定機能ユニットによって機能を実行することとを含む。ＧＰＵ２０上で実行しているソフトウェアまたはファームウェアはシェーダと呼ばれることがあり、シェーダはＧＰＵ２０の１つまたは複数のシェーダコア上で実行し得る。ユーザは、任意の考えられる方法で所望のタスクを実行するようにシェーダを設計することができるので、シェーダはユーザに機能的フレキシビリティを与える。固定機能ユニットは、しかしながら、固定機能ユニットがタスクを実行する様式のために配線接続される。したがって、固定機能ユニットは多くの機能的フレキシビリティを与え得ない。
【００４５】
[0056]  頂点シェーダ３８とドメインシェーダ４４とジオメトリシェーダステージ４６とを含み得るシェーダ、ならびに図２に描かれていない他のシェーダユニットは、プログラマブルユニットであり得るが、ＧＰＵ２０の他のステージまたはユニット（図２に図示せず）はプログラマブルであり得ない。本開示の技法によるオンデマンドキャッシュコヒーレンスをサポートするために、ＧＰＵ２０のシェーダは、ロードウィズアクワイア動作およびストアウィズリリース動作を含み得る追加の動作をサポートするように構成され得る。いくつかの例では、ロードウィズアクワイア動作およびストアウィズリリース動作は、ＧＰＵ２０にキャッシュ無効化および／またはキャッシュフラッシュを実行させ得る。ＧＰＵ２０はまた、キャッシュ２２のビヘイビア（behavior）を制御し得る別個の明示的キャッシュ管理命令をサポートし得る。キャッシュ管理命令は、キャッシュフラッシュ命令とキャッシュ無効化命令とを含み得る。キャッシュフラッシュ命令および／またはストアウィズリリース動作は、キャッシュ２２に記憶された値、たとえば共有変数データ２８の値をシステムメモリ１４、高レベルキャッシュ、またはＣＰＵ１６のキャッシュ１８に書き出すことをＧＰＵ２０に行わせ得る。キャッシュ無効化命令および／またはロードウィズアクワイア動作は、システムメモリ１４からデータ値を読み取ることと、その値をキャッシュ２２に記憶することとをＧＰＵ２０に行わせ得る。
【００４６】
[0057]  いくつかの例では、キャッシュ管理命令ならびにロードウィズアクワイア動作およびストアウィズリリース動作の追加は、電力および／または面積の観点から費用がかかることがある専用キャッシュコヒーレンシハードウェアを必要とすることなしに、ＧＰＵ２０がキャッシュコヒーレンシを維持することを可能にし得る。ドライバ、コンパイラ（たとえば、コンパイラ３０）、または別のアプリケーションが、（「カーネル」と呼ばれる）シェーダプログラムのコードを修正し得る。コンパイラまたはドライバは、本開示の技法に従ってマルチコアシステム２の他のプロセッサとのキャッシュコヒーレンシを維持するために、ロードウィズアクワイア動作またはストアウィズリリース動作が行われるポイントにコードを自動的に挿入し得る。コンパイラまたはドライバによるコードの挿入が、図３Ａおよび図３Ｂにより詳細に示されている。
【００４７】
[0058]  カーネルコンパイラは、カーネルが共有変数データ２８にアクセスすることになるとコンパイラが判断した場合、同期動作、たとえば、ロードウィズアクワイア動作またはストアウィズリリース動作を挿入し得る。ロードウィズアクワイア動作は、共有キャッシュライン（たとえば、共有変数データ２８に関連するキャッシュライン）を無効にすることと、キャッシュフィルを実行することとをＧＰＵ２０に行わせ得、ロードウィズアクワイア動作の完了の完了の前に実行するように読取りが並べ替えられ得ないことを保証する。ストアウィズリリース動作は、共有変数データ２８を含んでいるキャッシュラインをフラッシュすることをＧＰＵ２０に行わせ得、ストアウィズリリース動作の後に実行するようにカレントなスレッドにおける書込みが並べ替えられ得ないことを保証する。１つプロセッサによって実行されたストアウィズリリース動作の後にロードウィズアクワイア動作が続くとき、共有変数データ２８の変更は順序付けられた一貫した形で行われる。ロードウィズアクワイア動作およびストアウィズリリース動作は、いくつかの例では、カーネル／シェーダプログラミング言語の一部であり得る。しかしながら、いくつかの例では、同期動作、たとえば、ロードウィズアクワイア動作またはストアウィズリリース動作を実行する必要は、これらの同期動作命令の必要が、カーネルが（「共有サーフェス（shared surface）」とも呼ばれる）共有データまたは共有変数を用いて実行されるかどうかに依存し得るので、コンパイル時に知られていないことがある。
【００４８】
[0059]  ＧＰＵ２０が共有変数を読み取っているときのキャッシュコヒーレンシを保証するために、コンパイラまたはドライバは、シェーダコードを分析し得、共有変数データ２８から読み取るときおよび／または共有変数データ２８に書き込むときに、同期動作、たとえば、ロードウィズアクワイア動作およびストアウィズリリース動作のための命令をシェーダコードに挿入し得る。同期動作は、共有変数データ２８の値を読み取る前に、システムメモリ１４から共有変数データ２８の値を読み取ることと、共有変数データ２８の値をキャッシュ２２に記憶することとをＧＰＵ２０に行わせる、キャッシュ無効化命令を含み得る。ＧＰＵ２０が値をキャッシュ２２に書き込むときのキャッシュコヒーレンシを保証するために、コンパイラまたはドライバは、シェーダコードを分析し、同期動作、たとえば、共有変数データ２８の変更が順序付けられた形で伝搬されることを保証するロードウィズアクワイア動作またはストアウィズリリース動作を挿入し得る。
【００４９】
[0060]  いくつかの例では、ストアウィズリリース動作などの同期動作は、共有変数データ２８に対応するキャッシュ１８の１つまたは複数のキャッシュラインを無効にすることと、共有変数データ２８の新しい値をフェッチすることと、キャッシュ２２に共有変数データ２８の新しい値を記憶することとをＧＰＵ２０に行わせ得る。いくつかの例では、ＧＰＵ２０は、共有変数データ２８の最も最新の値を取得するために、別のプロセッサのキャッシュ、たとえば、ＣＰＵ１６のキャッシュ１８を「スヌープ」するかまたは読み取り得る。他の例では、ＧＰＵ２０はシステムメモリ１４または高レベルキャッシュから共有変数データ２８の値を読み取り得る。
【００５０】
[0061]  コンパイラまたはドライバは、いくつかの異なる方法で、同期動作、たとえば、ストアウィズリリース動作およびロードウィズアクワイア動作をカーネルに挿入し得る。一例では、コンパイラは、ストアウィズリリース動作およびロードウィズアクワイア動作を共有変数データ２８に対するロードおよびストア命令の周りに挿入し得る。別の例では、コンパイラは、ＮＯＰ（Ｎｏ動作）命令を共有変数データ２８に対する読取りおよび書込み（ロードおよびストア）の周りのカーネル中に挿入し得る。カーネルのバインド時に、ドライバは、カーネルが共有変数データ２８（たとえば、共有サーフェス）とペアリングされているかどうかを判断し得る。カーネルが共有変数データ２８とペアリングされているかどうかに基づいて、ドライバは、本開示の技法に従ってカーネルバイナリを修正し、ストアウィズリリース動作およびロードウィズアクワイア動作をＮＯＰ命令と交換し得る。また別の例では、ＧＰＵ２０は、カーネルを起動する前にドライバが設定し得るＧＰＵ２０のレジスタに記憶された一定値に基づいて実行時に条件付きでカーネルへのストアウィズリリース動作およびロードウィズアクワイア動作をコンパイルし得る。
【００５１】
[0062]  キャッシュ２２の共有変数をフラッシュするかまたは無効にするために、ドライバは、バインド時およびカーネルを起動する前に、カーネルコード中に共有変数のリストを作成し得る。カーネルを実行している間、ＧＰＵ２０は、特定の変数に対して同期動作が実行される場合はいつでも、共有変数のリストを「ウォーク（walk）」するかまたはトラバース（traverse）し、リスト中の各共有変数に関連するキャッシュ２２のエリアをフラッシュするかまたは無効にする、ルーチンを実行し得る。共有変数のリストが空の場合、ＧＰＵ２０はストアウィズリリース動作およびロードウィズアクワイア動作を実行しないことがある。
【００５２】
[0063]  上記のように、図２に示されたグラフィックス処理パイプラインは、実質的にＤｉｒｅｃｔ３Ｄ  １１によって定義されたグラフィック処理パイプラインである。この例では、ＧＰＵ２０は、１つまたは複数の頂点シェーダ（vertex shader）ステージ３８と、ハルシェーダ（hull shader）ステージ４０と、ドメインシェーダ（domain shader）ステージ４４と、ジオメトリシェーダ（geometry shader）ステージ４６とを含み得る。ＧＰＵ２０は、図示されたものよりも多くのステージを含み得、いくつかの例では、ＧＰＵ２０は、必ずしも図示されたステージのすべてを含むとは限らない。また、ステージの特定の順序付けは、例示のために与えたものであり、限定的であると考えられるべきではない。
【００５３】
[0064]  頂点シェーダステージ３８は、頂点を処理し得、変換（transformation）、スキニング（skinning）、モーフィング（morphing）、および頂点ごとの照明（per-vertex lighting）などの頂点ごとの動作（per-vertex operation）を実行し得る。頂点シェーダステージ３８は１つのシェーダであり得る。ハルシェーダステージ４０は、頂点シェーダステージ３８によって処理されたパッチの制御ポイントを受信し、制御ポイントを処理し、処理されたパッチについての制御ポイントを出力する。言い換えれば、ハルシェーダステージ４０は、頂点シェーダステージ３８によって処理された入力パッチ（patch）を受信し、入力パッチを処理し、出力パッチを出力する。ハルシェーダステージ４０は、入力パッチを処理するための様々な機能を実行し得る。たとえば、ハルシェーダステージ４０は、制御ポイントのロケーションを変更するためにパッチの制御ポイントの座標を修正し得、またはパッチの制御ポイントの追加または削除さえ行い得る。
【００５４】
[0065]  さらに、ハルシェーダステージ４０は、頂点シェーダステージ３８によって生成されたパッチ（すなわち、出力パッチ）にいくつのプリミティブ（primitive）が追加されるべきか示す値を判断し得る。ハルシェーダステージ４０は、いくつのプリミティブがパッチに追加されるべきか判断するために様々な基準を利用し得る。いくつのプリミティブがパッチに追加されるべきか判断するためにハルシェーダステージ４０が利用し得る、２つの例示的な基準について以下で説明する。しかしながら、本開示の態様はそのように限定されず、ハルシェーダステージ４０は、いくつのプリミティブがパッチに追加されるべきかを判断するために任意の基準を利用し得る。いくつのプリミティブが追加されるべきかの判断に基づいて、ハルシェーダステージ４０は、ドメインタイプと、いくつのプリミティブがパッチに追加されるべきかを示す値とを出力し得る。
【００５５】
[0066]  ドメインシェーダステージ４４は、テッセレーションステージ（tessellation stage）（図示せず）から頂点座標のセットを受信し得る。ドメインシェーダステージ４４は、テッセレーションステージ（図示せず）によって出力された各頂点座標について実行し得る。ハルシェーダステージ４０からのパッチの制御ポイントの座標を用いて、ドメインシェーダステージ４４は、パッチ上のテッセレーションステージによって出力された頂点のロケーションを判断し得る。ジオメトリシェーダステージ４６は、ドメインシェーダステージ４４によってパッチに付加されたプリミティブの頂点を受信し、なお一層解像度を増すためにプリミティブのための追加の頂点をさらに生成し得る。
【００５６】
[0067]  マルチコアシステム２は、ＣＰＵ１６とＧＰＵ２０との間のキャッシュコヒーレンシを実装するために様々な技法を実装し得る。本開示の技法によれば、ＧＰＵ２０は、ＧＰＵ２０のキャッシュ２２のキャッシュラインに共有変数データ２８を記憶するように構成され得る。ＧＰＵ２０は、ストアウィズリリース動作を実行するように構成され得る。ＣＰＵ１６は、次いで、ロードウィズアクワイア動作を実行し、ＣＰＵ１６のキャッシュ１８から共有変数データ２８の値をロードし得る。
【００５７】
[0068]  図３Ａは、キャッシュ無効化およびフラッシュ命令を含み得る、ＧＰＵカーネル中の同期動作を実行するように構成されたＧＰＵを示す概念図である。図３Ａに、ＣＰＵ１６と、ＧＰＵ２０と、システムメモリ１４とを示す。ＣＰＵ１６は、オペレーティングシステム５０と、ＧＰＵドライバ５１と、ＧＰＵコンパイラ５２とを実行する。オペレーティングシステム５０は、スレッドなど、タスクのスケジューリングを実行し、ＧＰＵドライバ５１とＧＰＵコンパイラ５２との実行をも管理し得る。ＧＰＵドライバ５１は、ＣＰＵ１６とＧＰＵ２０との間の相互作用を管理し得、いくつかの例では、本開示の技法に従ってキャッシュ管理命令を含むようにＧＰＵ２０の命令５４Ａを修正し得る。ＧＰＵコンパイラ５２は、ＧＰＧＰＵプログラムのためのコードをコンパイルし得、いくつかの例では、本開示の技法に従ってキャッシュ管理命令を含むようにコンパイル時にコードを修正し得る。
【００５８】
[0069]  図３Ａにおいて、ＧＰＵ２０は命令５４Ａを実行しようとしている。ＧＰＵコンパイラ５２は、ドライバ５１がＧＰＵ２０のメモリにロードし得る命令５４Ａを前もって生成し得る。命令５４Ａは、共有変数データ２８に対する一連の読取りおよび書込みを含む。これらの例では、共有変数データ２８は、ＧＰＵ２０とＣＰＵ１６などの別のプロセッサとの間で共有され得、ＧＰＵ２０のキャッシュ２２とＣＰＵ１６のキャッシュ１８の両方に記憶され得る。
【００５９】
[0070]  ＣＰＵ１６は、命令５４Ａ中に示すように、ＧＰＵ２０がその後読み取る共有変数データ２８の値を変更する書込みを実行し得る。コンパイラ５４Ａは、ＧＰＵ２０が命令５４Ａの読取り命令を実行するときに、共有変数データ２８に対するＣＰＵ１６による書込みがコヒーレント方式でＧＰＵ２０に伝搬されることを保証するために、たとえばオペレーティングシステム５０またはドライバ５１によって、実行時に同期動作と交換され得る一連のｎｏ動作（ＮＯＰ）命令を、書込み命令および読取り命令の周りに挿入し得る。
【００６０】
[0071]  ハードウェア命令、あるいはロードウィズアクワイアルーチンまたは命令またはストアウィズリリースルーチンなど、ソフトウェアルーチンを実行するプロセッサが中断されないことがある。ルーチンが中断され得ない１つのそのような方法は、特定の時間に１つのプロセッサのみがロードウィズアクワイアルーチンを実行することを可能にする、クリティカルセクション（critical section）と呼ばれるプログラミング構成体を使用することによってである。別の例では、プロセッサが、マルチコアシステム２において割込みを一時的に無効化することによってルーチンが中断されないことを保証し得る。
【００６１】
[0072]  ＧＰＵコンパイラ５２が命令５４Ａを生成した後、ＧＰＵコンパイラ５２またはＧＰＵドライバ５１は、本開示の技法に従ってキャッシュコヒーレンシを維持するためにキャッシュフラッシュおよび／またはキャッシュ無効化を実行し得る、ロードウィズアクワイア動作など、同期動作を含むように命令５４Ａを挿入または修正し得る。キャッシュ管理命令を含み得る同期動作に命令５４Ａを修正する結果が、図３Ｂに示されている。
【００６２】
[0073]  図３Ｂは、同期動作のための命令をＧＰＵカーネルに挿入するコンパイラ／ドライバを示す概念図である。ＧＰＵコンパイラ５２が命令５４Ａ（図３Ａ）を生成した後、ＧＰＵコンパイラ５２またはＧＰＵドライバ５１は、キャッシュ管理命令など、同期動作を含めるために命令を修正し得る。ＧＰＵコンパイラ５２またはＧＰＵドライバ５１は、命令５４Ａが共有変数にアクセスするかどうかに基づいて命令を修正し得る。この例では、命令５４Ａは、共有変数データ、たとえば、共有変数データ２８の書込みと後続の読取りとを含む。ＧＰＵコンパイラ５２またはＧＰＵドライバ５１は、ロードウィズアクワイア動作を書込み命令の後に挿入することによって、およびストアウィズリリース動作をストアウィズリリース動作の後であるがＧＰＵ２０による共有変数データ２８の読取りの前に挿入することによって、命令５４Ａを修正し得る。ストアウィズリリース動作は、ＧＰＵ２０など、第１のプロセッサに共有変数データ２８に関連するキャッシュラインをフラッシュさせ得、ストアウィズリリース動作の後に書込みが行われないことを保証し得る。ロードウィズアクワイア動作は、たとえば、システムメモリ１４から共有変数データ２８の値をスヌープすることまたは読み取ることによって、共有変数データ２８のコピーを保持するＣＰＵ１６のキャッシュ１８のラインを無効にすることと、キャッシュフィルを実行することとをＧＰＵ２０に行わせ得る。ロードウィズアクワイア動作は、ロードウィズアクワイア動作が実行を完了した後に読取りが行われることをさらに保証し、それによって、ＧＰＵ２０によって読み取られた共有変数データ２８の値が最も最新の値であることを保証する。キャッシュフラッシュおよび無効化命令の効果について、図４Ａおよび図４Ｂに関して以下で説明する。
【００６３】
[0074]  ＧＰＵコンパイラ５２またはＧＰＵドライバ５１は、共有変数がコンパイル時に知られるか、バインド時に知られるかに基づいて、命令５４Ａを修正し得る。共有変数がコンパイル時に知られる場合、ＧＰＵコンパイラ５２はコンパイル時に命令５４Ａを修正し得る。共有変数がバインド時に知られる場合、ＧＰＵドライバ５１はバインド時に命令５４Ａを修正し得る。いずれの場合も、修正された命令は命令５４Ｂを備える。また、いくつかの例では、ＧＰＵコンパイラ５２またはＧＰＵドライバ５１は、命令をカーネルの命令に挿入し得ず、むしろプレースホルダとしてコンパイラによって最初に挿入されるＮＯＰ命令を、上記で説明した同期動作と交換し得る。ＧＰＵドライバ５１またはＧＰＵコンパイラ５２が命令５４Ａを修正すると、ＧＰＵ２０は、ＧＰＵ２０とマルチコアシステム２の他のプロセッサとの間のキャッシュコヒーレンシを保証するように修正された命令５４Ｂを実行し得る。
【００６４】
[0075]  図４Ａは、陳腐な（stale）共有変数を含んでいるキャッシュを示す概念図である。図４Ａに、図１のシステムメモリ１４と、ＧＰＵ２０のキャッシュ２２（図１）とを示す。ＧＰＵ２０およびＧＰＵキャッシュ２２に関して示されているが、任意のコアまたはプロセッサの任意のキャッシュが、図４Ａおよび図４Ｂに示された技法を実行し得る。
【００６５】
[0076]  キャッシュ２２は５つのエントリを含み、その各々が垂直矩形として表されている。キャッシュ２２中のエントリの数は、例のために、大幅に低減されている。キャッシュ２２は、（対角ハッシング（diagonal hashing）を有するキャッシュエントリによって示された）陳腐なデータを有する２つのエントリを含む。陳腐なデータは、マルチコアシステム２中の別のプロセッサによって改変されていることがある共有変数値である。図４Ａ〜図４Ｂ中の矢印は、ＧＰＵ２０が矢印のうちのいずれかの末端によって示されたシステムメモリ１４のロケーションから共有データを読み取る場合、その値が矢印の先端によって示されたキャッシュ２２のロケーションに記憶されるという、システムメモリ１４のロケーションとキャッシュ２２中のエントリとの間の関連付けを示す。
【００６６】
[0077]  陳腐なデータを含むキャッシュ２２のラインから読み取る前に、ＧＰＵ２０はロードウィズアクワイア動作を実行し得る。ロードウィズアクワイア動作は、ＣＰＵ１６にキャッシュ１８の１つまたは複数のラインを無効にさせ、キャッシュ１８のキャッシュフィル（cache fill）を生じさせ、ロードウィズアクワイア動作の実行の前に実行するように読取りが並べ替えられないことを保証する。
【００６７】
[0078]  上述したように、キャッシュライン６２は、ロードウィズアクワイア動作により無効とマークされたので、ＧＰＵ２０は、システムメモリ１４のアドレス６４から共有変数データ２８の新しいコピーをフェッチする。いくつかの例では、ＧＰＵ２０は、新しいコピーをシステムメモリからフェッチする必要はなく、むしろ高レベルキャッシュ、たとえば、ＣＰＵ１６とＧＰＵ２０との間で共有されるレベル２キャッシュまたはレベル３キャッシュからフェッチし得る。別の例では、ＣＰＵ１６は、キャッシュライン６２中に記憶された共有変数データ２８の値を修正するかまたは「スヌープ」し、更新し得る。
【００６８】
[0079]  図４Ｂは、たとえば、ロードウィズアクワイア動作を実行した結果として、無効とマークされたキャッシュラインから読み取ることにより、メインメモリからキャッシュを更新することを示す概念図である。図４Ｂに、ＧＰＵ２０が無効とマークされたキャッシュライン６２から読み取ることと、システムメモリ１４のロケーション６２に記憶された共有変数データ２８の最新コピーをフェッチすることとの結果を示す。システムメモリ１４から読み取るように示されているが、ＧＰＵ２０は、ＣＰＵ１６のキャッシュ１８など、別のキャッシュからも共有変数データ２８の新しい値を読み取り得る。ＣＰＵ１６がキャッシュライン６２を無効とマークした後、図４Ａに関して上記で説明したように、ＧＰＵ２０は、システムメモリロケーション６４から共有変数データ２８の値を読み取り得、システムメモリロケーション６４からの共有変数データ２８をキャッシュロケーション６２に記憶する。単一のキャッシュエントリのみを無効にするように示されているが、キャッシュ無効化命令は、共有とマークされたすべてのキャッシュエントリなど、キャッシュ２２のすべてまたは複数のエントリをも無効にし得る。共有キャッシュエントリについて以下でさらに詳細に説明する。
【００６９】
[0080]  図５Ａは、陳腐な共有変数値を含んでいるシステムメモリを示す概念図である。図５Ａにおいて、キャッシュ２２のライン８０に記憶された共有変数データ２８の値は最新であるが、システムメモリ１４のロケーション８２に書き戻されなかった。この状況は、たとえば、ＧＰＵ２０が共有変数データ２８についての新しい値を計算し、共有変数データ２８の値をシステムメモリ１４にではなく、キャッシュ２２に書き込む場合に生じ得る。
【００７０】
[0081]  システムメモリ１４のロケーション８２が共有変数のカレントな値を有することを保証するために、ＧＰＵ２０は、図４Ａに関して説明されたプロセスと同様のプロセスを実行する。図４Ａに関して説明した技法と同様に、ＧＰＵ２０は、ストアウィズリリース動作を実行するなど、同期動作を実行する。ストアウィズリリース動作を実行する前に、ＧＰＵ２０は１つまたは複数の書込みを実行し得、システムメモリ１４のメモリアドレス８２に伝搬されていないキャッシュライン８０の更新された値が生じる。キャッシュライン８０への書込みを実行した後に、ＧＰＵ２０は、キャッシュライン８０に記憶された共有変数データ２８の値をシステムメモリ１４のアドレス８２にフラッシュすることをＧＰＵ２０に行わせ得る、ストアウィズリリース動作を実行する。フラッシング、いくつかの例では、ストアウィズリリース動作はまた、たとえば、ＣＰＵ１６のキャッシュ１８またはＤＳＰ２４のキャッシュ２６中の、共有変数データ２８の陳腐な値を記憶する１つまたは複数のキャッシュラインを無効にすることをＧＰＵ２０または別のプロセッサに行わせ得る。このメモリ状態を図５Ａに示す。
【００７１】
[0082]  ストアウィズリリース動作はさらに、ロードウィズアクワイア動作の実行の後に実行するように共有変数データ２８への書込みが並べ替えられないことを保証する。ストアウィズリリース命令は、ストアウィズリリース動作が実行を完了するまで後続の命令が出ないように、命令ストリーム中の１つまたは複数の後続の命令を特殊ビットでタグ付けすることによって、この実行順序付けを保証し得る。
【００７２】
[0083]  ストアウィズリリース命令は、プログラムコードシーケンスでストアウィズリリース命令の前に行われる書込みが、ストアウィズリリース命令が実行する前に完了することをも保証する。前の書込みがストアウィズリリース命令の前に完了することを保証するために、ＧＰＵ１２など、プロセッサは、ＧＰＵ１２のキャッシュのすべてまたは一部分をフラッシュする命令のミクロ配列（microsequence）を実行し得る。ＧＰＵ１２は、ミクロ配列キャッシュフラッシュの完了時のみに、ストアウィズリリース命令の記憶された値を書き込む。
【００７３】
[0084]  図５Ｂは、キャッシュフラッシュを実行した後のシステムメモリの状態を示す概念図である。図５Ｂにおいて、ＧＰＵ２０は、キャッシュ２２のキャッシュライン８０に記憶された共有変数データ２８の値を、システムメモリ１４のロケーション８２に書き戻した。ＧＰＵ２０は、ストアウィズリリース動作の一部として共有変数データ２８の値を書き込んでいることがあり、それにより、場合によっては、共有変数データ２８の値に対応するキャッシュライン、たとえば、キャッシュライン８０に対してキャッシュフラッシュを実行することをＧＰＵ２０に行わせ得る。キャッシュフラッシュは、図５Ｂにおいて、ロケーション８０の値のみをシステムメモリロケーション８２にフラッシュバックするものとして示されているが、フラッシュは、キャッシュ８０のすべてまたは複数の値をシステムメモリ１４にフラッシュバックし得る。
【００７４】
[0085]  図６は、本開示の技法による、ＧＰＵおよびＣＰＵのキャッシュおよびメモリ管理ユニットを示す概念図である。図６に、メモリ管理ユニット（ＭＭＵ：memory management unit）１０２と、物理キャッシュ１０４とをさらに含むＣＰＵ１６を示す。図６に、仮想キャッシュ１０６と、システムメモリ管理ユニット（ＳＭＭＵ：system memory management unit）１０８とを含むＧＰＵ２０をも示す。ＣＰＵ１６およびＧＰＵ２０は、共有変数データ２８を含み得るシステムメモリ１４に結合される。ＧＰＵ２０は仮想キャッシュを有するものとして示され、ＣＰＵ１６は物理キャッシュを有するものとして示されているが、仮想キャッシュおよび／または物理キャッシュの任意の組合せが可能であり得る。
【００７５】
[0086]  物理キャッシュ１０４は、様々な例では、Ｌ１キャッシュ、Ｌ２キャッシュ、またはＬ３キャッシュのうちの１つまたは複数を備え得る。また、物理キャッシュ１０４は、ＭＥＳＩまたはＭＯＥＳＩキャッシュコヒーレンスプロトコルを実装するＩ／Ｏコヒーレントキャッシュを備え得る。例のために、物理キャッシュ１０４は複数のキャッシュラインを含む。物理キャッシュ１０４のキャッシュラインの各々は、インデックスと呼ばれる物理アドレスの一部分（通常、仮想アドレスの最下位ビットの数）に基づいてインデックス付けされる。また、キャッシュエントリは、キャッシュに記憶されたデータに関連するアドレスの最上位ビットを備える「タグ（tag）」を含む。物理キャッシュ１０４など、物理キャッシュの場合、タグは、キャッシュされたデータに関連する物理アドレスの最上位ビットを備える。特定のアドレスがキャッシュされているかどうかを判断するために、ＭＭＵ１０２は、トランスレーションルックアサイドバッファ（ＴＬＢ：translation lookaside buffer）に記憶され得るページテーブルから仮想アドレスを変換し、変換された物理アドレスの最上位ビットを物理キャッシュのタグと比較して、２つが一致するかどうかを判断する。２つが一致する場合、そのアドレスに関連するデータはキャッシュに記憶されており、キャッシュ「ヒット（hit）」と呼ばれる。他の場合、データはキャッシュに記憶されておらず、キャッシュ「ミス（miss）」と呼ばれる。
【００７６】
[0087]  また、各キャッシュラインはオフセットを含み得る。ページテーブルエントリ（page table entry）およびキャッシュテーブルエントリ（cache table entry）のサイズは、ワードサイズ（すなわちプロセッサの最大アドレス可能ワード）よりも大きく（たとえば、キロバイトまたはメガバイト）になり得るので、ＣＰＵ１６は、キャッシュエントリ内の特定のワードを指定するオフセットの値に基づいて、キャッシュラインデータの特定のワードにインデックス付けし得る。
【００７７】
[0088]  物理キャッシュ１０４および／または仮想キャッシュ１０６の各キャッシュラインは、仮想キャッシュ（virtual cache）１０６の個々のキャッシュラインに関連する状態、たとえば１つまたは複数の状態ビットを含み得る。状態は、仮想キャッシュ１０６の特定のキャッシュラインがダーティーであるか、有効であるか、または無効であるかを示し得る。さらに、状態はキャッシュラインの個々のバイトに適用され得る。物理キャッシュ１０４および／または仮想キャッシュ１０６が維持する状態について、図７に関して以下でさらに詳細に説明する。
【００７８】
[0089]  図６に、仮想キャッシュ１０６とＳＭＭＵ１０８とをさらに含むＧＰＵ２０をも示す。仮想キャッシュ１０６は、物理キャッシュ１０４とは異なり、物理アドレスではなく仮想アドレスに基づいて、キャッシュされたデータをタグ付けし得る。物理キャッシュ１０４は、仮想アドレスを物理アドレスに変換し、キャッシュラインのタグとして最上位ビット数を記憶し得、仮想キャッシュ１０６は、キャッシュラインタグとして仮想アドレスのビット数を記憶し得る。そのようなキャッシュは「仮想的にタグ付けされた（virtually tagged）」と呼ばれることがある。仮想的にタグ付けされたキャッシュを利用することによって、ＳＭＭＵ１０８は、仮想キャッシュ１０６にアクセスするときに仮想アドレスから物理アドレスに変換する必要がなく、代わりに、キャッシュにアクセスした後に仮想アドレスタグを物理アドレスに変換する。対照的に、ＭＭＵ１０２は、物理キャッシュ１０４にアクセスするために物理アドレスから仮想アドレスに変換する。
【００７９】
[0090]  メモリの各チャンクまたはページは、「物理アドレス（physical address）」と呼ばれるアドレスによってアクセス可能である。しかしながら、アプリケーションは連続アドレス空間を予想し得るが、利用可能な物理アドレス範囲は不連続であり得る。連続メモリアドレス空間を各アプリケーションに与えるために、ＣＰＵ１６およびＧＰＵ２０は仮想アドレス指定を実装し得る。仮想アドレス指定では、アプリケーションは、物理アドレスにマッピングする仮想アドレス空間を割り振られる。仮想アドレスと物理アドレスとの間のマッピングはページテーブルエントリに記憶される。ページテーブルエントリは１つまたは複数のページテーブルに記憶され得る。様々な例では、ＣＰＵ１６およびＧＰＵ２０は、それぞれ、別個のページテーブルまたは単一の共通ページテーブルを有し得る。
【００８０】
[0091]  各ページテーブルエントリは、指定された仮想アドレスに関連する物理アドレスの最上位ビット数と、属性データを備えるビット数とを含む。物理アドレスに基づいて、ＭＭＵ１０２およびＳＭＭＵは、システムメモリ１４の特定のアドレス、あるいはハードディスクドライブまたはソリッドステートドライブなどの別のストレージデバイス上に記憶され得る物理アドレスに関連するデータにアクセスし得る。
【００８１】
[0092]  仮想アドレスと物理アドレスとの間で変換するプロセスは、望ましくない量のレイテンシ（latency）を招くことがある。仮想物理間アドレス変換に関連するレイテンシを低減するために、ＭＭＵ１０２およびＳＭＭＵ１０８は、それぞれ、ＴＬＢ１０６およびＴＬＢ１１０など、トランスレーションルックアサイドバッファ（ＴＬＢ）を含み得る。ＴＬＢ１０６およびＴＬＢ１１０は、それぞれ、１つまたは複数の頻繁にアクセスされる物理アドレスに関連するから頻繁に使用されるページテーブルエントリをキャッシュする。ＭＭＵ１０２およびＳＭＭＵ１０８の各エントリはページテーブルエントリ（ＰＴＥ：page table entry）である。
【００８２】
[0093]  ＭＭＵ１０２、物理キャッシュ１０４、仮想キャッシュ１０６、およびＳＭＭＵ１０８の各々はまた、システムメモリ１４に記憶されているページテーブルに書き込み、ページテーブルから読み取り得る。たとえば、特定のページテーブルエントリがＭＭＵ１０２またはＳＭＭＵ１０８のＴＬＢからエビクトされる場合、ＭＭＵは、エビクトされたＰＴＥをシステムメモリ１４に書き込み得る。ＴＬＢが、要求されたＰＴＥの値を含まない場合（ＴＬＢミスと呼ばれる）、ＭＭＵ１０２またはＳＭＭＵ１０８は、要求されたＰＴＥをシステムメモリ１４から取り出し得る。
【００８３】
[0094]  いくつかの例では、ＭＭＵ１０２およびＳＭＭＵ１０８はキャッシュフィルおよびキャッシュエビクション（eviction）も処理し得る。いくつかの例では、ＭＭＵ１０２またはＳＭＭＵ１０８は、物理キャッシュ１０４中に現在ない値をシステムメモリ１４から取り出すことと、その値を物理キャッシュ１０４または仮想キャッシュ１０６のラインに記憶することとによってキャッシュフィルを実行し得る。キャッシュラインがエビクトされ、すなわちキャッシュエントリのための空間がない場合、ＭＭＵ１０２またはＳＭＭＵ１０８は、物理キャッシュ１０４または仮想キャッシュ１０６のエビクトされたキャッシュラインをシステムメモリ１４に書き込み得る。
【００８４】
[0095]  ＭＭＵ１０２およびＳＭＭＵ１０８はまた、「スヌーピング（snooping）」動作を実行し得る。スヌープ中に、ＳＭＭＵ１０８など、ＭＭＵは、別のプロセッサ、たとえばＣＰＵ１６の物理キャッシュ１０４のキャッシュラインを検査し得る。場合によっては、ＳＭＭＵ１０８は、物理キャッシュ１０４の１つまたは複数のキャッシュラインの値を更新し得る。たとえば、ＧＰＵ２０は、ストアウィズリリース動作を実行することによって、仮想キャッシュ１０６に記憶された共有変数データ２８の値を更新し得る。ストアウィズリリース動作中に、ＳＭＭＵ１０８は、物理キャッシュ１０４をスヌープし、物理キャッシュ１０４の対応するキャッシュラインを更新し得る。ＣＰＵ１６が共有変数データ２８の値にアクセスすることを試みる場合、共有変数データ２８の最もカレントな値は物理キャッシュ１０４にすでに記憶されている。したがって、ＣＰＵ１６は、物理キャッシュ１０４が最もカレントな値を有することを検出し得、たとえばＣＰＵ１６がロードウィズアクワイア動作を実行するとき、単に物理キャッシュ１０４に記憶されたキャッシュされた値を読み取る。
【００８５】
[0096]  この例では、ＣＰＵ１６は共有変数データ２８の値に関連するキャッシュラインを無効にせず、ＣＰＵ１６はシステムメモリ１４から共有変数データ２８の新しい値をフェッチしない。このようにして、本開示によるスヌーピング技法は、共有変数データに書き込むときのマルチプロセッサシステムの性能を改善し得る。
【００８６】
[0097]  いくつかの例では、ＧＰＵ２０は、仮想キャッシュ１０６ではなく、オンデマンドコヒーレンスをサポートする物理キャッシュを実装し得る。ＧＰＵ２０が、物理キャッシュ１０４と同様のキャッシュなど、物理キャッシュを実装する場合、ＧＰＵ２０は、仮想アドレスではなく、それらの関連する物理アドレスに基づいて、物理キャッシュ中のエントリキャッシュラインをタグ付けする。ＧＰＵ２０が物理キャッシュを含む例では、ＴＬＢ１１０が、物理キャッシュに書き込む前に仮想アドレスを物理アドレスに変換する。
【００８７】
[0098]  図７は、本開示の技法による、属性ビットを実装するキャッシュラインを示す概念図である。上記で説明したように、仮想キャッシュ１０６は複数のキャッシュラインを含む。図７に、データ部分１２２と、仮想アドレスタグ１２４とを含み、随意の共有可能ビット１２６と、ＣｌｅａｎＶａｌｉｄビット１２８と、ＤｉｒｔｙＶａｌｉｄビット１３０と、ＢｙｔｅＥｎａｂｌｅｓビット１３２とを含み得る、単一のキャッシュライン１２０を示す。
【００８８】
[0099]  共有ビット１２６は、キャッシュライン中に含まれることも含まれないこともある随意のビットである。共有ビット１２６の値は、その特定のキャッシュライン中でデータのいずれかのバイトが共有され、したがって他のプロセッサ、たとえばＣＰＵ１６および／またはＤＳＰ２４に対して可視であるかどうかを示す。キャッシュラインが他のプロセッサに対して可視である場合、他のプロセッサは共有キャッシュラインのカレントな値を有しなければならないので、データの共有バイトの値の変更がシステムメモリ１４にフラッシュされる必要があり得る。非共有値は、システムメモリ１４にフラッシュされる必要がない。様々な例では、オペレーティングシステム（ＯＳ）が共有ビットのデフォルト値を設定し得、あるいはユーザまたはプログラムが、共有ビット１２６のデフォルト値を設定するためにＡＰＩ（アプリケーションプログラミングインターフェース）呼を行い得る。プロセッサによる後続の読取りは、いくつかの例では、共有ビット１２６の値を変更し得る。キャッシュミス中に、キャッシュラインが仮想キャッシュ１０６に入れられる必要があるとき、共有ビット１２６の値はデフォルトで共有状態に設定され得、同じキャッシュラインへの後続のキャッシュアクセス（すなわちキャッシュヒット）は、共有ビット１２６の状態を変更し得ない。
【００８９】
[0100]  ＢｙｔｅＥｎａｂｌｅｓビット１３２はキャッシュデータ１２２の各バイトについてのビットを含む。ＢｙｔｅＥｎａｂｌｅｓビット１３２の各ビットは、その特定のキャッシュバイトがダーティーであるかどうかを示し、別のキャッシュにまたはシステムメモリ１４に書き出される必要があり得る。ＤｉｒｔｙＶａｌｉｄビット１３０はＢｙｔｅＥｎａｂｌｅｓビット１３２の各々の論理ＯＲに等しい。ＤｉｒｔｙＶａｌｉｄビット１３０が１に等しく、共有ビット１２６が１に等しい場合、ＳＭＭＵ１０８は、キャッシュフラッシュ動作中にダーティーバイトの値をシステムメモリ１４に書き出し得る。
【００９０】
[0101]  ＣｌｅａｎＶａｌｉｄビット１２８は、非ダーティーデータバイトがキャッシュライン中にあるかどうかを示す。共有ビット１２６が、キャッシュラインが共有であることを示し、ＣｌｅａｎＶａｌｉｄビット１２８が１に等しい場合、カレントでないデータ１２２の少なくとも１バイトがあり得るので、ＳＭＭＵ１０８は、キャッシュ無効化動作を実行するときにキャッシュライン、たとえばキャッシュライン１２０を無効にする。
【００９１】
[0102]  図８は、本開示の技法による、ＧＰＵキャッシュを示す概念図である。図８の例では、ＧＰＵ２０は仮想キャッシュ１０６を含む。仮想キャッシュ１０６は複数のキャッシュラインを含む。ラインの各々は、図７の例において説明したように、共有ビット１２６、ＣｌｅａｎＶａｌｉｄビット１２８、ＤｉｒｔｙＶａｌｉｄビット１３０、およびＢｙｔｅＥｎａｂｌｅｓビット１３２などの属性に関連する。各キャッシュラインの状態は、「クリーン（clean）」と、「有効（valid）」と、「無効（invalid）」と、「ダーティー（dirty）」との混合であり得る。本開示の技法は、ＧＰＵ２０のＳＭＭＵ１０８など、プロセッサのメモリ管理ユニット（ＭＭＵ）が、仮想キャッシュ１０６の各ラインの状態を示すキャッシュの各ラインについての状態ビットを維持することを可能にし得る。
【００９２】
[0103]  ＳＭＭＵ１０８は、キャッシュラインが、システムメモリ１４または別のメモリに書き込まれなかった１つまたは複数の更新された値を含む場合、キャッシュラインをダーティーとマークし得る。ＳＭＭＵ１０８は、キャッシュラインのコンテンツが最新であり、すなわち、他のプロセッサが、そのキャッシュエントリに関連する物理アドレスにより新しい値を書き込まなかった場合、キャッシュラインを有効とマークし得る。対照的に、ＳＭＭＵ１０８は、キャッシュラインが特定のメモリアドレスの最も最新のコピーを含んでいない場合、キャッシュラインを無効とマークし得る。ＳＭＭＵ１０８が無効なラインにアクセスすることを試みるとき、ＳＭＭＵ１０８は、別のキャッシュから、またはメインメモリから共有データの新しいコピーを取り出さなければならない。
【００９３】
[0104]  図８の例では、キャッシュライン１４０など、ハッシングなしのキャッシュラインはクリーンキャッシュラインおよび有効キャッシュラインを表す。キャッシュライン１４４など、対角ハッシングをもつキャッシュラインは無効キャッシュラインを表し、垂直ハッシングをもつキャッシュラインはダーティーキャッシュラインを表す。また、キャッシュラインは、ブロックまたは領域、たとえば、異なるキャッシュ状態を有するバイトサイズ領域に分割され得る。一例として、キャッシュライン１４２は、無効であるキャッシュブロックと、ダーティーであるキャッシュブロックの両方を含み、キャッシュライン１４６は、ダーティーであるキャッシュブロックと、クリーン（ならびに有効）であるキャッシュブロックの両方を含む。定義によって、クリーンまたはダーティーであるブロックは有効でもある。しかしながら、同じキャッシュライン内の他のブロックは無効であり得る。本開示の技法に従って、仮想キャッシュ１０６に記憶された各ブロックの状態を維持することによって、キャッシュエビクション（cache eviction）またはキャッシュフィル（cache fill）を実行するとき、不要なキャッシュフラッシュ（cache flush）またはキャッシュ無効化（invalidation）を低減することが可能であり得る。
【００９４】
[0105]  上記で説明したように、共有変数データ２８を含んでいるキャッシュラインが、共有変数データ２８など、共有値の最も最新の値を有しない場合、ＧＰＵ２０は、ロードウィズアクワイア動作を実行することの一部として最新の値を取り出し得る。様々な例では、最新の共有変数値を取り出すことは、ＳＭＭＵ１０８がキャッシュラインまたはキャッシュラインの一部分を、たとえばシステムメモリ１４からの、最新の値で充填すること（「キャッシュフィル（cache fill）」と呼ばれる）を備え得る。
【００９５】
[0106]  キャッシュフィルを実行するときにキャッシュライン全体を充填することは、いくつかの例では望ましくないことがあり得る。したがって、本開示の技法は、上記で説明したように、キャッシュラインの個々のブロックのキャッシュ状態をマークする。各ブロックの状態に基づいて、ＳＭＭＵ１０８は、共有変数データ２８の最新の値を含んでいないブロックのみを無効化および更新し、またはフラッシュし得る。一例として、キャッシュライン１４４など、キャッシュラインがダーティーブロックと無効ブロックの両方を含む場合、ＳＭＭＵ１０８は、キャッシュフィルを実行するときに、無効ブロックに対応するキャッシュデータのみを取り出し得る。ダーティーブロックは共有変数データの最も最新の値を含むので、ダーティーとマークされたブロックは、キャッシュフィルを実行するときに更新されない。非ダーティーブロックのみを充填することは、キャッシュフィルを実行することに関連する消費される帯域幅および／またはレイテンシを低減し得る。
【００９６】
[0107]  上記で説明したように、ＧＰＵ２０は、ストアウィズリリース動作を実行するときにキャッシュフラッシュ動作を実行し得る。キャッシュフラッシュは、共有変数データ２８の値をシステムメモリ１４に書き出し得る。１つの技法では、ＭＭＵ１０８は、キャッシュフラッシュ中にキャッシュライン全体をシステムメモリ１４に書き込み得る。しかしながら、個々のブロックではなくキャッシュライン全体を書き出すことは、場合によっては不要であり得る。たとえば、キャッシュラインは、ダーティーブロックと無効ブロックとを含み（たとえば、キャッシュライン１４２）、またはダーティーブロックと有効ブロックとを含み得る（たとえば、キャッシュライン１４６）。キャッシュフラッシュ中、定義によって共有データの最もカレントな最新の値を有するダーティーブロックのみ、システムメモリ１４に書き込まれる必要がある。したがって、ＳＭＭＵ１０８は、キャッシュフラッシュ動作を実行するときにダーティーブロックのみをシステムメモリ１４に書き出し得る。
【００９７】
[0108]  ダーティーブロックと無効ブロックの両方を含む仮想キャッシュ１０６のキャッシュラインの場合、ＳＭＭＵ１０８は、ダーティーブロックをシステムメモリ１４に書き込み得、書込みの完了時、仮想キャッシュ１０６のダーティーブロックの各々を無効とマークし得る。キャッシュライン１４６など、仮想キャッシュ１０６のキャッシュラインがダーティーブロックと有効ブロックの両方を含む場合、ＳＭＭＵ１０８は、ダーティーブロックをシステムメモリ１４に書き込み、書込みの完了時、ダーティーブロックを有効とマークし得る。このようにして、ＳＭＭＵ１０８がキャッシュフィルを実行することに関連するデータ、帯域幅および／またはレイテンシは、場合によっては、キャッシュライン全体を書き出すことと比較して低減され得る。
【００９８】
[0109]  ＳＭＭＵ１０８はまた、場合によってはラインエビクション（line eviction）を実行し得、ＳＭＭＵ１０８は、たとえばキャッシュプレッシャ（cache pressure）により、交換されているキャッシュラインを交換する。キャッシュエビクションプロセスの一部として、ＳＭＭＵ１０８は、エビクトアウトされるべきラインをシステムメモリ１４に書き込む。ラインエビクションでは、ＳＭＭＵ１０８は最初に、ダーティーとマークされたバイトまたはワードをシステムメモリ１４に書き出し得る。ＳＭＭＵ１０８は、次いで、エビクトされるべきキャッシュライン全体を無効にし得る。ＳＭＭＵ１０８にダーティーとマークされたブロックのみを書き出させることによって、本開示の技法は、キャッシュエビクションを実行することに関連するデータ、帯域幅、および／または時間を低減し得る。
【００９９】
[0110]  図９は、本開示で説明する１つまたは複数の例による、マルチコアシステムにおいてキャッシュコヒーレンシを維持するためのプロセスを示すフローチャートである。単に説明のために、図１のＧＰＵ２０への参照を行うが、マルチコアシステム２のいずれのプロセッサも本開示の技法を実行し得る。
【０１００】
[0111]  図９では、ファースプロセッサ、たとえばＧＰＵ２０は、共有変数データ２８を第１のプロセッサの第１のキャッシュのキャッシュラインに書き込むように構成され得る（３００）。ＧＰＵ２０は、次いで、ストアウィズリリース動作を実行するかまたはフェンスをリリースし得る（３０２）。いくつかの例では、ストアウィズリリース動作を実行することは、共有変数データ２８に関連するＧＰＵ２０のキャッシュ２２のキャッシュラインをフラッシュすることをＧＰＵ２０に行わせ得る。本方法は、第２のプロセッサ、たとえばＣＰＵ１６が、ロードウィズアクワイア動作を実行することまたはフェンスを取得することをさらに含み得る（３０６）。いくつかの例では、ロードウィズアクワイア動作を実行することは、共有変数データ２８に関連するキャッシュ１８のキャッシュラインを無効にすることをＣＰＵ１６に行わせ得る（３０８）。ＣＰＵ１６は、次いで、キャッシュ１８から共有変数データ２８の値を読み取り、ロードし、共有し得る（３１０）。
【０１０１】
[0112]  いくつかの例では、ストアウィズリリース動作を実行することはさらに、第１のプログラマブルプロセッサを用いて、共有変数データに関連する第１のキャッシュのキャッシュラインをフラッシュすることと、第１のプログラマブルプロセッサを用いて、任意の前のストアが完了するのを待つこととをさらに含み得る。
【０１０２】
[0113]  一例では、ロードウィズアクワイア動作を実行することは、第２のプログラマブルプロセッサを用いて、共有変数データに関連する第２のプログラマブルプロセッサのキャッシュラインを無効にすることと、第２のプログラマブルプロセッサを用いて、共有変数データに関連する第２のキャッシュのキャッシュラインを充填することと、第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作が実行を完了するまで、後続の命令が発行されるのを防ぐこととをさらに備える。
【０１０３】
[0114]  いくつかの例では、図９の方法は、第２のプロセッサを用いて、第１のプログラマブルプロセッサのキャッシュをスヌープすることと、第２のプログラマブルプロセッサを用いて、共有変数データの更新された値に関連するキャッシュヒットを検出することと、第２のプログラマブルプロセッサを用いて、共有変数データに関連するキャッシュヒットを検出したことに応答して、共有変数データの更新された値を第２のプログラマブルプロセッサのキャッシュに書き込むこととをさらに備える。
【０１０４】
[0115]  いくつかの例では、ストアウィズリリース動作を実行することは、第１のキャッシュよりも高いレベルを有する高レベルキャッシュ、システムメモリ、および第２のプロセッサの第２のキャッシュのうちの１つに共有変数データを書き込むことをさらに備える。
【０１０５】
[0116]  別の例では、第１のプロセッサは中央処理ユニット、たとえば、ＣＰＵ１６を備え得、第２のプロセッサはグラフィカル処理ユニット（ＧＰＵ）、たとえば、ＧＰＵ２０を備える。第２のキャッシュのキャッシュラインを無効にするために、ＧＰＵ２０は、コンパイラを用いて、ＧＰＵによって動作可能なシェーダコード中に無効化命令を挿入し得る。
【０１０６】
[0117]  別の例では、第１のプロセッサのキャッシュラインのすべておよび第２のプロセッサのキャッシュラインのすべてが共有される。ストアウィズリリース動作を実行することは、第１のプロセッサのキャッシュラインのすべてをさらに得る。ロードウィズアクワイア動作を実行することは、第１のプロセッサのキャッシュライン第２のすべてを無効にすることを備える。
【０１０７】
[0118]  いくつかの事例では、第１のプロセッサのキャッシュラインの共有サブセットの少なくとも１つの共有ラインが第１の共有可能性属性（shareability attribute）によって示され、記第２のプロセッサのキャッシュラインの共有サブセットの各共有ラインが第２の共有可能性属性によって示される。
【０１０８】
[0119]  別の事例では、図９の方法は、キャッシュフィル動作を実行することと、キャッシュフィル動作を実行したことに応答して、ページテーブルから第１の共有可能性属性または第２の共有可能性属性のうちの１つを読み取ることをさらに備える。
【０１０９】
[0120]  また別の事例では、図９の方法は、コンパイラが、少なくとも１つのロード命令またはストア命令を出すこと、ここにおいて、少なくとも１つのロード命令または記憶命令は、第１の共有可能性属性または第２の共有可能性属性のうちの少なくとも１つ示す、をさらに備える。
【０１１０】
[0121]  別の例では、ロード命令が共有ロード命令を備え、ストア命令が共有ストア命令を備える。
【０１１１】
[0122]  また別の例では、本方法は、第１の共有可能性属性および第２の共有可能性属性のうちの少なくとも１つを示す複数のアドレスポインタの１つまたは複数のビットを読み取ることをさらに備える。
【０１１２】
[0123]  また別の例では、第１の共有可能性属性および第２の共有可能性属性のうちの少なくとも１つは、第１のキャッシュおよび第２のキャッシュのうちの少なくとも１つが非共有状態にあることを示し、本方法は、第１のキャッシュおよび第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、キャッシュ動作を実行したことに応答して、第１のキャッシュおよび第２のキャッシュのうちの少なくとも１つが共有状態にあることを示すように、第１の共有可能性属性および第２の共有可能性属性のうちの少なくとも１つを変更することとをさらに備える。
【０１１３】
[0124]  また別の例では、第１の共有可能性属性および第２の共有可能性属性のうちの少なくとも１つは、第１のキャッシュおよび第２のキャッシュのうちの少なくとも１つが共有状態にあることを示し、本方法は、第１のキャッシュおよび第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、キャッシュ動作を実行したことに応答して、第１のキャッシュおよび第２のキャッシュのうちの少なくとも１つが非共有共有状態にあることを示すように、第１の共有可能性属性および第２の共有可能性属性のうちの少なくとも１つを変更することとをさらに備える。
【０１１４】
[0125]  また別の例では、本方法は、第１のキャッシュおよび第２のキャッシュのうちの少なくとも１つのアドレス領域を判断するために、アドレス記憶された１つまたは複数のレジスタを第１のキャッシュおよび第２のキャッシュのうちの少なくとも１つのアドレスと比較することと、アドレス領域が共有されているか共有されていないかを判断することとをさらに備える。
【０１１５】
[0126]  また別の例では、本方法は、第１のキャッシュおよび第２のキャッシュのうちの少なくとも１つのダーティーバイトを判断することと、キャッシュエビクションおよびキャッシュフラッシュのうちの少なくとも１つを実行することと、キャッシュエビクションおよびキャッシュフラッシュのうちの少なくとも１つ中にダーティーバイトのみをキャッシュまたはシステムメモリに書き込むこととをさらに備える。
【０１１６】
[0127]  また別の例では、ストアウィズリリース動作を実行するために、第１のプロセッサは、割込みの受信、レジスタ読取り、レジスタ書込み、およびプログラマブル遅延のうちの少なくとも１つに応答して、第１のプロセッサのキャッシュをフラッシュする。
【０１１７】
[0128]  さらに別の例では、ストアウィズリリース動作を実行するために、第１のプロセッサは、キャッシュプレッシャ、タイムアウトおよび明示的ソフトウェアキャッシュメンテナンスのうちの少なくとも１つに応答して、第１のキャッシュをフラッシュする。
【０１１８】
[0129]  さらに別の例では、ストアウィズリリース動作を実行するために、第１のプロセッサは、キャッシュプレッシャ、タイムアウトおよび明示的ソフトウェアキャッシュメンテナンスのうちの少なくとも１つに応答して、第１のキャッシュをフラッシュする。
【０１１９】
[0130]  さらに別の例では、第１のキャッシュおよび第２のキャッシュのうちの少なくとも１つが仮想的にタグ付けされる。いくつかの例では、ストアウィズリリース動作を実行することが、第１のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、物理アドレスに基づいて、仮想アドレスを物理アドレスに変換した後に、第１のキャッシュのキャッシュラインをフラッシュすることとを備える。
【０１２０】
[0131]  また別の例では、ロードウィズアクワイア動作を実行することが、第２のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、物理アドレスに基づいて、仮想アドレスを物理アドレスに変換した後に、第２のキャッシュのキャッシュラインを無効にすることとを備える。
【０１２１】
[0132]  例によっては、本明細書で説明した技法のうちいずれかの、いくつかの作用またはイベントは、異なるシーケンスで実行され得、追加、マージ、または完全に除外され得る（たとえば、すべての説明した作用またはイベントが、本技法の実施のために必要であるとは限らない）ことを認識されたい。さらに、いくつかの例では、行為またはイベントは、連続的にではなく、同時に、たとえば、マルチスレッド処理、割込み処理、または複数のプロセッサを通じて実行され得る。
【０１２２】
[0133]  １つまたは複数の例では、説明された機能は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。ソフトウェアで実装した場合、機能は、１つまたは複数の命令またはコードとしてコンピュータ可読媒体上に記憶され得る。コンピュータ可読媒体はコンピュータデータ記憶媒体を含み得る。データ記憶媒体は、本開示で説明した技法の実装のための命令、コードおよび／またはデータ構造を取り出すために１つまたは複数のコンピュータあるいは１つまたは複数のプロセッサによってアクセスされ得る任意の利用可能な媒体であり得る。限定ではなく、例として、そのようなコンピュータ可読媒体は、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭまたは他の光ディスクストレージ、磁気ディスクストレージまたは他の磁気ストレージデバイス、あるいは命令またはデータ構造の形態の所望のプログラムコードを記憶するために使用され得、コンピュータによってアクセスされ得る、任意の他の媒体を備えることができる。本明細書で使用するディスク（disk）およびディスク（disc）は、コンパクトディスク（disc）（ＣＤ）、レーザーディスク（登録商標）（disc）、光ディスク（disc）、デジタル多用途ディスク（disc）（ＤＶＤ）、フロッピー（登録商標）ディスク（disk）およびブルーレイ（登録商標）ディスク（disc）を含み、ディスク（disk）は、通常、データを磁気的に再生し、ディスク（disc）は、データをレーザーで光学的に再生する。上記の組合せもコンピュータ可読媒体の範囲内に含まれるべきである。
【０１２３】
[0134]  コードは、１つまたは複数のデジタル信号プロセッサ（ＤＳＰ）などの１つまたは複数のプロセッサ、汎用マイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブル論理アレイ（ＦＰＧＡ）、あるいは他の等価な集積回路またはディスクリート論理回路によって実行され得る。したがって、本明細書で使用する「プロセッサ」という用語は、前述の構造、または本明細書で説明する技法の実装に好適な他の構造のいずれかを指す。また、本技法は、１つまたは複数の回路または論理要素中に十分に実装され得る。
【０１２４】
[0135]  本開示に従って、たとえば、リリース一貫性メモリ順序付けモデル（release consistency memory ordering model）を用いて、オンデマンドキャッシュコヒーレンシ（on-demand cache coherency）を実装する技法について上記で説明した。付録も本開示に添付する。付録において説明する技法は、図１に示されたユニットのうちの１つまたは複数、たとえば、ＣＰＵ１６、ＧＰＵ２０および／またはＤＳＰ２４上に実装され得る。添付の付録は、参照によりその全体が本開示に組み込まれ、本開示への添付と見なされ得る。
【０１２５】
[0136]  本開示の技法は、ワイヤレスハンドセット、集積回路（ＩＣ）、またはＩＣのセット（たとえば、チップセット）を含む、多種多様なデバイスまたは装置において実装され得る。本開示では、開示する技法を実行するように構成されたデバイスの機能的態様を強調するために様々な構成要素、モジュール、またはユニットについて説明したが、それらの構成要素、モジュール、またはユニットを、必ずしも異なるハードウェアユニットによって実現する必要があるとは限らない。むしろ、上記で説明したように、様々なユニットが、好適なソフトウェアおよび／またはファームウェアとともに、上記で説明した１つまたは複数のプロセッサを含めて、ハードウェアユニットにおいて組み合わせられるか、または相互動作可能なハードウェアユニットの集合によって与えられ得る。
【０１２６】
[0137]  様々な例について説明した。これらおよび他の例は以下の特許請求の範囲内に入る。
【図１】
2015524597.tif 000003
【図２】
2015524597.tif 000004
【図３Ａ】
2015524597.tif 000005
【図３Ｂ】
2015524597.tif 000006
【図４Ａ】
2015524597.tif 000007
【図４Ｂ】
2015524597.tif 000008
【図５Ａ】
2015524597.tif 000009
【図５Ｂ】
2015524597.tif 000010
【図６】
2015524597.tif 000011
【図７】
2015524597.tif 000012
【図８】
2015524597.tif 000013
【図９】
2015524597.tif 000014
【手続補正書】
【提出日】平成27年4月21日(2015.4.21)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
第１のプログラマブルプロセッサを用いて、前記第１のプロセッサの第１のキャッシュのキャッシュラインに共有変数データを記憶することと、
前記第１のプログラマブルプロセッサを用いて、ストアウィズリリース動作を実行することと、ここにおいて、前記ストアウィズリリース動作を実行することが、
前記第１のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第１のキャッシュのキャッシュラインをフラッシュすることと、
前記第１のプログラマブルプロセッサを用いて、任意の前のストアが完了するのを待つことと
を備える、
第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行することと、
前記第２のプログラマブルプロセッサを用いて、前記第２のプログラマブルプロセッサのキャッシュから前記共有変数データの値をロードすることと
を備える方法。
【請求項２】
前記ロードウィズアクワイア動作を実行することは、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のプログラマブルプロセッサのキャッシュラインを無効にすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する第２のキャッシュのキャッシュラインを充填することと、
前記第２のプログラマブルプロセッサを用いて、前記ロードウィズアクワイア動作が実行を完了するまで、後続の命令が発行されるのを防ぐことと
を備える、請求項１に記載の方法。
【請求項３】
前記第２のプロセッサを用いて、前記第１のプログラマブルプロセッサの前記キャッシュをスヌープすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データの更新された値に関連するキャッシュヒットを検出することと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記キャッシュヒットを検出したことに応答して、前記共有変数データの前記更新された値を前記第２のプログラマブルプロセッサの前記キャッシュに書き込むことと
をさらに備える、請求項２に記載の方法。
【請求項４】
前記ストアウィズリリース動作を実行することが、
前記第１のキャッシュよりも高いレベルを有する高レベルキャッシュ、システムメモリ、および前記第２のプロセッサの前記第２のキャッシュのうちの１つに前記共有変数データを書き込むこと
をさらに備える、請求項１に記載の方法。
【請求項５】
前記第１のプロセッサが中央処理ユニット（ＣＰＵ）を備え、前記第２のプロセッサがグラフィックス処理ユニット（ＧＰＵ）を備える、請求項１に記載の方法。
【請求項６】
前記第１のプロセッサの前記キャッシュラインのすべておよび前記第２のプロセッサの前記キャッシュラインのすべてが共有され、
ここにおいて、前記ストアウィズリリース動作を実行することが、前記第１のプロセッサの前記キャッシュラインのすべてをフラッシュすることをさらに備え、
ここにおいて、前記ロードウィズアクワイア動作を実行することが、前記第２の第１のプロセッサの前記キャッシュラインのすべてを無効にすることをさらに備える、請求項１に記載の方法。
【請求項７】
前記第１のプロセッサの前記キャッシュラインのすべてうちの１サブセットが共有され、第２のプロセッサの前記キャッシュラインのすべてのうちの１サブセットが共有され、
ここにおいて、前記ストアウィズリリース動作を実行することが、前記第１のプロセッサの前記キャッシュラインの前記共有サブセットのみをフラッシュすることをさらに備え、
ここにおいて、前記ロードウィズアクワイア動作を実行することが、前記第２のプロセッサの前記キャッシュラインのすべて前記共有サブセットのみを無効にすることをさらに備える、
請求項１に記載の方法。
【請求項８】
前記第１のプロセッサの前記キャッシュラインの前記共有サブセットの少なくとも１つの共有ラインが第１の共有可能性属性によって示され、
ここにおいて、前記第２のプロセッサの前記キャッシュラインの前記共有サブセットの各共有ラインが第２の共有可能性属性によって示される、
請求項７に記載の方法。
【請求項９】
キャッシュフィル動作を実行することと、
前記キャッシュフィル動作を実行したことに応答して、ページテーブルから前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つを読み取ることと
をさらに備える、請求項８に記載の方法。
【請求項１０】
コンパイラが、ロード命令およびストア命令のうちの少なくとも１つを発行すること、ここにおいて、前記ロード命令および前記ストア命令のうちの前記少なくとも１つが前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを示す、
をさらに備える、請求項８に記載の方法。
【請求項１１】
前記ロード命令が共有ロード命令を備え、前記ストア命令が共有ストア命令を備える、請求項１０に記載の方法。
【請求項１２】
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つを示す複数のアドレスポインタの１つまたは複数のビットを読み取ることをさらに備える、請求項８に記載の方法。
【請求項１３】
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つは、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが非共有状態にあることを示し、前記方法は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、
前記キャッシュ動作を実行したことに応答して、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが共有状態にあることを示すように、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを変更することと
をさらに備える、請求項８に記載の方法。
【請求項１４】
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つは、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが共有状態にあることを示し、前記方法は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、
前記キャッシュ動作を実行したことに応答して、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが、非共有共有状態にあることを示すように、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを変更することと
をさらに備える、請求項８に記載の方法。
【請求項１５】
前記第１のキャッシュおよび前記第２のキャッシュのうちの前記少なくとも１つのアドレス領域を判断するために、アドレスが記憶された１つまたは複数のレジスタを前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つのアドレスと比較することと、
前記アドレス領域が共有されているか共有されていないかを判断することと
をさらに備える、請求項１に記載の方法。
【請求項１６】
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つのダーティーバイトを判断することと、
キャッシュエビクションおよびキャッシュフラッシュのうちの少なくとも１つを実行することと、
前記キャッシュエビクションおよび前記キャッシュフラッシュのうちの前記少なくとも１つ中に前記ダーティーバイトのみをキャッシュまたはシステムメモリに書き込むことと
をさらに備える、請求項１に記載の方法。
【請求項１７】
前記第１のプロセッサを用いて、前記ストアウィズリリース動作を実行することが、
割込みを受信すること、レジスタ読取り、レジスタ書込み、およびプログラマブル遅延のうちの少なくとも１つに応答して、前記第１のプロセッサを用いて、前記第１のプロセッサの前記キャッシュをフラッシュすること
をさらに備える、請求項１に記載の方法。
【請求項１８】
前記第１のプロセッサを用いて、前記ストアウィズリリース動作を実行することが、
キャッシュプレッシャ、タイムアウト、および明示的ソフトウェアキャッシュメンテナンスのうちの少なくとも１つに応答して、前記第１のプロセッサを用いて、前記第１のキャッシュをフラッシュすること
をさらに備える、請求項１に記載の方法。
【請求項１９】
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが仮想的にタグ付けされる、請求項１に記載の方法。
【請求項２０】
前記ストアウィズリリース動作を実行することが、前記第１のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、
前記物理アドレスに基づいて、前記仮想アドレスを前記物理アドレスに変換した後に、前記第１のキャッシュの前記キャッシュラインをフラッシュすることと
をさらに備える、請求項１に記載の方法。
【請求項２１】
前記ロードウィズアクワイア動作を実行することが、前記第２のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、
前記物理アドレスに基づいて、前記仮想アドレスを前記物理アドレスに変換した後に、前記第２のキャッシュの前記キャッシュラインを無効にすることと
をさらに備える、請求項１に記載の方法。
【請求項２２】
第１のプログラマブルプロセッサを用いて、前記第１のプロセッサの第１のキャッシュのキャッシュラインに共有変数データを記憶するための手段と、
前記第１のプログラマブルプロセッサを用いて、ストアウィズリリース動作を実行するための手段と、ここにおいて、前記ストアウィズリリース動作を実行するための前記手段は、
前記第１のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第１のキャッシュのキャッシュラインをフラッシュするための手段と、
前記第１のプログラマブルプロセッサを用いて、任意の前のストアが完了するのを待つための手段と
を備える、
第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行するための手段と、
前記第２のプログラマブルプロセッサを用いて、前記第２のプログラマブルプロセッサのキャッシュから前記共有変数データの値をロードするための手段と
を備える装置。
【請求項２３】
前記ロードウィズアクワイア動作を実行するための前記手段は、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のプログラマブルプロセッサのキャッシュラインを無効にするための手段と、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する第２のキャッシュのキャッシュラインを充填するための手段と、
前記第２のプログラマブルプロセッサを用いて、前記ロードウィズアクワイア動作が実行を完了するまで、後続の命令が発行されるのを防ぐための手段と
を備える、請求項２２に記載の装置。
【請求項２４】
前記第２のプロセッサを用いて、前記第１のプログラマブルプロセッサの前記キャッシュをスヌープするための手段と、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データの更新された値に関連するキャッシュヒットを検出するための手段と、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記キャッシュヒットを検出したことに応答して、前記共有変数データの前記更新された値を前記第２のプログラマブルプロセッサの前記キャッシュに書き込むための手段とをさらに備える、請求項２３に記載の装置。
【請求項２５】
第１のキャッシュを有する第１のプログラマブルプロセッサと、
第２のキャッシュを有する第２のプログラマブルプロセッサと
を備える装置であって、前記デバイスが、
前記第１のプログラマブルプロセッサを用いて、前記第１のプロセッサの前記第１のキャッシュのキャッシュラインに共有変数データを記憶することと、
前記第１のプログラマブルプロセッサを用いて、ストアウィズリリース動作を実行することと、ここにおいて、前記ストアウィズリリース動作を実行するために、前記装置が、
前記第１のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第１のキャッシュのキャッシュラインをフラッシュすることと、
前記第１のプログラマブルプロセッサを用いて、任意の前のストアが完了するのを待つことと
を行うように構成される、
前記第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行することと、
前記第２のプログラマブルプロセッサを用いて、前記第２のプログラマブルプロセッサの前記キャッシュから前記共有変数データの値をロードすることと
を行うように構成された、装置。
【請求項２６】
前記ロードウィズアクワイア動作を実行するために、前記装置は、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のプログラマブルプロセッサのキャッシュラインを無効にすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のキャッシュのキャッシュラインを充填することと、
前記第２のプログラマブルプロセッサを用いて、前記ロードウィズアクワイア動作が実行を完了するまで、後続の命令が発行されるのを防ぐことと
を行うように構成された、請求項２５に記載の装置。
【請求項２７】
前記装置が、
前記第２のプロセッサを用いて、前記第１のプログラマブルプロセッサの前記キャッシュをスヌープすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データの更新された値に関連するキャッシュヒットを検出することと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記キャッシュヒットを検出したことに応答して、前記共有変数データの前記更新された値を前記第２のプログラマブルプロセッサの前記キャッシュに書き込むことと
を行うようにさらに構成された、請求項２６に記載の装置。
【請求項２８】
前記ストアウィズリリース動作を実行するために、前記装置が、
前記第１のキャッシュよりも高いレベルを有する高レベルキャッシュ、システムメモリ、および前記第２のプロセッサの前記第２のキャッシュのうちの１つに前記共有変数データを書き込むこと
を行うようにさらに構成された、請求項２５に記載の装置。
【請求項２９】
前記第１のプロセッサが中央処理ユニット（ＣＰＵ）を備え、前記第２のプロセッサがグラフィックス処理ユニット（ＧＰＵ）を備える、請求項２５に記載の装置。
【請求項３０】
前記第１のプロセッサの前記キャッシュラインのすべておよび前記第２のプロセッサの前記キャッシュラインのすべてが共有され、
ここにおいて、前記ストアウィズリリース動作を実行するために、前記装置が、前記第１のプロセッサの前記キャッシュラインのすべてをフラッシュするようにさらに構成され、
ここにおいて、前記ロードウィズアクワイア動作を実行するために、前記装置が、前記第２の第１のプロセッサの前記キャッシュラインのすべてを無効にするようにさらに構成された、
請求項２５に記載の装置。
【請求項３１】
前記第１のプロセッサの前記キャッシュラインのすべての１サブセットが共有され、第２のプロセッサの前記キャッシュラインのすべてのうちの１サブセットが共有され、
ここにおいて、前記ストアウィズリリース動作を実行するために、前記装置が、前記第１のプロセッサの前記キャッシュラインの前記共有サブセットのみをフラッシュするようにさらに構成され、
ここにおいて、前記ロードウィズアクワイア動作を実行するために、前記装置が、前記第２のプロセッサの前記キャッシュラインのすべて前記共有サブセットのみを無効にするようにさらに構成された、
請求項２５に記載の装置。
【請求項３２】
前記第１のプロセッサの前記キャッシュラインの前記共有サブセットの少なくとも１つの共有ラインが第１の共有可能性属性によって示され、
ここにおいて、前記第２のプロセッサの前記キャッシュラインの前記共有サブセットの各共有ラインが第２の共有可能性属性によって示される、
請求項３１に記載の装置。
【請求項３３】
前記装置が、
キャッシュフィル動作を実行することと、
前記キャッシュフィル動作を実行したことに応答して、ページテーブルから前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つを読み取ることと
を行うようにさらに構成された、請求項３２に記載の装置。
【請求項３４】
前記装置は、
コンパイラが、ロード命令およびストア命令のうちの少なくとも１つを発行すること、ここにおいて、前記ロード命令および前記ストア命令のうちの前記少なくとも１つが前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを示す、
を行うようにさらに構成された、請求項３２に記載の装置。
【請求項３５】
前記ロード命令が共有ロード命令を備え、前記ストア命令が共有ストア命令を備える、請求項３４に記載の装置。
【請求項３６】
前記装置が、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つを示す複数のアドレスポインタの１つまたは複数のビットを読み取ることを行うようにさらに構成された、請求項３２に記載の装置。
【請求項３７】
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つは、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが非共有状態にあることを示し、前記装置は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、
前記キャッシュ動作を実行したことに応答して、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが共有状態にあることを示すように、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを変更することと
を行うようにさらに構成された、請求項３２に記載の装置。
【請求項３８】
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つは、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが共有状態にあることを示し、前記装置は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、
前記キャッシュ動作を実行したことに応答して、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが非共有共有状態にあることを示すように、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを変更することと
を行うようにさらに構成された、請求項３２に記載の装置。
【請求項３９】
前記装置は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの前記少なくとも１つのアドレス領域を判断するために、アドレスが記憶された１つまたは複数のレジスタを前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つのアドレスと比較することと、
前記アドレス領域が共有されているか共有されていないかを判断することと
を行うようにさらに構成された、請求項２５に記載の装置。
【請求項４０】
前記装置が、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つのダーティーバイトを判断することと、
キャッシュエビクションおよびキャッシュフラッシュのうちの少なくとも１つを実行することと、
前記キャッシュエビクションおよび前記キャッシュフラッシュのうちの前記少なくとも１つ中に前記ダーティーバイトのみをキャッシュまたはシステムメモリに書き込むこととを行うようにさらに構成された、請求項２５に記載の装置。
【請求項４１】
前記第１のプロセッサを用いて、前記ストアウィズリリース動作を実行するために、前記装置が、
割込みを受信すること、レジスタ読取り、レジスタ書込み、およびプログラマブル遅延のうちの少なくとも１つに応答して、前記第１のプロセッサを用いて、前記第１のプロセッサの前記キャッシュをフラッシュすること
を行うようにさらに構成された、請求項２５に記載の装置。
【請求項４２】
前記第１のプロセッサを用いて、前記ストアウィズリリース動作を実行するために、前記装置が、
キャッシュプレッシャ、タイムアウト、および明示的ソフトウェアキャッシュメンテナンスのうちの少なくとも１つに応答して、前記第１のプロセッサを用いて、前記第１のキャッシュをフラッシュすること
を行うようにさらに構成された、請求項２５に記載の装置。
【請求項４３】
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが仮想的にタグ付けされる、請求項２５に記載の装置。
【請求項４４】
前記ストアウィズリリース動作を実行するために、前記装置が、
前記第１のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、
前記物理アドレスに基づいて、前記仮想アドレスを前記物理アドレスに変換した後に、前記第１のキャッシュの前記キャッシュラインをフラッシュすることと
を行うようにさらに構成された、請求項２５に記載の装置。
【請求項４５】
前記ロードウィズアクワイア動作を実行するために、前記装置が、前記第２のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、
前記物理アドレスに基づいて、前記仮想アドレスを前記物理アドレスに変換した後に、前記第２のキャッシュの前記キャッシュラインを無効にすることと
を行うようにさらに構成された、請求項２５に記載の装置。
【請求項４６】
実行されたとき、１つまたは複数のプロセッサに、
第１のプログラマブルプロセッサを用いて、前記第１のプロセッサの第１のキャッシュのキャッシュラインに共有変数データを記憶することと、
前記第１のプログラマブルプロセッサを用いて、ストアウィズリリース動作を実行することと
を行わせる命令を記憶し、ここにおいて、前記１つまたは複数のプロセッサに前記ストアウィズリリース動作を実行させる前記命令は、実行されたとき、前記１つまたは複数のプロセッサに、
前記第１のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第１のキャッシュのキャッシュラインをフラッシュすることと、
前記第１のプログラマブルプロセッサを用いて、任意の前のストアが完了するのを待つことと
を行わせる命令を備える、
第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行することと、
前記第２のプログラマブルプロセッサを用いて、前記第２のプログラマブルプロセッサのキャッシュから前記共有変数データの値をロードすることと
を行わせる命令をさらに記憶した非一時的コンピュータ可読記憶媒体。
【請求項４７】
前記１つまたは複数のプロセッサに前記ロードウィズアクワイア動作を実行させる前記命令は、実行されたとき、前記１つまたは複数のプロセッサに、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のプログラマブルプロセッサのキャッシュラインを無効にすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する第２のキャッシュのキャッシュラインを充填することと、
前記第２のプログラマブルプロセッサを用いて、前記ロードウィズアクワイア動作が実行を完了するまで、後続の命令が発行されるのを防ぐことと
を行わせる命令を備える、請求項４６に記載の非一時的コンピュータ可読記憶媒体。
【請求項４８】
実行されたとき、前記１つまたは複数のプロセッサに、
前記第２のプロセッサを用いて、前記第１のプログラマブルプロセッサの前記キャッシュをスヌープすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データの更新された値に関連するキャッシュヒットを検出することと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記キャッシュヒットを検出したことに応答して、前記共有変数データの前記更新された値を前記第２のプログラマブルプロセッサの前記キャッシュに書き込むことと
を行わせる命令をさらに備える、請求項４６に記載の非一時的コンピュータ可読記憶媒体。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】０１２６
【補正方法】変更
【補正の内容】
【０１２６】
[0137]  様々な例について説明した。これらおよび他の例は以下の特許請求の範囲内に入る。
以下に、本願出願の当初の特許請求の範囲に記載された発明を付記する。
［Ｃ１］
第１のプログラマブルプロセッサを用いて、前記第１のプロセッサの第１のキャッシュのキャッシュラインに共有変数データを記憶することと、
前記第１のプログラマブルプロセッサを用いて、ストアウィズリリース動作を実行することと、
第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行することと、
前記第２のプログラマブルプロセッサを用いて、前記第２のプログラマブルプロセッサのキャッシュから前記共有変数データの値をロードすることと
を備える方法。
［Ｃ２］
前記ストアウィズリリース動作を実行することが、
前記第１のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第１のキャッシュのキャッシュラインをフラッシュすることと、
前記第１のプログラマブルプロセッサを用いて、任意の前のストアが完了するのを待つことと
をさらに備える、Ｃ１に記載の方法。
［Ｃ３］
前記ロードウィズアクワイア動作を実行することは、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のプログラマブルプロセッサのキャッシュラインを無効にすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する第２のキャッシュのキャッシュラインを充填することと、
前記第２のプログラマブルプロセッサを用いて、前記ロードウィズアクワイア動作が実行を完了するまで、後続の命令が発行されるのを防ぐことと
をさらに備える、Ｃ１に記載の方法。
［Ｃ４］
前記第２のプロセッサを用いて、前記第１のプログラマブルプロセッサの前記キャッシュをスヌープすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データの更新された値に関連するキャッシュヒットを検出することと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記キャッシュヒットを検出したことに応答して、前記共有変数データの前記更新された値を前記第２のプログラマブルプロセッサの前記キャッシュに書き込むことと
をさらに備える、Ｃ３に記載の方法。
［Ｃ５］
前記ストアウィズリリース動作を実行することが、
前記第１のキャッシュよりも高いレベルを有する高レベルキャッシュ、システムメモリ、および前記第２のプロセッサの前記第２のキャッシュのうちの１つに前記共有変数データを書き込むこと
をさらに備える、Ｃ１に記載の方法。
［Ｃ６］
前記第１のプロセッサが中央処理ユニット（ＣＰＵ）を備え、前記第２のプロセッサがグラフィックス処理ユニット（ＧＰＵ）を備える、Ｃ１に記載の方法。
［Ｃ７］
前記第１のプロセッサの前記キャッシュラインのすべておよび前記第２のプロセッサの前記キャッシュラインのすべてが共有され、
ここにおいて、前記ストアウィズリリース動作を実行することが、前記第１のプロセッサの前記キャッシュラインのすべてをフラッシュすることをさらに備え、
ここにおいて、前記ロードウィズアクワイア動作を実行することが、前記第２の第１のプロセッサの前記キャッシュラインのすべてを無効にすることをさらに備える、Ｃ１に記載の方法。
［Ｃ８］
前記第１のプロセッサの前記キャッシュラインのすべてうちの１サブセットが共有され、第２のプロセッサの前記キャッシュラインのすべてのうちの１サブセットが共有され、
ここにおいて、前記ストアウィズリリース動作を実行することが、前記第１のプロセッサの前記キャッシュラインの前記共有サブセットのみをフラッシュすることをさらに備え、
ここにおいて、前記ロードウィズアクワイア動作を実行することが、前記第２のプロセッサの前記キャッシュラインのすべて前記共有サブセットのみを無効にすることをさらに備える、
Ｃ１に記載の方法。
［Ｃ９］
前記第１のプロセッサの前記キャッシュラインの前記共有サブセットの少なくとも１つの共有ラインが第１の共有可能性属性によって示され、
ここにおいて、前記第２のプロセッサの前記キャッシュラインの前記共有サブセットの各共有ラインが第２の共有可能性属性によって示される、
Ｃ８に記載の方法。
［Ｃ１０］
キャッシュフィル動作を実行することと、
前記キャッシュフィル動作を実行したことに応答して、ページテーブルから前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つを読み取ることと
をさらに備える、Ｃ９に記載の方法。
［Ｃ１１］
コンパイラが、ロード命令およびストア命令のうちの少なくとも１つを発行すること、ここにおいて、前記ロード命令および前記ストア命令のうちの前記少なくとも１つが前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを示す、
をさらに備える、Ｃ９に記載の方法。
［Ｃ１２］
前記ロード命令が共有ロード命令を備え、前記ストア命令が共有ストア命令を備える、Ｃ１１に記載の方法。
［Ｃ１３］
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つを示す複数のアドレスポインタの１つまたは複数のビットを読み取ることをさらに備える、Ｃ９に記載の方法。
［Ｃ１４］
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つは、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが非共有状態にあることを示し、前記方法は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、
前記キャッシュ動作を実行したことに応答して、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが共有状態にあることを示すように、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを変更することと
をさらに備える、Ｃ９に記載の方法。
［Ｃ１５］
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つは、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが共有状態にあることを示し、前記方法は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、
前記キャッシュ動作を実行したことに応答して、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが、非共有共有状態にあることを示すように、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを変更することと
をさらに備える、Ｃ９に記載の方法。
［Ｃ１６］
前記第１のキャッシュおよび前記第２のキャッシュのうちの前記少なくとも１つのアドレス領域を判断するために、アドレスが記憶された１つまたは複数のレジスタを前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つのアドレスと比較することと、
前記アドレス領域が共有されているか共有されていないかを判断することとをさらに備える、Ｃ１に記載の方法。
［Ｃ１７］
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つのダーティーバイトを判断することと、
キャッシュエビクションおよびキャッシュフラッシュのうちの少なくとも１つを実行することと、
前記キャッシュエビクションおよび前記キャッシュフラッシュのうちの前記少なくとも１つ中に前記ダーティーバイトのみをキャッシュまたはシステムメモリに書き込むこととをさらに備える、Ｃ１に記載の方法。
［Ｃ１８］
前記第１のプロセッサを用いて、前記ストアウィズリリース動作を実行することが、
割込みを受信すること、レジスタ読取り、レジスタ書込み、およびプログラマブル遅延のうちの少なくとも１つに応答して、前記第１のプロセッサを用いて、前記第１のプロセッサの前記キャッシュをフラッシュすること
をさらに備える、Ｃ１に記載の方法。
［Ｃ１９］
前記第１のプロセッサを用いて、前記ストアウィズリリース動作を実行することが、
キャッシュプレッシャ、タイムアウト、および明示的ソフトウェアキャッシュメンテナンスのうちの少なくとも１つに応答して、前記第１のプロセッサを用いて、前記第１のキャッシュをフラッシュすること
をさらに備える、Ｃ１に記載の方法。
［Ｃ２０］
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが仮想的にタグ付けされる、Ｃ１に記載の方法。
［Ｃ２１］
前記ストアウィズリリース動作を実行することが、前記第１のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、
前記物理アドレスに基づいて、前記仮想アドレスを前記物理アドレスに変換した後に、前記第１のキャッシュの前記キャッシュラインをフラッシュすることと
をさらに備える、Ｃ１に記載の方法。
［Ｃ２２］
前記ロードウィズアクワイア動作を実行することが、前記第２のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、
前記物理アドレスに基づいて、前記仮想アドレスを前記物理アドレスに変換した後に、前記第２のキャッシュの前記キャッシュラインを無効にすることと
をさらに備える、Ｃ１に記載の方法。
［Ｃ２３］
第１のプログラマブルプロセッサを用いて、前記第１のプロセッサの第１のキャッシュのキャッシュラインに共有変数データを記憶するための手段と、
前記第１のプログラマブルプロセッサを用いて、ストアウィズリリース動作を実行するための手段と、
第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行するための手段と、
前記第２のプログラマブルプロセッサを用いて、前記第２のプログラマブルプロセッサのキャッシュから前記共有変数データの値をロードするための手段と
を備える装置。
［Ｃ２４］
前記ストアウィズリリース動作を実行するための前記手段は、
前記第１のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第１のキャッシュのキャッシュラインをフラッシュするための手段と、
前記第１のプログラマブルプロセッサを用いて、任意の前のストアが完了するのを待つための手段と
をさらに備える、Ｃ２３に記載の装置。
［Ｃ２５］
前記ロードウィズアクワイア動作を実行するための前記手段は、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のプログラマブルプロセッサのキャッシュラインを無効にするための手段と、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する第２のキャッシュのキャッシュラインを充填するための手段と、
前記第２のプログラマブルプロセッサを用いて、前記ロードウィズアクワイア動作が実行を完了するまで、後続の命令が発行されるのを防ぐための手段と
をさらに備える、Ｃ２３に記載の装置。
［Ｃ２６］
前記第２のプロセッサを用いて、前記第１のプログラマブルプロセッサの前記キャッシュをスヌープするための手段と、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データの更新された値に関連するキャッシュヒットを検出するための手段と、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記キャッシュヒットを検出したことに応答して、前記共有変数データの前記更新された値を前記第２のプログラマブルプロセッサの前記キャッシュに書き込むための手段とをさらに備える、Ｃ２５に記載の装置。
［Ｃ２７］
第１のキャッシュを有する第１のプログラマブルプロセッサと、
第２のキャッシュを有する第２のプログラマブルプロセッサと
を備える装置であって、前記デバイスが、
前記第１のプログラマブルプロセッサを用いて、前記第１のプロセッサの前記第１のキャッシュのキャッシュラインに共有変数データを記憶することと、
前記第１のプログラマブルプロセッサを用いて、ストアウィズリリース動作を実行することと、
前記第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行することと、
前記第２のプログラマブルプロセッサを用いて、前記第２のプログラマブルプロセッサの前記キャッシュから前記共有変数データの値をロードすることと
を行うように構成された、装置。
［Ｃ２８］
前記ストアウィズリリース動作を実行するために、前記装置が、
前記第１のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第１のキャッシュのキャッシュラインをフラッシュすることと、
前記第１のプログラマブルプロセッサを用いて、任意の前のストアが完了するのを待つことと
を行うようにさらに構成された、Ｃ２７に記載の装置。
［Ｃ２９］
前記ロードウィズアクワイア動作を実行するために、前記装置は、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のプログラマブルプロセッサのキャッシュラインを無効にすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のキャッシュのキャッシュラインを充填することと、
前記第２のプログラマブルプロセッサを用いて、前記ロードウィズアクワイア動作が実行を完了するまで、後続の命令が発行されるのを防ぐことと
を行うようにさらに構成された、Ｃ２７に記載の装置。
［Ｃ３０］
前記装置が、
前記第２のプロセッサを用いて、前記第１のプログラマブルプロセッサの前記キャッシュをスヌープすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データの更新された値に関連するキャッシュヒットを検出することと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記キャッシュヒットを検出したことに応答して、前記共有変数データの前記更新された値を前記第２のプログラマブルプロセッサの前記キャッシュに書き込むことと
を行うようにさらに構成された、Ｃ２９に記載の装置。
［Ｃ３１］
前記ストアウィズリリース動作を実行するために、前記装置が、
前記第１のキャッシュよりも高いレベルを有する高レベルキャッシュ、システムメモリ、および前記第２のプロセッサの前記第２のキャッシュのうちの１つに前記共有変数データを書き込むこと
を行うようにさらに構成された、Ｃ２７に記載の装置。
［Ｃ３２］
前記第１のプロセッサが中央処理ユニット（ＣＰＵ）を備え、前記第２のプロセッサがグラフィックス処理ユニット（ＧＰＵ）を備える、Ｃ２７に記載の装置。
［Ｃ３３］
前記第１のプロセッサの前記キャッシュラインのすべておよび前記第２のプロセッサの前記キャッシュラインのすべてが共有され、
ここにおいて、前記ストアウィズリリース動作を実行するために、前記装置が、前記第１のプロセッサの前記キャッシュラインのすべてをフラッシュするようにさらに構成され、
ここにおいて、前記ロードウィズアクワイア動作を実行するために、前記装置が、前記第２の第１のプロセッサの前記キャッシュラインのすべてを無効にするようにさらに構成された、
Ｃ２７に記載の装置。
［Ｃ３４］
前記第１のプロセッサの前記キャッシュラインのすべての１サブセットが共有され、第２のプロセッサの前記キャッシュラインのすべてのうちの１サブセットが共有され、
ここにおいて、前記ストアウィズリリース動作を実行するために、前記装置が、前記第１のプロセッサの前記キャッシュラインの前記共有サブセットのみをフラッシュするようにさらに構成され、
ここにおいて、前記ロードウィズアクワイア動作を実行するために、前記装置が、前記第２のプロセッサの前記キャッシュラインのすべて前記共有サブセットのみを無効にするようにさらに構成された、
Ｃ２７に記載の装置。
［Ｃ３５］
前記第１のプロセッサの前記キャッシュラインの前記共有サブセットの少なくとも１つの共有ラインが第１の共有可能性属性によって示され、
ここにおいて、前記第２のプロセッサの前記キャッシュラインの前記共有サブセットの各共有ラインが第２の共有可能性属性によって示される、
Ｃ３４に記載の装置。
［Ｃ３６］
前記装置が、
キャッシュフィル動作を実行することと、
前記キャッシュフィル動作を実行したことに応答して、ページテーブルから前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つを読み取ることと
を行うようにさらに構成された、Ｃ３５に記載の装置。
［Ｃ３７］
前記装置は、
コンパイラが、ロード命令およびストア命令のうちの少なくとも１つを発行すること、ここにおいて、前記ロード命令および前記ストア命令のうちの前記少なくとも１つが前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを示す、
を行うようにさらに構成された、Ｃ３５に記載の装置。
［Ｃ３８］
前記ロード命令が共有ロード命令を備え、前記ストア命令が共有ストア命令を備える、Ｃ３７に記載の装置。
［Ｃ３９］
前記装置が、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つを示す複数のアドレスポインタの１つまたは複数のビットを読み取ることを行うようにさらに構成された、Ｃ３５に記載の装置。
［Ｃ４０］
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つは、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが非共有状態にあることを示し、前記装置は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、
前記キャッシュ動作を実行したことに応答して、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが共有状態にあることを示すように、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを変更することと
を行うようにさらに構成された、Ｃ３５に記載の装置。
［Ｃ４１］
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つは、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが共有状態にあることを示し、前記装置は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、
前記キャッシュ動作を実行したことに応答して、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが非共有共有状態にあることを示すように、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを変更することと
を行うようにさらに構成された、Ｃ３５に記載の装置。
［Ｃ４２］
前記装置は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの前記少なくとも１つのアドレス領域を判断するために、アドレスが記憶された１つまたは複数のレジスタを前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つのアドレスと比較することと、
前記アドレス領域が共有されているか共有されていないかを判断することとを行うようにさらに構成された、Ｃ２７に記載の装置。
［Ｃ４３］
前記装置が、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つのダーティーバイトを判断することと、
キャッシュエビクションおよびキャッシュフラッシュのうちの少なくとも１つを実行することと、
前記キャッシュエビクションおよび前記キャッシュフラッシュのうちの前記少なくとも１つ中に前記ダーティーバイトのみをキャッシュまたはシステムメモリに書き込むこととを行うようにさらに構成された、Ｃ２７に記載の装置。
［Ｃ４４］
前記第１のプロセッサを用いて、前記ストアウィズリリース動作を実行するために、前記装置が、
割込みを受信すること、レジスタ読取り、レジスタ書込み、およびプログラマブル遅延のうちの少なくとも１つに応答して、前記第１のプロセッサを用いて、前記第１のプロセッサの前記キャッシュをフラッシュすること
を行うようにさらに構成された、Ｃ２７に記載の装置。
［Ｃ４５］
前記第１のプロセッサを用いて、前記ストアウィズリリース動作を実行するために、前記装置が、
キャッシュプレッシャ、タイムアウト、および明示的ソフトウェアキャッシュメンテナンスのうちの少なくとも１つに応答して、前記第１のプロセッサを用いて、前記第１のキャッシュをフラッシュすること
を行うようにさらに構成された、Ｃ２７に記載の装置。
［Ｃ４６］
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが仮想的にタグ付けされる、Ｃ２７に記載の装置。
［Ｃ４７］
前記ストアウィズリリース動作を実行するために、前記装置が、
前記第１のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、
前記物理アドレスに基づいて、前記仮想アドレスを前記物理アドレスに変換した後に、前記第１のキャッシュの前記キャッシュラインをフラッシュすることと
を行うようにさらに構成された、Ｃ２７に記載の装置。
［Ｃ４８］
前記ロードウィズアクワイア動作を実行するために、前記装置が、前記第２のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、
前記物理アドレスに基づいて、前記仮想アドレスを前記物理アドレスに変換した後に、前記第２のキャッシュの前記キャッシュラインを無効にすることと
を行うようにさらに構成された、Ｃ２７に記載の装置。
［Ｃ４９］
実行されたとき、１つまたは複数のプロセッサに、
第１のプログラマブルプロセッサを用いて、前記第１のプロセッサの第１のキャッシュのキャッシュラインに共有変数データを記憶することと、
前記第１のプログラマブルプロセッサを用いて、ストアウィズリリース動作を実行することと、
第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行することと、
前記第２のプログラマブルプロセッサを用いて、前記第２のプログラマブルプロセッサのキャッシュから前記共有変数データの値をロードすることと
を行わせる命令を記憶した非一時的コンピュータ可読記憶媒体。
［Ｃ５０］
前記１つまたは複数のプロセッサに前記ストアウィズリリース動作を実行させる前記命令は、実行されたとき、前記１つまたは複数のプロセッサに、
前記第１のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第１のキャッシュのキャッシュラインをフラッシュすることと、
前記第１のプログラマブルプロセッサを用いて、任意の前のストアが完了するのを待つことと
を行わせる命令をさらに備える、Ｃ４９に記載の非一時的コンピュータ可読記憶媒体。
［Ｃ５１］
前記１つまたは複数のプロセッサに前記ロードウィズアクワイア動作を実行させる前記命令は、実行されたとき、前記１つまたは複数のプロセッサに、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のプログラマブルプロセッサのキャッシュラインを無効にすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する第２のキャッシュのキャッシュラインを充填することと、
前記第２のプログラマブルプロセッサを用いて、前記ロードウィズアクワイア動作が実行を完了するまで、後続の命令が発行されるのを防ぐことと
を行わせる命令をさらに備える、Ｃ４９に記載の非一時的コンピュータ可読記憶媒体。
［Ｃ５２］
実行されたとき、前記１つまたは複数のプロセッサに、
前記第２のプロセッサを用いて、前記第１のプログラマブルプロセッサの前記キャッシュをスヌープすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データの更新された値に関連するキャッシュヒットを検出することと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記キャッシュヒットを検出したことに応答して、前記共有変数データの前記更新された値を前記第２のプログラマブルプロセッサの前記キャッシュに書き込むことと
を行わせる命令をさらに備える、Ｃ４９に記載の非一時的コンピュータ可読記憶媒体。
【手続補正書】
【提出日】平成27年4月22日(2015.4.22)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
第１のプログラマブルプロセッサを用いて、前記第１のプロセッサの第１のキャッシュのキャッシュラインに共有変数データを記憶することと、ここにおいて、前記第１のキャッシュの前記キャッシュラインは、前記第１のキャッシュの前記キャッシュラインの個々のバイトがダーティー、有効、または無効であるかを示す状態ビットを含む、
前記第１のプログラマブルプロセッサを用いて、前記第１のキャッシュの前記状態ビットに基づいてストアウィズリリース動作を実行することと、ここにおいて、前記ストアウィズリリース動作を実行することが、
前記第１のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第１のキャッシュのキャッシュラインをフラッシュすることと、
前記第１のプログラマブルプロセッサを用いて、任意の前のストアが完了するのを待つことと
を備える、
第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行することと、
前記第２のプログラマブルプロセッサを用いて、第２のキャッシュの前記キャッシュラインの状態ビットに基づいて前記第２のプログラマブルプロセッサの前記第２のキャッシュのキャッシュラインから前記共有変数データの値をロードすることと
を備え、
前記第２のキャッシュの前記キャッシュラインは、前記第２のキャッシュの前記キャッシュラインの個々のバイトがダーティー、有効、または無効であるかを示す状態ビットを含む、方法。
【請求項２】
前記ロードウィズアクワイア動作を実行することは、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のプログラマブルプロセッサのキャッシュラインを無効にすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のキャッシュのキャッシュラインを充填することと、
前記第２のプログラマブルプロセッサを用いて、前記ロードウィズアクワイア動作が実行を完了するまで、後続の命令が発行されるのを防ぐことと
を備える、請求項１に記載の方法。
【請求項３】
前記第２のプロセッサを用いて、前記第１のプログラマブルプロセッサの前記キャッシュをスヌープすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データの更新された値に関連するキャッシュヒットを検出することと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記キャッシュヒットを検出したことに応答して、前記共有変数データの前記更新された値を前記第２のプログラマブルプロセッサの前記キャッシュに書き込むことと
をさらに備える、請求項２に記載の方法。
【請求項４】
前記ストアウィズリリース動作を実行することが、
前記第１のキャッシュよりも高いレベルを有する高レベルキャッシュ、システムメモリ、および前記第２のプロセッサの前記第２のキャッシュのうちの１つに前記共有変数データを書き込むこと
をさらに備える、請求項１に記載の方法。
【請求項５】
前記第１のプロセッサが中央処理ユニット（ＣＰＵ）を備え、前記第２のプロセッサがグラフィックス処理ユニット（ＧＰＵ）を備える、請求項１に記載の方法。
【請求項６】
前記第１のプロセッサの前記キャッシュラインのすべておよび前記第２のプロセッサの前記キャッシュラインのすべてが共有され、
前記ストアウィズリリース動作を実行することが、前記第１のプロセッサの前記キャッシュラインのすべてをフラッシュすることをさらに備え、
前記ロードウィズアクワイア動作を実行することが、前記第２の第１のプロセッサの前記キャッシュラインのすべてを無効にすることをさらに備える、請求項１に記載の方法。
【請求項７】
前記第１のプロセッサの前記キャッシュラインのすべてうちの１サブセットが共有され、第２のプロセッサの前記キャッシュラインのすべてのうちの１サブセットが共有され、
前記ストアウィズリリース動作を実行することが、前記第１のプロセッサの前記キャッシュラインの前記共有サブセットのみをフラッシュすることをさらに備え、
前記ロードウィズアクワイア動作を実行することが、前記第２のプロセッサの前記キャッシュラインのすべて前記共有サブセットのみを無効にすることをさらに備える、
請求項１に記載の方法。
【請求項８】
前記第１のプロセッサの前記キャッシュラインの前記共有サブセットの少なくとも１つの共有ラインが第１の共有可能性属性によって示され、
前記第２のプロセッサの前記キャッシュラインの前記共有サブセットの各共有ラインが第２の共有可能性属性によって示される、
請求項７に記載の方法。
【請求項９】
キャッシュフィル動作を実行することと、
前記キャッシュフィル動作を実行したことに応答して、ページテーブルから前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つを読み取ることと
をさらに備える、請求項８に記載の方法。
【請求項１０】
コンパイラが、ロード命令およびストア命令のうちの少なくとも１つを発行すること
をさらに備え、ここにおいて、前記ロード命令および前記ストア命令のうちの前記少なくとも１つが前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを示す、請求項８に記載の方法。
【請求項１１】
前記ロード命令が共有ロード命令を備え、前記ストア命令が共有ストア命令を備える、請求項１０に記載の方法。
【請求項１２】
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つを示す複数のアドレスポインタの１つまたは複数のビットを読み取ることをさらに備える、請求項８に記載の方法。
【請求項１３】
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つは、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが非共有状態にあることを示し、前記方法は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、
前記キャッシュ動作を実行したことに応答して、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが共有状態にあることを示すように、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを変更することと
をさらに備える、請求項８に記載の方法。
【請求項１４】
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つは、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが共有状態にあることを示し、前記方法は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、
前記キャッシュ動作を実行したことに応答して、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが、非共有共有状態にあることを示すように、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを変更することと
をさらに備える、請求項８に記載の方法。
【請求項１５】
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つのアドレス領域を判断するために、アドレスが記憶された１つまたは複数のレジスタを前記第１のキャッシュおよび前記第２のキャッシュのうちの前記少なくとも１つのアドレスと比較することと、
前記アドレス領域が共有されているか共有されていないかを判断することと
をさらに備える、請求項１に記載の方法。
【請求項１６】
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つのダーティーバイトを判断することと、
キャッシュエビクションおよびキャッシュフラッシュのうちの少なくとも１つを実行することと、
前記キャッシュエビクションおよび前記キャッシュフラッシュのうちの前記少なくとも１つ中に前記ダーティーバイトのみをキャッシュまたはシステムメモリに書き込むことと
をさらに備える、請求項１に記載の方法。
【請求項１７】
前記第１のプロセッサを用いて、前記ストアウィズリリース動作を実行することが、
割込みを受信すること、レジスタ読取り、レジスタ書込み、およびプログラマブル遅延のうちの少なくとも１つに応答して、前記第１のプロセッサを用いて、前記第１のプロセッサの前記キャッシュをフラッシュすること
をさらに備える、請求項１に記載の方法。
【請求項１８】
前記第１のプロセッサを用いて、前記ストアウィズリリース動作を実行することが、
キャッシュプレッシャ、タイムアウト、および明示的ソフトウェアキャッシュメンテナンスのうちの少なくとも１つに応答して、前記第１のプロセッサを用いて、前記第１のキャッシュをフラッシュすること
をさらに備える、請求項１に記載の方法。
【請求項１９】
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが仮想的にタグ付けされる、請求項１に記載の方法。
【請求項２０】
前記ストアウィズリリース動作を実行することが、前記第１のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、
前記物理アドレスに基づいて、前記仮想アドレスを前記物理アドレスに変換した後に、前記第１のキャッシュの前記キャッシュラインをフラッシュすることと
をさらに備える、請求項１に記載の方法。
【請求項２１】
前記ロードウィズアクワイア動作を実行することが、前記第２のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、
前記物理アドレスに基づいて、前記仮想アドレスを前記物理アドレスに変換した後に、前記第２のキャッシュの前記キャッシュラインを無効にすることと
をさらに備える、請求項１に記載の方法。
【請求項２２】
第１のプログラマブルプロセッサを用いて、前記第１のプロセッサの第１のキャッシュのキャッシュラインに共有変数データを記憶するための手段と、ここにおいて、前記第１のキャッシュの前記キャッシュラインは、前記第１のキャッシュの前記キャッシュラインの個々のバイトがダーティー、有効、または無効であるかを示す状態ビットを含む、
前記第１のプログラマブルプロセッサを用いて、前記第１のキャッシュの前記状態ビットに基づいてストアウィズリリース動作を実行するための手段と、ここにおいて、前記ストアウィズリリース動作を実行するための前記手段は、
前記第１のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第１のキャッシュのキャッシュラインをフラッシュするための手段と、
前記第１のプログラマブルプロセッサを用いて、任意の前のストアが完了するのを待つための手段と
を備える、
第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行するための手段と、
前記第２のプログラマブルプロセッサを用いて、第２のキャッシュの前記キャッシュラインの状態ビットに基づいて前記第２のプログラマブルプロセッサの前記第２のキャッシュのキャッシュラインから前記共有変数データの値をロードするための手段と
を備え、
前記第２のキャッシュの前記キャッシュラインは、前記第２のキャッシュの前記キャッシュラインの個々のバイトがダーティー、有効、または無効であるかを示す状態ビットを含む、装置。
【請求項２３】
前記ロードウィズアクワイア動作を実行するための前記手段は、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のプログラマブルプロセッサのキャッシュラインを無効にするための手段と、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のキャッシュのキャッシュラインを充填するための手段と、
前記第２のプログラマブルプロセッサを用いて、前記ロードウィズアクワイア動作が実行を完了するまで、後続の命令が発行されるのを防ぐための手段と
を備える、請求項２２に記載の装置。
【請求項２４】
前記第２のプロセッサを用いて、前記第１のプログラマブルプロセッサの前記キャッシュをスヌープするための手段と、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データの更新された値に関連するキャッシュヒットを検出するための手段と、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記キャッシュヒットを検出したことに応答して、前記共有変数データの前記更新された値を前記第２のプログラマブルプロセッサの前記キャッシュに書き込むための手段とをさらに備える、請求項２３に記載の装置。
【請求項２５】
第１のキャッシュを有する第１のプログラマブルプロセッサと、
第２のキャッシュを有する第２のプログラマブルプロセッサと
を備える装置であって、前記装置が、
前記第１のプログラマブルプロセッサを用いて、前記第１のプロセッサの前記第１のキャッシュのキャッシュラインに共有変数データを記憶することと、ここにおいて、前記第１のキャッシュの前記キャッシュラインは、前記第１のキャッシュの前記キャッシュラインの個々のバイトがダーティー、有効、または無効であるかを示す状態ビットを含む、
前記第１のプログラマブルプロセッサを用いて、前記第１のキャッシュの前記状態ビットに基づいてストアウィズリリース動作を実行することと、ここにおいて、前記ストアウィズリリース動作を実行するために、前記装置が、
前記第１のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第１のキャッシュのキャッシュラインをフラッシュすることと、
前記第１のプログラマブルプロセッサを用いて、任意の前のストアが完了するのを待つことと
を行うように構成される、
前記第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行することと、
前記第２のプログラマブルプロセッサを用いて、第２のキャッシュの前記キャッシュラインの状態ビットに基づいて前記第２のプログラマブルプロセッサの前記第２のキャッシュのキャッシュラインから前記共有変数データの値をロードすることと
を行うように構成され、
前記第２のキャッシュの前記キャッシュラインは、前記第２のキャッシュの前記キャッシュラインの個々のバイトがダーティー、有効、または無効であるかを示す状態ビットを含む、装置。
【請求項２６】
前記ロードウィズアクワイア動作を実行するために、前記装置は、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のプログラマブルプロセッサのキャッシュラインを無効にすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のキャッシュのキャッシュラインを充填することと、
前記第２のプログラマブルプロセッサを用いて、前記ロードウィズアクワイア動作が実行を完了するまで、後続の命令が発行されるのを防ぐことと
を行うように構成された、請求項２５に記載の装置。
【請求項２７】
前記装置が、
前記第２のプロセッサを用いて、前記第１のプログラマブルプロセッサの前記キャッシュをスヌープすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データの更新された値に関連するキャッシュヒットを検出することと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記キャッシュヒットを検出したことに応答して、前記共有変数データの前記更新された値を前記第２のプログラマブルプロセッサの前記キャッシュに書き込むことと
を行うようにさらに構成された、請求項２６に記載の装置。
【請求項２８】
前記ストアウィズリリース動作を実行するために、前記装置が、
前記第１のキャッシュよりも高いレベルを有する高レベルキャッシュ、システムメモリ、および前記第２のプロセッサの前記第２のキャッシュのうちの１つに前記共有変数データを書き込むこと
を行うようにさらに構成された、請求項２５に記載の装置。
【請求項２９】
前記第１のプロセッサが中央処理ユニット（ＣＰＵ）を備え、前記第２のプロセッサがグラフィックス処理ユニット（ＧＰＵ）を備える、請求項２５に記載の装置。
【請求項３０】
前記第１のプロセッサの前記キャッシュラインのすべておよび前記第２のプロセッサの前記キャッシュラインのすべてが共有され、
前記ストアウィズリリース動作を実行するために、前記装置が、前記第１のプロセッサの前記キャッシュラインのすべてをフラッシュするようにさらに構成され、
前記ロードウィズアクワイア動作を実行するために、前記装置が、前記第２の第１のプロセッサの前記キャッシュラインのすべてを無効にするようにさらに構成された、
請求項２５に記載の装置。
【請求項３１】
前記第１のプロセッサの前記キャッシュラインのすべての１サブセットが共有され、第２のプロセッサの前記キャッシュラインのすべてのうちの１サブセットが共有され、
ここにおいて、前記ストアウィズリリース動作を実行するために、前記装置が、前記第１のプロセッサの前記キャッシュラインの前記共有サブセットのみをフラッシュするようにさらに構成され、
ここにおいて、前記ロードウィズアクワイア動作を実行するために、前記装置が、前記第２のプロセッサの前記キャッシュラインのすべて前記共有サブセットのみを無効にするようにさらに構成された、
請求項２５に記載の装置。
【請求項３２】
前記第１のプロセッサの前記キャッシュラインの前記共有サブセットの少なくとも１つの共有ラインが第１の共有可能性属性によって示され、
前記第２のプロセッサの前記キャッシュラインの前記共有サブセットの各共有ラインが第２の共有可能性属性によって示される、
請求項３１に記載の装置。
【請求項３３】
前記装置が、
キャッシュフィル動作を実行することと、
前記キャッシュフィル動作を実行したことに応答して、ページテーブルから前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つを読み取ることと
を行うようにさらに構成された、請求項３２に記載の装置。
【請求項３４】
前記装置は、
コンパイラが、ロード命令およびストア命令のうちの少なくとも１つを発行すること
を行うようにさらに構成され、前記ロード命令および前記ストア命令のうちの前記少なくとも１つが前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを示す、請求項３２に記載の装置。
【請求項３５】
前記ロード命令が共有ロード命令を備え、前記ストア命令が共有ストア命令を備える、請求項３４に記載の装置。
【請求項３６】
前記装置が、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つを示す複数のアドレスポインタの１つまたは複数のビットを読み取ることを行うようにさらに構成された、請求項３２に記載の装置。
【請求項３７】
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つは、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが非共有状態にあることを示し、前記装置は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、
前記キャッシュ動作を実行したことに応答して、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが共有状態にあることを示すように、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを変更することと
を行うようにさらに構成された、請求項３２に記載の装置。
【請求項３８】
前記第１の共有可能性属性および前記第２の共有可能性属性のうちの少なくとも１つは、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが共有状態にあることを示し、前記装置は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つに対してキャッシュ動作を実行することと、
前記キャッシュ動作を実行したことに応答して、前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが非共有共有状態にあることを示すように、前記第１の共有可能性属性および前記第２の共有可能性属性のうちの前記少なくとも１つを変更することと
を行うようにさらに構成された、請求項３２に記載の装置。
【請求項３９】
前記装置は、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つのアドレス領域を判断するために、アドレスが記憶された１つまたは複数のレジスタを前記第１のキャッシュおよび前記第２のキャッシュのうちの前記少なくとも１つのアドレスと比較することと、
前記アドレス領域が共有されているか共有されていないかを判断することと
を行うようにさらに構成された、請求項２５に記載の装置。
【請求項４０】
前記装置が、
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つのダーティーバイトを判断することと、
キャッシュエビクションおよびキャッシュフラッシュのうちの少なくとも１つを実行することと、
前記キャッシュエビクションおよび前記キャッシュフラッシュのうちの前記少なくとも１つ中に前記ダーティーバイトのみをキャッシュまたはシステムメモリに書き込むことと
を行うようにさらに構成された、請求項２５に記載の装置。
【請求項４１】
前記第１のプロセッサを用いて、前記ストアウィズリリース動作を実行するために、前記装置が、
割込みを受信すること、レジスタ読取り、レジスタ書込み、およびプログラマブル遅延のうちの少なくとも１つに応答して、前記第１のプロセッサを用いて、前記第１のプロセッサの前記キャッシュをフラッシュすること
を行うようにさらに構成された、請求項２５に記載の装置。
【請求項４２】
前記第１のプロセッサを用いて、前記ストアウィズリリース動作を実行するために、前記装置が、
キャッシュプレッシャ、タイムアウト、および明示的ソフトウェアキャッシュメンテナンスのうちの少なくとも１つに応答して、前記第１のプロセッサを用いて、前記第１のキャッシュをフラッシュすること
を行うようにさらに構成された、請求項２５に記載の装置。
【請求項４３】
前記第１のキャッシュおよび前記第２のキャッシュのうちの少なくとも１つが仮想的にタグ付けされる、請求項２５に記載の装置。
【請求項４４】
前記ストアウィズリリース動作を実行するために、前記装置が、
前記第１のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、
前記物理アドレスに基づいて、前記仮想アドレスを前記物理アドレスに変換した後に、前記第１のキャッシュの前記キャッシュラインをフラッシュすることと
を行うようにさらに構成された、請求項２５に記載の装置。
【請求項４５】
前記ロードウィズアクワイア動作を実行するために、前記装置が、前記第２のキャッシュに記憶された仮想アドレスを物理アドレスに変換することと、
前記物理アドレスに基づいて、前記仮想アドレスを前記物理アドレスに変換した後に、前記第２のキャッシュの前記キャッシュラインを無効にすることと
を行うようにさらに構成された、請求項２５に記載の装置。
【請求項４６】
実行されたとき、１つまたは複数のプロセッサに、
第１のプログラマブルプロセッサを用いて、前記第１のプロセッサの第１のキャッシュのキャッシュラインに共有変数データを記憶することと、ここにおいて、前記第１のキャッシュの前記キャッシュラインは、前記第１のキャッシュの前記キャッシュラインの個々のバイトがダーティー、有効、または無効であるかを示す状態ビットを含む、
前記第１のプログラマブルプロセッサを用いて、前記第１のキャッシュの前記状態ビットに基づいてストアウィズリリース動作を実行することと
を行わせる命令を記憶し、ここにおいて、前記１つまたは複数のプロセッサに前記ストアウィズリリース動作を実行させる前記命令は、実行されたとき、前記１つまたは複数のプロセッサに、
前記第１のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第１のキャッシュのキャッシュラインをフラッシュすることと、
前記第１のプログラマブルプロセッサを用いて、任意の前のストアが完了するのを待つことと
を行わせる命令を備える、
第２のプログラマブルプロセッサを用いて、ロードウィズアクワイア動作を実行することと、
前記第２のプログラマブルプロセッサを用いて、第２のキャッシュの前記キャッシュラインの状態ビットに基づいて前記第２のプログラマブルプロセッサの前記第２のキャッシュのキャッシュラインから前記共有変数データの値をロードすることと
を行わせる命令をさらに記憶し、
前記第２のキャッシュの前記キャッシュラインは、前記第２のキャッシュの前記キャッシュラインの個々のバイトがダーティー、有効、または無効であるかを示す状態ビットを含む、非一時的コンピュータ可読記憶媒体。
【請求項４７】
前記１つまたは複数のプロセッサに前記ロードウィズアクワイア動作を実行させる前記命令は、実行されたとき、前記１つまたは複数のプロセッサに、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のプログラマブルプロセッサのキャッシュラインを無効にすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記第２のキャッシュのキャッシュラインを充填することと、
前記第２のプログラマブルプロセッサを用いて、前記ロードウィズアクワイア動作が実行を完了するまで、後続の命令が発行されるのを防ぐことと
を行わせる命令を備える、請求項４６に記載の非一時的コンピュータ可読記憶媒体。
【請求項４８】
実行されたとき、前記１つまたは複数のプロセッサに、
前記第２のプロセッサを用いて、前記第１のプログラマブルプロセッサの前記キャッシュをスヌープすることと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データの更新された値に関連するキャッシュヒットを検出することと、
前記第２のプログラマブルプロセッサを用いて、前記共有変数データに関連する前記キャッシュヒットを検出したことに応答して、前記共有変数データの前記更新された値を前記第２のプログラマブルプロセッサの前記キャッシュに書き込むことと
を行わせる命令をさらに備える、請求項４６に記載の非一時的コンピュータ可読記憶媒体。
【国際調査報告】
2015524597.tif 000015
2015524597.tif 000016