(57)【要約】【課題】プロセッサと外部デバイスがアクセスするバッファを効率的良く管理する。【解決手段】クエリバッファ２４０は、レンダリングリソースバッファ２５０の各セグメントに対応づけられたクエリデータを有する。サブプロセッサ１１０は、レンダリングリソースバッファ２５０のセグメントにデータを書き込み、対応するクエリデータに規定値を書き込む。ＧＰＵ１４０は、レンダリングリソースバッファ２５０のセグメントからデータを読み出し、対応するクエリデータに規定値とは異なる値を書き込む。サブプロセッサ１１０は、アトミックキャッシュ２３０を用いてクエリデータに対してロックラインリザベーションを行い、ＧＰＵ１４０によりクエリデータの値の書き換えがなされた場合に、ロックラインリザベーションロストイベントの通知を受ける。【選択図】図２
2013137648.tif 000002
【特許請求の範囲】
【請求項１】
ロックラインリザベーションによりキャッシュラインをロック可能なアトミックキャッシュを含むプロセッサと、
前記プロセッサがデータを書き出す、複数のセグメントに分けられたリングバッファと、
前記リングバッファのセグメントからデータを読み出して処理する外部デバイスと、
前記リングバッファの各セグメントに対応づけられたクエリデータを有するクエリバッファとを含み、
前記プロセッサは、前記リングバッファのセグメントにデータを書き込むと、そのセグメントに対応するクエリデータに規定値を書き込み、
前記外部デバイスは、前記リングバッファのセグメントからデータを読み出すと、そのセグメントに対応するクエリデータに前記規定値とは異なる値を書き込み、
前記プロセッサは、前記アトミックキャッシュを用いて前記クエリバッファのクエリデータに対してロックラインリザベーションを行い、前記アトミックキャッシュを参照することにより、前記クエリバッファのクエリデータにアクセスし、前記外部デバイスによりクエリデータの値の書き換えがなされた場合に、ロックラインリザベーションロストイベントの通知を受けることを特徴とするプロセッサシステム。
【請求項２】
前記プロセッサは、ロックラインリザベーションロストイベントの通知を受けたセグメントに新たなデータを書き込むことを特徴とする請求項１に記載のプロセッサシステム。
【請求項３】
前記外部デバイスは、前記プロセッサと入出力インタフェースを介して接続されたグラフィックスプロセッサであり、
前記プロセッサは、テクスチャデータを生成して前記リングバッファのセグメントに書き込み、
前記グラフィックスプロセッサは、前記リングバッファのセグメントからテクスチャデータを読み出して実行することを特徴とする請求項１または２に記載のプロセッサシステム。
【請求項４】
ロックラインリザベーションによりキャッシュラインをロック可能なアトミックキャッシュを含むプロセッサと、
前記プロセッサがデータを書き出す、複数のセグメントに分けられたリングバッファと、
前記リングバッファのセグメントからデータを読み出して処理する外部デバイスと、
前記リングバッファの各セグメントに対応づけられたクエリデータを有するクエリバッファとを含むプロセッサシステムにおけるバッファ管理方法であって、
前記プロセッサは、前記リングバッファのセグメントにデータを書き込むと、そのセグメントに対応するクエリデータに規定値を書き込み、
前記外部デバイスは、前記リングバッファのセグメントからデータを読み出すと、そのセグメントに対応するクエリデータに前記規定値とは異なる値を書き込み、
前記プロセッサは、前記アトミックキャッシュを用いて前記クエリバッファのクエリデータに対してロックラインリザベーションを行い、前記アトミックキャッシュを参照することにより、前記クエリバッファのクエリデータにアクセスし、前記外部デバイスによりクエリデータの値の書き換えがなされた場合に、ロックラインリザベーションロストイベントの通知を受けることを特徴とするバッファ管理方法。
【請求項５】
ロックラインリザベーションによりキャッシュラインをロック可能なアトミックキャッシュを含むプロセッサと、
前記プロセッサがデータを書き出す、複数のセグメントに分けられたリングバッファと、
前記リングバッファのセグメントからデータを読み出して処理する外部デバイスと、
前記リングバッファの各セグメントに対応づけられたクエリデータを有するクエリバッファとを含むプロセッサシステムにおいて前記プロセッサに実行させるバッファ管理のためのプログラムであって、
前記リングバッファのセグメントにデータを書き込む際、そのセグメントに対応するクエリデータに規定値を書き込むステップと、
前記アトミックキャッシュを用いて前記クエリバッファのクエリデータに対してロックラインリザベーションを行い、前記アトミックキャッシュを参照することにより、前記クエリバッファのクエリデータにアクセスするステップと、
前記外部デバイスが前記リングバッファのセグメントからデータを読み出し、そのセグメントに対応するクエリデータに前記規定値とは異なる値を書き込むことにより、クエリデータの値の書き換えがなされた場合に、ロックラインリザベーションロストイベントの通知を受けるステップとを前記プロセッサに実行させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、バッファ管理技術、特にプロセッサと外部デバイスがアクセスするバッファを管理する技術に関する。
【背景技術】
【０００２】
パーソナルコンピュータやゲーム専用機において、高品質な３次元コンピュータグラフィックスを用いたゲームやシミュレーションなどのアプリケーションを実行したり、実写とコンピュータグラフィックスを融合させた映像コンテンツの再生を行うなど、高画質のグラフィックスの利用が広がっている。
【０００３】
一般に、グラフィックス処理は、ＣＰＵとグラフィックスプロセッシングユニット（ＧＰＵ）が連携することで実行される。ＣＰＵが汎用的な演算を行う汎用プロセッサであるのに対して、ＧＰＵは高度なグラフィックス演算を行うための専用プロセッサである。ＣＰＵはオブジェクトの３次元モデルにもとづいて投影変換などのジオメトリ演算を行い、ＧＰＵはＣＰＵから頂点データなどを受け取ってレンダリングを実行する。ＧＰＵはラスタライザやピクセルシェーダなどの専用ハードウェアから構成され、パイプライン処理でグラフィックス処理を実行する。
【０００４】
ＣＰＵは、グラフィックスプロセッシングユニット（ＧＰＵ）、ネットワーク機器、コーデックエンジンなどの外部装置の状態を確認するために、外部装置のレジスタに書き込まれた値や外部装置からメモリへ書き込まれた値を参照する。特に、外部装置が利用している記憶領域、ディスプレイ出力などの資源の解放／割り当てをおこなうために、ＣＰＵは外部装置の状態を定期的に確認する必要がある。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００８−１２３５２０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
外部装置のステータスを確認するために外部装置のレジスタを参照する方法では、レジスタアクセスが非常に低速であり、値を読み込むまで主計算装置が停止してしまうという問題がある。また、主記憶およびレジスタへの頻繁な読み込み命令は、データバスの負荷となる。特に、複数のプロセッサがデータバスを共有している環境においては、この負荷は他のプロセッサのメモリアクセス性能の低下につながる。さらに、レジスタの読み込みを行っているＣＰＵによって、消費電力が増大する。
【０００７】
外部装置のステータスを確認するために割り込み（ｉｎｔｅｒｒｕｐｔ）を利用する方法もあるが、割り込みの場合、実際にプロセッサがその割り込みを処理するまでに大きな時間がかかるため、外部装置が処理すべきデータを割り当てるまでに時間が空いてしまいリアルタイムシステムにおいてはリアルタイム性に問題が生じる。
【０００８】
本発明はこうした課題に鑑みてなされたものであり、その目的は、プロセッサと外部デバイスがアクセスするバッファを効率的良く管理することのできる技術を提供することにある。
【課題を解決するための手段】
【０００９】
上記課題を解決するために、本発明のある態様のプロセッサシステムは、ロックラインリザベーションによりキャッシュラインをロック可能なアトミックキャッシュを含むプロセッサと、前記プロセッサがデータを書き出す、複数のセグメントに分けられたリングバッファと、前記リングバッファのセグメントからデータを読み出して処理する外部デバイスと、前記リングバッファの各セグメントに対応づけられたクエリデータを有するクエリバッファとを含む。前記プロセッサは、前記リングバッファのセグメントにデータを書き込むと、そのセグメントに対応するクエリデータに規定値を書き込み、前記外部デバイスは、前記リングバッファのセグメントからデータを読み出すと、そのセグメントに対応するクエリデータに前記規定値とは異なる値を書き込み、前記プロセッサは、前記アトミックキャッシュを用いて前記クエリバッファのクエリデータに対してロックラインリザベーションを行い、前記アトミックキャッシュを参照することにより、前記クエリバッファのクエリデータにアクセスし、前記外部デバイスによりクエリデータの値の書き換えがなされた場合に、ロックラインリザベーションロストイベントの通知を受ける。
【００１０】
本発明の別の態様は、バッファ管理方法である。この方法は、ロックラインリザベーションによりキャッシュラインをロック可能なアトミックキャッシュを含むプロセッサと、前記プロセッサがデータを書き出す、複数のセグメントに分けられたリングバッファと、前記リングバッファのセグメントからデータを読み出して処理する外部デバイスと、前記リングバッファの各セグメントに対応づけられたクエリデータを有するクエリバッファとを含むプロセッサシステムにおけるバッファ管理方法であって、前記プロセッサは、前記リングバッファのセグメントにデータを書き込むと、そのセグメントに対応するクエリデータに規定値を書き込み、前記外部デバイスは、前記リングバッファのセグメントからデータを読み出すと、そのセグメントに対応するクエリデータに前記規定値とは異なる値を書き込み、前記プロセッサは、前記アトミックキャッシュを用いて前記クエリバッファのクエリデータに対してロックラインリザベーションを行い、前記アトミックキャッシュを参照することにより、前記クエリバッファのクエリデータにアクセスし、前記外部デバイスによりクエリデータの値の書き換えがなされた場合に、ロックラインリザベーションロストイベントの通知を受ける。
【００１１】
なお、以上の構成要素の任意の組合せ、本発明の表現を方法、装置、システム、コンピュータプログラム、データ構造、記録媒体などの間で変換したものもまた、本発明の態様として有効である。
【発明の効果】
【００１２】
本発明によれば、プロセッサと外部デバイスがアクセスするバッファを効率的良く管理することができる。
【図面の簡単な説明】
【００１３】
【図１】実施の形態に係るグラフィックス処理システムの構成図である。
【図２】図１のグラフィックス処理システムにおけるバッファ管理方法を説明する図である。
【図３】図３（ａ）は、図２のクエリバッファのデータ構造を示し、図３（ｂ）は、図２のレンダリングリソースバッファのデータ構造を示す図である。
【図４】図３（ａ）のクエリバッファのクエリデータのデータ構造を示す図である。
【図５】共有変数をアトミックに更新するマルチプロセッサシステムを説明する図である。
【図６】サブプロセッサから見た共有変数のアトミック更新の手順を示すフローチャートである。
【図７】図７（ａ）は、バスから見たGet Lock Line and Reserveコマンドの処理手順を示すフローチャートであり、図７（ｂ）は、バス１２０から見たPut Lock Line Conditionalコマンドの処理手順を示すフローチャートである。
【図８】図８（ａ）〜（ｃ）は、実施の形態に係るアトミックキャッシュを用いたバッファ管理の手順を説明するフローチャートである。
【発明を実施するための形態】
【００１４】
図１は、実施の形態に係るグラフィックス処理システムの構成図である。このグラフィックス処理システムは、メインプロセッシングユニット１００と、グラフィックスプロセッシングユニット１４０と、システムメモリ１８０と、ローカルメモリ１６０とを含む。
【００１５】
メインプロセッシングユニット１００は、単一のメインプロセッサであってもよく、複数のプロセッサを含むマルチプロセッサシステムであってもよく、あるいは、複数のプロセッサコアを１個のパッケージに集積したマルチコアプロセッサであってもよい。ここでは、一例として、メインプロセッシングユニット１００は、メインプロセッサ１０１と複数のサブプロセッサ１１０とを含むヘテロジニアス（Heterogeneous:異種混合）マルチコアプロセッサである。メインプロセッサ１０１と複数のサブプロセッサ１１０はバス１２０に接続されており、バス１２０にはメモリインタフェース１７０を介してシステムメモリ１８０が接続されている。メインプロセッサ１０１と複数のサブプロセッサ１１０はバス１２０を介してシステムメモリ１８０に対してデータを読み書きすることができる。
【００１６】
バス１２０には入出力インタフェース（以下、「ＩＯＩＦ」と呼ぶ）１３０を介して外部デバイス１９０が接続されている。ここでは、一例であり、これに限定するものではないが、外部デバイス１９０は、グラフィックスプロセッシングユニット１４０とローカルメモリ１６０を含む。
【００１７】
グラフィックスプロセッシングユニット（以下、単に「ＧＰＵ」という）１４０は、グラフィックプロセッサコアを搭載したグラフィックチップであり、ローカルバス１５０を介してローカルメモリ１６０に対してデータを読み書きすることができる。
【００１８】
メインプロセッシングユニット１００とＧＰＵ１４０は、ＩＯＩＦ１３０で接続されており、メインプロセッシングユニット１００とＧＰＵ１４０は互いにＩＯＩＦ１３０を介してデータをやりとりすることができる。
【００１９】
メインプロセッシングユニット１００は、オブジェクトを描画するための描画コマンドを生成し、システムメモリ１８０内に設けられたコマンドバッファにキューイングする。ＧＰＵ１４０は、コマンドバッファに蓄積された描画コマンドを順次読み出して処理する。
【００２０】
メインプロセッシングユニット１００は、オブジェクトの３次元モデルにもとづいて、ポリゴンの頂点座標値、頂点カラー、法線ベクトル、ＵＶ値などのジオメトリデータを生成し、システムメモリ１８０に格納する。また、メインプロセッシングユニット１００は、ポリゴン表面にマッピングするためのテクスチャをシステムメモリ１８０に格納する。さらに、メインプロセッシングユニット１００は、ハードディスクなどの記録媒体からシェーダプログラムを読み込み、システムメモリ１８０に格納する。
【００２１】
システムメモリ１８０のメモリ領域はＩ／Ｏアドレス空間にメモリマッピングされており、ＧＰＵ１４０は、Ｉ／Ｏアドレス空間にメモリマップされたシステムメモリ１８０のメモリ領域をＩＯＩＦ１３０経由で読み取ることができる。
【００２２】
ジオメトリデータ、テクスチャおよびシェーダプログラムが格納されたシステムメモリ１８０内のメモリ領域は、ＩＯＩＦ１３０のコントローラに設けられたメモリ内のＩ／Ｏアドレス空間にメモリマッピングされる。ＧＰＵ１４０は、ＩＯＩＦ１３０を介して、Ｉ／Ｏアドレス空間にメモリマッピングされたジオメトリデータ、テクスチャおよびシェーダプログラムを読み出す。ＧＰＵ１４０は、システムメモリ１８０から読み出したジオメトリデータ、テクスチャなどグラフィックス演算に必要なデータをローカルメモリ１６０に格納することができる。
【００２３】
ＧＰＵ１４０は、シェーダプログラムにしたがって、ジオメトリデータを用いてポリゴンのラスタライズデータを生成し、ピクセルデータをローカルメモリ１６０内のフレームバッファに書き込む。さらに、ＧＰＵ１４０は、ポリゴン表面にテクスチャをマッピングし、テクスチャマッピング後のピクセルデータをフレームバッファに書き込む。
【００２４】
図２は、図１のグラフィックス処理システムにおけるバッファ管理方法を説明する図である。サブプロセッサ１１０は、テクスチャデータをローカルメモリ２１０内に設けられたレンダリングリソースバッファ２５０に書き出す。ＧＰＵ１４０は、レンダリングリソースバッファ２５０からテクスチャデータを読み出して実行する。サブプロセッサ１１０は、ローカルストレージ２２０を有しており、ローカルストレージ２２０内のテクスチャバッファ２５２は、ローカルメモリ２１０内のレンダリングリソースバッファ２５０にメモリマップされている。図２において、点線の矢印は、テクスチャデータをＤＭＡ  ｐｕｔコマンドにより、ローカルメモリ２１０のレンダリングリソースバッファ２５０に書き出すことを示している。
【００２５】
レンダリングリソースバッファ２５０は、リングバッファである。サブプロセッサ１１０がレンダリングリソースバッファ２５０にテクスチャデータを書き込み、ＧＰＵ１４０がレンダリングリソースバッファ２５０からテクスチャデータを読み出すことから、リングバッファのどのセグメントまでサブプロセッサ１１０が書き込めるか、つまり、ＧＰＵ１４０がリングバッファのどのセグメントまでテクスチャデータを読み出し、使用済みとなったかをサブプロセッサ１１０に通知する必要がある。
【００２６】
レンダリングリソースバッファ２５０のセグメントがＧＰＵ１４０により未使用であるか使用済みであるかをサブプロセッサ１１０に通知するために、クエリバッファ２４０がメインメモリ２００に設けられる。クエリバッファ２４０は、レンダリングリソースバッファ２５０の各セグメントに対応づけられたクエリデータを含む。サブプロセッサ１１０のローカルストレージ２２０内のクエリバッファ２４２は、メインメモリ２００内のクエリバッファ２４０にメモリマップされている。
【００２７】
サブプロセッサ１１０は、レンダリングリソースバッファ２５０のセグメントにテクスチャデータを書き込んだとき、テクスチャデータを書き込んだレンダリングリソースバッファ２５０のセグメントに対応づけられたクエリバッファ２４０のクエリデータに後述するピクセル数がとりえない値（例えば、"0xffffffff"）を事前に決定して書き込む。一方、ＧＰＵ１４０は、レンダリングリソースバッファ２５０のセグメントからテクスチャデータ読み出しを終了したとき、テクスチャデータを読み出したレンダリングリソースバッファ２５０のセグメントに対応づけられたクエリバッファ２４０のクエリデータに生成したピクセル数を書き込み、使用済みであることをサブプロセッサ１１０に知らせる。図２において、一点鎖線の矢印は、ＧＰＵ１４０がクエリバッファ２４０のクエリデータを書き換えることを示している。
【００２８】
クエリバッファ２４０は、サブプロセッサ１１０とＧＰＵ１４０の両方によってアクセスされるため、同期を取る必要がある。クエリバッファ２４０の同期を取るために、サブプロセッサ１１０にはアトミックキャッシュ２３０が設けられる。アトミックキャッシュ２３０は、クエリバッファ２４０のクエリデータに対するロックラインリザベーションを管理する。図２において、実線の矢印は、アトミック操作を示す。
【００２９】
図３（ａ）は、クエリバッファ２４０のデータ構造を示し、図３（ｂ）は、レンダリングリソースバッファ２５０のデータ構造を示す。
【００３０】
図３（ａ）に示すように、クエリバッファ２４０は、サイズが３２バイトであり、４バイト単位に８つのクエリデータに分割されており、８つのクエリデータにはインデックス０〜７が付けられている。インデックス０〜７のいずれかを指定することでクエリバッファ２４０の指定されたクエリデータにアクセスすることができる。クエリバッファ２４０は、アトミックキャッシュによってロックラインリザベーションをかけることができるように、メインメモリ２００上で１２８バイトでアライメントされている。
【００３１】
図３（ｂ）に示すように、レンダリングリソースバッファ２５０は、一例として２〜４メガバイトのサイズであり、８つのセグメントに分割されており、１セグメントは２５６〜５１２キロバイトである。８つのセグメントは、クエリバッファ２４０と同様にインデックス０〜７が付けられている。レンダリングリソースバッファ２５０の８つのセグメントのインデックス０〜７は、クエリバッファ２４０の８つのクエリデータのインデックス０〜７にそれぞれ対応している。クエリバッファ２４０のインデックスｉ（ｉ＝０〜７）のクエリデータは、レンダリングリソースバッファ２５０の対応するインデックスｉのセグメントに保持されたデータが未使用であるか使用済みであるかを示すために用いられる。
【００３２】
図４は、クエリバッファ２４０のクエリデータのデータ構造を示す図である。ここでは、クエリデータは生成したピクセル数を表す４バイトデータを含むものとする。ピクセル数は、サブプロセッサ１１０により、レンダリングリソースバッファ２５０のセグメントにテクスチャが書き込まれたとき、ピクセル数がとりえない値（例えば、0xffffffff）を書き込まれ、ＧＰＵ１４０により、レンダリングリソースバッファ２５０のセグメントからテクスチャが読み出されたとき、生成したピクセル数に書き換えられる。
【００３３】
図２に戻り、サブプロセッサ１１０は、テクスチャデータを随時生成し、レンダリングリソースバッファ２５０に蓄積する。サブプロセッサ１１０は、レンダリングリソースバッファ２５０のセグメント境界を越えてテクスチャデータを蓄積する度に、使用するセグメントのインデックスと同一のインデックスをもつクエリバッファ２４０のクエリデータを規定値（0xffffffff）に書き換え、ＧＰＵ１４０がそのセグメント内のテクスチャを利用し終わったときに、そのクエリデータを規定値以外の値（生成したピクセル数）に書き換えるコマンドを生成されたテクスチャデータを利用する描画コマンドの後に積む。その後、後述するアトミックキャッシュ２３０を用いたロックラインリザベーションにより同期制御を行う。
【００３４】
一方、ＧＰＵ１４０は、サブプロセッサ１１０が生成したテクスチャデータをレンダリングリソースバッファ２５０上で随時走査し、実行する。
【００３５】
サブプロセッサ１１０は、レンダリングリソースバッファ２５０のセグメントを超える際、クエリバッファ２４０を読み込み、レンダリングリソースバッファ２５０の次のセグメントのインデックスと同一のインデックスのクエリバッファ２４０のクエリデータが規定値であるかどうかをチェックする。次のセグメントに対応するクエリデータがＧＰＵ１４０によって規定値0xffffffff以外の値に書き換えられていれば、次のセグメントのバッファは使用済みであり、新しいデータで書き換えることが可能であるが、次のセグメントに対応するクエリデータが規定値のままであれば、そのセグメントのバッファはまだＧＰＵ１４０が使用を完了していないことを意味するため、規定値0xffffffff以外に書き換えられるまで待つ必要がある。
【００３６】
本実施の形態では、データバスおよびメインメモリにアトミックキャッシュ機能を有する。アトミックキャッシュ機能を用いれば、サブプロセッサ１１０は、下記のロックラインリザベーションを用いた同期制御によってＧＰＵ１４０のような外部デバイスからの書き込みを待つことが可能である。
【００３７】
図５〜図７を参照して、まずアトミックキャッシュの一般的な機能について説明した上で、図８を参照して、本実施の形態のアトミックキャッシュを利用した同期制御機構を説明する。
【００３８】
アトミックキャッシュは、複数のプロセッサが、プロセッサ間で共有する変数を不可分（アトミック）に更新するために実装された機能であり、リード（Read）をブロックすることなく、共有変数を不可分に更新できる非ブロッキング同期（Non-Blocking Synchronization）を提供する。
【００３９】
図５は、共有変数をアトミックに更新するマルチプロセッサシステムを説明する図である。複数のサブプロセッサ１１０（ここではサブプロセッサＡ〜Ｃ）はバス１２０に接続されており、システムメモリ１８０はメモリインタフェース１７０を介してバス１２０に接続されている。
【００４０】
複数のサブプロセッサ１１０のそれぞれにアトミックキャッシュ２３０が設けられる。複数のサブプロセッサ１１０が共有する変数はシステムメモリ１８０に保持されており、各サブプロセッサ１１０は、メモリインタフェース１７０を介してシステムメモリ１８０上の共有変数にアクセスする。
【００４１】
キャッシュラインは、システムメモリ１８０の１２８バイト境界にアラインされた１２８バイトの領域である。
【００４２】
（ａ）ロックラインリザベーション（Lock Line Reservation）
サブプロセッサ１１０からアトミックキャッシュユニットへのコマンドにより、指定されたキャッシュライン上のデータをサブプロセッサ１１０のローカルストレージ２２０に転送し、ロックラインとして予約することをバスに通知する。これをロックラインリザベーションという。ロックラインリザベーションの実行により、リザベーション（予約）を示すフラグが設定される。
【００４３】
サブプロセッサ１１０から同一のキャッシュラインへ更新コマンドを発行した場合、リザベーションが保持されている状態であれば、更新は完了し、リザベーションを失っていればデータの更新は失敗する。
【００４４】
（ｂ）ロックラインリザベーションロストイベント（Lock Line Reservation Lost Event）
他のサブプロセッサ１１０やデバイスによって、キャッシュラインが１ビットでも変更されると、バスは、ロックラインリザベーションを破棄し、ロックラインリザベーションをかけたサブプロセッサ１１０にイベント通知を行う。このイベントをロックラインリザベーションロストイベントという。サブプロセッサ１１０は、ロックラインリザベーションの喪失をこのイベント通知によって知ることができる。
【００４５】
図６は、サブプロセッサ１１０から見た共有変数のアトミック更新の手順を示すフローチャートである。
【００４６】
サブプロセッサ１１０は、Get Lock Line and Reserveコマンドをバスに通知し、ロックラインリザベーションとそのキャッシュラインの値を取得する（Ｓ１０）。
【００４７】
サブプロセッサ１１０は、取得したキャッシュラインの値、すなわち共有変数をサブプロセッサ１１０のローカルストレージ２２０上で更新する（Ｓ１２）。
【００４８】
サブプロセッサ１１０は、更新した値をメインメモリへ書き込むために、Put Lock Line Conditionalコマンドをバスへ送る（Ｓ１４）。
【００４９】
ステップＳ１０でロックラインリザベーションをかけてから、ステップＳ１２でサブプロセッサ１１０が共有変数を更新し、ステップＳ１４で更新した値をメインメモリに書き込むコマンドをバスへ送るまでの間に、他のサブプロセッサやデバイスからの書きこみでロックラインが１ビットでも更新されるとロックラインリザベーションは失われ、更新は失敗する。
【００５０】
Put Lock Line Conditionalコマンドが成功した場合（Ｓ１６のＹ）、ロックラインリザベーションは残っていることを意味し、メインメモリの共有変数は新しい値で更新されてたことがわかる。
【００５１】
Put Lock Line Conditionalコマンドが失敗した場合（Ｓ１６のＮ）、ロックラインリザベーションは失われていることを意味し、メインメモリの共有変数は更新されなかったことがわかる。この場合、ステップＳ１０に戻り、ロックラインリザベーションをやり直す。
【００５２】
図７（ａ）は、バス１２０から見たGet Lock Line and Reserveコマンドの処理手順を示すフローチャートである。
【００５３】
バス１２０は、サブプロセッサ１１０からのGet Lock Line and Reserveコマンドを受けつける（Ｓ２０）。バス１２０は、サブプロセッサ１１０へロックラインの値を返し、ロックラインリザベーションを確保する（Ｓ２２）。
【００５４】
他のサブプロセッサ１１０またはデバイスからこのロックラインへの更新が発生した場合（Ｓ２４のＹ）、バス１２０は、ロックラインリザベーションを破棄し、ロックラインリザベーションを取得したサブプロセッサ１１０へ"ロックラインリザベーションロストイベント"を送信する（Ｓ２６）。他のサブプロセッサ１１０からもデバイスからもこのロックラインへの更新が行われない場合（Ｓ２４のＮ）、ロックラインリザベーションロストイベントは発生しない。
【００５５】
図７（ｂ）は、バス１２０から見たPut Lock Line Conditionalコマンドの処理手順を示すフローチャートである。
【００５６】
バス１２０は、サブプロセッサ１１０からのPut Lock Line Conditionalコマンドを受けつける（Ｓ３０）。バス１２０は、ロックラインリザベーションが保持されているかどうかを調べ（Ｓ３２）、ロックラインリザベーションが保持されている場合（Ｓ３２のＹ）、バス１２０は、メモリの値を更新し、サブプロセッサ１１０へPut Lock Line Conditionalコマンドの成功を通知する（Ｓ３４）。ロックラインリザベーションが失われている場合（Ｓ３２のＮ）、バス１２０は、メモリの値を更新せず、サブプロセッサ１１０へPut Lock Line Conditionalコマンドの失敗を通知する（Ｓ３６）。
【００５７】
図６および図７（ａ）、図７（ｂ）を参照して共有変数のアトミック更新の手順を説明したが、このアトミックキャッシュ機構は、本来は、複数のサブプロセッサ１１０間で共有されるデータに対する同期、およびメインプロセッサ１０１とサブプロセッサ１１０間で共有されるデータに対する同期のために用意されたものである。本実施の形態では、このアトミックキャッシュ機構を、メインプロセッサ１０１またはサブプロセッサ１１０がＧＰＵ１４０のような外部デバイス１９０と共有するデータに対する同期に応用している。従来は、外部デバイスとの同期は、割り込みやレジスタ参照によって管理されるが、アトミックキャッシュを用いると、従来の方法と比較して高い応答性を実現できる。そのため、小さなメモリでリングバッファを構成して効率良く処理を進めることができる。
【００５８】
アトミックキャッシュ機構を用いると、ロックラインリザベーションでキャッシュラインをロックすることができ、ロックラインがロストしたことをロックラインリザベーションロストイベントの通知により知ることができる。なお、アトミックキャッシュは通常のキャッシュのようなキャッシュコヒーレンシを保つための複雑な機能を備えておらず、ロックラインがロストしたことをイベント通知するだけのシンプルな機能を備えている。
【００５９】
クエリバッファ２４０はメインメモリ２００に保持され、サブプロセッサ１１０はメインメモリ２００上のクエリバッファ２４０にアトミックキャッシュ２３０を利用してアクセスするため、クエリバッファ２４０のクエリデータがＧＰＵ１４０による書き込みによって更新されたことをサブプロセッサ１１０はロックラインリザベーションロストイベントにより知ることができる。つまりサブプロセッサ１１０は、ＧＰＵ１４０がクエリデータを書き込むまでメインメモリ２００からデータを読み込むことなしに、ＧＰＵ１４０からの通知を受け取ることができ、スリーピングロックを実現することができる。
【００６０】
レンダリングリソースバッファ２５０を複数のセグメントに分け、クエリバッファ２４０内に各セグメントに対応するクエリデータを１つずつ設けることで、ＧＰＵ１４０がどのセグメントの使用を終えたかをサブプロセッサ１１０に通知することができる。クエリデータのサイズが４バイトであり、１２８バイトのアトミックキャッシュラインに最大３２個のクエリデータを収めることができるが、ここではセグメントの数は８個とする。セグメントの数は、レンダリングリソースバッファ２５０の大きさ、サブプロセッサ１１０およびＧＰＵ１４０の速度から適宜決定される。
【００６１】
図８（ａ）〜（ｃ）は、本実施の形態に係るアトミックキャッシュを用いたバッファ管理の手順を説明するフローチャートである。
【００６２】
図８（ａ）を参照して、サブプロセッサ１１０は、レンダリングリソースバッファ２５０の現在使用しているセグメントから必要量のバッファをとれるかどうかを調べる（Ｓ４０）。現在のセグメントに空きが十分あり、必要量のバッファを取れる場合（Ｓ４０のＹ）、現在のセグメントから必要なバッファを確保する（Ｓ４４）。現在のセグメントに空きが不足しており、必要量のバッファを取れない場合（Ｓ４０のＮ）、次のセグメントを利用するために、セグメント切り替え処理を実行する（Ｓ４２）。
【００６３】
図８（ｂ）は、ステップＳ４２のセグメント切り替え処理の詳細な手順を説明するフローチャートである。
【００６４】
レンダリングリソースバッファ２５０の現在のセグメントに対してデータの作成が完了したことを示す規定値を現在のセグメントのインデックスに対応するクエリバッファ２４０のクエリデータに書き込む（Ｓ５０）。
【００６５】
ＧＰＵ１４０がセグメント内のデータの使用を完了したことを示す非規定値を対応するクエリバッファに書き込むＧＰＵコマンドを生成されたデータの最後に積む（Ｓ５２）。これにより、ＧＰＵ１４０がセグメント内のデータを全部読み終えると、対応するクエリバッファに非規定値を書き込むコマンドが実行され、クエリバッファの値が0xffffffffから生成したピクセル値に書き換えられる。
【００６６】
アトミックキャッシュを利用したポーリングを実行し（Ｓ５４）、ポーリングの後、セグメントを切り替え、次のセグメントに移る（Ｓ５６）。
【００６７】
図８（ｃ）は、Ｓ５４のアトミックキャッシュを利用したポーリング処理の詳細な手順を説明するフローチャートである。
【００６８】
クエリバッファ２４０のクエリデータのロックラインリザベーションの確保とクエリデータの値の読み込みを行う（Ｓ６０）。
【００６９】
監視しているセグメント（次に利用するセグメント）に対応するクエリバッファ２４０のクエリデータが0xffffffffかどうかを判定する（Ｓ６２）。監視セグメントのクエリデータが0xffffffffでない場合（Ｓ６２のＮ）、監視セグメントは既にデータがＧＰＵ１４０により使用済みであることを意味するから、処理を終了する。この場合、図８（ｂ）のステップＳ５６に進み、セグメントの切り替えがなされ、次のセグメントを利用することができる。
【００７０】
監視セグメントのクエリデータが0xffffffffである場合（Ｓ６２のＹ）、監視セグメント内のデータはＧＰＵ１４０によってまだ使用されていないことを意味するから、ロックラインリザベーションロストイベントの発生を待つ（Ｓ６４）。ロックラインリザベーションロストイベントを待つ間、サブプロセッサ１１０はスリープする。ロックラインリザベーションロストイベントが発生すると、ステップＳ６０に戻る。
【００７１】
本実施の形態のバッファ管理機構は、ＧＰＵ１４０によるクエリデータの書き込みを、サブプロセッサ１１０側からアトミックキャッシュ２３０経由でクエリデータを参照することにより、ロックラインリザベーションロストイベントの発生として検知するというものである。この方法はスピンロックによるポーリングと比較して、メインメモリ２００へのリードリクエストが発生せず低負荷で実行可能である。また、サブプロセッサ１１０の反応速度が速い、つまりＧＰＵ１４０があるセグメントを使い終わると直ちにサブプロセッサ１１０がそのセグメントを獲得できるという利点がある。このバッファ管理機構は、ＧＰＵ１４０が早期に処理を完了する見込みがあり、一刻も速くサブプロセッサ１１０のレンダリングスレッドの処理を終了させたい場合に特に有効である。一方、ＧＰＵ１４０がセグメントを使い終えるまで待つ間、サブプロセッサ１１０を独占してしまうため、待ち時間を予測して、サブプロセッサ１１０が他のタスクやワークロードを実行することができるようにすることがより好ましい。
【００７２】
以上述べたように、本実施の形態のバッファ管理機構によれば、従来技術の割り込みによる方法と比べ、外部装置からのメモリ書き込みに対して即時にＣＰＵが反応することができ、外部装置をより効率的に利用することができる。また、本実施の形態のバッファ管理機構によれば、従来技術のメモリを直接ポーリングする方法に比べ、データバスに負荷をかけずに動作することができる。さらに、消費電力を削減することができ、モバイル環境では特に有益である。また、外部記憶装置との間に小さなメモリ量でリングバッファ構築することができる。
【００７３】
さらに一般化するなら、本実施の形態のバッファ管理機構は、比較的レイテンシーの短いリアルタイム処理を担当する外部デバイスとの同期に利用することで、小さなリソースで外部デバイスの性能を引き出すことが可能である。たとえば、コーデックチップによる符号化／復号の完了を待つ場合などでも利用可能である。
【００７４】
なお、１つの実施形態として図３（ａ）で表されるクエリバッファ、図４で表される１セグメントのクエリデータを示したが、本発明はこれらの構成に限られない。例えば、１セグメントに対応するクエリデータを１ビットのフラグ情報として形成することも可能である。具体的には、１０２４個のセグメントに対応する１０２４ｂｉｔ（１２８Ｂｙｔｅ）のフラグ領域を用意しサブプロセッサ１１０がセグメントにデータを生成し終えた時、対応するフラグ領域のビットを１とする。外部デバイスがデータを処理し終えて、セグメントを越える際に、対応するフラグ領域のビットを０に変更することで実現される。
【００７５】
以上、本発明を実施の形態をもとに説明した。実施の形態は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。
【００７６】
上記の説明では、外部デバイス１９０の一例として、ＧＰＵ１４０を説明したが、外部デバイス１９０は、コーデックエンジンやネットワーク機器であってもよい。外部デバイス１９０の種類に関係なく、本実施の形態のアトミックキャッシュを用いたリングバッファ管理機構を適用することができる。
【符号の説明】
【００７７】
１００  メインプロセッシングユニット、  １０１  メインプロセッサ、  １１０  サブプロセッサ、  １２０  バス、  １３０  ＩＯＩＦ、  １４０  ＧＰＵ、  １５０  ローカルバス、  １６０  ローカルメモリ、  １７０  メモリインタフェース、  １８０  システムメモリ、  １９０  外部デバイス、  ２００  メインメモリ、  ２１０  ローカルメモリ、  ２２０  ローカルストレージ、  ２３０  アトミックキャッシュ、  ２４０  クエリバッファ、  ２５０  レンダリングリソースバッファ、  ２４２  クエリバッファ、  ２５２  テクスチャバッファ、  ２６０  ロックフラグ、  ２６４  ピクセル数。
【図１】
2013137648.tif 000003
【図２】
2013137648.tif 000004
【図３】
2013137648.tif 000005
【図４】
2013137648.tif 000006
【図５】
2013137648.tif 000007
【図６】
2013137648.tif 000008
【図７】
2013137648.tif 000009
【図８】
2013137648.tif 000010