(57)【特許請求の範囲】
【請求項１】
１つまたは複数のプロセッサによって、メモリ転送動作の少なくとも一部を行うためのメモリ転送モードを選択することと、ここにおいて、前記メモリ転送モードは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含む少なくとも２つの異なるメモリ転送モードのセットから選択され、ここにおいて、前記順次的メモリ転送モードは、別個の時間間隔の間に、複数の連続的な読取り要求のグループを出すことと、複数の連続的な書込み要求のグループを出すこととを交互に行うことを含む、
グラフィックスプロセッシングユニット（ＧＰＵ）によって、前記選択されたメモリ転送モードに基づいて前記メモリ転送動作を行うことと
を備える方法。
【請求項２】
前記１つまたは複数のプロセッサによって前記メモリ転送モードを選択することは、
前記１つまたは複数のプロセッサによって、前記メモリ転送動作によって転送されるべきデータの量に基づいて前記メモリ転送モードを選択することを備える、請求項１に記載の方法。
【請求項３】
前記１つまたは複数のプロセッサによって、前記メモリ転送動作によって転送されるべきデータの前記量に基づいて前記メモリ転送モードを選択することは、
前記メモリ転送動作によって転送されるべきデータの前記量が閾値より大きい場合、前記１つまたは複数のプロセッサによって、前記メモリ転送モードとして前記順次的メモリ転送モードを選択することと、
前記メモリ転送動作によって転送されるべきデータの前記量が前記閾値より大きくない場合、前記１つまたは複数のプロセッサによって、前記メモリ転送モードとして前記インターリーブメモリ転送モードを選択することとを備える、請求項２に記載の方法。
【請求項４】
前記１つまたは複数のプロセッサによって前記メモリ転送モードを選択することは、
前記１つまたは複数のプロセッサによって、メモリ転送動作の宛先領域が有する固定されたスクリーン整列されたバッファ領域との重複の量に基づいて、前記固定されたスクリーン整列されたバッファ領域に関して前記メモリ転送動作を行うためのメモリ転送モードを選択することを備える、請求項１に記載の方法。
【請求項５】
前記メモリ転送動作を行うことはシェーダプログラムを実行することを備え、
前記１つまたは複数のプロセッサによって、前記メモリ転送モードを選択することは、前記シェーダプログラムの実行が前記メモリ転送動作の性能のボトルネックになる可能性が高いかどうかの決定に基づいて、前記メモリ転送モードを選択することを備える、請求項１に記載の方法。
【請求項６】
前記１つまたは複数のプロセッサによって、前記シェーダプログラムの前記実行が前記メモリ転送動作の前記性能のボトルネックになる可能性が高いかどうかの前記決定に基づいて、前記メモリ転送モードを選択することは、
前記シェーダプログラムの前記実行が前記メモリ転送動作の前記性能のボトルネックになる可能性が高くないと決定したことに応答して、前記メモリ転送モードとして前記順次的メモリ転送モードを選択することと、
前記シェーダプログラムの前記実行が前記メモリ転送動作の前記性能のボトルネックになる可能性が高いと決定したことに応答して、前記メモリ転送モードとして前記インターリーブメモリ転送モードを選択することとを備える、請求項５に記載の方法。
【請求項７】
前記メモリ転送動作を行うことはシェーダプログラムを実行することを備え、
前記１つまたは複数のプロセッサによって前記メモリ転送モードを選択することは、前記メモリ転送動作を行うために使用されるシェーダプログラムのサイズおよび前記メモリ転送動作を行うために使用される前記シェーダプログラムの複雑さの少なくとも１つに基づいて、前記メモリ転送モードを選択することを備える、請求項１に記載の方法。
【請求項８】
前記１つまたは複数のプロセッサによって、前記メモリ転送動作を行うために使用される前記シェーダプログラムの前記サイズおよび前記メモリ転送動作を行うために使用される前記シェーダプログラムの前記複雑さの前記少なくとも１つに基づいて、前記メモリ転送モードを選択することは、
前記シェーダプログラムの前記サイズと前記シェーダプログラムの前記複雑さの前記少なくとも１つが閾値より小さい場合、前記１つまたは複数のプロセッサによって、前記メモリ転送モードとして前記順次的メモリ転送モードを選択することと、
前記シェーダプログラムの前記サイズと前記シェーダプログラムの前記複雑さの前記少なくとも１つが前記閾値より小さくない場合、前記１つまたは複数のプロセッサによって、前記メモリ転送モードとして前記インターリーブメモリ転送モードを選択することとを備える、請求項７に記載の方法。
【請求項９】
前記ＧＰＵによって前記メモリ転送動作を行うことは、
前記ＧＰＵによって、前記メモリ転送動作を行うための前記メモリ転送モードとしてインターリーブメモリ転送モードが選択されたことに応答して、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うことと、
前記ＧＰＵによって、前記メモリ転送動作を行うための前記メモリ転送モードとして順次的メモリ転送モードが選択されたことに応答して、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うこととを備える、請求項１に記載の方法。
【請求項１０】
前記ＧＰＵによって、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うことは、生産者−消費者パラダイムに基づいて、読取りエンジンに読取り要求を出させ、書込みエンジンに書込み要求を出させることを備え、
前記ＧＰＵによって、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うことは、相互排除のパラダイムに基づいて、前記読取りエンジンに読取り要求を出させ、前記書込みエンジンに書込み要求を出させることを備える、請求項９に記載の方法。
【請求項１１】
前記ＧＰＵによって、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うことは、前記メモリ転送動作のための書込み要求を出すために十分なソースデータが前記ＧＰＵによってメモリから受け取られるたびに、書込みエンジンによって、少なくとも１つの他の書込み要求に対して後で受け取られるべき追加のソースデータを待機することなく、それぞれの前記ソースデータを消費することを備え、
前記ＧＰＵによって、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うことは、前記メモリ転送動作の少なくとも一部に対して、前記メモリ転送動作のための書込み要求を出すために十分なソースデータを前記ＧＰＵが前記メモリから受け取ったことに応答して、前記書込みエンジンによって、少なくとも１つの他の書込み要求を出すために十分な追加のソースデータが後で受け取られるまで前記ソースデータの消費を延期することを備える、請求項９に記載の方法。
【請求項１２】
前記ＧＰＵによって、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うことは、前記メモリ転送動作のための書込み要求を出すために十分なソースデータを書込みエンジンが消費するたびに、読取りエンジンによって、少なくとも１つの他の書込み要求に対して前記書込みエンジンによって後で消費されるべき追加のソースデータを待機することなく、読取り要求を出すことを備え、
前記ＧＰＵによって、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うことは、前記メモリ転送動作の少なくとも一部に対して、前記メモリ転送動作のための書込み要求を出すために十分なソースデータを前記書込みエンジンが消費したことに応答して、読取りエンジンによって、少なくとも１つの他の書込み要求を出すために十分な追加のソースデータが前記書込みエンジンによって後で消費されるまで、後続の読取り要求の発行を延期することを備える、請求項９に記載の方法。
【請求項１３】
前記ＧＰＵは、前記ＧＰＵによってメモリに出された読取り要求に応答して受け取られたソースデータを記憶するように構成されるバッファを備え、
前記ＧＰＵによって、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うことは、
１つまたは複数の読取り要求を出すことと、
前記複数の読取り要求に応答して前記メモリから受け取られたソースデータを前記バッファに配置することと、
前記複数の読取り要求の各々について、前記複数の読取り要求のそれぞれ１つに対して前記ソースデータが前記バッファに配置されたことに応答して、前記バッファに配置された前記ソースデータを消費し、前記消費されたソースデータに基づいて書込み要求を出すことと、
複数の書込み要求の各々について、前記書込み要求のそれぞれ１つに対してソースデータが前記バッファから消費されたことに応答して、後続の読取り要求を出すことと
を備え、
前記ＧＰＵによって、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うことは、
複数の読取り要求を出すことと、
前記複数の読取り要求に応答して前記メモリから受け取られたソースデータを前記バッファに配置することと、
前記バッファを埋めるために十分な読取り要求が出されたことを検出したことに応答して、読取り要求を出すことを止めることと、
前記バッファが満たされていることを検出したことに応答して、前記消費されたソースデータに基づいて、前記バッファ中のソースデータを消費し、複数の書込み要求を出すことと、
前記バッファが空であることを検出したことに応答して、前記バッファ中のソースデータを消費して書込み要求を出すことを止めることと、
前記バッファが空であることを検出したことに応答して、読取り要求の発行を再開することと
を備える、請求項１に記載の方法。
【請求項１４】
少なくとも２つの異なるメモリ転送モードの前記セットから選択された第１のメモリ転送モードを使用して、前記メモリ転送動作の第１の部分を行うことと、
少なくとも２つの異なるメモリ転送モードの前記セットから選択された第２のメモリ転送モードを使用して、前記メモリ転送動作の第２の部分を行うこととをさらに備える、請求項１に記載の方法。
【請求項１５】
前記ＧＰＵによって前記メモリ転送動作を行うことは、
前記選択されたメモリ転送モードに基づいて、前記メモリ転送動作の間にメモリから取り出されるソースデータをバッファリングするために使用されるキャッシュのキャッシュラインサイズを選択することと、
前記選択されたキャッシュラインサイズに基づいて、前記メモリ転送動作のために前記キャッシュを構成することとを備える、請求項１に記載の方法。
【請求項１６】
前記キャッシュラインサイズを選択することは、
前記順次的メモリ転送モードが、前記メモリ転送動作を行うための前記メモリ転送モードとして選択されたことに応答して、前記キャッシュの容量全体に等しいキャッシュラインサイズを選択することと、
前記インターリーブメモリ転送モードが、前記メモリ転送動作を行うための前記メモリ転送モードとして選択されたことに応答して、前記キャッシュの前記容量全体より小さいキャッシュラインサイズを選択することとを備える、請求項１５に記載の方法。
【請求項１７】
前記１つまたは複数のプロセッサは前記ＧＰＵを備え、前記１つまたは複数のプロセッサによって前記メモリ転送モードを選択することは、前記ＧＰＵによって、前記メモリ転送動作の前記少なくとも一部を行うための前記メモリ転送モードを選択することを備える、請求項１に記載の方法。
【請求項１８】
前記１つまたは複数のプロセッサはＣＰＵを備え、前記１つまたは複数のプロセッサによって前記メモリ転送モードを選択することは、前記ＣＰＵによって、メモリ転送動作の前記少なくとも一部を行うための前記メモリ転送モードを選択することを備え、前記ＧＰＵに、前記選択されたメモリ転送モードに基づいて前記メモリ転送動作を行わせることをさらに備える、請求項１に記載の方法。
【請求項１９】
１つまたは複数のプロセッサによって、メモリ転送動作の少なくとも一部を行うためのメモリ転送モードを選択することと、ここにおいて、前記メモリ転送モードは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含む少なくとも２つの異なるメモリ転送モードのセットから選択される、
グラフィックスプロセッシングユニット（ＧＰＵ）によって、前記選択されたメモリ転送モードに基づいて前記メモリ転送動作を行うことと、を備え、ここにおいて、前記１つまたは複数のプロセッサによって、前記メモリ転送モードを選択することは、
前記１つまたは複数のプロセッサによって、メモリ転送動作の宛先領域が有する固定されたスクリーン整列されたバッファ領域との重複の量に基づいて、前記固定されたスクリーン整列されたバッファ領域に関して前記メモリ転送動作を行うためのメモリ転送モードを選択することと、
前記宛先領域が前記固定されたスクリーン整列されたバッファ領域を完全に覆う場合、前記メモリ転送モードとして前記順次的メモリ転送モードを選択することと、
前記宛先領域が前記固定されたスクリーン整列されたバッファ領域を完全には覆わない場合、前記メモリ転送モードとして前記インターリーブメモリ転送モードを選択することと、
を備える、方法。
【請求項２０】
１つまたは複数のプロセッサによって、メモリ転送動作の少なくとも一部を行うためのメモリ転送モードを選択することと、ここにおいて、前記メモリ転送モードは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含む少なくとも２つの異なるメモリ転送モードのセットから選択される、
グラフィックスプロセッシングユニット（ＧＰＵ）によって、前記選択されたメモリ転送モードに基づいて前記メモリ転送動作を行うことと、を備え、ここにおいて、前記ＧＰＵによって前記メモリ転送動作を行うことは、
前記ＧＰＵによって、前記メモリ転送動作を行うための前記メモリ転送モードとしてインターリーブメモリ転送モードが選択されたことに応答して、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うことと、ここにおいて、前記インターリーブメモリ転送モードに基づいた前記メモリ転送動作は、書込み要求を出すために十分なソースデータを前記ＧＰＵがメモリから受け取ったことに応答して、書込みエンジンに前記書込み要求を出させることと、前記書込み要求を出すために十分な前記ソースデータを前記書込みエンジンが消費したことに応答して、読取りエンジンに読取り要求を出させることとを備える、
前記ＧＰＵによって、前記メモリ転送動作を行うための前記メモリ転送モードとして順次的メモリ転送モードが選択されたことに応答して、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うことと、ここにおいて、前記順次的メモリ転送モードに基づいた前記メモリ転送動作は、前記読取りエンジンおよび前記書込みエンジンに、別個の時間間隔の間に、複数の連続的な読取り要求のグループを出すことと、複数の連続的な書込み要求のグループを出すことと、を交互に行わせることを備える、
を備える方法。
【請求項２１】
少なくとも１つのメモリと、
前記少なくとも１つのメモリに関してメモリ転送動作の少なくとも一部を行うためのメモリ転送モードを選択するように構成される１つまたは複数のプロセッサと、ここにおいて、前記メモリ転送モードは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含む少なくとも２つの異なるメモリ転送モードのセットから選択され、ここにおいて、前記順次的メモリ転送モードは、別個の時間間隔の間に、複数の連続的な読取り要求のグループを出すことと、複数の連続的な書込み要求のグループを出すこととを交互に行うことを含む、
前記選択されたメモリ転送モードに基づいて前記メモリ転送動作を行うように構成されるグラフィックスプロセッシングユニット（ＧＰＵ）と、
を備えるデバイス。
【請求項２２】
前記１つまたは複数のプロセッサはさらに、前記メモリ転送動作によって転送されるべきデータの量に基づいて前記メモリ転送モードを選択するように構成される、請求項２１に記載のデバイス。
【請求項２３】
前記１つまたは複数のプロセッサはさらに、前記メモリ転送動作によって転送されるべきデータの前記量が閾値より大きい場合、前記メモリ転送モードとして前記順次的メモリ転送モードを選択し、前記メモリ転送動作によって転送されるべきデータの前記量が前記閾値より大きくない場合、前記メモリ転送モードとして前記インターリーブメモリ転送モードを選択するように構成される、請求項２２に記載のデバイス。
【請求項２４】
前記１つまたは複数のプロセッサはさらに、メモリ転送動作の宛先領域が有する固定されたスクリーン整列されたバッファ領域との重複の量に基づいて、前記固定されたスクリーン整列されたバッファ領域に関して前記メモリ転送動作を行うためのメモリ転送モードを選択するように構成される、請求項２１に記載のデバイス。
【請求項２５】
前記１つまたは複数のプロセッサはさらに、前記宛先領域が前記固定されたスクリーン整列されたバッファ領域を完全に覆う場合、前記メモリ転送モードとして前記順次的メモリ転送モードを選択し、前記宛先領域が前記固定されたスクリーン整列されたバッファ領域を完全には覆わない場合、前記メモリ転送モードとして前記インターリーブメモリ転送モードを選択するように構成される、請求項２４に記載のデバイス。
【請求項２６】
前記ＧＰＵはさらに、前記メモリ転送動作を行うためにシェーダプログラムを実行するように構成され、前記１つまたは複数のプロセッサはさらに、前記シェーダプログラムの実行が前記メモリ転送動作の性能のボトルネックになる可能性が高いかどうかの決定に基づいて、前記メモリ転送モードを選択するように構成される、請求項２１に記載のデバイス。
【請求項２７】
前記１つまたは複数のプロセッサはさらに、前記シェーダプログラムの前記実行が前記メモリ転送動作の性能のボトルネックになる可能性が高くないと決定したことに応答して、前記メモリ転送モードとして前記順次的メモリ転送モードを選択し、前記シェーダプログラムの前記実行が前記メモリ転送動作の性能のボトルネックになる可能性が高いと決定したことに応答して、前記メモリ転送モードとして前記インターリーブメモリ転送モードを選択するように構成される、請求項２６に記載のデバイス。
【請求項２８】
前記ＧＰＵはさらに、前記メモリ転送動作を行うためにシェーダプログラムを実行するように構成され、前記１つまたは複数のプロセッサはさらに、前記メモリ転送動作を行うために使用されるシェーダプログラムのサイズおよび前記メモリ転送動作を行うために使用される前記シェーダプログラムの複雑さの少なくとも１つに基づいて、前記メモリ転送モードを選択するように構成される、請求項２１に記載のデバイス。
【請求項２９】
前記１つまたは複数のプロセッサはさらに、前記シェーダプログラムの前記サイズと前記シェーダプログラムの前記複雑さの前記少なくとも１つが閾値より小さい場合、前記メモリ転送モードとして前記順次的メモリ転送モードを選択し、前記シェーダプログラムの前記サイズと前記シェーダプログラムの前記複雑さの前記少なくとも１つが前記閾値より小さくない場合、前記メモリ転送モードとして前記インターリーブメモリ転送モードを選択するように構成される、請求項２８に記載のデバイス。
【請求項３０】
前記ＧＰＵはさらに、前記メモリ転送動作を行うための前記メモリ転送モードとしてインターリーブメモリ転送モードが選択されたことに応答して、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行い、前記メモリ転送動作を行うための前記メモリ転送モードとして順次的メモリ転送モードが選択されたことに応答して、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うように構成される、請求項２１に記載のデバイス。
【請求項３１】
前記ＧＰＵはさらに、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うときに、生産者−消費者パラダイムに基づいて、読取りエンジンに読取り要求を出させ、書込みエンジンに書込み要求を出させるように構成され、
前記ＧＰＵはさらに、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うときに、相互排除のパラダイムに基づいて、前記読取りエンジンに読取り要求を出させ、前記書込みエンジンに書込み要求を出させるように構成される、請求項３０に記載のデバイス。
【請求項３２】
前記ＧＰＵはさらに、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うときに、書込み要求を出すために十分なソースデータを前記ＧＰＵがメモリから受け取ったことに応答して、書込みエンジンに前記書込み要求を出させ、書込み要求を出すために十分な、前記メモリから受け取られたソースデータを前記書込みエンジンが消費したことに応答して、読取りエンジンに読取り要求を出させるように構成され、
前記ＧＰＵはさらに、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うときに、前記読取りエンジンおよび前記書込みエンジンに、別個の時間間隔の間に、複数の連続的な読取り要求のグループを出すことと、複数の連続的な書込み要求のグループを出すこととを、交互に行わせるように構成される、請求項３０に記載のデバイス。
【請求項３３】
前記ＧＰＵはさらに、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うときに、前記メモリ転送動作のための書込み要求を出すために十分なソースデータが前記ＧＰＵによってメモリから受け取られるたびに、書込みエンジンによって、少なくとも１つの他の書込み要求に対して後で受け取られるべき追加のソースデータを待機することなく、それぞれの前記ソースデータを消費するように構成され、
前記ＧＰＵはさらに、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うときに、前記メモリ転送動作の少なくとも一部に対して、前記メモリ転送動作のための書込み要求を出すために十分なソースデータを前記ＧＰＵが前記メモリから受け取ったことに応答して、前記書込みエンジンによって、少なくとも１つの他の書込み要求を出すために十分な追加のソースデータが後で受け取られるまで前記ソースデータの消費を延期するように構成される、請求項３０に記載のデバイス。
【請求項３４】
前記ＧＰＵはさらに、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うときに、前記メモリ転送動作のための書込み要求を出すために十分なソースデータを書込みエンジンが消費するたびに、読取りエンジンによって、少なくとも１つの他の書込み要求に対して前記書込みエンジンによって後で消費されるべき追加のソースデータを待機することなく、読取り要求を出すように構成され、
前記ＧＰＵはさらに、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うときに、前記メモリ転送動作の少なくとも一部に対して、前記メモリ転送動作のための書込み要求を出すために十分なソースデータを前記書込みエンジンが消費したことに応答して、前記読取りエンジンによって、少なくとも１つの他の書込み要求を出すために十分なソースデータが前記書込みエンジンによって後で消費されるまで、後続の読取り要求の発行を延期するように構成される、請求項３０に記載のデバイス。
【請求項３５】
前記ＧＰＵは、前記ＧＰＵによって前記メモリに出された読取り要求に応答して受け取られたソースデータを記憶するように構成されるバッファを備え、
前記ＧＰＵはさらに、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うときに、
１つまたは複数の読取り要求を出し、
前記複数の読取り要求に応答して前記メモリから受け取られたソースデータを前記バッファに配置し、
前記複数の読取り要求の各々について、前記複数の読取り要求のそれぞれ１つに対して前記ソースデータが前記バッファに配置されたことに応答して、前記バッファに配置された前記ソースデータを消費し、前記消費されたソースデータに基づいて書込み要求を出し、
複数の書込み要求の各々について、前記書込み要求のそれぞれ１つに対して前記ソースデータが前記バッファから消費されたことに応答して、後続の読取り要求を出す
ように構成され、
前記ＧＰＵはさらに、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うときに、
複数の読取り要求を出し、
前記複数の読取り要求に応答して前記メモリから受け取られたソースデータを前記バッファに配置し、
前記バッファを埋めるために十分な読取り要求が出されたことを検出したことに応答して、読取り要求を出すことを止め、
前記バッファが満たされていることを検出したことに応答して、前記消費されたソースデータに基づいて、前記バッファ中のソースデータを消費し、複数の書込み要求を出し、
前記バッファが空であることを検出したことに応答して、前記バッファ中のソースデータを消費して書込み要求を出すことを止め、
前記バッファが空であることを検出したことに応答して、読取り要求の発行を再開する
ように構成される、請求項２１に記載のデバイス。
【請求項３６】
前記ＧＰＵはさらに、少なくとも２つの異なるメモリ転送モードの前記セットから選択された第１のメモリ転送モードを使用して、前記メモリ転送動作の第１の部分を行い、少なくとも２つの異なるメモリ転送モードの前記セットから選択された第２のメモリ転送モードを使用して、前記メモリ転送動作の第２の部分を行うように構成される、請求項２１に記載のデバイス。
【請求項３７】
前記ＧＰＵはさらに、前記選択されたメモリ転送モードに基づいて、前記メモリ転送動作の間にメモリから取り出されるソースデータをバッファリングするために使用されるキャッシュのキャッシュラインサイズを選択し、前記選択されたキャッシュラインサイズに基づいて、前記メモリ転送動作のために前記キャッシュを構成するように構成される、請求項２１に記載のデバイス。
【請求項３８】
前記ＧＰＵはさらに、前記順次的メモリ転送モードが前記メモリ転送動作を行うための前記メモリ転送モードとして選択されたことに応答して、前記キャッシュの容量全体に等しいキャッシュラインサイズを選択し、前記インターリーブメモリ転送モードが前記メモリ転送動作を行うための前記メモリ転送モードとして選択されたことに応答して、前記キャッシュの前記容量全体より小さいキャッシュラインサイズを選択するように構成される、請求項３７に記載のデバイス。
【請求項３９】
前記１つまたは複数のプロセッサは前記ＧＰＵを備え、前記ＧＰＵはさらに、メモリ転送動作の前記少なくとも一部を行うための前記メモリ転送モードを選択するように構成される、請求項２１に記載のデバイス。
【請求項４０】
前記１つまたは複数のプロセッサは、前記メモリ転送動作の前記少なくとも一部を行うための前記メモリ転送モードを選択し、前記ＧＰＵに、前記メモリ転送モードに基づいて前記メモリ転送動作を行わせるように構成される、ＣＰＵを備える、請求項２１に記載のデバイス。
【請求項４１】
ワイヤレス通信デバイスを備える、請求項２１に記載のデバイス。
【請求項４２】
携帯電話ハンドセットを備える、請求項２１に記載のデバイス。
【請求項４３】
メモリ転送動作の少なくとも一部を行うためのメモリ転送モードを選択するための手段と、ここにおいて、前記メモリ転送モードは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含む少なくとも２つの異なるメモリ転送モードのセットから選択され、ここにおいて、前記順次的メモリ転送モードは、別個の時間間隔の間に、複数の連続的な読取り要求のグループを出すことと、複数の連続的な書込み要求のグループを出すこととを交互に行うことを含む、
前記選択されたメモリ転送モードに基づいて前記メモリ転送動作を行うための手段とを備える装置。
【請求項４４】
前記メモリ転送モードを選択するための前記手段は、
前記メモリ転送動作によって転送されるべきデータの量、前記メモリ転送動作を行うために使用されるシェーダプログラムのサイズ、および前記メモリ転送動作を行うために使用される前記シェーダプログラムの複雑さの少なくとも１つに基づいて、前記メモリ転送モードを選択するための手段を備える、請求項４３に記載の装置。
【請求項４５】
前記メモリ転送モードを選択するための前記手段は、
メモリ転送動作の宛先領域が有する固定されたスクリーン整列されたバッファ領域との重複の量に基づいて、前記固定されたスクリーン整列されたバッファ領域に関して前記メモリ転送動作を行うためのメモリ転送モードを選択するための手段を備える、請求項４３に記載の装置。
【請求項４６】
前記メモリ転送動作を行うための前記手段は、グラフィックスプロセッシングユニット（ＧＰＵ）を備え、
前記メモリ転送モードを選択するための前記手段は、ＣＰＵと前記ＧＰＵの少なくとも１つを備える、請求項４３に記載の装置。
【請求項４７】
実行されたとき、１つまたは複数のプロセッサに、
メモリ転送動作の少なくとも一部を行うためのメモリ転送モードを選択させ、ここにおいて、前記メモリ転送モードは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含む少なくとも２つの異なるメモリ転送モードのセットから選択され、ここにおいて、前記順次的メモリ転送モードは、別個の時間間隔の間に、複数の連続的な読取り要求のグループを出すことと、複数の連続的な書込み要求のグループを出すこととを交互に行うことを含む、
前記選択されたメモリ転送モードに基づいて前記メモリ転送動作を行わせる命令を記憶したコンピュータ可読記憶媒体。
【請求項４８】
実行されたとき、前記１つまたは複数のプロセッサに、前記メモリ転送モードを選択させる前記命令は、実行されたとき、前記１つまたは複数のプロセッサに、
前記メモリ転送動作によって転送されるべきデータの量、前記メモリ転送動作を行うために使用されるシェーダプログラムのサイズ、および前記メモリ転送動作を行うために使用されるシェーダプログラムの複雑さの少なくとも１つに基づいて、前記メモリ転送モードを選択させる命令を備える、請求項４７に記載のコンピュータ可読記憶媒体。
【請求項４９】
実行されたとき、前記１つまたは複数のプロセッサに、前記メモリ転送モードを選択させる前記命令は、実行されたとき、前記１つまたは複数のプロセッサに、
メモリ転送動作の宛先領域が有する固定されたスクリーン整列されたバッファ領域との重複の量に基づいて、前記固定されたスクリーン整列されたバッファ領域に関して前記メモリ転送動作を行うためのメモリ転送モードを選択させる命令を備える、請求項４７に記載のコンピュータ可読記憶媒体。
【請求項５０】
実行されたとき、前記１つまたは複数のプロセッサに、前記メモリ転送動作を行わせる前記命令は、実行されたとき、グラフィックスプロセッシングユニット（ＧＰＵ）に、前記選択されたメモリ転送モードに基づいて前記メモリ転送動作を行わせる命令を備え、
実行されたとき、前記１つまたは複数のプロセッサに、前記メモリ転送モードを選択させる前記命令は、実行されたとき、ＣＰＵと前記ＧＰＵの少なくとも１つに、メモリ転送動作の前記少なくとも一部を行うための前記メモリ転送モードを選択させる命令を備える、請求項４７に記載のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
[0001]  本開示はグラフィックス処理に関し、より具体的には、グラフィックスプロセッサによってメモリ転送動作を行うための技法に関する。
【背景技術】
【０００２】
[0002]  グラフィックスプロセッシングユニット（ＧＰＵ）はしばしば、グラフィックス画像を表示するために必要とされる動作の１つまたは複数のためのハードウェアアクセラレーションを処理および／または提供するために、コンピューティングデバイスにおいて使用される。ＧＰＵによって一般に処理される動作の１つの分類は、メモリ転送動作である。メモリ転送動作は、メモリ複製動作とメモリ合成動作とを含み得る。いくつかの例では、メモリ転送動作は、ブリット動作またはＢＬＴ動作（すなわち、ビットブロック転送動作）と呼ばれ得る。これらのメモリ転送動作を行うことは、メモリ転送動作のためのソースデータと宛先データとを記憶するオフチップメモリに関する、多数の読取り動作と書込み動作とを行うことを伴い得る。
【発明の概要】
【０００３】
[0003]  本開示は、選択可能なメモリ転送モードに基づいて、グラフィックスプロセッシングユニット（ＧＰＵ）によってメモリ転送動作を行うための技法と、ＧＰＵによってメモリ転送動作のすべてまたは一部を行うためのメモリ転送モードを選択するための技法とを説明する。いくつかの例では、メモリ転送動作を行うための技法は、メモリ転送動作のすべてまたは一部を行うために、インターリーブメモリ転送モード(interleave memory transfer mode)を使用することと順次的メモリ転送モード(sequential memory transfer mode)を使用することとを選択的に切り替えるように構成されるＧＰＵを使用し得る。インターリーブメモリ転送モードは、ＧＰＵに、読取り要求および書込み要求が互いにインターリーブされる生産者−消費者パラダイム(producer-consumer paradigm)に基づいて、メモリ転送動作を行わせ得る。順次的メモリ転送モードは、複数の連続的な読取り要求のグループを出すことと複数の連続的な書込み要求のグループを出すこととをＧＰＵが交互に行うように、ＧＰＵにメモリ転送動作を行わせ得る。追加の例では、メモリ転送モードを選択するための技法は、１つまたは複数の基準に基づいてメモリ転送動作のすべてまたは一部のために使用すべきメモリ転送モードを選択するために、ホストプロセッサ（例えば、ＣＰＵ）および／またはＧＰＵを使用し得る。
【０００４】
[0004]  一例では、本開示は、１つまたは複数のプロセッサによって、メモリ転送動作の少なくとも一部を行うためのメモリ転送モードを選択することを含む、方法を説明する。メモリ転送モードは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含む、少なくとも２つの異なるメモリ転送モードのセットから選択され得る。方法はさらに、ＧＰＵによって、選択されたメモリ転送モードに基づいてメモリ転送動作を行うことを含む。
【０００５】
[0005]  別の例では、本開示は、メモリ転送動作の少なくとも一部を行うためのメモリ転送モードを選択するように構成される１つまたは複数のプロセッサを含む、デバイスを説明する。メモリ転送モードは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含む、少なくとも２つの異なるメモリ転送モードのセットから選択され得る。デバイスはさらに、選択されたメモリ転送モードに基づいてメモリ転送動作を行うように構成されるＧＰＵを含む。
【０００６】
[0006]  別の例では、本開示は、メモリ転送動作の少なくとも一部を行うためのメモリ転送モードを選択するための手段を含む、装置を説明する。メモリ転送モードは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含む、少なくとも２つの異なるメモリ転送モードのセットから選択され得る。装置はさらに、選択されたメモリ転送モードに基づいてメモリ転送動作を行うための手段を含む。
【０００７】
[0007]  別の例では、本開示は、実行されたとき、１つまたは複数のプロセッサに、メモリ転送動作の少なくとも一部を行うためのメモリ転送モードを選択させる命令を記憶した、コンピュータ可読記憶媒体を説明する。メモリ転送モードは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含む、少なくとも２つの異なるメモリ転送モードのセットから選択され得る。コンピュータ可読記憶媒体はさらに、実行されたとき、１つまたは複数のプロセッサに、選択されたメモリ転送モードに基づいてメモリ転送動作を行わせる命令を記憶する。
【０００８】
[0008]  本開示の１つまたは複数の例の詳細が、添付の図面および以下の説明に記載される。本開示の他の特徴、目的、および利点は、説明および図面、ならびに特許請求の範囲から明らかになろう。
【図面の簡単な説明】
【０００９】
【図１】本開示のマルチモードメモリ転送技法と本開示のメモリ転送モード選択技法とを実施するために使用され得る例示的なコンピューティングデバイスを示すブロック図である。
【図２】図１のコンピューティングデバイスのＣＰＵと、ＧＰＵと、メモリサブシステムとをより詳細に示すブロック図である。
【図３】図２に示される例示的な構成において使用され得る例示的なメモリサブシステムを示すブロック図である。
【図４】図２に示される例示的な構成において使用され得る別の例示的なメモリサブシステムを示すブロック図である。
【図５】本開示による例示的な単一ソースのメモリ転送動作を示す概念図である。
【図６】本開示による例示的な複数ソースのメモリ転送動作を示す概念図である。
【図７】本開示による例示的なＧＰＵにより支援された単一ソースのメモリ転送動作を示す概念図である。
【図８】本開示による例示的なＧＰＵにより支援された複数ソースのメモリ転送動作を示す概念図である。
【図９Ａ】本開示のインターリーブメモリ転送モードに従って行われる単一ソースのメモリ転送動作の例示的なタイミング特性を示すタイミング図である。
【図９Ｂ】本開示のインターリーブメモリ転送モードに従って行われる単一ソースのメモリ転送動作の例示的なタイミング特性を示すタイミング図である。
【図１０】本開示の順次的メモリ転送モードに従って行われる単一ソースのメモリ転送動作の例示的なタイミング特性を示すタイミング図である。
【図１１Ａ】本開示のインターリーブメモリ転送モードに従って行われる複数ソースのメモリ転送動作の例示的なタイミング特性を示すタイミング図である。
【図１１Ｂ】本開示のインターリーブメモリ転送モードに従って行われる複数ソースのメモリ転送動作の例示的なタイミング特性を示すタイミング図である。
【図１２】本開示の順次的メモリ転送モードに従って行われる複数ソースのメモリ転送動作の例示的なタイミング特性を示すタイミング図である。
【図１３】本開示のインターリーブメモリ転送技法による、メモリ転送動作を行うための例示的な技法を示す流れ図である。
【図１４】本開示のインターリーブ同期モードによる、読取り要求を出すための例示的な技法を示す流れ図である。
【図１５】本開示のインターリーブ同期モードによる、書込み要求を出すための例示的な技法を示す流れ図である。
【図１６】本開示の順次的メモリ転送技法による、メモリ転送動作を行うための例示的な技法を示す流れ図である。
【図１７】本開示の順次的同期モードによる、読取り要求を出すための例示的な技法を示す流れ図である。
【図１８】本開示の順次的同期モードによる、書込み要求を出すための例示的な技法を示す流れ図である。
【図１９】本開示の順次的メモリ転送モードによる、メモリ転送動作を行うための例示的な技法を示す流れ図である。
【図２０】本開示によるメモリ転送動作を行うための例示的な技法を示す流れ図である。
【図２１】本開示によるメモリ転送動作を行うためのメモリ転送モードを選択するための例示的な技法を示す流れ図である。
【図２２】本開示によるメモリ転送動作を行うためのメモリ転送モードを選択するための例示的な技法を示す流れ図である。
【図２３】本開示による、複数のスクリーン整列されたバッファ領域と宛先面とを伴うスクリーンを示す概念図である。
【図２４】本開示によるメモリ転送動作を行うためのメモリ転送モードを選択するための例示的な技法を示す流れ図である。
【図２５】本開示によるメモリ転送動作を行うためのメモリ転送モードを選択するための例示的な技法を示す流れ図である。
【図２６】本開示によるメモリ転送動作を行うためのメモリ転送モードを選択するための例示的な技法を示す流れ図である。
【図２７】本開示によるメモリ転送動作を行うための例示的な技法を示す流れ図である。
【発明を実施するための形態】
【００１０】
[0033]  本開示は、選択可能なメモリ転送モードに基づいて、グラフィックスプロセッシングユニット（ＧＰＵ）によってメモリ転送動作を行うための技法と、ＧＰＵによってメモリ転送動作のすべてまたは一部を行うためのメモリ転送モードを選択するための技法とを説明する。いくつかの例では、メモリ転送動作を行うための技法は、メモリ転送動作のすべてまたは一部を行うために、インターリーブメモリ転送モードを使用することと順次的メモリ転送モードを使用することとを選択的に切り替えるように構成される、ＧＰＵを使用し得る。インターリーブメモリ転送モードは、ＧＰＵに、読取り要求および書込み要求が互いにインターリーブされる生産者−消費者パラダイムに基づいて、メモリ転送動作を行わせ得る。順次的メモリ転送モードは、複数の連続的な読取り要求のグループを出すことと複数の連続的な書込み要求のグループを出すこととをＧＰＵが交互に行うように、ＧＰＵにメモリ転送動作を行わせ得る。追加の例では、メモリ転送モードを選択するための技法は、１つまたは複数の基準に基づいてメモリ転送動作のすべてまたは一部のために使用すべきメモリ転送動作を選択するために、ホストプロセッサ（例えば、ＣＰＵ）および／またはＧＰＵを使用し得る。
【００１１】
[0034]  異なるメモリ転送モードが、異なるタイプのメモリ転送動作の他のメモリ転送モードより効率的であることがある。例えば、より大きなメモリ転送動作では、一般に順次的メモリ転送モードがインターリーブメモリ転送モードよりも効率的であり得るが、より小さなメモリ転送動作では、いくつかの場合、特に、順次的メモリ転送モードの間の読取り要求ごとにアクセスされる最小の量のデータが大きい場合、インターリーブメモリ転送モードが順次的メモリ転送モードよりも効率的であり得る。本開示の技法は、特定のタイプのメモリ転送動作により適した異なるメモリ転送モードを選択的に使用するために使用されてよく、これによって、ＧＰＵによるメモリ転送動作の性能(performance)を改善する。
【００１２】
[0035]  メモリ転送動作は、メモリ複製動作とメモリ合成動作とを含み得る。いくつかの例では、メモリ転送動作は、ブリット（すなわち、ビットブロック転送）動作と呼ばれ得る。メモリ複製動作は、ソース面のソース領域から宛先面の宛先領域にデータを複製することを伴い得る。すなわち、ＧＰＵは、ソース面のソース領域からデータを読み取り、ソース面のソース領域に含まれるデータの厳密な複製を、宛先面の宛先領域に書き込み得る。
【００１３】
[0036]  合成動作は、同じまたは異なるソース面の少なくとも２つの異なるソース領域を何らかの方式で組み合わせることと、ソース領域の組合せを宛先面の宛先領域に書き込むこととを伴い得る。いくつかの場合には、ソース面の１つまたは複数は、合成動作のための宛先面と同じ面であり得る。例えば、合成動作は、単一のソース領域と単一の宛先領域とを読み取ることと、これら２つを一緒にブレンドすることと、ブレンドされた結果を宛先領域に書き込むこととを伴い得る。
【００１４】
[0037]  いくつかの例では、合成動作を行うとき、異なるソース領域が、ラスタ演算に従って組み合わされてよく、ラスタ演算は合成動作の異なる例では異なり得る。ラスタ演算は、特定の合成動作のためにビットがどのように組み合わされるべきかを規定する動作であり得る。いくつかの例では、ラスタ演算は、例えばブーリアン論理演算のような、ビットごとの演算を含み得る。ブーリアン論理演算は、例えば、ビットごとのＡＮＤ演算、ＯＲ演算、ＮＯＴ演算、および／またはＸＯＲ演算を含み得る。
【００１５】
[0038]  追加の例では、ラスタ演算は、ブレンド演算（例えば、アルファブレンド演算）を含み得る。いくつかの例では、ブレンド演算は、ブレンド演算の実行中に使用されるべきソースピクセル乗算器と宛先ピクセル乗算器とを規定し得る。そのような例では、ブレンド演算の実行中に、ソースピクセル値（例えば、ソースピクセル色値および／またはソースピクセルアルファ値）は、第１の積を生成するためにソースピクセル乗算器によって乗算されてよく、対応する宛先ピクセル値（例えば、宛先ピクセル色値および／または宛先ピクセルアルファ値）は、第２の積を生成するために宛先ピクセル乗算器によって乗算されてよく、ピクセル位置に対する宛先値を生成するために、２つの積の合計が一緒に加算され得る。他のタイプのブレンド演算も可能である。さらなる例では、ＧＰＵ上で実行するシェーダプログラムに従って、異なるソース領域が組み合わされ得る。
【００１６】
[0039]  メモリ転送動作で使用されるソース面および宛先面は、同じ面または異なる面であってよく、ピクセルデータの２次元アレイに各々対応し得る。ピクセルデータは、面の中の各ピクセルに対する、赤、緑、青（ＲＧＢ）の色値と、いくつかの場合には、アルファ値（Ａ）とを含み得る。面はピクセルデータの２次元アレイに対応するので、面の中の個々のピクセル位置に対するピクセルデータは、行および列の座標によってアドレス指定され得る。メモリ転送動作で使用されるソース領域の各々は、それぞれのソース面のすべてまたはサブセットに対応し得る。同様に、メモリ転送動作で使用される宛先領域は、宛先面のすべてまたはサブセットに対応し得る。ソース領域および宛先領域は同じサイズまたは形状であってよく、通常は長方形の領域であるが、必ずしもそうとは限らない。
【００１７】
[0040]  ＧＰＵがメモリ転送動作を行うとき、メモリ転送動作のために使用されるソース面および宛先面は通常、オフチップメモリに記憶される。言い換えると、メモリは、ＧＰＵが形成され、配置され、および／または配設される、マイクロチップ、集積回路、および／またはダイとは異なる、マイクロチップ、集積回路、および／またはダイの上に、形成され、配置され、および／または配設され得る。メモリは、１つまたは複数のバスを介して、および、いくつかの場合にはメモリコントローラを介して、ＧＰＵに通信可能に結合され得る。
【００１８】
[0041]  メモリ複製動作を行うとき、ＧＰＵは、ソース領域中のピクセル位置の各々からデータを読み取り、ソース領域から読み取られたデータを宛先領域中の対応するピクセル位置に書き込み得る。同様に、合成動作の遂行(performance)は、複数のソース領域中の位置の各々からデータを読み取ることと、データを組み合わせることと、組み合わされたデータを宛先領域に書き込むこととを伴い得る。従って、単一メモリの転送動作は、１つまたは複数のバスを介した、オフチップメモリへの、ＧＰＵによる多数の読取り要求および多数の書込み要求の発行を伴い得る。
【００１９】
[0042]  メモリ転送動作のためのメモリ読取り動作とメモリ書込み動作とを行うために、ＧＰＵは、いくつかの例では、読取りエンジンと書込みエンジンとを使用し得る。読取りエンジンは、メモリ転送動作のための読取り要求の発行を処理でき、書込みエンジンは、メモリ転送動作のための書込み要求の発行を処理し得る。インターリーブメモリ転送モードを使用してメモリ転送動作を行うとき、読取りエンジンおよび書込みエンジンは、読取りクライアントが初期の量の読取り要求を出す、生産者−消費者タイプの同期を利用でき、読取り要求に応答してソースデータを受け取ると、書込みクライアントは、データを消費し(consume)、対応する書込み要求をメモリに発行し得る。ソースデータの消費(consumption)に伴って、読取りエンジンは、後続の読取り要求を出すことに進み得る。読取りエンジンと書込みエンジンとの間での、このタイプの緩やかな同期により、読取りストリームと書込みストリームが、互いに混合され、および／またはインターリーブされるようになり得る。従って、インターリーブメモリ転送モードに基づいてメモリ転送動作を行うとき、メモリおよびバスは、読取り要求にサービスすることと、書込み要求にサービスすることとの間で頻繁に切り替わる。
【００２０】
[0043]  例えば、ダブルデータレート同期ダイナミックランダムアクセスメモリ（ＤＤＲ  ＳＤＲＡＭ）のようないくつかのタイプのメモリでは、ある長さの処理時間のオーバーヘッドは、メモリおよび／またはバスが読取り動作にサービスすることと書込み動作にサービスすることとを切り替える必要のある各時間と関連付けられ得る。例えば、読取り要求にサービスすることと書込み要求にサービスすることとの切替えが発生するたびに、バスが向きを変える前にバスを安定させるために、特定の長さのアイドル時間が必要とされ得る。この処理時間のオーバーヘッドは、読取り−書込み転換時間と呼ばれ得る。別の例として、読取りストリームおよび書込みストリームがメモリの異なるページにアクセスしている場合、メモリは、読取り要求にサービスすることと書込み要求にサービスすることの切替えが発生するたびに、メモリの異なるページおよび／またはバンクを開き、閉じる必要があり得るので、読取り−書込みの切替えに追加の処理時間のオーバーヘッドが加わる。
【００２１】
[0044]  合成動作およびブリット動作のようなメモリ転送動作は、メモリが限られていることが多い。すなわち、そのような動作を行うために必要とされるメモリ読取り要求およびメモリ書込み要求は、ＧＰＵの性能のボトルネックとなることが多い。従って、読取り要求にサービスすることと書込み要求にサービスすることとの大量の切替えをもたらす、読取り−書込みエンジンの同期の方式は、ＧＰＵのメモリアクセス効率を下げ得るだけではなく、メモリ転送動作全体の性能も下げ得る。
【００２２】
[0045]  本開示で説明される順次的メモリ転送モードは、例えば、複数の連続的な読取り要求のシーケンスと複数の連続的な書込み要求のシーケンスとを、別個の時間間隔の間にメモリへ出すことによって、ＧＰＵにおいてメモリ転送動作を行うときに発生する読取り−書込み転換のオーバーヘッドを減らすために使用され得る。読取り要求および書込み要求は、別個の時間間隔において複数の連続的な要求のグループの中で出されるので、システムメモリおよび／またはバスが読取り要求にサービスすることと書込み要求にサービスすることを切り替える必要があり得る回数が減らされることが可能であり、これによって、メモリ転送動作の読取り−書込み転換のオーバーヘッドが減る。
【００２３】
[0046]  比較的大きなメモリ転送動作では、順次的メモリ転送モードによって提供される、低減された読取り−書込み転換のオーバーヘッドは、メモリ転送動作を行う際に、順次的メモリ転送モードをインターリーブメモリ転送モードよりも効率的にし得る。しかしながら、より小さなメモリ転送動作では、順次的メモリ転送モードにおいて同期を行うために必要とされる過剰なオーバーヘッドは、いくつかの場合には、読取り−書込み転換のオーバーヘッドを減らす利益より重大であり得る。その上、順次的メモリ転送モードの間に読取り要求のためにメモリからＧＰＵに転送されたデータの最小の量が、メモリ転送動作（例えば、ＢＬＴ動作）のサイズと比較して相対的に大きい場合、順次的メモリ転送モードは、無関係なデータをメモリから読み取らせることがあり、これによって、メモリ転送動作の性能(performance)が下がる。
【００２４】
[0047]  本開示の技法に従って、特定のメモリ転送動作およびその一部のために、順次的メモリ転送モードとインターリーブメモリ転送モードを選択的に切り替えるための能力を提供することは、ＧＰＵが、そのようなモードの利点が重大ではない、および／または他の要因によって減弱されない場合にはメモリ効率を上げるために順次的なメモリ転送モードを選択的に使用し、順次的メモリ転送モードの利点が重大である、および／または他の要因によって減弱される場合にはインターリーブメモリ転送モードを使用することを、可能にし得る。特定のタイプ（例えば、サイズ）のメモリ転送動作により適した様々なメモリ転送モードをＧＰＵが選択的に使用することを可能にすることによって、本開示の技法は、種々の異なるタイプのメモリ転送モードを行うＧＰＵの全体の性能を改善可能であり得る。
【００２５】
[0048]  いくつかの例では、ＧＰＵおよび／またはアプリケーションプロセッサ上で実行するＧＰＵドライバは、メモリ転送動作のサイズに基づいて、メモリ転送動作のすべてまたは一部を行うためのメモリ転送モードを選択し得る。メモリ転送動作のサイズは、メモリ転送動作によって転送されるべきデータの量を指し得る。例えば、メモリ転送動作のサイズが閾値より大きい場合、ＧＰＵおよび／またはＧＰＵドライバは、メモリ転送動作のすべてまたは一部を行うために使用されるべきメモリ転送モードとして、順次的メモリ転送モードを選択し得る。別の例として、メモリ転送動作のサイズが閾値より大きくない場合、ＧＰＵおよび／またはＧＰＵドライバは、メモリ転送動作のすべてまたは一部を行うために使用されるべきメモリ転送モードとして、インターリーブメモリ転送モードを選択し得る。
【００２６】
[0049]  追加の例では、ＧＰＵおよび／またはアプリケーションプロセッサ上で実行するＧＰＵドライバは、メモリ転送動作のために定義された宛先領域が有する固定されたスクリーン整列されたバッファ領域との重複の量に基づいて、メモリ転送動作のすべてまたは一部を行うためのメモリ転送モードを選択し得る。いくつかの場合には、面は、ディスプレイモニタまたはスクリーンに含まれるピクセルに対応し得る。スクリーンは、読み取られたデータを記憶するために使用されるバッファのサイズに対応する固定されたサイズを各々有する、複数の領域へと細分化され得る。これらの細分化された領域は、固定されたスクリーン整列されたバッファ領域と呼ばれ得る。そのような例では、順次的メモリ転送モードで動作するとき、ＧＰＵは、固定されたスクリーン整列されたバッファ領域のサイズに対応する固定されたサイズのデータユニットで、メモリとＧＰＵとの間でデータを転送するように構成され得る。
【００２７】
[0050]  宛先領域が、完全にではなく部分的に、特定の固定されたスクリーン整列されたバッファ領域を覆う場合、ＧＰＵおよび／またはＧＰＵドライバは、読み取られたデータが記憶されるバッファが完全には利用されていないので、スクリーンのその領域のためのメモリ転送モードとしてインターリーブメモリ転送モードを選択し得る。そのような場合に順次的メモリモードが選択された場合、固定されたサイズのメモリ読取りは、無関係なデータをメモリから読み取らせ、これは、順次的メモリ転送モードを使用することによって発生するであろう読取り−書込み転換の減少より重大であり得る。一方、宛先領域が完全に特定の固定されたスクリーン整列されたバッファ領域を覆う場合、ＧＰＵおよび／またはＧＰＵドライバは、読み取られたデータが記憶されるバッファが完全に利用され無関係なデータを取り出すことで時間が無駄にされないので、スクリーンのその領域のためのメモリ転送モードとして順次的メモリ転送モードを選択し得る。
【００２８】
[0051]  さらなる例では、ＧＰＵおよび／またはアプリケーションプロセッサ上で実行するＧＰＵドライバは、メモリ転送動作（例えば、合成動作）を行うために使用されるシェーダプログラムのサイズおよび／または複雑さに基づいて、メモリ転送動作のすべてまたは一部を行うためのメモリ転送モードを選択し得る。シェーダプログラムのサイズおよび／または複雑さは、特定のメモリ転送動作のためのシェーダ動作の遂行が、メモリ転送動作の性能のボトルネックになる可能性が高いかどうかを示すものであり得る。
【００２９】
[0052]  そのような例では、シェーダプログラムのサイズおよび／または複雑さが閾値より低い場合、ＧＰＵおよび／またはＧＰＵドライバは、シェーダ動作の遂行がメモリ転送動作の性能のボトルネックにならない可能性が高いことを決定し得る。そのような場合、ＧＰＵおよび／またはＧＰＵドライバは、メモリアクセス効率がメモリ転送動作の性能のボトルネックであり得る可能性があるので、メモリ転送動作のために順次的メモリ転送モードを選択し得る。一方、シェーダプログラムのサイズおよび／または複雑さが閾値より高い場合、ＧＰＵおよび／またはＧＰＵドライバは、シェーダ動作の遂行がメモリ転送動作の性能のボトルネックになる可能性が高いことを決定し得る。そのような場合、ＧＰＵおよび／またはＧＰＵドライバは、メモリ効率の上昇が必要とされないので、および、順次的メモリ転送モードにおいて発生する読取り動作の延期がシェーダプログラムにおいてデータを不足させる可能性があり、これは通常シェーダプログラムが性能のボトルネックである場合には望ましくないので、メモリ転送動作のためにインターリーブメモリ転送モードを選択し得る。
【００３０】
[0053]  追加の例では、ＧＰＵは、選択されたメモリ転送モードに基づいて、キャッシュのキャッシュラインサイズを選択し構成し得る。キャッシュは、読み取られたデータが記憶される、ＧＰＵ中のバッファに対応し得る。そのような例では、メモリ転送モードが順次的メモリ転送モードである場合、ＧＰＵは、読取り動作および書込み動作の可能な限り大きなグループ化を可能にするために、キャッシュの容量全体に等しいキャッシュラインサイズを選択し得る。一方、メモリ転送モードがインターリーブメモリ転送モードである場合、ＧＰＵは、インターリーブされた要求にサービスするときにデータの複数の領域が同時にキャッシュされることを可能にするために、キャッシュの容量全体よりも少ないキャッシュラインサイズを選択し得る。
【００３１】
[0054]  本開示のいくつかの態様によれば、メモリ転送動作を行うためにＧＰＵによって使用されるべきメモリ転送モードをシグナリングするための技法が説明される。シグナリング技法は、ホストアプリケーションプロセッサ上で実行するＧＰＵドライバおよび／またはユーザアプリケーションが、メモリ転送動作を行うために使用されるメモリ転送モードを制御することを可能にし得る。
【００３２】
[0055]  いくつかの例では、メモリ転送モードを規定する情報フィールドは、ＧＰＵによって実行されるように構成される１つまたは複数の既存のＧＰＵコマンドに追加され得る。情報フィールドは、いくつかの場合には、命令と関連付けられるメモリ転送動作のために使用されるべきメモリ転送モードを規定する、単一のモードビットであり得る。例えば、グラフィックスドライバは、ソースメモリ領域と宛先メモリ領域とをＧＰＵに対して規定することによって、および、（３次元の）３Ｄ描画呼出し命令をＧＰＵに出すことによって、ユーザレベルのブリットコマンドにサービスし得る。３Ｄ描画呼出し命令は、３Ｄ描画呼出し命令の実行中に使用されるべきメモリ転送モードを示すモードビットを含み得る。ＧＰＵは、命令に規定されるメモリ転送モードに基づいてメモリ転送動作を行うように構成され得る。
【００３３】
[0056]  追加の例では、ＧＰＵは、メモリ転送動作を行うために使用されるべきメモリ転送モードを規定する、メモリ転送モード状態変数を含み得る。そのような例では、ＧＰＵコマンド（例えば、ＧＰＵドライバからＧＰＵに出されるコマンド）は、メモリ転送モード状態変数の状態を、メモリ転送動作を行うために使用されるべきメモリ転送モードを示す値へとプログラムするために使用され得る。ＧＰＵは、メモリ転送モード状態変数の状態に基づいてメモリ転送動作を行うように構成され得る。
【００３４】
[0057]  さらなる例では、メモリ転送モードは、ＧＰＵコマンドストリームの一部として修正されるＧＰＵ状態の一部であり得る。ＧＰＵコマンドストリームは、状態レジスタセットアップコマンド、ならびに、１つまたは複数のＧＰＵシェーダプロセッサによって実行されるコーディングすべき命令（または命令ポインタ）の両方を含み得る。
【００３５】
[0058]  追加の例では、命令は、ＧＰＵドライバのためのアプリケーションプログラミングインターフェース（ＡＰＩ）に追加され得る。命令は、メモリ転送動作を行うために使用されるべきメモリ転送モードを示す、メモリ転送モードインジケータを含み得る。ＧＰＵドライバは、ＧＰＵに、メモリ転送モードインジケータに基づいてメモリ転送動作を行わせるように構成され得る。このようにして、ユーザアプリケーションは、メモリ転送動作を行うときにＧＰＵによって使用されるべきメモリ転送モードを規定可能であり得る。
【００３６】
[0059]  図１は、本開示のマルチモードメモリ転送技法と本開示のメモリ転送モード選択技法とを実施するために使用され得る例示的なコンピューティングデバイス２を示すブロック図である。コンピューティングデバイス２は、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、コンピュータワークステーション、ビデオゲームプラットフォームもしくはコンソール、（例えば、携帯電話、セルラー電話、衛星電話、および／もしくは携帯電話ハンドセットのような）ワイヤレス通信デバイス、固定電話、インターネット電話、ポータブルビデオゲームデバイスもしくは携帯情報端末（ＰＤＡ）のようなハンドヘルドデバイス、パーソナル音楽プレーヤー、ビデオプレーヤー、ディスプレイデバイス、テレビジョン、テレビジョンセットトップボックス、サーバ、中間ネットワークデバイス、メインフレームコンピュータ、またはグラフィカルデータを処理および／もしくは表示する任意の他のタイプのデバイスを備え得る。
【００３７】
[0060]  図１の例に示されるように、コンピューティングデバイス２は、ユーザインターフェース４と、ＣＰＵ６と、メモリサブシステム８と、グラフィックスプロセッシングユニット（ＧＰＵ）１０と、ＧＰＵキャッシュ１２と、ディスプレイインターフェース１４と、ディスプレイ１６と、バス１８とを含む。ユーザインターフェース４、ＣＰＵ６、メモリサブシステム８、ＧＰＵ１０、およびディスプレイインターフェース１４は、バス１８を使用して互いに通信し得る。図１に示される異なるコンポーネント間のバスおよび通信インターフェースの特定の構成は単なる例示であり、本開示の技法を実装するために、同じもしくは異なるコンポーネントを伴うコンピューティングデバイスおよび／または他のグラフィックス処理システムの他の構成が使用され得ることに留意されたい。
【００３８】
[0061]  ＣＰＵ６は、コンピューティングデバイス２の動作を制御する汎用プロセッサまたは専用プロセッサを備え得る。ユーザは、ＣＰＵ６に１つまたは複数のソフトウェアアプリケーションを行わせるための入力をコンピューティングデバイス２に与え得る。ＣＰＵ６上で実行するソフトウェアアプリケーションは、例えば、オペレーティングシステム、ワードプロセッサアプリケーション、電子メールアプリケーション、スプレッドシートアプリケーション、メディアプレーヤーアプリケーション、ビデオゲームアプリケーション、グラフィカルユーザインターフェースアプリケーション、または別のプログラムを含み得る。ユーザは、ユーザインターフェース４を介してコンピューティングデバイス２に結合される、キーボード、マウス、マイクロフォン、タッチパッドまたは別の入力デバイスのような、１つもしくは複数の入力デバイス（図示されず）を介してコンピューティングデバイス２に入力を与え得る。
【００３９】
[0062]  ＣＰＵ６上で実行するソフトウェアアプリケーションは、ディスプレイ１６に対するグラフィックスデータのレンダリングを引き起こすようにＧＰＵ１０に命令する、１つまたは複数のグラフィックスレンダリング命令を含み得る。いくつかの例では、ソフトウェア命令は、例えば、Ｏｐｅｎ  Ｇｒａｐｈｉｃｓ  Ｌｉｂｒａｒｙ（ＯｐｅｎＧＬ（商標登録））アプリケーションプログラミングインターフェース（ＡＰＩ）、Ｏｐｅｎ  Ｇｒａｐｈｉｃｓ  Ｌｉｂｒａｒｙ  Ｅｍｂｅｄｄｅｄ  Ｓｙｓｔｅｍ（ＯｐｅｎＧＬ  ＥＳ）ＡＰＩ、Ｄｉｒｅｃｔ３Ｄ  ＡＰＩ、ＤｉｒｅｃｔＸ  ＡＰＩ、ＲｅｎｄｅｒＭａｎ  ＡＰＩ、ＷｅｂＧＬ  ＡＰＩ、または任意の他の公開の、もしくはプロプライエタリの標準的なグラフィックスＡＰＩのような、グラフィックスＡＰＩに準拠し得る。グラフィックスレンダリング命令を処理するために、ＣＰＵ６は、ＧＰＵ１０にグラフィックスデータのレンダリングの一部またはすべてを行わせるために、１つまたは複数のグラフィックスレンダリングコマンドをＧＰＵ１０に出し得る。いくつかの例では、レンダリングされるべきグラフィックスデータは、グラフィックスプリミティブのリスト、例えば、点、線、三角形、四角形、トライアングルストリップ、パッチなどを含み得る。
【００４０】
[0063]  メモリサブシステム８は、コンピューティングデバイス２の中の他のコンポーネントから受け取られたメモリアクセス要求にサービスするように構成され得る。例えば、メモリサブシステム８は、ＣＰＵ６、ＧＰＵ１０、および／またはディスプレイインターフェース１４からのメモリアクセス要求にサービスし得る。メモリアクセス要求は、読取りアクセス要求と書込みアクセス要求とを含み得る。メモリサブシステム８は、ＣＰＵ６、ＧＰＵ１０、ユーザインターフェース４、およびディスプレイインターフェース１４に、バス１８を介して通信可能に結合される。
【００４１】
[0064]  メモリサブシステム８は、メモリコントローラ２０とメモリ２２とを含む。メモリコントローラ２０は、メモリ２２に入りメモリ２２から出るデータの転送を容易にする。例えば、メモリコントローラ２０は、メモリ読取り要求とメモリ書込み要求とをＣＰＵ６および／またはＧＰＵ１０から受け取って、コンピューティングデバイス２の中のコンポーネントにメモリサービスを提供するために、メモリ２２に関するそのような要求にサービスし得る。
【００４２】
[0065]  読取り要求は、そこからのデータが要求者に返されるべきである、メモリアドレスまたはメモリアドレスの範囲を規定し得る。書込み要求は、規定されたデータが書き込まれるべきである、メモリアドレスまたはメモリアドレスの範囲を規定し得る。書き込まれるべきデータは、１つまたは複数のデータバスを介して要求者（例えば、ＣＰＵ６および／またはＧＰＵ１０）によってメモリコントローラ２０に書込み要求とともに供給され得る。いくつかの例では、書き込まれるべきデータは、書込み要求の一部を形成し得る。メモリアクセス要求を受け取ったことに応答して、メモリコントローラ２０は、読取り要求と書込み要求とにサービスするために、１つまたは複数の読取りコマンドをメモリ２２に出し、および／または、１つまたは複数の書込み命令をメモリ２２に出し得る。
【００４３】
[0066]  メモリコントローラ２０は、専用のメモリバスを介してメモリ２２に、および、バス１８を介して他のコンポーネント（例えば、ＣＰＵ６およびＧＰＵ１０）に通信可能に結合される。メモリコントローラ２０は、図１の例示的なコンピューティングデバイス２では、ＣＰＵ６とメモリ２２の両方とは別の処理モジュールとして示されているが、他の例では、メモリコントローラ２０の機能の一部またはすべては、ＣＰＵ６、ＧＰＵ１０、およびメモリ２２の１つもしくは複数で実装され得る。
【００４４】
[0067]  メモリ２２は、ＣＰＵ６による実行のためにアクセス可能なプログラムモジュールおよび／もしくは命令、ならびに／またはＣＰＵ６上で実行するプログラムにより使用するためのデータを記憶し得る。例えば、メモリ２２は、ユーザアプリケーションと、それらのアプリケーションと関連付けられたグラフィックスデータとを記憶し得る。メモリ２２はまた、コンピューティングデバイス２の他のコンポーネントによって使用するための情報、および／またはそれらによって生成される情報を記憶し得る。例えば、メモリ２２は、ＧＰＵ１０のデバイスメモリとして機能でき、ＧＰＵ１０によって演算されことになるデータ、ならびにＧＰＵ１０によって行われる演算の結果生じるデータを記憶し得る。例えば、メモリ２２は、ソース面、宛先面、テクスチャバッファ、深度バッファ、ステンシルバッファ、頂点バッファ、フレームバッファなどの、面の任意の組合せを記憶し得る。加えて、メモリ２２は、ＧＰＵ１０による処理のためのコマンドストリームを記憶し得る。メモリ２２は、例えば、ランダムアクセスメモリ（ＲＡＭ）、スタティックＲＡＭ（ＳＲＡＭ）、ダイナミックＲＡＭ（ＤＲＡＭ）、同期式ダイナミックランダムアクセスメモリ（ＳＤＲＡＭ）、読取り専用メモリ（ＲＯＭ）、消去可能プログラマブルＲＯＭ（ＥＰＲＯＭ）、電気的消去可能プログラマブルＲＯＭ（ＥＥＰＲＯＭ（登録商標））、フラッシュメモリ、磁気データ媒体または光記憶媒体のような、１つもしくは複数の揮発性または不揮発性のメモリあるいは記憶デバイスを含み得る。いくつかの例では、メモリ２２は、例えば、ＤＤＲ１  ＳＤＲＡＭ、ＤＤＲ２  ＳＤＲＡＭ、ＤＤＲ３  ＳＤＲＡＭ、ＤＤＲ４  ＳＤＲＡＭなどのような、ダブルデータレート（ＤＤＲ）ＳＤＲＡＭであり得る。
【００４５】
[0068]  ＧＰＵ１０は、ＣＰＵ６によってＧＰＵ１０に出されたコマンドを実行するように構成され得る。ＧＰＵ１０によって実行されるコマンドは、グラフィックスコマンド、描画呼出しコマンド、ＧＰＵ状態プログラミングコマンド、メモリ転送コマンド、汎用コンピューティングコマンド、カーネル実行コマンドなどを含み得る。メモリ転送コマンドは、例えば、メモリ複製コマンド、メモリ合成コマンド、およびブリットコマンドを含み得る。
【００４６】
[0069]  いくつかの例では、ＧＰＵ１０は、ディスプレイ１６に１つまたは複数のグラフィックスプリミティブをレンダリングするためのグラフィックス演算を行うように構成され得る。そのような例では、ＣＰＵ６上で実行するソフトウェアアプリケーションの１つがグラフィックス処理を必要とするとき、ＣＰＵ６は、ディスプレイ１６にレンダリングするためのグラフィックスデータをＧＰＵ１０に提供して、ＧＰＵ１０に１つまたは複数のグラフィックスコマンドを出し得る。グラフィックスコマンドは、例えば、描画呼出しコマンド、ＧＰＵ状態プログラミングコマンド、メモリ転送コマンド、ブリットコマンドなどを含み得る。グラフィックスデータは、頂点バッファ、テクスチャデータ、面データなどを含み得る。いくつかの例では、ＣＰＵ６は、コマンドとグラフィックスデータとをＧＰＵ１０によってアクセスされ得るメモリ２２に書き込むことによって、コマンドとグラフィックスデータとをＧＰＵ１０に提供し得る。
【００４７】
[0070]  さらなる例では、ＧＰＵ１０は、ＣＰＵ６上で実行するアプリケーションのために汎用コンピューティングを行うように構成され得る。そのような例では、ＣＰＵ６上で実行するソフトウェアアプリケーションの１つが計算タスクをＧＰＵ１０にオフロードすることを決定するとき、ＣＰＵ６は、汎用コンピューティングデータをＧＰＵ１０に提供して、ＧＰＵ１０に１つまたは複数の汎用コンピューティングコマンドを出し得る。汎用コンピューティングコマンドは、例えば、カーネル実行コマンド、メモリ転送コマンドなどを含み得る。いくつかの例では、ＣＰＵ６は、コマンドとグラフィックスデータとをＧＰＵ１０によってアクセスされ得るメモリ２２に書き込むことによって、コマンドと汎用コンピューティングデータとをＧＰＵ１０に提供し得る。
【００４８】
[0071]  ＧＰＵ１０は、いくつかの例では、ＣＰＵ６よりも効率的なベクトル演算の処理を行う高度に並列な構造を伴って構築され得る。例えば、ＧＰＵ１０は、複数の頂点、制御点、画素および／または他のデータについて並列の方式で演算するように構成された複数の処理要素を含み得る。ＧＰＵ１０の高度に並列な性質は、いくつかの例では、ＧＰＵ１０が、ＣＰＵ６を使用して画像をレンダリングするよりもより迅速にグラフィックス画像（例えば、ＧＵＩおよび２次元（２Ｄ）ならびに／または３次元（３Ｄ）のグラフィックスシーン）をディスプレイ１６上にレンダリングすることを可能にし得る。加えて、ＧＰＵ１０の高度に並列な性質は、ＧＰＵ１０が、ＣＰＵ６よりもより迅速に、汎用コンピューティングアプリケーションのためのあるタイプのベクトル演算と行列演算とを処理することを可能にし得る。
【００４９】
[0072]  いくつかの例では、ＧＰＵ１０は、コンピューティングデバイス２のマザーボードに統合され得る。他の例では、ＧＰＵ１０は、コンピューティングデバイス２のマザーボードにおけるポートに設置されるグラフィックスカード上に存在してよく、または別様には、コンピューティングデバイス２と相互動作するように構成された周辺デバイス内に組み込まれてよい。さらなる例では、ＧＰＵ１０は、システムオンチップ（ＳｏＣ）を形成するＣＰＵ６と同じマイクロチップ上に配置され得る。ＧＰＵ１０は、１つもしくは複数のマイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、デジタル信号プロセッサ（ＤＳＰ）、あるいは他の等価な集積論理回路または個別論理回路のような、１つもしくは複数のプロセッサを含み得る。
【００５０】
[0073]  いくつかの例では、ＧＰＵ１０はＧＰＵキャッシュ１２に直接結合され得る。従って、ＧＰＵ１０は、必ずしもバス１８を使用せずに、ＧＰＵキャッシュ１２からデータを読み取り、ＧＰＵキャッシュ１２にデータを書き込み得る。言い換えると、ＧＰＵ１０は、オフチップメモリの代わりに、ローカルストレージを使用してデータをローカルに処理し得る。これは、大量のバストラフィックを経験し得るバス１８を介するＧＰＵ１０のデータの読取りおよび書込みの必要をなくすことによって、より効率的な方式でＧＰＵ１０を動作させ得る。しかしながら、いくつかの例では、ＧＰＵ１０は、別個のキャッシュを含まず、代わりに、バス１８を介してメモリ２２を利用し得る。ＧＰＵキャッシュ１２は、例えば、ランダムアクセスメモリ（ＲＡＭ）、スタティックＲＡＭ（ＳＲＡＭ）、ダイナミックＲＡＭ（ＤＲＡＭ）、消去可能プログラマブルＲＯＭ（ＥＰＲＯＭ）、電気消去可能プログラマブルＲＯＭ（ＥＥＰＲＯＭ）、フラッシュメモリ、磁気データ媒体または光学記憶媒体のような、１つもしくは複数の揮発性または不揮発性のメモリあるいは記憶デバイスを含み得る。
【００５１】
[0074]  ＣＰＵ６および／またはＧＰＵ１０は、レンダリングされた画像データをメモリ２２内に割り振られたフレームバッファに記憶し得る。ディスプレイインターフェース１４は、データをフレームバッファから取り出して、レンダリングされた画像データによって表される画像を表示するようにディスプレイ１６を構成し得る。いくつかの例では、ディスプレイインターフェース１４は、フレームバッファから取り出されたデジタル値をディスプレイ１６によって利用され得るアナログ信号に変換するように構成されたデジタルアナログ変換器（ＤＡＣ）を含み得る。他の例では、ディスプレイインターフェース１４は、処理のために、デジタル値をディスプレイ１６に直接的に渡し得る。ディスプレイ１６は、モニタ、テレビジョン、プロジェクションデバイス、液晶ディスプレイ（ＬＣＤ）、プラズマディスプレイパネル、発光ダイオード（ＬＥＤ）アレイ、陰極線管（ＣＲＴ）ディスプレイ、電子ペーパー、表面伝導型電子放出素子ディスプレイ（ＳＥＤ）、レーザテレビジョンディスプレイ、ナノ結晶ディスプレイまたは別のタイプのディスプレイユニットを含み得る。ディスプレイ１６はコンピューティングデバイス２内に統合され得る。例えば、ディスプレイ１６は、携帯電話ハンドセットまたはタブレットコンピュータのスクリーンであってよい。あるいは、ディスプレイ１６は、有線通信リンクまたはワイヤレス通信リンクを介してコンピュータデバイス２に結合されるスタンドアロンデバイスであってよい。例えば、ディスプレイ１６は、ケーブルリンクまたはワイヤレスリンクを介してパーソナルコンピュータに接続されるコンピュータモニタまたはフラットパネルディスプレイであってよい。
【００５２】
[0075]  バス１８は、第１世代、第２世代、および第３世代のバス構造ならびにバスプロトコルと、共有されたバス構造およびバスプロトコルと、ポイントツーポイントバス構造およびバスプロトコルと、一方向バス構造およびバスプロトコルと、双方向バス構造およびバスプロトコルとを含む、バス構造およびバスプロトコルの任意の組合せを使用して実装され得る。バス１８を実装するために使用され得る様々なバス構造およびバスプロトコルの例としては、例えば、ＨｙｐｅｒＴｒａｎｓｐｏｒｔバス、ＩｎｆｉｎｉＢａｎｄバス、Ａｄｖａｎｃｅｄ  Ｇｒａｐｈｉｃｓ  Ｐｏｒｔバス、Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ（ＰＣＩ）バス、ＰＣＩ  Ｅｘｐｒｅｓｓバス、Ａｄｖａｎｃｅｄ  Ｍｉｃｒｏｃｏｎｔｒｏｌｌｅｒ  Ｂｕｓ  Ａｒｃｈｉｔｅｃｔｕｒｅ（ＡＭＢＡ）Ａｄｖａｎｃｅｄ  Ｈｉｇｈ−performance  Ｂｕｓ（ＡＨＢ）、ＡＭＢＡ  Ａｄｖａｎｃｅｄ  Ｐｅｒｉｐｈｅｒａｌ  Ｂｕｓ（ＡＰＢ）、およびＡＭＢＡ  Ａｄｖａｎｃｅｄ  ｅＸｅｎｔｉｓｉｂｌｅ  Ｉｎｔｅｒｆａｃｅ（ＡＸＩ）バスがある。他のタイプのバス構造およびプロトコルも使用され得る。
【００５３】
[0076]  本開示によれば、ＣＰＵ６とＧＰＵ１０の１つまたは両方が、メモリ転送動作の少なくとも一部を行うためのメモリ転送モードを選択するように構成されてよく、ＧＰＵ１０が、選択されたメモリ転送モードに基づいてメモリ転送動作を行うように構成されてよい。メモリ転送モードは、少なくとも２つの異なるメモリ転送モードのセットから選択され得る。いくつかの例では、少なくとも２つの異なるメモリ転送モードのセットは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含み得る。
【００５４】
[0077]  いくつかの例では、メモリ転送モードは、メモリ転送動作の遂行中に読取り要求の発行および書込み要求の発行がどのように同期されるべきかを示し得る。そのような例では、本開示の技法は、ＧＰＵ１０が、読取り要求および書込み要求の発行のための少なくとも２つの異なる同期のモードを選択的に切り替えることを可能にし得る。例えば、インターリーブメモリ転送モードが、メモリ転送動作のすべてまたは一部を行うために使用すべきメモリ転送モードとして選択される場合、ＧＰＵ１０は、生産者−消費者の同期のパラダイムに基づいて、読取り要求と書込み要求とを発行させ得る。例えば、書込みエンジンは、ＧＰＵ１０がソースデータを受け取ったことに応答して（例えば、ソースデータが生成されたことに応答して）、ソースデータを消費でき、読取りエンジンは、ソースデータが書込みエンジンによって消費されたことに応答して、読取り要求を出し得る。一方、順次的メモリ転送モードが、メモリ転送動作のすべてまたは一部を行うために使用すべきメモリ転送モードとして選択される場合、ＧＰＵ１０は、相互排除の同期のパラダイムに基づいて、読取り要求と書込み要求とを発行させ得る。例えば、ＧＰＵ１０は、別々の時間間隔の間に、読取りエンジンが複数の連続的な読取り要求出すことを可能にすることと、書込みエンジンが複数の連続的な書込み要求を出すことを可能にすることとを、交互に行い得る。
【００５５】
[0078]  さらなる例では、メモリ転送モードは、メモリ転送動作の遂行中に読取り要求および書込み要求がインターリーブされるべき細分性(granularity)のレベルを示し得る。そのような例では、本開示の技法は、ＧＰＵ１０が、メモリ転送動作の遂行のために、読取り要求および書込み要求をインターリーブする少なくとも２つの異なる細分性を選択的に切り替えることを可能にし得る。例えば、インターリーブメモリ転送モードが、メモリ転送動作のすべてまたは一部を行うために使用すべきメモリ転送モードとして選択される場合、ＧＰＵ１０は、比較的細かいレベルの細分性で、読取り要求および書込み要求がインターリーブされるようにし得る。例えば、単一の読取り要求および単一の書込み要求が互いにインターリーブされ得る。一方、順次的メモリ転送モードが、メモリ転送動作のすべてまたは一部を行うために使用すべきメモリ転送モードとして選択される場合、ＧＰＵ１０は、比較的粗いレベルの細分性で、読取り要求および書込み要求がインターリーブされるようにし得る。例えば、ＧＰＵ１０は、複数の連続的な読取り要求のグループを出すことと、複数の連続的な書込み要求のグループを出すこととを、交互に行い得る。
【００５６】
[0079]  追加の例では、メモリ転送モードは、複数の連続的な読取り要求のグループおよび複数の連続的な書込み要求のグループにおいて読取り要求および書込み要求が出されることがＧＰＵ１０によって要求されるかどうかを示し得る。そのような例では、本開示の技法は、ＧＰＵ１０が、（１）複数の連続的な読取り要求のグループおよび複数の連続的な書込み要求のグループにおいて読取り要求および書込み要求が出されることを要求することと、（２）複数の連続的な読取り要求のグループおよび複数の連続的な書込み要求のグループにおいて読取り要求および書込み要求が出されることを要求しないこととを、選択的に切り替えることを可能にし得る。
【００５７】
[0080]  例えば、インターリーブメモリ転送モードが、メモリ転送動作のすべてまたは一部を行うために使用すべきメモリ転送モードとして選択される場合、ＧＰＵ１０は、複数の連続的な読取り要求のグループおよび複数の連続的な書込み要求のグループにおいて読取り要求および書込み要求が出されることを要求しなくてよい。例えば、ＧＰＵ１０は、読取りエンジンおよび書込みエンジンが、生産者−消費者パラダイムに基づいて、個々のメモリ要求を独立に出すことを可能にし得る。一方、順次的メモリ転送モードが、メモリ転送動作のすべてまたは一部を行うために使用すべきメモリ転送モードとして選択される場合、ＧＰＵ１０は、複数の連続的な読取り要求のグループおよび複数の連続的な書込み要求のグループにおいて読取り要求および書込み要求が出されることを要求し得る。例えば、ＧＰＵ１０は、複数の連続的な読取り要求をメモリ２２に出すために、独占的なメモリアクセス権を読取りエンジンに付与することと、複数の連続的な書込み要求をメモリ２２に出すために、独占的なメモリアクセス権を書込みエンジンに付与することとを、交互に行い得る。
【００５８】
[0081]  いくつかの例では、ＧＰＵ１０および／またはＣＰＵ６（例えば、ＣＰＵ６上で実行するＧＰＵドライバ）は、メモリ転送動作のサイズに基づいて、メモリ転送動作のすべてまたは一部を行うためのメモリ転送モードを選択し得る。メモリ転送動作のサイズは、メモリ転送動作によって転送されるべきデータの量を指し得る。例えば、メモリ転送動作のサイズが閾値より大きい場合、ＧＰＵ１０および／またはＣＰＵ６は、メモリ転送動作のすべてまたは一部を行うために使用されるべきメモリ転送モードとして、順次的メモリ転送モードを選択し得る。一方、メモリ転送動作のサイズが閾値より小さい場合、ＧＰＵ１０および／またはＣＰＵ６は、メモリ転送動作のすべてまたは一部を行うために使用されるべきメモリ転送モードとして、インターリーブメモリ転送モードを選択し得る。
【００５９】
[0082]  追加の例では、ＧＰＵ１０および／またはＣＰＵ６（例えば、ＣＰＵ６上で実行するＧＰＵドライバ）は、メモリ転送動作のために定義された宛先領域が有する固定されたスクリーン整列されたバッファ領域との重複の量に基づいて、メモリ転送動作のすべてまたは一部を行うためのメモリ転送モードを選択し得る。いくつかの場合には、面は、ディスプレイモニタまたはスクリーンに含まれるピクセルに対応し得る。スクリーンは、読み取られたデータを記憶するために使用されるバッファのサイズに対応する固定されたサイズを各々有する、複数の領域へと細分化され得る。これらの細分化された領域は、固定されたスクリーン整列されたバッファ領域と呼ばれ得る。そのような例では、順次的メモリ転送モードで動作するとき、ＧＰＵ１０は、固定されたスクリーン整列されたバッファ領域のサイズに対応する固定されたサイズのデータユニットで、メモリ２２とＧＰＵ１０との間でデータを転送するように構成され得る。
【００６０】
[0083]  宛先領域が、完全にではなく部分的に、特定の固定されたスクリーン整列されたバッファ領域を覆う場合、ＧＰＵ１０および／またはＣＰＵ６は、読み取られたデータが記憶されるバッファが完全には利用されていないので、スクリーンのその領域のためのメモリ転送モードとしてインターリーブメモリ転送モードを選択し得る。そのような場合に順次的メモリモードが選択された場合、固定されたサイズのメモリ読取りは、無関係なデータをメモリから読み取らせ、これは、順次的メモリ転送モードを使用することによって発生するであろう読取り−書込み転換の減少より重大であり得る。一方、宛先領域が完全に特定の固定されたスクリーン整列されたバッファ領域を覆う場合、ＧＰＵ１０および／またはＣＰＵ６は、読み取られたデータが記憶されるバッファが完全に利用され無関係なデータを取り出すことで時間が無駄にされないので、スクリーンのその領域のためのメモリ転送モードとして順次的メモリ転送モードを選択し得る。
【００６１】
[0084]  さらなる例では、ＧＰＵ１０および／またはＣＰＵ６（例えば、ＣＰＵ６上で実行するＧＰＵドライバ）は、メモリ転送動作（例えば、合成動作）を行うために使用されるシェーダプログラムのサイズおよび／または複雑さに基づいて、メモリ転送動作を行うためのメモリ転送モードを選択し得る。シェーダプログラムのサイズおよび／または複雑さは、特定のメモリ転送動作のためのシェーダ動作の遂行が、メモリ転送動作の性能のボトルネックになる可能性が高いかどうかを示すものであり得る。
【００６２】
[0085]  そのような例では、シェーダプログラムのサイズおよび／または複雑さが閾値より低い場合、ＧＰＵ１０および／またはＣＰＵ６は、シェーダ動作の遂行がメモリ転送動作の性能のボトルネックにならない可能性が高いことを決定し得る。そのような場合、ＧＰＵ１０および／またはＣＰＵ６は、メモリアクセス効率がメモリ転送動作の性能のボトルネックであり得る可能性があるので、メモリ転送動作のために順次的メモリ転送モードを選択し得る。一方、シェーダプログラムのサイズおよび／または複雑さが閾値より高い場合、ＧＰＵ１０および／またはＣＰＵ６は、シェーダ動作の遂行がメモリ転送動作の性能のボトルネックになる可能性が高いことを決定し得る。そのような場合、ＧＰＵ１０および／またはＣＰＵ６は、メモリ効率の上昇が必要とされないので、および、順次的メモリ転送モードにおいて発生する読取り動作の延期がシェーダプログラムにおいてデータを不足させる可能性があり、これは通常シェーダプログラムが性能のボトルネックである場合には望ましくないので、メモリ転送動作のためにインターリーブメモリ転送モードを選択し得る。
【００６３】
[0086]  追加の例では、ＧＰＵ１０および／またはＣＰＵ６（例えば、ＣＰＵ６上で実行するＧＰＵドライバ）は、シェーダプログラムの実行がメモリ転送動作の性能のボトルネックになる可能性が高いかどうかの決定に基づいて、メモリ転送モードを選択し得る。例えば、ＧＰＵ１０および／またはＣＰＵ６は、シェーダプログラムの実行がメモリ転送動作の性能のボトルネックになる可能性が高くないと決定したことに応答して、メモリ転送モードとして順次的メモリ転送モードを選択し得る。一方、シェーダプログラムの実行がメモリ転送動作の性能のボトルネックになる可能性が高いと決定したことに応答して、メモリ転送モードとしてインターリーブメモリ転送モードを選択するＧＰＵ１０および／またはＣＰＵ６。
【００６４】
[0087]  追加の例では、ＧＰＵ１０は、選択されたメモリ転送モードに基づいて、キャッシュのキャッシュラインサイズを選択し構成し得る。キャッシュは、読み取られたデータが記憶される、ＧＰＵ中のバッファに対応し得る。そのような例では、メモリ転送モードが順次的メモリ転送モードである場合、ＧＰＵ１０は、読取り動作および書込み動作の可能な限り大きなグループ化を可能にするために、キャッシュの容量全体に等しいキャッシュラインサイズを選択し得る。一方、メモリ転送モードがインターリーブメモリ転送モードである場合、ＧＰＵ１０は、インターリーブされた要求にサービスするときにデータの複数の領域が同時にキャッシュされることを可能にするために、キャッシュの容量全体よりも少ないキャッシュラインサイズを選択し得る。
【００６５】
[0088]  いくつかの例では、コンピューティングデバイス２（例えば、ＣＰＵ６）内の１つまたは複数の他のコンポーネントは、メモリ転送動作を行うためにＧＰＵ１０によって使用されるべきメモリ転送モードをシグナリングし得る。シグナリング技法は、アプリケーションプロセッサ上で実行するＧＰＵドライバおよび／またはユーザアプリケーションが、メモリ転送動作を行うために使用されるメモリ転送モードを制御することを可能にし得る。
【００６６】
[0089]  異なるメモリ転送モードが、異なるタイプのメモリ転送動作の他のメモリ転送モードより効率的であることがある。例えば、より大きなメモリ転送動作では、一般に順次的メモリ転送モードがインターリーブメモリ転送モードよりも効率的であり得るが、より小さなメモリ転送動作では一般に、特に、順次的メモリ転送モードの間の読取り要求ごとにアクセスされる最小の量のデータが大きい場合、インターリーブメモリ転送モードが順次的メモリ転送モードよりも効率的であり得る。本開示の技法は、特定のタイプのメモリ転送動作により適した異なるメモリ転送モードを選択的に使用するために使用されてよく、これによって、ＧＰＵによるメモリ転送動作の性能を改善する。
【００６７】
[0090]  図２は、図１のコンピューティングデバイス２のＣＰＵ６と、ＧＰＵ１０と、メモリサブシステム８とをさらに詳細に示すブロック図である。図２に示されるように、ＣＰＵ６はＧＰＵ１０とメモリサブシステム８とに通信可能に結合され、ＧＰＵ１０はＣＰＵ６とメモリサブシステム８とに通信可能に結合される。いくつかの例では、ＧＰＵ１０は、ＣＰＵ６とともにマザーボード上に統合され得る。追加の例では、ＧＰＵ１０は、ＣＰＵ６を含むマザーボードのポート中に設置されたグラフィックスカード上で実装され得る。さらなる例では、ＧＰＵ１０は、ＣＰＵ６と相互作用するように構成された周辺デバイス内に組み込まれ得る。追加の例では、ＧＰＵ１０は、システムオンチップ（ＳｏＣ）を形成するＣＰＵ６と同じマイクロチップ上に配置され得る。
【００６８】
[0091]  ＣＰＵ６は、ソフトウェアアプリケーション２４と、グラフィックスＡＰＩ２６と、ＧＰＵドライバ２８と、オペレーティングシステム３０とを実行するように構成され得る。ソフトウェアアプリケーション２４は、グラフィックス画像を表示させる１つもしくは複数の命令および／または非グラフィックスタスク（例えば、汎用コンピューティングタスク）をＧＰＵ１０上で行わせる１つもしくは複数の命令を含み得る。ソフトウェアアプリケーション２４は、グラフィックスＡＰＩ２６に命令を出し得る。グラフィックスＡＰＩ２６は、ソフトウェアアプリケーション２４から受け取られた命令をＧＰＵドライバ２８によって利用可能なフォーマットに変換するランタイムサービスであり得る。
【００６９】
[0092]  ＧＰＵドライバ２８は、グラフィックスＡＰＩ２６を介して、ソフトウェアアプリケーション２４から命令を受け取って、それらの命令にサービスするためにＧＰＵ１０の動作を制御する。例えば、ＧＰＵドライバ２８は、１つまたは複数のコマンドを編成して、コマンドをメモリ２２の中に配置して、コマンドを実行するようにＧＰＵ１０に命令し得る。いくつかの例では、ＧＰＵドライバ２８は、コマンドをメモリ２２の中に配置して、オペレーティングシステム３０、例えば、１つまたは複数のシステム呼出しを介してＧＰＵ１０と通信し得る。
【００７０】
[0093]  いくつかの例では、ＧＰＵドライバ２８（またはＣＰＵ６上の別のソフトウェアコンポーネント）は、メモリ転送動作のすべてまたは一部を行うために使用されるべきメモリ転送モードを選択し、ＧＰＵ１０に、選択されたメモリ転送モードに基づいてメモリ転送動作を行わせるように構成され得る。いくつかの例では、メモリ転送モードは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含む、少なくとも２つのメモリ転送モードのセットから選択され得る。
【００７１】
[0094]  追加の例では、ＧＰＵ  ドライバ２８は、本開示で説明される技法のいずれかに従って、メモリ転送動作のすべてまたは一部のために使用されるべきメモリ転送モードを選択するように構成され得る。例えば、ＧＰＵドライバ２８は、メモリ転送動作のサイズ（例えば、メモリ転送動作によって転送されるべきデータの量）に基づいて、メモリ転送モードを選択し得る。別の例として、ＧＰＵドライバ２８は、メモリ転送動作のために定義される宛先領域が有する、固定されたスクリーン整列されたバッファ領域との重複の量に基づいて、メモリ転送モードを選択し得る。さらなる例として、ＧＰＵドライバ２８は、シェーダプログラムの実行がメモリ転送動作の性能のボトルネックになる可能性が高いかどうかの決定に基づいて、メモリ転送モードを選択し得る。追加の例では、ＧＰＵ１０は、メモリ転送動作を行うために１つまたは複数のシェーダプログラムを使用でき、ＧＰＵドライバ２８は、メモリ転送動作を行うために使用されるシェーダプログラムのサイズおよび／またはメモリ転送動作を行うために使用されるシェーダプログラムの複雑さに基づいて、メモリ転送モードを選択し得る。
【００７２】
[0095]  ＧＰＵ１０は、コマンドエンジン３２と、ラスタ演算ユニット３４と、バッファ３６と、読取りエンジン３８と、書込みエンジン４０とを含む。いくつかの例では、ＧＰＵ１０は、３Ｄグラフィックスレンダリングパイプライン（図示されず）を含み得る。そのような例では、ラスタ演算ユニット３４は、３Ｄグラフィックスレンダリングパイプラインの一部を形成し得る。
【００７３】
[0096]  いくつかの例では、ＧＰＵ１０は、その各々がプログラマブル処理ユニットまたは機能不変処理ユニットであり得る、複数の処理ユニット（図示されず）を含み得る。ＧＰＵ１０が３Ｄグラフィックスレンダリングパイプラインを含む場合、複数の処理ユニットが、３Ｄグラフィックスレンダリングパイプラインを実装するために一緒に動作し得る。いくつかの例では、３Ｄグラフィックスレンダリングパイプラインは、Ｏｐｅｎ  Ｇｒａｐｈｉｃｓ  Ｌｉｂｒａｒｙ（ＯｐｅｎＧＬ（登録商標））ＡＰＩ、Ｏｐｅｎ  Ｇｒａｐｈｉｃｓ  Ｌｉｂｒａｒｙ  Ｅｍｂｅｄｄｅｄ  Ｓｙｓｔｅｍｓ（ＯｐｅｎＧＬ  ＥＳ）ＡＰＩ、Ｄｉｒｅｃｔ３Ｄ  ＡＰＩ、ＤｉｒｅｃｔＸ  ＡＰＩなどのような、１つまたは複数の公開の、および／またはプロプライエタリの３Ｄグラフィックス規格のＡＰＩによって規定される、３Ｄグラフィックスパイプラインに準拠し得る。
【００７４】
[0097]  プログラマブル処理ユニットは、例えば、ＣＰＵ６によってＧＰＵ１０上にダウンロードされた１つまたは複数のシェーダプログラムを実行するように構成されるプログラマブルシェーダユニットを含み得る。いくつかの例では、シェーダプログラムは、例えば、ＯｐｅｎＧＬ  Ｓｈａｄｉｎｇ  Ｌａｎｇｕａｇｅ（ＧＬＳＬ）、Ｈｉｇｈ  Ｌｅｖｅｌ  Ｓｈａｄｉｎｇ  Ｌａｎｇｕａｇｅ（ＨＬＳＬ）、Ｃ  ｆｏｒ  Ｇｒａｐｈｉｃｓ（Ｃｇ）シェーディング言語などのような、高水準シェーディング言語で書かれたプログラムのコンパイルされたバージョンであり得る。いくつかの例では、プログラマブルシェーダユニットは、並列に動作するように構成された複数の処理ユニット、例えば、ＳＩＭＤパイプラインを含み得る。プログラマブルシェーダユニットは、シェーダプログラム命令を記憶するプログラムメモリと、実行状態レジスタ、例えば、実行されているプログラムメモリ中の現在の命令またはフェッチされることになる次の命令を示すプログラムカウンタレジスタとを有し得る。プログラマブルシェーダユニットは、例えば、頂点シェーダユニット、ピクセルシェーダユニット、ジオメトリシェーダユニット、ハルシェーダユニット、ドメインシェーダユニット、計算シェーダユニットなどを含み得る。
【００７５】
[0098]  機能不変処理ユニットは、ある機能を行うために配線接続されたハードウェアを含み得る。機能不変ハードウェアは、１つまたは複数の制御信号を介して、例えば、異なる機能を行うように構成可能であり得るが、機能不変ハードウェアは、通常、ユーザによりコンパイルされたプログラムを受け取ることが可能なプログラムメモリを含まない。ＧＰＵ１０に含まれる機能不変処理ユニットは、例えば、ラスタ演算、深度テスト、シザーテスト、アルファブレンドなどを行う処理ユニットを含み得る。ラスタ演算ユニット３４が３Ｄレンダリングパイプラインに含まれる例では、ラスタ演算ユニット３４は、いくつかの例では、構成可能な機能不変処理ユニットであり得る。いくつかの例では、ラスタ演算ユニット３４は、３Ｄレンダリングパイプラインの出力統合処理ユニットとして実装され得る。
【００７６】
[0099]  コマンドエンジン３２は、ＣＰＵ６からコマンドを受け取り、ＧＰＵ１０にコマンドを実行させるように構成される。いくつかの例では、ＣＰＵ６は、コマンドをメモリ２２に配置でき、コマンドエンジン３２は、メモリ２２からコマンドを取り出し得る。コマンドは、例えば、ＧＰＵ１０の状態（例えば、レンダリング状態）を変更する状態コマンド、特定のシェーダプログラムを３Ｄレンダリングパイプライン中のプログラム可能処理ユニットの１つまたは複数へロードするようにＧＰＵ１０に命令するシェーダプログラム拘束コマンド、メモリ２２に記憶されている特定のデータをレンダリングするようにＧＰＵ１０に命令する描画コマンド、メモリ２２に記憶されている特定のデータに関して１つまたは複数の汎用コンピューティングカーネルを実行するようにＧＰＵ１０に命令する汎用コンピューティングコマンド、および、１つまたは複数のメモリ転送動作を行うようにＧＰＵ１０に命令するメモリ転送コマンドを含み得る。
【００７７】
[0100]  状態コマンドを受け取ったことに応答して、コマンドエンジン３２は、状態コマンドに基づいて、ＧＰＵ１０の中の１つもしくは複数の状態レジスタを特定の値に設定するように、および／または、状態コマンドに基づいて、ＧＰＵ１０のための３Ｄレンダリングパイプライン（図示されず）中の機能不変処理ユニットの１つもしくは複数を構成するように構成され得る。描画呼出しコマンドを受け取ったことに応答して、コマンドエンジン３２は、ＧＰＵ１０中の３Ｄレンダリングパイプライン（図示されず）に、メモリ２２から３Ｄジオメトリを取り出させ、３Ｄジオメトリデータを２Ｄグラフィックス画像へとレンダリングさせるように構成され得る。シェーダプログラム拘束コマンドを受け取ったことに応答して、コマンドエンジン３２は、３Ｄレンダリングパイプライン中のプログラム可能処理ユニットの１つまたは複数に、１つまたは複数の特定のシェーダプログラムをロードし得る。
【００７８】
[0101]  いくつかの例では、メモリ転送動作を行うようにＧＰＵ１０に命令するメモリ転送コマンドを受け取ったことに応答して、コマンドエンジン３２は、メモリ転送動作のすべてまたは一部を行うために使用されるべきメモリ転送モードを選択し、ＧＰＵ１０に、選択されたメモリ転送モードに基づいてメモリ転送動作を行わせ得る。いくつかの例では、メモリ転送モードは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含む、少なくとも２つのメモリ転送モードのセットから選択され得る。
【００７９】
[0102]  追加の例では、コマンドエンジン３２は、本開示で説明される技法のいずれかに従って、メモリ転送動作のすべてまたは一部のために使用されるべきメモリ転送モードを選択するように構成され得る。例えば、コマンドエンジン３２は、メモリ転送動作のサイズ（例えば、メモリ転送動作によって転送されるべきデータの量）に基づいて、メモリ転送モードを選択し得る。別の例として、コマンドエンジン３２は、メモリ転送動作のために定義される宛先領域が有する、固定されたスクリーン整列されたバッファ領域との重複の量に基づいて、メモリ転送モードを選択し得る。さらなる例として、コマンドエンジン３２は、シェーダプログラムの実行がメモリ転送動作の性能のボトルネックになる可能性が高いかどうかの決定に基づいて、メモリ転送モードを選択し得る。追加の例では、ＧＰＵ１０は、メモリ転送動作を行うために１つまたは複数のシェーダプログラムを使用でき、コマンドエンジン３２は、メモリ転送動作を行うために使用されるシェーダプログラムのサイズおよび／またはメモリ転送動作を行うために使用されるシェーダプログラムの複雑さに基づいて、メモリ転送モードを選択し得る。
【００８０】
[0103]  さらなる例では、コマンドエンジン３２は、特定のメモリ転送モードを使用するようにコマンドエンジン３２に命令する、ＣＰＵ６から受け取られた１つまたは複数のコマンドに基づいて、メモリ転送モードを選択し得る。いくつかの場合には、１つまたは複数のコマンドは、ＧＰＵ１０におけるメモリ転送モード状態変数の状態を設定するようにＧＰＵ１０に命令する、状態コマンドを含み得る。そのような場合、コマンドエンジン３２は、メモリ転送モード状態変数の現在の状態に基づいてメモリ転送モードを選択し得る。メモリ転送モード状態変数は、例えば、ＧＰＵ１０中のレジスタに記憶され得る。追加の場合には、１つまたは複数のコマンドは、メモリ転送動作またはいくつかの他の動作を行うようにＧＰＵ１０に命令するコマンドであってよく、このコマンドは、メモリ転送動作または他の動作を行うときに使用すべきメモリ転送動作を示す、フラグまたは他の情報を含み得る。
【００８１】
[0104]  選択されたメモリ転送動作モードに基づいてメモリ転送動作を行うために、コマンドエンジン３２は、選択されたメモリ転送モードに基づいて、メモリ転送動作を行うために使用されるＧＰＵ１０中の１つまたは複数のコンポーネントを構成し得る。例えば、コマンドエンジン３２は、以下でさらに詳細に説明されるように、選択されたメモリ転送モードに基づいて、バッファ３６、読取りエンジン３８、および書込みエンジン４０の１つまたは複数を構成し得る。
【００８２】
[0105]  ラスタ演算ユニット３４は、宛先データを生成するために、ソースデータに基づいて１つまたは複数のラスタ演算を行うように構成される。ソースデータは、メモリ転送動作の１つまたは複数のソース領域に対応し得る。いくつかの例では、ラスタ演算ユニット３４は、バッファ３６および／または書込みエンジン４０からソースデータを受け取り得る。宛先データは、メモリ転送動作の宛先領域に書き込まれ得る。
【００８３】
[0106]  ラスタ演算ユニット３４によって実行されるラスタ演算のタイプは、例えば、コマンドエンジン３２によって構成可能であり得る。ラスタ演算のタイプは、宛先データが特定のメモリ転送動作のためにソースデータに基づいてどのように生成されるべきかを規定し得る。ラスタ演算ユニット３４が宛先データを生成するために２つの異なるソース領域を組み合わせる（例えば、合成動作）場合、ラスタ化演算のタイプは、宛先データを生成するために２つの異なるソース領域がどのように組み合わされるべきかを規定し得る。いくつかの例では、ラスタ演算のタイプは、宛先領域中の特定のピクセル位置に対する宛先データが、ソース領域中の対応するピクセル位置に基づいてどのように生成されるべきかを規定する、ビットごとの演算であり得る。ソース領域中の対応するピクセル位置は、宛先領域中のピクセル位置と同じ、それぞれのソース領域の相対的な位置にある、ピクセル位置であり得る。ビットごとの演算は、例えば、ビットごとのＡＮＤ演算、ＯＲ演算、ＮＯＴ演算、および／またはＸＯＲ演算のような、ブーリアン演算を含み得る。ビットごとの演算はまた、ビット複製演算、ビット反転演算、塗りつぶし演算などを含み得る。ラスタ演算は、特定の合成動作のためにビットがどのように組み合わされるべきかを規定する動作であり得る。いくつかの例では、ラスタ演算は、例えばブーリアン論理演算のような、ビットごとの演算を含み得る。ブーリアン論理演算は、例えば、ビットごとのＡＮＤ演算、ＯＲ演算、ＮＯＴ演算、および／またはＸＯＲ演算を含み得る。
【００８４】
[0107]  追加の例では、ラスタ演算のタイプは、ブレンド演算（例えば、アルファブレンド演算）を含み得る。いくつかの例では、ブレンド演算は、ブレンド演算の実行中に使用されるべきソースピクセル乗算器と宛先ピクセル乗算器とを規定し得る。そのような例では、ブレンド演算の実行中に、ソースピクセル値（例えば、ソースピクセル色および／またはソースアルファ値）は、第１の積を生成するためにソースピクセル乗算器によって乗算されてよく、対応する宛先ピクセル値（例えば、宛先ピクセル色および／または宛先アルファ値）は、第２の積を生成するために宛先ピクセル乗算器によって乗算されてよく、ピクセル位置に対する宛先値を生成するために、２つの積の合計が一緒に加算され得る。他のタイプのブレンド演算も可能である。
【００８５】
[0108]  いくつかの例では、コマンドエンジン３２は、ＣＰＵ６からＧＰＵ１０によって受け取られるメモリ転送動作コマンドに含まれるデータに基づいて、ラスタ演算ユニット３４を構成し得る。例えば、コマンドエンジン３２は、メモリ転送動作コマンドで規定されるラスタ演算のタイプに基づいて、ラスタ演算ユニット３４によって実行されるべきラスタ演算のタイプを選択し、選択されたタイプのラスタ化演算を使用してメモリ転送動作を行うようにラスタ演算ユニット３４を構成し得る。
【００８６】
[0109]  ラスタ演算ユニット３４は、メモリ転送動作のための宛先データを生成するために異なるソース領域を組み合わせるものとして本明細書で説明されてきたが、他の例では、ＧＰＵ１０中の１つまたは複数の他のコンポーネントは、メモリ転送動作を行うために、ラスタ演算ユニット３４に加えて、またはその代わりに使用され得る。例えば、ＧＰＵ１０のシェーダユニット（図示されず）上で実行するシェーダプログラムは、メモリ転送動作のための宛先データを生成するために、シェーダプログラムで規定される組合せ技法に従って、異なるソース領域を組み合わせ得る。
【００８７】
[0110]  バッファ３６は、メモリ転送動作の実行中に、メモリ２２から取り出されたソースデータを記憶するように構成される。いくつかの例では、バッファ３６は、ＧＰＵ１０内の複数のレジスタとして実装され得る。バッファ３６は、例えば、ｆｉｒｓｔ−ｉｎ−ｆｉｒｓｔ−ｏｕｔ（ＦＩＦＯ）バッファリング方式を含む、種々のバッファリング方式のいずれをも利用し得る。ＦＩＦＯバッファリング方式によれば、バッファ３６に記憶されているソースデータは、ソースデータがバッファ３６に配置された順序で、消費者（例えば、書込みエンジン４０）によって消費される。
【００８８】
[0111]  いくつかの例では、バッファ３６は、バッファ３６が満たされているかどうかを示す信号と、バッファ３６が空かどうかを示す信号とを生成し得る。そのような例では、これらの信号は、メモリ転送動作の実行中に、読取りエンジン３８および／または書込みエンジン４０を同期するために使用され得る。追加の例では、バッファ３６は、バッファ３６に現在記憶されているソースデータが、１つもしくは複数の閾値以上か、または１つもしくは複数の閾値以下かを示す信号を生成でき、これらの信号は、メモリ転送動作の実行中に、読取りエンジン３８および／または書込みエンジン４０を同期するために、満たされているかどうかの信号および空かどうかの信号に加えて、またはそれらの代わりに使用され得る。
【００８９】
[0112]  いくつかの例では、バッファ３６は、背後にあるメモリ２２に関してヒット／ミスのキャッシングのパラダイムに従って動作する、キャッシュであり得る。そのような例では、バッファ３６は、いくつかの例では、キャッシュラインサイズが構成可能であり得るという意味で、構成可能なキャッシュであり得る。キャッシュラインは、キャッシュミスに応答して、および／またはキャッシュライトバックに応答して、背後にあるメモリ（例えば、メモリ２２）とキャッシュ（例えば、バッファ３６）との間で転送されるデータユニットを指し得る。キャッシュラインのサイズは、背後にあるメモリとキャッシュとの間で転送されるデータユニットのサイズを指し得る。キャッシュラインが背後にあるメモリからキャッシュに転送されるとき、キャッシュラインは、キャッシュエントリに配置され、キャッシュエントリに対応し得る。従って、キャッシュラインのサイズは、キャッシュ中の単一のキャッシュエントリのサイズも指し得る。
【００９０】
[0113]  バッファ３６が構成可能なキャッシュである例では、コマンドエンジン３２は、選択されたメモリ転送モードに基づいて、バッファ３６のキャッシュラインサイズを選択して構成し得る。例えば、コマンドエンジン３２は、選択されたメモリ転送モードに基づいて、バッファ３６に対するキャッシュラインサイズを選択し、選択されたキャッシュラインサイズに従って動作するようにバッファ３６を構成し得る。
【００９１】
[0114]  いくつかの例では、コマンドエンジン３２は、順次的メモリ転送モードが、メモリ転送動作を行うためのメモリ転送モードとして選択されたことに応答して、バッファ３６の容量全体に等しいバッファ３６のキャッシュラインサイズを選択し得る。いくつかの場合、このことは、連続的な読取り動作のグループ化と連続的な書込み動作のグループ化とが、順次的メモリ転送モードの間に可能な限り大きくなることを可能にし得る。そのような例では、バッファ３６は、インターリーブメモリ転送モードが、メモリ転送動作を行うためのメモリ転送モードとして選択されたことに応答して、キャッシュの容量全体よりも小さいバッファ３６のキャッシュラインサイズを選択し得る。このことは、インターリーブされた要求にサービスするときに、背後にあるメモリ中のデータの複数の領域が同時にキャッシュされることを可能にでき、これは、いくつかの場合、キャッシュミス率を減らし、インターリーブモードの効率を上げ得る。
【００９２】
[0115]  読取りエンジン３８は、メモリサブシステム８に読取り要求を出し、読取り要求に応答して受け取られたソースデータをバッファ３６に配置するように構成される。読取りエンジン３８は、複数の同期モードの１つに従って動作するように構成され得る。読取りエンジン３８の動作を制御するために使用される同期モードは、読取り要求の発行が書込みエンジン４０による書込み要求の発行と同期される方式、および／または、読取り要求の発行がバッファ３６の状態と同期される方式を、定義し得る。読取りエンジン３８によって使用される同期モードは、インターリーブメモリ転送動作に対応するインターリーブ同期モードと、順次的メモリ転送動作に対応する順次的同期モードとを含み得る。
【００９３】
[0116]  いくつかの例では、コマンドエンジン３２は、選択されたメモリ転送モードに基づいて、メモリ転送動作のすべてまたは一部の遂行のために読取りエンジン３８によって使用されるべき同期モードを構成し得る。例えば、コマンドエンジン３２は、選択されたメモリ転送モードに基づいて同期モードを選択し、選択された同期モードに従って動作するように読取りエンジン３８を構成し得る。別の例として、コマンドエンジン３２は、インターリーブメモリ転送モードがメモリ転送動作を行うためのメモリ転送モードとして選択されたことに応答して、読取りエンジン３８によって使用されるべきインターリーブ同期モードを選択し、順次的メモリ転送モードがメモリ転送動作を行うためのメモリ転送モードとして選択されたことに応答して、読取りエンジン３８によって使用されるべき順次的同期モードを選択し得る。
【００９４】
[0117]  インターリーブ同期モードに従って動作するとき、読取りエンジン３８は、メモリ転送動作の開始に応答して、初期の数の読取り要求を出し得る。初期の数の読取り要求が出された後で、読取りエンジン３８は、メモリ転送動作に対する書込み要求を出すために十分なソースデータがバッファ３６によって消費されたことに応答して、追加の読取り要求を出し得る。読取りエンジン３８は、すべての読取り要求がメモリ転送動作のために出されるまで、この方式で読取り要求を出し続け得る。特定の読取り要求に応答してソースデータを受け取ったことに応答して、読取りエンジン３８は、ソースデータユニットをバッファ３６に配置し、ならびに／または、さらなる処理のためにソースデータユニットを直接書込みエンジン４０および／もしくはラスタ演算ユニット３４に渡し得る。
【００９５】
[0118]  メモリ転送動作に対する書込み要求を出すために十分なデータは、宛先領域中の単一の位置に対する宛先データを計算するために必要とされるソースオペランドのすべてに対応するデータを指し得る。例えば、メモリ複製動作について、メモリ転送動作のための書込み要求を出すために十分なデータは、メモリ複製動作のソース領域中の単一の位置に対応するデータを指し得る。別の例として、合成動作について、メモリ転送動作のための書込み要求を出すために十分なデータは、メモリ複製動作のための第１のソース領域中の単一の位置に対応するデータと、メモリ複製動作のための第２のソース領域中の単一の対応する位置に対応するデータとを指し得る。対応する位置は、異なる領域中で同じ相対的な配置を有する位置を指し得る。例えば、２つの異なる領域中の第２行の第３列は、それらの領域がそれぞれの面の異なる部分に位置している場合であっても、同じ相対的な位置を有する。
【００９６】
[0119]  順次的同期モードに従って動作するとき、読取りエンジン３８は、メモリ転送動作の開始に応答して、読取り要求の発行を開始し得る。読取りエンジン３８は、出された読取り要求の数が第１の閾値以上になるまで、読取り要求を出すことを続け得る。出された読取り要求の数が第１の閾値以上になると、読取りエンジン３８は、バッファ３６に記憶されている消費されていないソースデータ（例えば、書込みエンジン４０によって消費されていないデータ）の量が第２の閾値以下になるまで、読取り要求を出すことを止め得る。バッファ３６に記憶されている消費されていないソースデータの量が第２の閾値以下になると、読取りエンジン３８は、読取り結果の発行を再開し得る。読取りエンジン３８は、すべての読取り要求がメモリ転送動作のために出されるまで、この方式で読取り要求を出すことを止めて再開することを続け得る。第１の閾値は、第２の閾値よりも大きくてよい。
【００９７】
[0120]  いくつかの例では、第１の閾値は、バッファ３６のサイズに基づき得る。例えば、第１の閾値は、いくつかの例では、バッファ３６が一度に記憶可能な読取りデータユニットの最大の数に等しくてよく、ここで、読取りデータユニットは、単一の読取り要求に応答して返されるソースデータに対応する。そのような例では、読取りエンジン３８は、要求に応答して返されるソースデータによってバッファ３６を埋めるために「ちょうど十分な」読取り要求を出し得る。いくつかの例では、読取りエンジン３８は、閾値の数の読取り要求が出されたかどうかを決定するために、どれだけの読取り要求が所与の読取り要求のバーストに対して出されたかを記録し得る。追加の例では、読取りエンジン３８は、閾値の数の読取り要求が出されたかどうかを決定するために、バッファ３６に現在記憶されているソースデータの量を監視し得る。例えば、読取りエンジン３８は、バッファ３６が満たされているかどうかを示すバッファ３６によって生成される信号、または、バッファ３６に記憶されているデータの量が閾値の数の読取り要求が出されたかどうかを決定するための閾値以上であるかどうかを示すバッファ３６によって生成される信号を利用し得る。
【００９８】
[0121]  さらなる例では、第２の閾値は０に等しくてよい。すなわち、読取りエンジン３８は、バッファ３６中に消費されていないデータがなくなるまで、読取り要求を出すことを止め得る。言い換えると、読取りエンジン３８は、バッファ３６が空になるまで、読取り要求を出すことを止め得る。バッファ３６が空になると、読取りエンジン３８は、バッファを埋めるために、読取り要求を出すことを再開し得る。いくつかの例では、読取りエンジン３８は、バッファ３６が空であるかどうかを示すバッファ３６によって生成される信号、または、バッファ３６中の消費されていないソースデータの量が消費されていないデータが第２の閾値以下であるかどうかを決定するための閾値以下であるかどうかを示すバッファ３６によって生成される信号を利用し得る。
【００９９】
[0122]  バッファ３６によって出される読取り要求は、そこからのデータがＧＰＵ１０に返されるべきである、メモリ２２内のメモリアドレスまたはメモリアドレスの範囲を規定し得る。単一の読取り要求に応答してメモリサブシステム８によって返されるデータは、ソースデータユニットと呼ばれ得る。いくつかの例では、読取りエンジン３８によって出される各読取り要求は、メモリ転送動作のためのソース領域中の複数の位置のそれぞれの１つに対応してよく、読取り要求に応答して返されるソースデータユニットは、ソース領域中の複数の位置のそれぞれの１つと関連付けられるデータに対応してよい。そのような例では、単一のソース面についてのメモリ複製動作のために、読取りエンジン３８は、宛先面の中の各位置に対する単一の読取り要求を出し得る。複数のソース面についての合成動作のために、読取りエンジン３８は、宛先面の中の位置の各々に対して複数の読取り要求を、例えば、各ソース面の中の対応する位置に対して１つの読取り要求を出し得る。
【０１００】
[0123]  書込みエンジン４０は、バッファ３６からソースデータを消費し、消費されたソースデータに基づいて宛先データを生成し、宛先データをメモリ２２中の宛先領域に書き込むために書込み要求をメモリサブシステム８に出すように構成される。いくつかの例では、書込みエンジン４０は、宛先データがソースデータと同一であるように、宛先データを生成し得る。そのような例は、例えば、メモリ複製動作を行うために使用され得る。さらなる例では、書込みエンジン４０は、宛先データを生成するために少なくとも２つの異なるソース領域からのソースデータを組み合わせ得る。そのような例は、例えば、合成動作を行うために使用され得る。そのような例では、書込みエンジン４０は、いくつかの例では、ソースデータを組み合わせて宛先データを生成するために、ラスタ演算ユニット３４を使用してラスタ演算を行い得る。
【０１０１】
[0124]  書込みエンジン４０は、複数の同期モードの１つに従って動作するように構成され得る。書込みエンジン４０の動作を制御するために使用される同期モードは、書込み要求の発行が読取りエンジン３８による読取り要求の発行と同期される方式、および／または、書込み要求の発行がバッファ３６の状態と同期される方式を定義し得る。書込みエンジン４０によって使用される同期モードは、インターリーブメモリ転送動作に対応するインターリーブ同期モードと、順次的メモリ転送動作に対応する順次的同期モードとを含み得る。
【０１０２】
[0125]  いくつかの例では、コマンドエンジン３２は、選択されたメモリ転送モードに基づいて、メモリ転送動作のすべてまたは一部の遂行のために書込みエンジン４０によって使用されるべき同期モードを構成し得る。例えば、コマンドエンジン３２は、選択されたメモリ転送モードに基づいて同期モードを選択し、選択された同期モードに従って動作するように書込みエンジン４０を構成し得る。別の例として、コマンドエンジン３２は、インターリーブメモリ転送モードがメモリ転送動作を行うためのメモリ転送モードとして選択されたことに応答して、書込みエンジン４０によって使用されるべきインターリーブ同期モードを選択し、順次的メモリ転送モードがメモリ転送動作を行うためのメモリ転送モードとして選択されたことに応答して、書込みエンジン４０によって使用されるべき順次的同期モードを選択し得る。
【０１０３】
[0126]  インターリーブ同期モードに従って動作するとき、メモリ転送動作の開始に応答して、書込みエンジン４０は最初に、メモリ転送動作のための書込み要求を出すために十分なソースデータがＧＰＵ１０によって受け取られるまで、および／またはバッファ３６に配置されるまで待機し得る。ソースデータがＧＰＵ１０によって受け取られ、および／またはバッファ３６に配置されると、書込みエンジン４０は、ソースデータを消費し、ソースデータに基づいて宛先データを生成し、宛先データをメモリ２２に書き込むために書込み要求をメモリサブシステム８に出し得る。書込み要求が出された後、書込みエンジン４０は、任意の追加のソースデータがＧＰＵ１０によって受け取られたかどうか、および／またはバッファ３６に配置されたかどうかを決定し得る。そうである場合、書込みエンジン４０は、ソースデータを消費し、追加のソースデータに対する別の書込み要求を出し得る。それ以外の場合、書込みエンジン４０は、ＧＰＵ１０によって受け取られるべき、および／またはバッファ３６に配置されるべき追加のデータを待機し得る。書込みエンジン４０は、メモリ転送動作が完了するまで、この方式でソースデータを消費し続け得る。
【０１０４】
[0127]  いくつかの例では、ソースデータを消費することは、書込みエンジン４０が読取りエンジン３８からソースデータを直接受け取り、ソースデータを処理することを指し得る。さらなる例では、ソースデータを消費することは、書込みエンジン４０がバッファ３６からソースデータを取り出し、ソースデータを処理することを指し得る。ソースデータを処理することは、ソースデータに基づいて宛先データを生成することを含み得る。データが処理された後で、書込みエンジン４０は、宛先データを書き込むために書込み要求を出し得る。消費されていないソースデータは、バッファ３６に配置されたがまだ書込みエンジン４０によって消費されていないソースデータを指し得る。消費されていないソースデータの量は、バッファ３６に現在記憶されている消費されていないソースデータユニットの数を指すことがあり、ここで、各ソースデータユニットは、単一の読取り要求に応答して返されるソースデータに対応する。ソースデータユニットは代替的に、読取りデータワードと呼ばれ得る。
【０１０５】
[0128]  順次的同期モードに従って動作するとき、メモリ転送動作の開始に応答して、書込みエンジン４０は最初に、バッファ３６中の消費されていないデータの量が第１の閾値以上になるまで待機し得る。この待機期間の間、書込みエンジン４０は、ソースデータを消費できず、または、メモリ転送動作に対する書込み要求を出せない。バッファ３６中の消費されていないデータの量が第１の閾値以上になると、書込みエンジン４０は、ソースデータの消費と、消費されるソースデータに対する書込み要求の発行とを開始し得る。書込みエンジン４０は、バッファ３６中の消費されていないデータの量が第２の閾値以下になるまで、書込み要求を出すことを続け得る。バッファ３６中の消費されていないデータの量が第２の閾値以下になると、書込みエンジン４０は、バッファ３６中の消費されていないデータの量が第１の閾値以上になるまで、ソースデータを消費して消費されるソースデータに対する書込み要求を出すことを止め得る。バッファ３６中の消費されていないデータの量が第１の閾値以上になった後、書込みエンジン４０は再び、ソースデータの消費と書込み要求の発行とを開始し得る。書込みエンジン４０は、すべての書込み要求がメモリ転送動作のために出されるまで、この方式で、ソースデータの消費と書込み要求の発行とを止めて再開することを続け得る。第１の閾値は、第２の閾値よりも大きくてよい。
【０１０６】
[0129]  いくつかの例では、第１の閾値は、バッファ３６のサイズに基づき得る。例えば、第１の閾値は、いくつかの例では、読取りデータユニットの最大の数に等しくてよく、またはそのバッファ３６が一度に記憶可能であり、ここで、読取りデータユニットは、単一の読取り要求に応答して返されるソースデータに対応する。いくつかの例では、書込みエンジン４０は、バッファ３６に記憶されている消費されたデータの量が第１の閾値以上であるかどうかを決定するために、バッファ３６に現在記憶されている消費されていないソースデータの量を監視し得る。例えば、書込みエンジン４０は、バッファ３６が満たされているどうかを示すバッファ３６によって生成される信号、または、バッファ３６に記憶されているデータの量がバッファ３６に記憶されている消費されたデータの量が第１の閾値以上であるかどうかを決定するための閾値以上であるかどうかを示すバッファ３６によって生成される信号を、利用し得る。
【０１０７】
[0130]  さらなる例では、第２の閾値は０に等しくてよい。すなわち、書込みエンジン４０は、バッファ３６中に消費されていないデータがなくなるまで、ソースデータを消費し書込み要求を出すことを止め得る。言い換えると、書込みエンジン４０は、バッファ３６が空になるまで、ソースデータを消費し書込み要求を出すことを止め得る。いくつかの例では、書込みエンジン４０は、バッファ３６が空であるかどうかを示すバッファ３６によって生成される信号、または、バッファ３６中の消費されていないソースデータの量が消費されていないデータが第２の閾値以下であるかどうかを決定するための閾値以下であるかどうかを示すバッファ３６によって生成される信号を利用し得る。
【０１０８】
[0131]  書込みエンジン４０によって出される書込み要求は、規定されたデータが書き込まれるべき、メモリ２２内のメモリアドレスまたはメモリアドレスの範囲を規定し得る。書き込まれるべきデータは、１つまたは複数のデータバスを介して書込みエンジン４０によってメモリコントローラ２０に書込み要求とともに供給され得る。いくつかの例では、書き込まれるべきデータは、書込み要求の一部を形成し得る。書込み要求のメモリアドレスまたはメモリアドレス範囲は、宛先データを生成するために使用されたソースデータがそこから取得された、１つまたは複数のソース領域中の相対的な位置と同じである、宛先領域中の相対的な位置に対応し得る。
【０１０９】
[0132]  メモリサブシステム８はメモリ２２を含む。メモリ２２は、１つまたは複数のソース面４２と宛先面４４とを記憶し得る。ソース面４２および宛先面４４の各々は、ピクセルデータの２次元アレイに対応する。ピクセルデータは、面の中の各ピクセル位置に対する、赤、緑、青（ＲＧＢ）の色値と、いくつかの場合には、アルファ値（Ａ）とを含み得る。ソース面４２および宛先面４４はピクセルデータの２次元アレイに対応するので、面の中の個々のピクセル位置に対するピクセルデータは、行および列の座標によってアドレス指定され得る。メモリ転送動作で使用されるソース領域の各々は、それぞれのソース面のすべてまたは部分集合に対応してよく、宛先領域は、宛先面のすべてまたは部分集合に対応してよい。ソース領域および宛先領域は同じサイズまたは形状であってよく、通常は長方形の領域であるが、必ずしもそうとは限らない。図２は、別個のソース面４２と宛先面４４とを図示するが。いくつかの例では、宛先面４４が、メモリ転送動作のためのソース面として使用されてよく、および／または、ソース面４２の１つまたは複数が、メモリ転送動作のための宛先面として機能してよい。メモリサブシステム８は、ＣＰＵ６、ＧＰＵ１０、読取りエンジン３８、および書込みエンジン４０に、バス１８を介して通信可能に結合される。
【０１１０】
[0133]  メモリアクセス要求を受け取ったことに応答して、メモリサブシステム８は、要求されたメモリ動作が、メモリ２２に関して行われるようにし得る。例えば、読取り要求を受け取ったことに応答して、メモリサブシステム８は、読取り要求で規定された１つまたは複数のメモリアドレスに対応するメモリ２２中の１つまたは複数のメモリ位置から、メモリ２２に記憶されているデータを取得し（すなわち、読み取り）、取得されたデータをＧＰＵ１０（例えば、読取りエンジン３８）に提供し得る。別の例として、書込み要求と、書込み要求に対応する書込みデータとを受け取ったことに応答して、メモリサブシステム８は、書込みデータが、書込み要求で規定された１つまたは複数のメモリアドレスに対応する１つまたは複数の位置においてメモリ２２に記憶されるようにし得る。いくつかの例では、メモリサブシステム８は、書込み要求の完了が成功したという確認を、書込みエンジン４０に提供し得る。
【０１１１】
[0134]  いくつかの例では、ＧＰＵ１０によって出されメモリサブシステム８によって受け取られる読取り要求および書込み要求は、メモリ２２によって利用可能なフォーマットであり得る。そのような例では、メモリサブシステム８は、メモリ２２からデータを読み取り、および／またはメモリ２２にデータを書き込むために、ＧＰＵ１０からメモリ２２に直接、受け取られた要求を渡し得る。さらなる例では、ＧＰＵ１０によって出されメモリサブシステム８によって受け取られる読取り要求および書込み要求は、メモリ２２によって利用可能なフォーマットではないことがある。そのような例では、メモリサブシステム８は、読取り要求および書込み要求に基づいて、メモリ２２によって利用可能な１つまたは複数のメモリコマンドを生成し、メモリ２２からデータを読取り、および／またはメモリ２２にデータを書き込むために、そのようなコマンドをメモリ２２に出し得る。いくつかの例では、１つまたは複数のコマンドは、読取り動作に対するコマンドの読取りシーケンスおよび書込み動作に対するコマンドの書込みシーケンスという形式をとり得る。
【０１１２】
[0135]  バス１８は、共有されたバス構造およびバスプロトコルと、ポイントツーポイントバス構造およびバスプロトコルと、一方向バス構造およびバスプロトコルと、双方向バス構造およびバスプロトコルとを含む、バス構造およびバスプロトコルの任意の組合せを使用して実装され得る。いくつかの例では、バス１８は、ＧＰＵ１０とメモリサブシステム８との間の双方向データバスと、ＧＰＵ１０からメモリサブシステム８への単方向コマンドおよびアドレスバスとを含むように構成され得る。さらなる例では、バス１８は、メモリサブシステム８からＧＰＵ１０への単方向読取りバスと、ＧＰＵ１０からメモリサブシステム８への単方向書込みバスと、ＧＰＵ１０からメモリサブシステム８への単方向コマンドおよびアドレスバスとを含むように構成され得る。これらのバス構成は単なる例であり、より多数または少数のタイプのバスを伴い、同じまたは異なる構成の、バス構造の他の構成も使用され得る。
【０１１３】
[0136]  上で論じられたように、選択されたメモリ転送モードに基づいてメモリ転送動作を行うために、コマンドエンジン３２は、選択されたメモリ転送モードに基づいて、バッファ３６、読取りエンジン３８、および書込みエンジン４０の１つまたは複数を構成し得る。いくつかの例では、選択されたメモリ転送モードがインターリーブメモリ転送モードである場合、コマンドエンジン３２は、インターリーブ同期モードに従って動作するように、読取りエンジン３８と書込みエンジン４０とを構成し得る。そのような例では、選択されたメモリ転送モードが順次的メモリ転送モードである場合、コマンドエンジン３２は、順次的同期モードに従って動作するように、読取りエンジン３８と書込みエンジン４０とを構成し得る。
【０１１４】
[0137]  バッファ３６が構成可能なキャッシュサイズを伴うキャッシュである追加の例では、選択されたメモリ転送モードがインターリーブメモリ転送モードである場合、コマンドエンジン３２は、インターリーブ同期モードに従って動作するように読取りエンジン３８と書込みエンジン４０とを構成し、バッファ３６のキャッシュラインサイズがバッファ３６の最小のキャッシュラインサイズより小さいようにバッファ３６を構成し得る。そのような例では、選択されたメモリ転送モードが順次的メモリ転送モードである場合、コマンドエンジン３２は、順次的同期モードに従って動作するように読取りエンジン３８と書込みエンジン４０とを構成し、バッファ３６のキャッシュラインサイズがバッファ３６の最大のキャッシュラインサイズに等しいようにバッファ３６を構成し得る。
【０１１５】
[0138]  いくつかの例では、インターリーブメモリ転送モードがメモリ転送動作のすべてまたは一部を行うためのメモリ転送モードとして選択されるとき、コマンドエンジン３２は、生産者−消費者パラダイムに基づいて読取りエンジン３８に読取り要求を出させ書込みエンジン４０に書込み要求を出させるために、インターリーブ同期モードで動作するように読取りエンジン３８と書込みエンジン４０とを構成し得る。生産者−消費者パラダイムに基づいて読取りエンジン３８に読取り要求を出させ書込みエンジン４０に書込み要求を出させることは、書込み要求を出すために十分なソースデータをＧＰＵ１０がメモリサブシステム８および／またはメモリ２２から受け取ったことに応答して、書込みエンジン４０に書込み要求を出させることと、書込み要求を出すために十分なバッファ３６からのデータを書込みエンジン４０が消費したことに応答して、読取りエンジン３８に読取り要求を出させることとを含み得る。
【０１１６】
[0139]  さらなる例では、順次的メモリ転送モードがメモリ転送動作のすべてまたは一部を行うためのメモリ転送モードとして選択されるとき、コマンドエンジン３２は、相互排除のパラダイムに基づいて読取りエンジン３８に読取り要求を出させ書込みエンジン４０に書込み要求を出させるために、順次的同期モードで動作するように読取りエンジン３８と書込みエンジン４０とを構成し得る。相互排除のパラダイムに基づいて読取りエンジン３８に読取り要求を出させ書込みエンジン４０に書込み要求を出させることは、読取りエンジン３８および書込みエンジン４０に、別個の時間間隔の間に、メモリサブシステム８および／またはメモリ２２へ、複数の連続的な読取り要求のグループを出すことと複数の連続的な書込み要求のグループを出すことを交互に行わせることを含み得る。
【０１１７】
[0140]  追加の例では、コマンドエンジン３２が、インターリーブ同期モードで動作するように読取りエンジン３８と書込みエンジン４０とを構成するとき、メモリ転送動作のための書込み要求を出すために十分なデータがＧＰＵ１０（例えば、読取りエンジン３８）によってメモリサブシステム８（例えば、メモリ２２）から受け取られるたびに、書込みエンジン４０は、少なくとも１つの他の書込み要求のために後で受け取られることになる追加のデータを待機することなく、それぞれのデータを消費し得る。一方、コマンドエンジン３２が、メモリ転送動作に対する書込み要求を出すために十分なソースデータをメモリサブシステム８（例えば、メモリ２２）からＧＰＵ１０（例えば、読取りエンジン３８）が受け取ったことに応答して、メモリ転送動作の少なくとも一部について、順次的同期モードで動作するように読取りエンジン３８と書込みエンジン４０とを構成するとき、書込みエンジン４０は、少なくとも１つの他の書込み要求を出すために十分な追加のデータが後で受け取られるまで、ソースデータの消費を延期し得る。例えば、書込みエンジン４０は、消費されていないデータの量が第１の閾値より大きくなるまで、ソースデータの消費を延期し得る。
【０１１８】
[0141]  さらなる例では、コマンドエンジン３２が、インターリーブ同期モードで動作するように読取りエンジン３８と書込みエンジン４０とを構成するとき、メモリ転送動作に対する書込み要求を出すために十分なデータを書込みエンジン４０が消費するたびに、読取りエンジン３８は、少なくとも１つの他の書込み要求に対して、書込みエンジン４０によって後で消費されることになる追加のデータを待機することなく、読取り要求を出し得る。一方、コマンドエンジン３２が、メモリ転送動作に対する書込み要求を出すために十分なデータを書込みエンジン４０が消費したことに応答して、メモリ転送動作の少なくとも一部について、順次的同期モードで動作するように読取りエンジン３８と書込みエンジン４０とを構成するとき、読取りエンジン３８は、少なくとも１つの他の書込み要求を出すために十分なデータが書込みエンジン４０によって後で消費されるまで、後続の読取り要求の発行を延期し得る。例えば、読取りエンジン３８は、消費されていないデータの量が第２の閾値以下になるまで、後続の読取り要求の発行を延期し得る。
【０１１９】
[0142]  さらなる例では、インターリーブメモリ転送モードがメモリ転送動作のすべてまたは一部を行うためのメモリ転送モードとして選択されるとき、コマンドエンジン３２は、インターリーブ同期モードで動作するように読取りエンジン３８と書込みエンジン４０とを構成し、メモリ転送動作の遂行を開始するためにコマンドを読取りエンジン３８および／または書込みエンジン４０に出し得る。メモリ転送動作の遂行を開始するためのコマンドを受け取ったことに応答して、読取りエンジン３８は、１つまたは複数の読取り要求を出し得る。読取りエンジン３８は、複数の読取り要求に応答してメモリサブシステム８（例えば、メモリ２２）から受け取られたソースデータを、バッファ３６に配置し得る。複数の読取り要求の各々について、複数の読取り要求のそれぞれ１つに対してソースデータがバッファ３６に配置されたことに応答して、書込みエンジン４０は、バッファ３６に配置されたソースデータを消費し、消費されたソースデータに基づいて書込み要求を出し得る。例えば、書込みエンジン４０は、消費されたソースデータに基づいて宛先データを生成し、メモリ転送動作のための宛先領域中の対応する位置に宛先データを書き込むために書込み要求を出し得る。複数の書込み要求の各々について、書込み要求のそれぞれ１つに対してソースデータがバッファ３６から消費されたことに応答して、読取りエンジン３８は後続の読取り要求を出し得る。
【０１２０】
[0143]  いくつかの場合には、読取りエンジン３８は、データが書込みエンジン４０によっていつバッファ３６から消費されたかを決定するために、バッファ３６を監視し得る。追加の例では、読取りエンジン３８は、データが書込みエンジン４０によっていつバッファ３６から消費されたかを決定するために、バッファ３６および／または書込みエンジン４０から通知を受け取り得る。いくつかの場合には、書込みエンジン４０は、データが読取りエンジン３８によっていつバッファ３６に配置されたかを決定するために、バッファ３６を監視し得る。追加の例では、書込みエンジン４０は、データが読取りエンジン３８によっていつバッファ３６に配置されたかを決定するために、バッファ３６および／または書込みエンジン３８から通知を受け取り得る。
【０１２１】
[0144]  追加の例では、順次的メモリ転送モードがメモリ転送動作のすべてまたは一部を行うためのメモリ転送モードとして選択されるとき、コマンドエンジン３２は、順次的同期モードで動作するように読取りエンジン３８と書込みエンジン４０とを構成し、メモリ転送動作の遂行を開始するためにコマンドを読取りエンジン３８および／または書込みエンジン４０に出し得る。メモリ転送動作の遂行を開始するためのコマンドを受け取ったことに応答して、読取りエンジン３８は、複数の読取り要求を出し得る。読取りエンジン３８は、複数の読取り要求に応答してメモリサブシステム８（例えば、メモリ２２）から受け取られたソースデータを、バッファ３６に配置し得る。読取りエンジン３８は、バッファ３６が満たされていることを検出したことに応答して、読取り要求を出すことを止め得る。書込みエンジン４０は、バッファ３６が満たされていることを検出したことに応答して、消費されたデータに基づいて、バッファ中のソースデータを消費し、複数の書込み要求を出し得る。書込みエンジン４０は、バッファ３６が空であることを検出したことに応答して、バッファ３６中のソースデータを消費して書込み要求を出すことを止め得る。読取りエンジン３８は、バッファ３６が空であることを検出したことに応答して、読取り要求の発行を再開し得る。
【０１２２】
[0145]  いくつかの場合には、読取りエンジン３８および／または書込みエンジン４０は、バッファ３６が満たされているときまたは空であるときを決定するために、バッファ３６を監視し得る。追加の例では、読取りエンジン３８および／または書込みエンジン４０は、バッファ３６が満たされているときまたは空であるときを決定するために、バッファ３６および／または書込みエンジン４０から通知を受け取り得る。
【０１２３】
[0146]  コマンドエンジン３２は、メモリ転送モードの選択を行うものとして、および／または、メモリ転送モードの選択に基づいてＧＰＵ１０の中の他の処理コンポーネントを構成するものとして、本明細書で説明されるが、他の例では、ＧＰＵ１０の中の１つまたは複数の他のコンポーネントは、コマンドエンジン３２に加えて、またはその代わりにこれらの機能を行い得る。例えば、専用のメモリ転送モード選択および構成ユニットが、上で言及された機能を行うために使用されてよく、または、読取りエンジン３８および書込みエンジン４０が、そのような機能を行うように構成されてよい。
【０１２４】
[0147]  いくつかの例では、ＣＰＵ６上で実行するＧＰＵドライバ２８（またはＣＰＵ６上で実行する他のプログラム）は、本開示のメモリ転送モード選択技法のいずれをも行うことができ、選択されたメモリ転送モードをＧＰＵ１０に提供し得る。ＧＰＵ１０は次いで、ＣＰＵ６によってＧＰＵ１０に提供された選択されたメモリ転送モードに基づいて、メモリ転送を行うためのメモリ転送モードを選択し得る。
【０１２５】
[0148]  追加の例では、ＧＰＵドライバ２８は、メモリ転送動作を行うために使用されるべきメモリ転送モードを規定する、メモリ転送モードコマンドをソフトウェアアプリケーション２４（例えば、グラフィックスアプリケーション）から受け取り得る。メモリ転送モードコマンドを受け取ったことに応答して、ＧＰＵドライバ２８は、ＧＰＵ１０に、メモリ転送モードコマンドに基づいてメモリ転送動作を行わせ得る。例えば、ＧＰＵドライバ２８は、メモリ転送動作を行うときに使用すべきメモリ転送モードを規定する１つまたは複数のコマンドをＧＰＵ１０に出し得る。
【０１２６】
[0149]  図３は、図２に示される例示的な構成において使用され得る例示的なメモリサブシステム８を示すブロック図である。図３に示されるように、メモリサブシステム８は、メモリコントローラ２０と、メモリ２２と、バス４６とを含む。メモリコントローラ２０は、ＧＰＵ１０からメモリアクセス要求を受け取り、メモリ２２に関して受け取られたメモリアクセス要求にサービスするように構成され得る。メモリアクセス要求は、読取り要求および／または書込み要求を含み得る。ＧＰＵ１０によって出されメモリコントローラ２０によって受け取られるメモリアクセス要求は、メモリコントローラ２０によって利用可能なフォーマットであり得る。例えば、メモリアクセス要求は、ＡＭＢＡ  ＡＸＩ規格、ＡＭＢＡ  ＡＨＢ規格、または任意の他のメモリコントローラインターフェースに準拠し得る。
【０１２７】
[0150]  いくつかの例では、メモリコントローラ２０によって受け取られるメモリアクセス要求は、メモリ２２によって利用可能なフォーマットではないことがある。そのような例では、メモリコントローラ２０は、メモリ２２によって利用可能な１つまたは複数のメモリコマンドを生成し、メモリ２２からデータを読取り、および／またはメモリ２２にデータを書き込むために、そのようなコマンドをメモリ２２に出し得る。いくつかの例では、メモリ２２がＤＤＲ  ＳＤＲＡＭである場合、メモリ２２によって利用可能な１つまたは複数のメモリコマンドは、ＤＤＲ  ＳＤＲＡＭインターフェースに適合するコマンドであり得る。
【０１２８】
[0151]  いくつかの例では、メモリコントローラ２０によって生成される１つまたは複数のコマンドは、読取り動作に対するコマンドの読取りシーケンスおよび書込み動作に対するコマンドの書込みシーケンスという形式をとり得る。例えば、メモリ２２がＤＤＲ  ＳＤＲＡＭである場合、メモリコントローラ２０によって生成される１つまたは複数のメモリコマンドは、ＤＤＲ  ＳＤＲＡＭインターフェースに準拠するコマンドの読取りシーケンスおよび／またはコマンドの書込みシーケンスという形式をとり得る。コマンドの読取りシーケンスおよび書込みシーケンスは、ＤＤＲ  ＳＤＲＡＭインターフェースに準拠する１つまたは複数の制御信号のアサートという形式をとり得る。例えば、メモリアクセス要求を受け取ったことに応答して、メモリコントローラ２０は、メモリアクセス要求で規定されたアドレスに対応するメモリ２２の特定の行とバンクとを、それらがまだアクティブ化されていなければ、アクティブ化するための信号を生成し得る。メモリコントローラ２０はまた、メモリアクセス要求で規定されるアドレスに対応するアクティブ化された行およびバンクの中の特定の列を選択するための信号を生成し得る。メモリコントローラ２０はまた、メモリ２２からデータが読み取られるべきか、またはメモリ２２にデータが書き込まれるべきかをメモリ２２に示すための信号を生成し得る。メモリアクセス要求が書込み要求である場合、メモリコントローラ２０は、バス４６内の双方向データバスを介して、書込みデータをメモリ２２に与え得る。メモリアクセス要求が読取り要求である場合、メモリコントローラ２０は、バス４６内の双方向データバスを介してメモリ２２からデータを受け取り、バス１８を介してＣＰＵ  １４に読み取られたデータを提供し得る。
【０１２９】
[0152]  メモリ２２は、読取りコマンドと書込みコマンドとを受け取り、メモリ２２に含まれるデータ記憶空間に関してそれらのコマンドにサービスするように構成される。読取りコマンドを受け取ったことに応答して、メモリ２２は、読取りコマンドに含まれるアドレスによって規定される位置にある、メモリ２２内に含まれるデータ記憶空間からデータを取得し、バス４６内の双方向バスを介して、取得されたデータをメモリコントローラ２０に提供し得る。書込みコマンドを受け取ったことに応答して、メモリ２２は、書込みコマンドに含まれるアドレスによって規定される位置にある、メモリ２２内に含まれるデータ記憶空間に、バス４６内の双方向バスを介して、メモリコントローラ２０から受け取られたデータを記憶し得る。
【０１３０】
[0153]  ソース面４２および宛先面４４は、図２に示される対応するコンポーネントと実質的に同様であり得る。従って、簡潔のために、および冗長性をなくすために、これらのコンポーネントはさらに詳細には説明されない。
【０１３１】
[0154]  バス４６は、任意のタイプのバス構造として実装され、任意のタイプのバスプロトコルに従って動作し得る。いくつかの例では、バス４６は、メモリ２２を制御するために使用される制御信号に対応するビット線を含み得る。例えば、メモリ２２がＤＤＲ  ＳＤＲＡＭである場合、バス４６は、クロック信号、チップ選択信号、バンク選択信号、行アドレスストローブ、列アドレスストローブ、書込みイネーブル信号、双方向データバスなどの、１つまたは複数を含み得る。
【０１３２】
[0155]  上で論じられたように、バス４６は、双方向データバスを含み得る。言い換えると、バス４６中の同じビット線は、読取り要求を実行するとき、メモリ２２からメモリコントローラ２０に読取りデータを転送でき、書込み要求を実行するとき、メモリコントローラ２０からメモリ２２に書込みデータを転送し得る。メモリコントローラ２０が、読取り要求を出すことから書込み要求を出すことへ、または、書込み要求を出すことから読取り要求を出すことへ変化するたびに、バス４６中の双方向データバスが、向きが変わる前に安定することを可能にするために、アイドル時間が必要とされ得る。この安定化時間は、読取り−書込み転換時間と呼ばれ得る。
【０１３３】
[0156]  本開示で説明される順次的メモリ転送モードは、メモリ転送動作を行うときに起こる、読取りと書込みの移行の数を減らし、これによって、読取り−書込み転換時間によりメモリ転送動作の間に発生する遅延全体を減らすために、使用され得る。順次的メモリ転送モードは、いくつかのタイプのメモリ転送動作では、読取り−書込み転換時間によりメモリ転送動作の間に発生する遅延を減らすことができ、順次的メモリ転送モードは、必ずしもインターリーブメモリ転送モードより効率的ではないことがある。例えば、順次的メモリ転送モードの間に、比較的大きな不変の量のデータが常に読取り動作のために取り出される場合、小さなメモリ転送動作について、順次的モードは、無関係のデータのフェッチを必要とすることがあり、これは、読取り−書込み転換を減らすことによって達成される恩恵を見劣りさせ得る。
【０１３４】
[0157]  これらおよび他の考慮事項による、１つのタイプのメモリ転送モードが普遍的に、メモリ転送動作を行うための最も効率的なメモリ転送モードとはならないことがある。従って、本開示の技法は、特定のタイプのメモリ転送動作により適した、適切なメモリ転送モードを選択し、これによって、様々なタイプおよびサイズのメモリ転送動作を行い得るＧＰＵの性能を向上させるために、使用され得る。
【０１３５】
[0158]  図４は、図２に示される例示的な構成において使用され得る別の例示的なメモリサブシステム８を示すブロック図である。図４に示されるように、メモリサブシステム８は、介在するメモリコントローラを伴わずに、バス１８に直接結合されるメモリ２２を含む。この例では、メモリ２２は、ＧＰＵ１０からメモリアクセス要求を受け取り、メモリ２２に含まれるデータ記憶空間に関して受け取られたメモリアクセス要求にサービスするように構成され得る。メモリアクセス要求は、読取り要求および／または書込み要求を含み得る。
【０１３６】
[0159]  いくつかの例では、メモリ２２は、内蔵のメモリコントローラ機能を含み得る。そのような例では、ＧＰＵ１０によって出されメモリ２２によって出されるメモリアクセス要求は、メモリコントローラによって利用可能なフォーマットであり得る。例えば、メモリアクセス要求は、ＡＭＢＡ  ＡＸＩ規格、ＡＭＢＡ  ＡＨＢ規格、または任意の他のメモリコントローラインターフェースに準拠し得る。内蔵のメモリコントローラ機能は、受け取られたメモリアクセス要求を、メモリ２２によって利用可能な１つまたは複数のコマンドに変換し得る。例えば、メモリ２２がＤＤＲ  ＳＤＲＡＭである場合、メモリ２２によって利用可能な１つまたは複数のメモリコマンドは、ＤＤＲ  ＳＤＲＡＭインターフェースに適合するコマンドであり得る。
【０１３７】
[0160]  さらなる例では、ＧＰＵ１０の中の読取りエンジン３８および書込みエンジン４０は、メモリ２２によって利用可能なコマンドを、メモリサブシステム８およびメモリ２２に出し得る。例えば、メモリ２２がＤＤＲ  ＳＤＲＡＭである場合、メモリ２２によって利用可能な１つまたは複数のメモリコマンドは、ＤＤＲ  ＳＤＲＡＭインターフェースに適合するコマンドであり得る。
【０１３８】
[0161]  追加の例では、ＧＰＵ１０は、内蔵のメモリコントローラ機能を含み得る。そのような例では、読取りエンジン３８および書込みエンジン４０によって出されるメモリアクセス要求は、必ずしも、メモリ２２によって利用可能なフォーマットではないことがある。例えば、メモリアクセス要求は、ＡＭＢＡ  ＡＸＩ規格、ＡＭＢＡ  ＡＨＢ規格、または任意の他のメモリコントローラインターフェースに準拠し得る。ＧＰＵ１０の中の内蔵のメモリコントローラ機能は、受け取られたメモリアクセス要求を、メモリ２２によって利用可能な１つまたは複数のコマンドに変換し得る。例えば、メモリ２２がＤＤＲ  ＳＤＲＡＭである場合、メモリ２２によって利用可能な１つまたは複数のメモリコマンドは、ＤＤＲ  ＳＤＲＡＭインターフェースに適合するコマンドであり得る。
【０１３９】
[0162]  いくつかの例では、バス１８は双方向データバスを含み得る。本開示で説明される順次的メモリ転送モードは、メモリ転送動作を行うときに起こる、読取りと書込みの移行の数を減らし、これによって、読取り−書込み転換時間によりメモリ転送動作の間に発生する遅延全体を減らすために、使用され得る。しかしながら、上ですでに論じられたように、順次的メモリ転送モードは、すべてのタイプおよびサイズのメモリ転送動作に対して最も効率的なメモリ転送モードではないことがある。従って、本開示の技法は、特定のタイプのメモリ転送動作により適した、適切なメモリ転送モードを選択し、これによって、様々なタイプおよびサイズのメモリ転送動作を行い得るＧＰＵの性能を向上させるために、使用され得る。
【０１４０】
[0163]  図５は、本開示による例示的な単一ソースのメモリ転送動作を示す概念図である。図５は、各々がピクセルデータの２次元アレイに対応する、ソース面５０と宛先面５２とを図示する。ピクセルデータは、面の中の各ピクセルに対する、赤、緑、青（ＲＧＢ）の色値と、いくつかの場合には、アルファ値（Ａ）とを含み得る。面５０、５２の各々はピクセルデータの２次元アレイに対応するので、面の中の個々のピクセル位置に対するピクセルデータは、行および列の座標によってインデックスが付けられ得る。いくつかの例では、ソース面５０および宛先面５２は、ビットマップであり得る。さらなる例では、ソース面５０および宛先面５２は、例えばテクスチャバッファのような、バッファリソースであり得る。図５の例示的なソース面５０および宛先面５２は、同じ形状およびサイズであり、長方形である。しかしながら、他の例では、ソース面５０および宛先面５２は、必ずしも同じ形状およびサイズではなくてもよく、および／または他の形状であってよい。
【０１４１】
[0164]  ソース面５０はソース領域５４を含み、宛先面５２は宛先領域５６を含む。ソース領域５４は、ソース面５０に含まれるピクセルデータの部分集合を含み、宛先領域５６は、宛先面５２に含まれるピクセルデータの部分集合を含む。面に含まれるピクセルデータの部分集合は、面に含まれるピクセルデータのすべてまたはすべて未満を指し得る。図５に示されるように、ソース領域５４および宛先領域５６は、同じサイズおよび形状であり、長方形である。しかしながら、他の例では、ソース領域５４および宛先領域５６は、長方形でなくてよい。
【０１４２】
[0165]  図５に示される例示的なメモリ転送動作では、データは、ソース面５０のソース領域５４から宛先面５２の宛先領域５６に転送される。一般に、ソース領域５４中の各ピクセル位置のデータは、宛先領域５６中の対応するピクセル位置に転送される。異なる領域中の異なるピクセル位置は、それぞれの領域におけるピクセル位置の各々の相対的な配置が同じであれば、対応するピクセル位置であると言われ得る。例えば、ソース領域５４中のあるピクセル位置が、宛先領域５６中のあるピクセル位置の宛先領域５６での相対的な位置と同じ相対的な位置を、ソース領域５４において有する場合、ソース領域５４中のそのピクセル位置は、宛先領域５６中のそのピクセル位置に対応し得る。例えば、ソース領域５４および宛先領域５６の第２行の第３列は、同じ相対的な位置を有する。
【０１４３】
[0166]  図５に示されるメモリ転送動作は、単一のソース領域がメモリ転送動作のためのソースオペランドとして使用されるので、単一ソースのメモリ転送動作である。図５に示される単一ソースのメモリ転送動作は、ソース領域５４の同じデータが宛先領域５６に複製されるメモリ複製動作を表し得る。図５に示されるメモリ転送動作は別個のソース面５０と宛先面５２とを示すが、他の例では、ソース面５０および宛先面５２は同じ面であってよい。そのような例では、ソース領域５４および宛先領域５６は、いくつかの例では、それらの間でデータがメモリ複製動作によって転送される、同じ面内の異なる領域であり得る。
【０１４４】
[0167]  図６は、本開示による例示的な複数ソースのメモリ転送動作を示す概念図である。図６は、第１のソース面５８と、第２のソース面６０と、宛先面６２とを図示する。面５８、６０、６２の各々は、図５に関して上で論じられた面５０、５２と実質的に同様であり得る。第１のソース面５８は第１のソース領域６４を含み、第２のソース面６０は第２のソース領域６６を含み、宛先面６２は宛先領域６８を含む。第１のソース領域６４は、第１のソース面５８に含まれるピクセルデータの部分集合を含み、第２のソース領域６６は、第２のソース面６０に含まれるピクセルデータの部分集合を含み、宛先領域６８は、宛先面６２に含まれるピクセルデータの部分集合を含む。図５に示されるように、第１のソース領域６４、第２のソース領域６６、および宛先領域６８は、同じサイズおよび形状であり、長方形である。しかしながら、他の例では、領域６４、６６、および６８は、長方形でなくてよい。
【０１４５】
[0168]  図６の例示的なメモリ転送動作では、第１のソース領域６４からのソースデータおよび第２のソース領域６６からのソースデータが、宛先データを生成するために、ラスタ演算７０を介して組み合わされ、宛先データは、宛先面６２の宛先領域６８に配置される。一般に、第１のソース領域６４中の各ピクセル位置のデータは、第２のソース領域６６中の対応するピクセル位置からのデータと組み合わされ、宛先領域６８中の対応するピクセル位置に書き込まれる。異なる領域中の異なるピクセル位置は、それぞれの領域におけるピクセル位置の各々の相対的な配置が同じであれば、対応するピクセル位置であると言われ得る。
【０１４６】
[0169]  図６に示されるメモリ転送動作は、複数のソース領域がメモリ転送動作のためのソースオペランドとして使用されるので、複数ソースのメモリ転送動作である。図６に示される複数ソースのメモリ転送動作は、２つの異なるソース領域からのデータが、宛先領域に書き込まれる宛先データを生成するために組み合わされる、合成動作を表し得る。図６に示されるメモリ転送動作は、別個の第１のソース面５８と、第２のソース面６０と、宛先面６２とを示すが、他の例では、面５８、６０、６２の１つまたは複数は同じ面であってよい。例えば、第２のソース面６０および宛先面６２は同じ面であってよく、第２のソース領域６６および宛先領域６８はその面内の同じ領域であってよい。そのような例では、合成動作は、特定のラスタ演算子を使用して、第１のソース領域６４中のピクセルデータを、宛先面６２中の既存のピクセルデータと統合し得る。
【０１４７】
[0170]  図７は、本開示による例示的なＧＰＵにより支援された単一ソースのメモリ転送動作を示す概念図である。図７に示されるＧＰＵにより支援されたメモリ転送動作は、図５に示されたものと同じメモリ転送動作であり得る。図７に示されるように、ソース面５０および宛先面５２はメモリ２２に記憶される。
【０１４８】
[0171]  メモリ転送動作を行うために、ＧＰＵ１０は、ソース領域５４からソースデータを読み取り、ソース領域５４から読み取られたソースデータに基づいて宛先データを生成し、宛先データを宛先領域５６に書き込む。宛先データは、ソースデータと同じであってよい。
【０１４９】
[0172]  ソース領域５４中の各ピクセル位置に対して、ＧＰＵ１０は、それぞれのピクセル位置に対応する、ソース領域５４からのソースデータを読み取るために、読取り要求を出し得る。読取り要求を受け取ったことに応答して、メモリ２２は、それぞれのピクセル位置に対応するソースデータをＧＰＵ１０に提供し得る。いくつかの例では、ＧＰＵ１０は、ＧＰＵ１０中のバッファにソースデータを記憶し得る。ＧＰＵ１０は、それぞれのピクセル位置に対するソースデータに基づいて、それぞれのピクセル位置に対する宛先データを生成し得る。メモリ複製動作では、それぞれのピクセル位置に対する宛先データは、それぞれのピクセル位置に対するソースデータと同じであり得る。ＧＰＵ１０は、ソース領域５４のそれぞれのピクセル位置に対応する宛先領域５６中のピクセル位置に宛先データを書き込むために、書込み要求を出し得る。書込み要求を受け取ったことに応答して、メモリ２２は、ソース領域５４のそれぞれのピクセル位置に対応する宛先領域５６中のピクセル位置に宛先データを記憶し得る。ＧＰＵ１０は、ソース領域５４中の各ピクセル位置および宛先領域５６中の対応するピクセル位置に対して、これらの動作を行い得る。
【０１５０】
[0173]  図８は、本開示による例示的なＧＰＵにより支援された複数ソースのメモリ転送動作を示す概念図である。図８に示される例示的なＧＰＵにより支援されたメモリ転送動作は、図６に示されたものと同じメモリ転送動作であり得る。図８に示されるように、第１のソース面５８、第２のソース面６０、および宛先面６２はメモリ２２に記憶される。
【０１５１】
[0174]  メモリ転送動作を行うために、ＧＰＵ１０は、第１のソース面５８および第２のソース面６０からソースデータを読み取り、第１のソース面５８および第２のソース面６０から読み取られたソースデータに基づいて宛先データを生成し、宛先データを宛先面６２に書き込む。宛先データは、ソースデータの組合せに基づき得る。例えば、ＧＰＵ１０は、第１のソース面５８および第２のソース面６０からのソースデータが組み合わされるべき方式を規定する、ラスタ演算子に基づいて、宛先データを生成し得る。ＧＰＵ１０のラスタ演算ユニット（例えば、図２に示されるラスタ演算ユニット３４）が、データを組み合わせるために使用され得る。
【０１５２】
[0175]  第１のソース領域６４中の各ピクセル位置に対して、ＧＰＵ１０は、それぞれのピクセル位置に対応する、第１のソース領域６４からの第１のソースデータを読み取るための、読取り要求を出し、第１のソース領域６４中のそれぞれのピクセル位置に対応する、第２のソース領域６６中のピクセル位置（すなわち、第１のソース領域６４中のそれぞれのピクセル位置と同じ相対的な位置を有する第２のソース領域６６中のピクセル位置）からの第２のソースデータを読み取るための、読取り要求を出し得る。読取り要求を受け取ったことに応答して、メモリ２２は、第１のソース領域６４中のそれぞれのピクセル位置に対応する第１のソースデータをＧＰＵ１０に提供し、第２のソース領域６６中の対応するピクセル位置に対応する第２のソースデータをＧＰＵ１０に提供し得る。いくつかの例では、ＧＰＵ１０は、ＧＰＵ１０中のバッファにソースデータを記憶し得る。ＧＰＵ１０は、それぞれのピクセル位置に対する第１のソースデータおよび第２のソースデータに基づいて、それぞれのピクセル位置に対する宛先データを生成し得る。合成動作では、ソースデータは、宛先データを生成するために、ラスタ演算に従って組み合わされ得る。ＧＰＵ１０は、第１のソース領域６４のそれぞれのピクセル位置に対応する宛先領域６８中のピクセル位置に宛先データを書き込むために、書込み要求を出し得る。ＧＰＵ１０は、第１のソース領域６４、第２のソース領域６６、および宛先領域６８の中の対応するピクセル位置の各セットに対して、これらの動作を行い得る。
【０１５３】
[0176]  図９〜図１２は、本開示の様々なメモリ転送モードに従って行われる様々なメモリ転送動作の例示的なタイミング特性を示すタイミング図である。図９〜図１２のタイミング図は、例示を目的に、図３に示されるコンピューティングデバイス２の構成に関して説明される。しかしながら、同じ構成または異なる構成の、同じコンポーネントまたは異なるコンポーネントを有する他のデバイスが、本開示の技法を行うために使用され得ることを理解されたい。
【０１５４】
[0177]  図９〜図１２に提示されるタイミング図は、様々なメモリ転送モードにおける読取り要求および書込み要求の発行と、異なるメモリ転送モードを使用したときに発生し得る読取り−書込み転換遅延の変動とに関する、本開示の全般的な概念を図示するためだけに与えられていることに留意されたい。従って、これらのタイミング図は、メモリにアクセスするときに発生し得るすべてのタイミング考慮事項の物理的に正確なモデルまたは網羅的なモデルであることは意図されないことを、理解されたい。同様に、異なるメモリコントローラおよび／またはメモリは、図９〜図１２のタイミング図で図示されるものとは異なる方式で、読取り要求と書込み要求とに応答し得る。従って、本開示の技法は、図９〜図１２に図示された特定のメモリコントローラの挙動および／またはメモリの挙動に限定されないことを理解されたい。
【０１５５】
[0178]  図９Ａおよび図９Ｂは、本開示のインターリーブメモリ転送モードに従って行われる単一ソースのメモリ転送動作の例示的なタイミング特性を示すタイミング図である。上で論じられたように、図９Ａおよび図９Ｂに図示されるメモリ転送動作は、図３に示されるコンピューティングデバイス２の構成とともに行われる。図３に示されるように、構成は、バス１８を介してＧＰＵ１０に通信可能に結合され、バス４６を介してメモリ２２に通信可能に結合される、メモリコントローラ２０を含む。インターリーブメモリ転送モードに従ってメモリ転送動作を行うために、コマンドエンジン３２は、インターリーブ同期モードで動作するように、読取りエンジン３８と書込みエンジン４０とを構成し得る。図９Ａおよび図９Ｂに図示されるメモリ転送動作は、１２個のピクセルを各々有する、ソース領域および宛先領域に関して行われる。従って、メモリ転送動作の間に、１２個の読取り要求および１２個の書込み要求が、メモリ２２に関して行われる。
【０１５６】
[0179]  図９Ａおよび図９Ｂにおいて、各行は、メモリ転送動作の実行中の特定の時間スロットまたは時間間隔を表し、第１行が最早の時間スロットであり、最終行が最遅の時間スロットである。「時間」列は、時間スロットの番号を表す。
【０１５７】
[0180]  「読取りエンジン」列は「読取り」イベントを含み、これは、読取りエンジン３８によって出される読取り要求を表す。「書込みエンジン」列は「書込み」イベントを含み、これは、書込みエンジン４０によって出される書込み要求を表す。読取り要求および書込み要求は、バス１８内の１つまたは複数のコマンドおよび／またはアドレスバスチャンネルを介して、ＧＰＵ１０からメモリコントローラ２０に送られ得る。
【０１５８】
[0181]  読取り要求の後に続く数字は、ソース領域中の異なるピクセル位置と関連付けられる異なる読取り要求を数え上げる。書込み要求の後に続く数字は、宛先領域中の異なるピクセル位置と関連付けられる異なる書込み要求を数え上げる。同じ数字を有する読取り要求および書込み要求は、それらの読取り要求および書込み要求がソース領域および宛先領域中の対応するピクセル位置（すなわち、同じ相対的な位置を有するピクセル）に関して行われることを示す。言い換えると、特定の数字を伴う書込み要求に対する書込みデータは、同じ特定の数字を有する読取り要求に応答して受け取られるソースデータに基づいて生成される。
【０１５９】
[0182]  「読取りバス」および「書込みバス」列は、ＧＰＵ１０とメモリコントローラ２０との間でデータを転送するための独立したデータチャンネルを表す。「読取りバス」および「書込みバス」は、図３に示されるバス１８に対応し得る。「読取りバス」は、メモリコントローラ２０からＧＰＵ１０に読取りデータを移送する、バス１８内の単方向バスチャンネルであり得る。「書込みバス」は、ＧＰＵ１０からメモリコントローラ２０に書込みデータを移送する、バス１８内の単方向バスチャンネルであり得る。
【０１６０】
[0183]  「読取りバス」列は、読取りエンジン３８によって出された特定の読取り要求に応答してメモリコントローラ２０からＧＰＵ１０に転送されるソースデータを表す、「読取りデータ」イベントを含む。「読取りデータ」イベントの後に続く数は、「読取りデータ」イベントによって表されるソースデータに対応する読取り要求を示す。「書込みバス」列は、書込みエンジン４０によって出された書込み要求とともにＧＰＵ１０からメモリコントローラ２０に転送される宛先データを表す、「書込みデータ」イベントを含む。「書込みデータ」イベントの後に続く数は、「書込みデータ」イベントによって表される宛先データに対応する書込み要求を示す。
【０１６１】
[0184]  「メモリコントローラ」列は、メモリコントローラ２０からメモリ２２にそれぞれ送られる読取りコマンドと書込みコマンドとを表す、「読取りコマンド」イベントと「書込みコマンド」イベントとを含む。これらのコマンドは、バス４６内の１つまたは複数のコマンドおよび／またはアドレスバスチャンネルを通じて送られ得る。「読取りコマンド」イベントの後に続く数は、「読取りコマンド」イベントによって表される読取りコマンドに対応する読取り要求を示す。同様に、「書込みコマンド」イベントの後に続く数は、「書込みコマンド」イベントによって表される書込みコマンドに対応する書込み要求を示す。
【０１６２】
[0185]  「メモリバス」列は、メモリコントローラ２０とメモリ２２との間の双方向データバスを表す。双方向データバスは、バス４６の一部であり得る。「メモリバス」列は、メモリコントローラ２０によって出された特定の読取りコマンドに応答してメモリ２２からメモリコントローラ２０に転送されるソースデータを表す「読取りデータ」イベントと、メモリコントローラ２０によって出された特定の書込みコマンドとともにメモリコントローラ２０からメモリ２２に転送される宛先データを表す「書込みデータ」イベントとを含む。「読取りデータ」イベントの後に続く数は、「読取りデータ」イベントによって表されるソースデータに対応する読取りコマンドを示す。「書込みデータ」イベントの後に続く数は、「書込みデータ」イベントによって表される宛先データに対応する書込みコマンドを示す。
【０１６３】
[0186]  図９Ａおよび図９Ｂに図示されるメモリ転送動作は、パイプライン化された読取りアクセスとパイプライン化された書込みアクセスとをサポートするメモリアーキテクチャで行われる。パイプライン化された読取りアクセスは、ＧＰＵ１０および／またはメモリコントローラ２０が、すべての以前に出された読取り要求に応答してデータを受け取る前に後続の読取り要求を出すことを可能にし得る。言い換えると、パイプライン化された読取りアクセスは、ＧＰＵ１０および／またはメモリコントローラ２０が、第１の読取り要求を出すことと、第１の読取り要求を出した後で、第１の読取り要求に応答してソースデータを受け取る前に、第２の読取り要求を出すこととを可能にし得る。
【０１６４】
[0187]  パイプライン化された書込みアクセスは、ＧＰＵ１０および／またはメモリコントローラ２０が、すべての以前に出された書込み要求が完了したという確認を受け取る前に、後続の書込み要求を出すことを可能にし得る。言い換えると、パイプライン化された書込みアクセスは、ＧＰＵ１０および／またはメモリコントローラ２０が、第１の書込み要求を出すことと、第１の書込み要求を出した後で、第１の書込み要求が完了したという確認を受け取る前に、第２の書込み要求を出すこととを可能にし得る。
【０１６５】
[0188]  メモリ転送動作の実行は、読取りエンジン３８が読取り要求を出し始める時間スロット１〜４において、開始する。メモリコントローラ２０は、各読取り要求を読取りコマンドに変換する。時間スロット２〜５の間に、メモリコントローラ２０は、バス４６（すなわち、メモリバス）を介して、読取りコマンドをメモリ２２に出す。この例では、メモリ２２は、読取りコマンドを受け取った後に、第２の時間スロットにおける読取り要求に応答して、読取りデータを返すように構成される。例えば、時間スロット２において「読取りコマンド１」を受け取ったことに応答して、メモリ２２は、時間スロット４における「読取りコマンド１」に対応する「読取りデータ１」を返す。時間スロット４〜７の間に、メモリ２２は、最初の４個の読取り要求に対する読取りデータをメモリコントローラ２０に転送する。時間スロット５〜８の間に、メモリコントローラ２０は、「読取りバス」を介して読取りデータをＧＰＵ１０にリダイレクトする。
【０１６６】
[0189]  時間スロット５において、書込みエンジン４０は、書込み要求を出すために十分なソースデータが、読取り要求に応答してＧＰＵ１０によって受け取られたことを検出する。この例では、書込み要求を出すために十分なソースデータは、単一の読取り要求に応答して受け取られた１つのソースデータユニットに対応する。時間スロット６の間に、書込み要求を出すために十分なソースデータがＧＰＵ１０によって受け取られたことを検出したことに応答して、書込みエンジン４０は、受け取られたソースデータを消費し、ソースデータに基づいて宛先データを生成し、書込み要求をメモリコントローラ２０に出し、「書込みバス」を介して宛先データをメモリコントローラ２０に転送する。いくつかの例では、宛先データはソースデータと同一であり得る。
【０１６７】
[0190]  時間スロット６において、メモリコントローラ２０は、書込み要求を受け取るが、少なくとも２つの理由で、時間スロット１１まで書込みコマンドをメモリ２２に出さない。第１に、メモリコントローラ２０は、以前に出された読取り要求に応答してメモリ２２からソースデータを受け取ることをまだ待っている。第２に、上で論じられたように、読取り要求にサービスすることと書込み要求にサービスすることとの切替えが発生するたびに、（例えば、読取りから書込みに）バスが向きを変える前にバスを安定させるために、特定の長さのアイドル時間が必要とされ得る。このアイドル時間は、読取り−書込み転換遅延と呼ばれ得る。図９Ａおよび図９Ｂの例では、読取り−書込み転換遅延は、２個分のアイドル周期（すなわち、時間スロット）である。従って、「読取りデータ４」イベントの後、メモリコントローラ２０は、「書込みコマンド１」の発行を時間スロットの２個分遅らせる。「書込みコマンド１」を出すこととともに、メモリコントローラ２０は、メモリバスを通じて、「書込みデータ１」をメモリ２２に転送する。
【０１６８】
[0191]  時間スロット６に戻ると、読取りエンジン３８は、書込み要求を出すために十分なソースデータが、書込みエンジン４０によって消費されたことを検出する。時間スロット７の間に、書込み要求を出すために十分なソースデータが書込みエンジン４０によって消費されたことを検出したことに応答して、読取りエンジン３８は、後続の読取り要求を出す。また、時間スロット７の間に、書込みエンジン４０は、ＧＰＵ１０が「読取りデータ２」を受け取ったことに応答して、「書込み２」書込み要求を出す。
【０１６９】
[0192]  この時点で、メモリコントローラ２０は、調停し優先順位付けるべき、複数の異なるタイプのメモリアクセス要求を有する。図９Ａおよび図９Ｂに図示される例示的なメモリ転送動作では、メモリコントローラ２０は、より早く受け取られたメモリアクセス要求を、後で受け取られたメモリアクセス要求よりも前に、処理する。読取り要求および書込み要求が同じ時間スロットの間に受け取っている場合、メモリコントローラ２０は、書込み要求の前に読取り要求を処理する。従って、読取り要求と書込み要求の両方が時間スロット７の間にメモリコントローラ２０によって受け取られても、メモリコントローラ２０は、書込み要求を処理する前に読取り要求を処理する。これは図９Ａに示されており、メモリコントローラ２０は、時間スロット１１の間に「読取りコマンド５」を出し、時間スロット１６の間に「書込みコマンド２」を出す。上の規則は、メモリコントローラ２０で実装され得る調停および優先順位付けの方式の一例に過ぎず、他のタイプの調整および優先順位付けの方式も他の例では使用され得ることに、留意されたい。
【０１７０】
[0193]  時間スロット１１の後で、読取りエンジン３８および書込みエンジン４０は、生産者−消費者パラダイムに従って、読取り要求と書込み要求とを出し続ける。ソース領域中のすべての１２個のピクセルが読み取られ、宛先領域中のすべての１２個のピクセルが書き込まれた後で、メモリ転送動作は完了する。
【０１７１】
[0194]  図９Ａおよび図９Ｂに示されるように、インターリーブメモリ転送モードは、読取り要求および書込み要求がインターリーブされるようにし得る。例えば、時間スロット７〜９の間に、ＧＰＵ１０は、同じ時間スロットの間に、読取り要求と書込み要求とをメモリコントローラ２０に出す。このことは、時間スロット１１〜２８中の「メモリバス」列に示されるように、メモリコントローラ２０に、読取り要求と書込み要求とをインターリーブさせる。別の例として、時間スロット１０〜３９の間に、ＧＰＵ１０は、インターリーブされた方式で読取り要求と書込み要求とをメモリコントローラ２０に出し、このことが次いで、メモリコントローラ２０に、時間スロット２９〜５５の間にインターリーブされた方式で要求を処理させる。インターリーブが原因で、バスが頻繁に向きを変えるとき、多数の時間スロットが「メモリバス」上でアイドル状態になる。
【０１７２】
[0195]  図１０は、本開示の順次的メモリ転送モードに従って行われる単一ソースのメモリ転送動作の例示的なタイミング特性を示すタイミング図である。図９Ａおよび図９Ｂに図示されるメモリ転送動作と同様に、図１０のメモリ転送動作は、図３に示されるコンピューティングデバイス２の構成とともに行われる。図９Ａおよび図９Ｂに図示されるやはり同様メモリ転送動作、図１０に示されるメモリ転送動作は、パイプライン化された読取りアクセスとパイプライン化された書込みアクセスとをサポートする。図１０に図示される表のフォーマットは、図９Ａおよび図９Ｂに示される表と実質的に同様なので、さらに詳細には説明されない。
【０１７３】
[0196]  順次的メモリ転送モードに従ってメモリ転送動作を行うために、コマンドエンジン３２は、順次的同期モードで動作するように、読取りエンジン３８と書込みエンジン４０とを構成し得る。図１０に図示されるメモリ転送動作は、１２個のピクセルを各々有する、ソース領域および宛先領域に関して行われる。従って、メモリ転送動作の間に、１２個の読取り要求および１２個の書込み要求が、メモリ２２に関して行われる。
【０１７４】
[0197]  メモリ転送動作の実行は、読取りエンジン３８が読取り要求を出し始める時間スロット１〜４において、開始する。時間スロット５において、読取りエンジン３８は、出された読取り要求の数が第１の閾値以上になったことに応答して、読取り要求を出すことを止める。この例では、第１の閾値の数は、４個の読取り要求である。
【０１７５】
[0198]  時間スロット８において、書込みエンジン４０は、バッファ３６に記憶されている消費されていないデータの量が第１の閾値以上であることを検出する。時間スロット９において、バッファ３６に記憶されている消費されていないデータの量が第１の閾値以上であることを検出したことに応答して、書込みエンジン４０は、バッファ３６からのソースデータを消費することと、消費されたソースデータに基づいて宛先データを生成することと、宛先データをメモリ２２に書き込むための書込み要求を出すこととを、開始する。時間スロット１３において、書込みエンジン４０は、バッファ３６中の消費されていないデータの量が第２の閾値以下であることを検出する。バッファ３６中の消費されていないデータの量が第２の閾値以下であることを検出したことに応答して、書込みエンジン４０は、ソースデータを消費することと、消費されるソースデータに対する書込み要求出すことを、止める。この例では、第２の閾値は０である。
【０１７６】
[0199]  時間スロット１２において、読取りエンジン３８は、バッファ３６中の消費されていないデータの量が第２の閾値以下であることを検出し、時間スロット１３において、読取り要求の発行を再開する。読取りエンジン３８および書込みエンジン４０は、順次的メモリ転送モードに従って、連続的な読取り要求のシーケンスを出すことと、連続的な書込み要求のシーケンスを出すこととを、交互に行い続け得る。ソース領域中のすべての１２個のピクセルが読み取られ、宛先領域中のすべての１２個のピクセルが書き込まれた後で、メモリ転送動作は完了する。
【０１７７】
[0200]  図１０に示されるように、順次的メモリ転送モードは、読取り要求および書込み要求が、読取り要求と書込み要求の別個のグループで出されるようにし得る。例えば、時間スロット１〜４の間に、ＧＰＵ１０は４個の連続的な読取り要求のグループを出し、時間スロット９〜１２の間に、ＧＰＵ１０は、４個の連続的な書込み要求のグループを出す。図１０に示されるように、別個の読取り要求のグループと書込み要求のグループを出すことで、「メモリバス」が向きを変更した回数は、図９Ａおよび図９Ｂに示されるインターリーブメモリ転送モードよりも減らされた。従って、順次的メモリモードは、メモリ転送動作を行うときに発生する全体的な読取り−書込み転換遅延を、インターリーブメモリ転送モードよりも減らし得る。これは、同じメモリ転送動作が、インターリーブ転送モードに従って行われるときは、図９Ａおよび図９Ｂにおいて完了するために６１個のタイムスロットが必要であり、順次的メモリ転送モードに従って行われるときは、図１０において完了するために３７個のタイムスロットを必要とすることを見ることで理解できる。
【０１７８】
[0201]  順次的メモリ転送モードは、いくつかのタイプのメモリ転送動作では、読取り−書込み転換時間によりメモリ転送動作の間に発生する遅延を減らすことができ、順次的メモリ転送モードは、必ずしもインターリーブメモリ転送モードより効率的ではないことがある。例えば、順次的メモリ転送モードの間に、比較的大きな不変の量のデータが常に読取り動作のために取り出される場合、小さなメモリ転送動作について、順次的モードは、無関係のデータのフェッチを必要とすることがあり、これは、読取り−書込み転換を減らすことによって達成される恩恵を見劣りさせ得る。
【０１７９】
[0202]  これらおよび他の考慮事項による、１つのタイプのメモリ転送モードが普遍的に、メモリ転送動作を行うための最も効率的なメモリ転送モードとはならないことがある。従って、本開示の技法は、特定のタイプのメモリ転送動作により適した、適切なメモリ転送モードを選択し、これによって、様々なタイプおよびサイズのメモリ転送動作を行い得るＧＰＵの性能を向上させるために、使用され得る。
【０１８０】
[0203]  図１１Ａおよび図１１Ｂは、本開示のインターリーブメモリ転送モードに従って行われる複数ソースのメモリ転送動作の例示的なタイミング特性を示すタイミング図である。図９Ａおよび図９Ｂに図示されるメモリ転送動作と同様に、図１１Ａおよび図１１Ｂのメモリ転送動作は、図３に示されるコンピューティングデバイス２の構成とともに行われる。図９Ａおよび図９Ｂに図示されるやはり同様メモリ転送動作、図１１Ａおよび図１１Ｂに示されるメモリ転送動作は、パイプライン化された読取りアクセスとパイプライン化された書込みアクセスとをサポートする。
【０１８１】
[0204]  インターリーブメモリ転送モードに従ってメモリ転送動作を行うために、コマンドエンジン３２は、インターリーブ同期モードで動作するように、読取りエンジン３８と書込みエンジン４０とを構成し得る。図１１Ａおよび図１１Ｂに図示されるメモリ転送動作は、８個のピクセルを各々有する、２つの異なるソース領域および宛先領域に関して行われる。従って、メモリ転送動作の間に、１６個の読取り要求および８個の書込み要求が、メモリ２２に関して行われる。
【０１８２】
[0205]  図１１Ａおよび図１１Ｂに図示される表のフォーマットは、読取り要求、読取りコマンド、および読取りデータが数字および文字（例えば、「１Ａ」、「１Ｂ」、「２Ａ」、「２Ｂ」など）によって指定されることを除き、図９Ａおよび図９Ｂに示される表と同様である。この場合、異なる文字は異なるソース領域を表し、異なる数字は異なる領域中の対応するピクセル位置（すなわち、同じ相対的な位置を有するピクセル）を表す。例えば、「読取り１Ａ」は第１のソース領域中の特定のピクセル位置に対する読取り要求であり、「読取り１Ｂ」は第２のソース領域中の対応するピクセル位置に対する読取り要求である。この例では、「書込み１」は、「読取り１Ａ」と「読取り１Ｂ」の両方に対するピクセル位置に対応する、宛先領域中のピクセル位置に宛先データを書き込む書込み要求であり得る。ピクセル位置に対する宛先データは、両方のソース領域中の対応するピクセル位置と関連付けられるソースデータに基づいて生成され得る。例えば、ＧＰＵ１０は、「読取りデータ１Ａ」および「読取りデータ１Ｂ」に基づいて「書込みデータ１」を生成し得る。ラスタ演算は、宛先データを生成するために使用され得る。
【０１８３】
[0206]  読取りエンジン３８および書込みエンジン４０は、メモリ転送動作のための書込み要求を出すために十分なデータが、単一の読取り要求に応答して返される単一のソースデータユニットではなく２つの異なる読取り要求に応答して返される２つのソースデータユニットであり得ることを除き、図９Ａおよび図９Ｂに関して説明されたものと実質的に同様の方式で動作する。例えば、時間スロット６において、書込みエンジン４０は、メモリ転送動作のための書込み要求（すなわち、「書込みデータ１Ａ」および「書込みデータ１Ｂ」）を出すために十分なソースデータがＧＰＵ１０によって受け取られたことを検出し、時間スロット７の間に、メモリ転送動作のための書込み要求を出すために十分なソースデータがＧＰＵ１０によって受け取られたことを検出したことに応答して、書込みエンジン４０は、受け取られたソースデータを消費し、消費されたソースデータに基づいて宛先データを生成し、書込み要求をメモリコントローラ２０に出し、「書込みバス」を介して宛先データをメモリコントローラ２０に転送する。
【０１８４】
[0207]  別の例として、時間スロット７において、読取りエンジン３８は、メモリ転送動作のための書込み要求（すなわち、「書込みデータ１Ａ」および「書込みデータ１Ｂ」）を出すために十分なソースデータが、書込みエンジン４０によって消費されたことを検出する。時間スロット８の間に、メモリ転送動作のための書込み要求を出すために十分なソースデータが書込みエンジン４０によって消費されたことを検出したことに応答して、読取りエンジン３８は、後続の読取り要求を出す。
【０１８５】
[0208]  図１２は、本開示の順次的メモリ転送モードに従って行われる複数ソースのメモリ転送動作の例示的なタイミング特性を示すタイミング図である。図１１Ａおよび図１１Ｂに図示されるメモリ転送動作と同様に、図１２のメモリ転送動作は、図３に示されるコンピューティングデバイス２の構成とともに行われる。図１１Ａおよび図１１Ｂに図示されるやはり同様メモリ転送動作、図１２に示されるメモリ転送動作は、パイプライン化された読取りアクセスとパイプライン化された書込みアクセスとをサポートする。図１２に図示される表のフォーマットは、図１１Ａおよび図１１Ｂに示される表と実質的に同様なので、さらに詳細には説明されない。
【０１８６】
[0209]  順次的メモリ転送モードに従ってメモリ転送動作を行うために、コマンドエンジン３２は、順次的同期モードで動作するように、読取りエンジン３８と書込みエンジン４０とを構成し得る。図１１Ａおよび図１１Ｂに図示されるメモリ転送動作は、８個のピクセルを各々有する、２つの異なるソース領域および宛先領域に関して行われる。従って、メモリ転送動作の間に、１６個の読取り要求および８個の書込み要求が、メモリ２２に関して行われる。
【０１８７】
[0210]  図１２に示されるように、別個の読取り要求のグループと書込み要求のグループを出すことで、「メモリバス」が向きを変更した回数は、図１１Ａおよび図１１Ｂに示されるインターリーブメモリ転送モードよりも減らされた。従って、順次的メモリモードは、メモリ転送動作を行うときに発生する全体的な読取り−書込み転換遅延を、インターリーブメモリ転送モードよりも減らし得る。これは、同じメモリ転送動作が、インターリーブ転送モードに従って行われるときは、図１１Ａおよび図１１Ｂにおいて完了するために５３個のタイムスロットが必要であり、順次的メモリ転送モードに従って行われるときは、図１２において完了するために３３個のタイムスロットを必要とすることを見ることで理解できる。
【０１８８】
[0211]  やはり、１つのタイプのメモリ転送モードが普遍的に、メモリ転送動作を行うための最も効率的なメモリ転送モードとはならないことがある。従って、本開示の技法は、特定のタイプのメモリ転送動作により適した、適切なメモリ転送モードを選択し、これによって、様々なタイプおよびサイズのメモリ転送動作を行い得るＧＰＵの性能を向上させるために、使用され得る。
【０１８９】
[0212]  図１３〜図１９は、本開示のインターリーブメモリ転送モードおよび順次的メモリ転送モードによる、メモリ転送動作を行うための様々な技法を示す。図１３〜１９に示される技法は、例示を目的に、図１および図２に示されたＧＰＵ１０によって行われるものとして説明される。他の例では、図１３〜１９に示される技法は、同じ構成または異なる構成の、同じコンポーネントまたは異なるコンポーネントを有する他のシステムで実装され得る。
【０１９０】
[0213]  図１３は、本開示のインターリーブメモリ転送モードによる、メモリ転送動作を行うための例示的な技法を示す流れ図である。ＧＰＵ１０はメモリ転送動作を開始する（１００）。ＧＰＵ１０は、ソース領域内のピクセル位置と関連付けられるソースデータを読み取るための読取り要求をメモリサブシステム８（例えば、メモリコントローラ２０またはメモリ２２）に出す（１０２）。
【０１９１】
[0214]  ＧＰＵ１０は、読取り要求に応答してソースデータがメモリサブシステム８（例えば、メモリコントローラ２０またはメモリ２２）から受け取られるまで、待機する。例えば、ＧＰＵ１０は、読取り要求に応答してソースデータがメモリサブシステム８から受け取られたかどうかを決定する（１０４）。ソースデータが読取り要求に応答してメモリサブシステム８から受け取られていない場合、ＧＰＵ１０は決定ボックス１０４に戻る。メモリサブシステム８からソースデータを受け取ったことに応答して、ＧＰＵ１０は、データを消費し、ソースデータに基づいて宛先データを生成し、宛先領域中の対応するピクセル位置に宛先データを書き込むための書込み要求を出す（１０６）。
【０１９２】
[0215]  ソースデータが消費されたことに応答して、ＧＰＵ１０は、より多くのデータがメモリ転送動作のために読み取られる必要があれば、後続の読取り要求を出す。より具体的には、ＧＰＵ１０は、読み取るべきさらなるデータがあるかどうかを決定する（１０８）。読み取るべきさらなるデータがある場合、ＧＰＵ１０は、ボックス１０２を処理することに進み、後続の読取り要求を出す。読み取るべきさらなるデータがない場合、ＧＰＵ１０はメモリ転送動作を完了する（１１０）。
【０１９３】
[0216]  図１４は、本開示のインターリーブ同期モードによる、読取り要求を出すための例示的な技法を示す流れ図である。読取りエンジン３８はメモリ転送動作を開始する（１１２）。読取りエンジン３８は、ソース領域内のピクセル位置と関連付けられるソースデータを読み取るための読取り要求をメモリサブシステム８（例えば、メモリコントローラ２０またはメモリ２２）に出す（１１４）。
【０１９４】
[0217]  読取りエンジン３８は、ソースデータが書込みエンジン４０によってバッファ３６から消費されるまで待機する。例えば、読取りエンジン３８は、ソースデータが書込みエンジン４０によってバッファ３６から消費されたかどうかを決定する（１１６）。ソースデータがバッファ３６から消費されていない場合、ＧＰＵ１０は決定ボックス１１６に戻る。
【０１９５】
[0218]  ソースデータが書込みエンジン４０によってバッファ３６から消費されたことに応答して、読取りエンジン３８は、より多くのデータがメモリ転送動作のために読み取られる必要があれば、後続の読取り要求を出す。例えば、読取りエンジン３８は、読み取るべきさらなるデータがあるかどうかを決定する（１１８）。読み取るべきさらなるデータがある場合、読取りエンジン３８は、ボックス１１４を処理することに進み、後続の読取り要求を出す。読み取るべきさらなるデータがない場合、読取りエンジン３８はメモリ転送動作を完了する（１２０）。
【０１９６】
[0219]  図１５は、本開示のインターリーブ同期モードによる、書込み要求を出すための例示的な技法を示す流れ図である。書込みエンジン４０はメモリ転送動作を開始する（１２２）。
【０１９７】
[0220]  書込みエンジン４０は、読取り要求に応答してソースデータがメモリサブシステム８（例えば、メモリコントローラ２０またはメモリ２２）から受け取られるまで、待機する。例えば、書込みエンジン４０は、読取り要求に応答してソースデータがメモリサブシステム８からＧＰＵ１０によって受け取られたかどうかを決定する（１２４）。例えば、書込みエンジン４０は、読取りエンジン３８がバッファ３６にソースデータを配置したかどうかを決定し得る。ソースデータが読取り要求に応答してメモリサブシステム８から受け取られていない場合、書込みエンジン４０は決定ボックス１２４に戻る。ソースデータがＧＰＵ１０によって受け取られたと決定したことに応答して、メモリ２２は、データを消費し、ソースデータに基づいて宛先データを生成し、宛先領域中の対応するピクセル位置に宛先データを書き込むための書込み要求を出す（１２６）。
【０１９８】
[0221]  書込みエンジン４０は、メモリ転送動作の一部として消費すべきさらなるデータがあるかどうかを決定する（１２８）。消費すべきさらなるデータがある場合、書込みエンジン４０は、決定ボックス１２４に進み、さらなるソースデータが受け取られることを待つ。メモリ転送動作の一部として消費すべきさらなるデータがない場合、書込みエンジン４０はメモリ転送動作を完了する（１３０）。
【０１９９】
[0222]  図１６は、本開示の順次的メモリ転送モードによる、メモリ転送動作を行うための例示的な技法を示す流れ図である。ＧＰＵ１０はメモリ転送動作を開始する（１３２）。ＧＰＵ１０は、ソース領域内のピクセル位置と関連付けられるソースデータを読み取るための読取り要求をメモリサブシステム８（例えば、メモリコントローラ２０またはメモリ２２）に出す（１３４）。
【０２００】
[0223]  ＧＰＵ１０は、出された読取り要求の数が第１の閾値以上かどうかを決定する（１３６）。出された読取り要求の数が第１の閾値以上ではないと決定したことに応答して、ＧＰＵ１０は別の読取り要求を出す（１３４）。ＧＰＵ１０は、出された読取り要求の数が第１の閾値以上になるまで、読取り要求を出し続ける。出された読取り要求の数が第１の閾値以上であると決定したことに応答して、ＧＰＵ１０は読取り要求を出すことを止める（１３８）。
【０２０１】
[0224]  ＧＰＵ１０は、消費されていないソースデータの量が第１の閾値以上かどうかを決定する（１４０）。消費されていないソースデータの量が第１の閾値以上ではないと決定したことに応答して、ＧＰＵ１０は読取り要求を出すことを止め続ける（１３８）。消費されていないソースデータの量が第１の閾値以上であると決定したことに応答して、ＧＰＵ１０は、ソースデータを消費することと、ソースデータに基づいて宛先データを生成することと、書込み要求を出すこととを開始する（１４２）。
【０２０２】
[0225]  ＧＰＵ１０は、消費されていないソースデータの量が第２の閾値以下かどうかを決定する（１４４）。第２の閾値は第１の閾値よりも小さくてよい。消費されていないソースデータの量が第２の閾値以下ではないと決定したことに応答して、ＧＰＵ１０は、ソースデータを消費することと、宛先データを生成することと、書込み要求を出すこととを続ける（１４２）。ＧＰＵ１０は、消費されていないソースデータの量が第２の閾値以下になるまで、ソースデータを消費することと、宛先データを生成することと、書込み要求を出すこととを続ける。消費されていないソースデータの量が第２の閾値以下であると決定したことに応答して、ＧＰＵ１０は、ソースデータを消費することと、宛先データを生成することと、書込み要求を出すこととを止める（１４６）。
【０２０３】
[0226]  また、消費されていないソースデータの量が第２の閾値以下であると決定したことに応答して、ＧＰＵ１０は、メモリ転送動作の一部として読み取るべきさらなるデータがあれば、読取り要求を出すことを再開し得る。例えば、ＧＰＵ１０は、読み取るべきさらなるデータがあるかどうかを決定する（１４８）。読み取るべきさらなるデータがある場合、ＧＰＵ１０は、ボックス１３４を処理することに進み、後続の読取り要求を出す。読み取るべきさらなるデータがない場合、ＧＰＵ１０はメモリ転送動作を完了する（１５０）。
【０２０４】
[0227]  図１７は、本開示の順次的同期モードによる、読取り要求を出すための例示的な技法を示す流れ図である。読取りエンジン３８はメモリ転送動作を開始する（１５２）。読取りエンジン３８は、ソース領域内のピクセル位置と関連付けられるソースデータを読み取るための読取り要求をメモリサブシステム８（例えば、メモリコントローラ２０またはメモリ２２）に出す（１５４）。
【０２０５】
[0228]  読取りエンジン３８は、出された読取り要求の数が第１の閾値以上かどうかを決定する（１５６）。出された読取り要求の数が第１の閾値以上ではないと決定したことに応答して、読取りエンジン３８は別の読取り要求を出す（１５４）。読取りエンジン３８は、出された読取り要求の数が第１の閾値以上になるまで、読取り要求を出し続ける。出された読取り要求の数が第１の閾値以上であると決定したことに応答して、読取りエンジン３８は読取り要求を出すことを止める（１５８）。
【０２０６】
[0229]  読取りエンジン３８は、消費されていないソースデータの量が第２の閾値以下かどうかを決定する（１６０）。第２の閾値は第１の閾値よりも小さくてよい。消費されていないソースデータの量が第２の閾値以下ではないと決定したことに応答して、読取りエンジン３８は読取り要求を出すことを止め続ける（１５８）。読取りエンジン３８は、消費されていないソースデータの量が第２の閾値以下になるまで、読取り要求を出すことを止め続ける。
【０２０７】
[0230]  消費されていないソースデータの量が第２の閾値以下であると決定したことに応答して、ＧＰＵ１０は、メモリ転送動作の一部として読み取るべきさらなるデータがあれば、読取り要求を出すことを再開し得る。例えば、ＧＰＵ１０は、読み取るべきさらなるデータがあるかどうかを決定する（１６２）。読み取るべきさらなるデータがある場合、ＧＰＵ１０は、ボックス１５４を処理することに進み、後続の読取り要求を出す。読み取るべきさらなるデータがない場合、ＧＰＵ１０はメモリ転送動作を完了する（１６４）。
【０２０８】
[0231]  図１８は、本開示の順次的同期モードによる、書込み要求を出すための例示的な技法を示す流れ図である。書込みエンジン４０はメモリ転送動作を開始する（１６６）。
【０２０９】
[0232]  書込みエンジン４０は、消費されていないソースデータの量が第１の閾値以上になるまで待機する。例えば、書込みエンジン４０は、消費されていないソースデータの量が第１の閾値以上かどうかを決定する（１６８）。消費されていないソースデータの量が第１の閾値以上ではないと決定したことに応答して、書込みエンジン４０は待ち続ける。消費されていないソースデータの量が第１の閾値以上であると決定したことに応答して、書込みエンジン４０は、ソースデータを消費することと、ソースデータに基づいて宛先データを生成することと、書込み要求を出すこととを開始する（１７０）。
【０２１０】
[0233]  書込みエンジン４０は、消費されていないソースデータの量が第２の閾値以下かどうかを決定する（１７２）。第２の閾値は第１の閾値よりも小さくてよい。消費されていないソースデータの量が第２の閾値以下ではないと決定したことに応答して、書込みエンジン４０は、ソースデータを消費することと、宛先データを生成することと、書込み要求を出すこととを続ける（１７０）。書込みエンジン４０は、消費されていないソースデータの量が第２の閾値以下になるまで、ソースデータを消費することと、宛先データを生成することと、書込み要求を出すこととを続ける。消費されていないソースデータの量が第２の閾値以下であると決定したことに応答して、書込みエンジン４０は、ソースデータを消費することと、宛先データを生成することと、書込み要求を出すこととを止める（１７４）。
【０２１１】
[0234]  書込みエンジン４０は、消費されていないソースデータの量が第１の閾値以上になるまで、ソースデータを消費することと、宛先データを生成することと、書込み要求を出すこととを止め得る。メモリ転送動作の一部として消費すべきさらなるデータがあれば、書込みエンジン４０は、消費されていないソースデータの量が第１の閾値以上であると決定したことに応答して、ソースデータを消費することと、宛先データを生成することと、書込み要求を出すこととを再開し得る。例えば、書込みエンジン４０は、メモリ転送動作の一部として消費すべきさらなるデータがあるかどうかを決定する（１７６）。消費すべきさらなるデータがある場合、書込みエンジン４０は、決定ボックス１６８に進み、消費されていないソースデータの量が第１の閾値以上である待機する。メモリ転送動作の一部として消費すべきさらなるデータがない場合、書込みエンジン４０はメモリ転送動作を完了する（１７８）。
【０２１２】
[0235]  図１９は、本開示の順次的メモリ転送モードによる、メモリ転送動作を行うための例示的な技法を示す流れ図である。ＧＰＵ１０はメモリ転送動作を開始する（１８０）。ＧＰＵ１０は読取りエンジン３８をアクティブ化する（１８２）。読取りエンジン３８がアクティブ化されると、読取りエンジン３８は、読取りエンジン３８が非アクティブ化されるまで、読取り要求を出す。
【０２１３】
[0236]  読取りエンジン３８は、出された読取り要求の数が第１の閾値以上になるまで、アクティブ化されたままである。例えば、ＧＰＵ１０は、出された読取り要求の数が第１の閾値以上かどうかを決定する（１８４）。出された読取り要求の数が第１の閾値以上ではないと決定したことに応答して、ＧＰＵ１０は決定ブロック１８４に戻る。出された読取り要求の数が第１の閾値以上であると決定したことに応答して、ＧＰＵ１０は読取りエンジン３８を非アクティブ化する（１８６）。読取りエンジン３８が非アクティブ化されると、読取りエンジン３８は読取り要求を出すことを止め得る。
【０２１４】
[0237]  ＧＰＵ１０は、消費されていないソースデータの量が第１の閾値以上になるまで待機する。例えば、ＧＰＵ１０は、消費されていないソースデータの量が第１の閾値以上かどうかを決定する（１８８）。消費されていないソースデータの量が第１の閾値以上ではないと決定したことに応答して、ＧＰＵ１０は決定ブロック１８８に戻る。消費されていないソースデータの量が第１の閾値以上であると決定したことに応答して、ＧＰＵ１０は書込みエンジン４０をアクティブ化する（１９０）。書込みエンジン４０がアクティブ化されると、書込みエンジン４０は、ソースデータを消費し、ソースデータに基づいて宛先データを生成し、宛先データをメモリ２２に書き込むための書込み要求を出す。
【０２１５】
[0238]  書込みエンジン４０は、消費されていないソースデータの量が第２の閾値以下になるまで、アクティブ化されたままである。例えば、ＧＰＵ１０は、消費されていないソースデータの量が第２の閾値以下かどうかを決定する（１９２）。第２の閾値は第１の閾値よりも小さくてよい。消費されていないソースデータの量が第２の閾値以下ではないと決定したことに応答して、ＧＰＵ１０は決定ブロック１９２に戻る。消費されていないソースデータの量が第２の閾値以下であると決定したことに応答して、ＧＰＵ１０は書込みエンジン４０を非アクティブ化する（１９４）。書込みエンジン４０が非アクティブ化されると、書込みエンジン４０は、ソースデータを消費することと、宛先データを生成することと、書込み要求を出すこととを止め得る。
【０２１６】
[0239]  また、消費されていないソースデータの量が第２の閾値以下であると決定したことに応答して、ＧＰＵ１０は、メモリ転送動作の一部として読み取るべきさらなるデータがあれば、読取りエンジン３８を最アクティブ化し得る。例えば、ＧＰＵ１０は、読み取るべきさらなるデータがあるかどうかを決定する（１９６）。読み取るべきさらなるデータがある場合、ＧＰＵ１０は、ボックス１８２を処理することに進み、読取りエンジン３８をアクティブ化する。読み取るべきさらなるデータがない場合、ＧＰＵ１０はメモリ転送動作を完了する（１９８）。
【０２１７】
[0240]  図２０は、本開示によるメモリ転送動作を行うための例示的な技法を示す流れ図である。図２０の技法は、例示を目的に、図１および図２に示されたコンピューティングデバイス２によって行われるものとして説明される。他の例では、図２０に示される技法は、同じ構成または異なる構成の、同じコンポーネントまたは異なるコンポーネントを有する他のシステムで実装され得る。
【０２１８】
[0241]  ＣＰＵ６および／またはＧＰＵ  １０は、メモリ転送動作のすべてまたは一部を行うためのメモリ転送モードを選択する（２０２）。いくつかの例では、メモリ転送モードは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含む、少なくとも２つの異なるメモリ転送モードのセットから選択され得る。
【０２１９】
[0242]  ＧＰＵ１０は、選択されたメモリ転送モードに基づいてメモリ転送動作を行う（２０４）。例えば、ＧＰＵ１０は、メモリ転送動作を行うためのメモリ転送モードとしてインターリーブメモリ転送モードが選択されたことに応答して、インターリーブメモリ転送モードに基づいてメモリ転送動作を行い得る。別の例として、ＧＰＵ１０は、メモリ転送動作を行うためのメモリ転送モードとして順次的メモリ転送モードが選択されたことに応答して、順次的メモリ転送モードに基づいてメモリ転送動作を行い得る。
【０２２０】
[0243]  いくつかの例では、ＧＰＵ１０は、少なくとも２つの異なるメモリ転送モードのセットから選択された第１のメモリ転送モードを使用して、メモリ転送動作の第１の部分を行い、少なくとも２つの異なるメモリ転送モードのセットから選択された第２のメモリ転送モードを使用して、メモリ転送動作の第２の部分を行い得る。
【０２２１】
[0244]  図２１〜図２２および図２４〜図２６は、本開示によるメモリ転送動作を行うためのメモリ転送モードを選択するための様々な技法を示す。図２１〜図２２および図２４〜図２６に示される技法は、例示を目的に、図１および図２に示されたコンピューティングデバイス２によって行われるものとして説明される。他の例では、図２１〜図２２および図２４〜図２６に示される技法は、同じ構成または異なる構成の、同じコンポーネントまたは異なるコンポーネントを有する他のシステムで実装され得る。
【０２２２】
[0245]  図２１は、本開示による、メモリ転送動作によって転送されるべきデータの量に基づいてメモリ転送動作を行うためのメモリ転送モードを選択するための、例示的な技法を示す流れ図である。いくつかの例では、図２１に示される技法は、図２０に示される処理ブロック２０２を実施するために使用され得る。
【０２２３】
[0246]  ＣＰＵ６および／またはＧＰＵ１０は、メモリ転送動作のサイズを決定する（２０６）。メモリ転送動作のサイズは、メモリ転送動作によって転送されるべきデータの量に対応し得る。いくつかの例では、メモリ転送動作のサイズはメモリ転送コマンドで規定され得る。さらなる例では、ＣＰＵ６および／またはＧＰＵ１０は、ソース領域および宛先領域の寸法に基づいて、および、メモリ転送動作で使用されるソース領域の数に基づいて、メモリ転送動作のサイズを決定し得る。
【０２２４】
[0247]  ＣＰＵ６および／またはＧＰＵ１０は、メモリ転送動作のサイズが閾値より大きいかどうかを決定する（２０８）。メモリ転送動作のサイズが閾値より大きくない場合、ＣＰＵ６および／またはＧＰＵ１０は、メモリ転送動作のすべてまたは一部を行うために使用されるべきメモリ転送モードとして、インターリーブメモリ転送モードを選択する（２１０）。メモリ転送動作のサイズが閾値より大きい場合、ＣＰＵ６および／またはＧＰＵ１０は、メモリ転送動作のすべてまたは一部を行うために使用されるべきメモリ転送モードとして、順次的メモリ転送モードを選択する（２１２）。
【０２２５】
[0248]  図２２は、本開示による、メモリ転送動作の宛先領域が有する固定されたスクリーン整列されたバッファ領域との重複の量に基づいてメモリ転送動作を行うためのメモリ転送モードを選択するための、例示的な技法を示す流れ図である。いくつかの例では、図２２に示される技法は、図２０に示される処理ブロック２０２を実施するために使用され得る。
【０２２６】
[0249]  ＣＰＵ６および／またはＧＰＵ１０は、メモリ転送動作のために定義される宛先領域のスクリーン配置を決定する（２１４）。スクリーン配置は、スクリーン空間における宛先領域の位置を指し得る。いくつかの例では、ＣＰＵ６および／またはＧＰＵ１０は、メモリ転送コマンドで受け取られたデータに基づいてスクリーン配置を決定し得る。
【０２２７】
[0250]  ＣＰＵ６および／またはＧＰＵ１０は、宛先領域と少なくとも部分的に重複する、スクリーン整列されたバッファ領域を選択する（２１６）。図２３は、複数のスクリーン整列されたバッファ領域（すなわち、タイル１〜２０）と宛先面２１８を伴うスクリーンを示す概念図である。図２３に示されるように、スクリーン整列されたバッファ領域１〜４、６〜９、および１１〜１４は、宛先面２１８と少なくとも部分的に重複するが、スクリーン整列されたバッファ領域５、１０、１５、および１６〜２０は、宛先面２１８とはまったく重複しない。
【０２２８】
[0251]  ＣＰＵ６および／またはＧＰＵ１０は、宛先領域が選択されたスクリーン整列されたバッファ領域と完全に重複するかどうかを決定する（２２０）。言い換えると、ＣＰＵ６および／またはＧＰＵ１０は、宛先領域が選択され固定されたスクリーン整列されたバッファ領域を完全に覆うかどうかを決定し得る。宛先領域が選択されたスクリーン整列されたバッファ領域と完全には重複しない場合（例えば、宛先領域が選択されたスクリーン整列されたバッファ領域を完全には覆わない場合）、ＣＰＵ６および／またはＧＰＵ１０は、選択されたスクリーン整列されたバッファ領域に関してメモリ転送動作を行うために、メモリ転送モードとしてインターリーブメモリ転送モードを選択する（２２２）。そうではなく、宛先領域が選択されたスクリーン整列されたバッファ領域と完全に重複する場合（例えば、宛先領域が選択されたスクリーン整列されたバッファ領域を完全に覆う場合）、ＣＰＵ６および／またはＧＰＵ１０は、選択されたスクリーン整列されたバッファ領域に関してメモリ転送動作を行うために、メモリ転送モードとして順次的メモリ転送モードを選択する（２２４）。
【０２２９】
[0252]  例えば、図２３に関して、宛先領域２１８は、固定されたスクリーン整列されたバッファ領域７と、８と、９とを完全に覆う。従って、ＣＰＵ６および／またはＧＰＵ１０は、スクリーン整列されたバッファ領域７、８、および９に関してメモリ転送動作を行うために、順次的メモリ転送モードを選択し得る。同様に、宛先領域２１８は、スクリーン整列されたバッファ領域１〜４と、６と、１１〜１４とを部分的に覆うが、完全には覆わない。従って、ＣＰＵ６および／またはＧＰＵ１０は、スクリーン整列されたバッファ領域１〜４、６、および１１〜１４に関してメモリ転送動作を行うために、インターリーブメモリ転送モードを選択し得る。
【０２３０】
[0253]  いくつかの場合には、面は、ディスプレイモニタまたはスクリーンに含まれるピクセルに対応し得る。スクリーンは、読み取られたデータを記憶するために使用されるバッファのサイズに対応する固定されたサイズを各々有する、複数の領域へと細分化され得る。これらの細分化された領域は、固定されたスクリーン整列されたバッファ領域と呼ばれ得る。そのような例では、順次的メモリ転送モードで動作するとき、ＧＰＵ１０は、固定されたスクリーン整列されたバッファ領域のサイズに対応する固定されたサイズのデータユニットで、メモリ２２とＧＰＵ１０との間でデータを転送するように構成され得る。
【０２３１】
[0254]  宛先領域が、完全にではなく部分的に、特定の固定されたスクリーン整列されたバッファ領域を覆う場合、ＣＰＵ６および／またはＧＰＵ１０は、読み取られたデータが記憶されるバッファが完全には利用されていないので、スクリーンのその領域のためのメモリ転送モードとしてインターリーブメモリ転送モードを選択し得る。そのような場合に順次的メモリモードが選択された場合、固定されたサイズのメモリ読取りは、無関係なデータをメモリから読み取らせ、これは、順次的メモリ転送モードを使用することによって発生するであろう読取り−書込み転換の減少より重大であり得る。一方、宛先領域が完全に特定の固定されたスクリーン整列されたバッファ領域を覆う場合、ＣＰＵ６および／またはＧＰＵ１０は、読み取られたデータが記憶されるバッファが完全に利用され無関係なデータを取り出すことで時間が無駄にされないので、スクリーンのその領域のためのメモリ転送モードとして順次的メモリ転送モードを選択し得る。
【０２３２】
[0255]  いくつかの例では、メモリ転送動作は、メモリ転送動作の宛先領域に空間的に対応する１つまたは複数のプリミティブをレンダリングし、ソース領域データに対応するテクスチャをレンダリングされた１つまたは複数のプリミティブに適用し、１つまたは複数のプリミティブをフレームバッファにすでに記憶されている任意の宛先データと統合することによって、ＧＰＵ１０によって実施され得る。そのような例では、ＣＰＵ６および／またはＧＰＵ１０は、レンダリングされるべきプリミティブが有する固定されたスクリーン整列されたバッファ領域との重複の量に基づいて、固定されたスクリーン整列されたバッファ領域に関してメモリ転送動作を行うためのメモリ転送モードを選択し得る。例えば、ＣＰＵ６および／またはＧＰＵ１０は、レンダリングされるべきプリミティブが固定されたスクリーン整列されたバッファ領域を完全に覆う場合、メモリ転送モードとして順次的メモリ転送モードを選択し、レンダリングされるべきプリミティブが固定されたスクリーン整列されたバッファ領域を完全には覆わない場合、メモリ転送モードとしてインターリーブメモリ転送モードを選択し得る。
【０２３３】
[0256]  図２４は、本開示による、メモリ転送動作を行うために使用されるシェーダプログラムの複雑さに基づいてメモリ転送動作を行うためのメモリ転送モードを選択するための、例示的な技法を示す流れ図である。いくつかの例では、図２４に示される技法は、図２０に示される処理ブロック２０２を実施するために使用され得る。
【０２３４】
[0257]  ＣＰＵ６および／またはＧＰＵ１０は、メモリ転送動作を行うために使用されるシェーダプログラムの複雑さを決定する（２２６）。シェーダプログラムは、いくつかの例では、ピクセルシェーダプログラムであり得る。いくつかの例では、シェーダプログラムの複雑さは、シェーダプログラムのサイズに対応し得る。さらなる例では、シェーダプログラムの複雑さは、シェーダプログラムによって行われるべき計算の数に対応する。さらなる例では、シェーダプログラムの複雑さは、シェーダプログラムによって行われるべきループまたは繰り返しの数に対応し得る。
【０２３５】
[0258]  ＣＰＵ６および／またはＧＰＵ１０は、シェーダプログラムの複雑さが閾値より大きいかどうかを決定する（２２８）。シェーダプログラムの複雑さが閾値より大きくない場合、ＣＰＵ６および／またはＧＰＵ１０は、メモリ転送動作のすべてまたは一部を行うために使用されるべきメモリ転送モードとして、順次的メモリ転送モードを選択し得る（２３０）。シェーダプログラムの複雑さが閾値より大きい場合、ＣＰＵ６および／またはＧＰＵ１０は、メモリ転送動作のすべてまたは一部を行うために使用されるべきメモリ転送モードとして、インターリーブメモリ転送モードを選択し得る（２３２）。
【０２３６】
[0259]  図２５は、本開示による、メモリ転送動作を行うために使用されるシェーダプログラムのサイズに基づいてメモリ転送動作を行うためのメモリ転送モードを選択するための、例示的な技法を示す流れ図である。いくつかの例では、図２５に示される技法は、図２０に示される処理ブロック２０２を実施するために使用され得る。
【０２３７】
[0260]  ＣＰＵ６および／またはＧＰＵ１０は、メモリ転送動作を行うために使用されるシェーダプログラムのサイズを決定する（２３４）。シェーダプログラムは、いくつかの例では、ピクセルシェーダプログラムであり得る。いくつかの例では、シェーダプログラムのサイズは、シェーダプログラム中の命令の数に対応し得る。さらなる例では、シェーダプログラムのサイズは、シェーダプログラム中のバイトの数に対応し得る。
【０２３８】
[0261]  ＣＰＵ６および／またはＧＰＵ１０は、シェーダプログラムのサイズが閾値より大きいかどうかを決定する（２３６）。シェーダプログラムのサイズが閾値より大きくない場合、ＣＰＵ６および／またはＧＰＵ１０は、メモリ転送動作のすべてまたは一部を行うために使用されるべきメモリ転送モードとして、順次的メモリ転送モードを選択し得る（２３８）。シェーダプログラムのサイズが閾値より大きい場合、ＣＰＵ６および／またはＧＰＵ１０は、メモリ転送動作のすべてまたは一部を行うために使用されるべきメモリ転送モードとして、インターリーブメモリ転送モードを選択し得る（２４０）。
【０２３９】
[0262]  図２６は、本開示による、シェーダプログラムの実行がメモリ転送動作の性能のボトルネックになる可能性が高いかどうかの決定に基づいてメモリ転送動作を行うためのメモリ転送モードを選択するための例示的な技法を示す流れ図である。いくつかの例では、図２６に示される技法は、図２０に示される処理ブロック２０２を実施するために使用され得る。
【０２４０】
[0263]  ＣＰＵ６および／またはＧＰＵ１０は、シェーダプログラムの実行がメモリ転送動作の性能のボトルネックになる可能性が高いという決定を行う（２４２）。シェーダプログラムは、インスいくつかの例、ピクセルシェーダプログラムであり得る。いくつかの例では、ＣＰＵ６および／またはＧＰＵ１０は、シェーダプログラムの複雑さおよび／またはシェーダプログラムのサイズに基づいて決定を行い得る。
【０２４１】
[0264]  シェーダプログラムの実行がメモリ転送動作の性能のボトルネックになる可能性が高くない（例えば、シェーダプログラムのサイズおよび／または複雑さが閾値より小さい）場合、ＣＰＵ６および／またはＧＰＵ１０は、メモリ転送動作のすべてまたは一部を行うために使用されるべきメモリ転送モードとして、順次的メモリ転送モードを選択し得る（２４４）。シェーダプログラムの実行がメモリ転送動作の性能のボトルネックになる可能性が高い（例えば、シェーダプログラムのサイズおよび／または複雑さが閾値より大きい）場合、ＣＰＵ６および／またはＧＰＵ１０は、メモリ転送動作のすべてまたは一部を行うために使用されるべきメモリ転送モードとして、インターリーブメモリ転送モードを選択し得る（２４６）。
【０２４２】
[0265]  図２７は、本開示によるメモリ転送動作を行うための例示的な技法を示す流れ図である。いくつかの例では、図２７に示される技法は、図２０に示される処理ブロック２０４を実施するために使用され得る。
【０２４３】
[0266]  ＧＰＵ１０は、順次的メモリ転送モードまたはインターリーブメモリ転送モードが選択されたかどうかを決定する（２４８）。順次的メモリ転送モードが選択されていない（すなわち、インターリーブメモリ転送モードが選択されている）場合、ＧＰＵ１０は、メモリ転送動作を行うために使用されるキャッシュのキャッシュラインサイズを、第１のサイズとなるように構成し得る（２５０）。順次的メモリ転送モードが選択されている（すなわち、インターリーブメモリ転送モードが選択されている）場合、ＧＰＵ１０は、メモリ転送動作を行うために使用されるキャッシュのキャッシュラインサイズを、第２のサイズとなるように構成し得る（２５２）。第２のサイズは第１のサイズよりも大きくてよい。いくつかの例では、第２のサイズは、キャッシュの容量全体に等しいキャッシュラインサイズに対応してよく、第１のサイズは、キャッシュの容量全体以下のキャッシュラインサイズに対応してよい。
【０２４４】
[0267]  本開示のいくつかの態様によれば、メモリ転送動作を行うためにＧＰＵによって使用されるべきメモリ転送モードをシグナリングするための技法が説明される。シグナリング技法は、アプリケーションプロセッサ上で実行するＧＰＵドライバおよび／またはユーザアプリケーションが、メモリ転送動作を行うために使用されるメモリ転送モードを制御することを可能にし得る。
【０２４５】
[0268]  いくつかの例では、メモリ転送モードを規定する情報フィールドは、ＧＰＵ命令セットアーキテクチャ（ＩＳＡ）に含まれる１つまたは複数の既存のＧＰＵコマンドに追加され得る。情報フィールドは、いくつかの場合には、命令と関連付けられるメモリ転送動作のために使用されるべきメモリ転送モードを規定する、単一のモードビットであり得る。例えば、グラフィックスドライバは、ソースメモリ領域と宛先メモリ領域とをＧＰＵに対して規定し、（３次元の）３Ｄ描画呼出し命令をＧＰＵに出すことによって、ユーザレベルのブリット命令にサービスし得る。３Ｄ描画呼出し命令は、３Ｄ描画呼出し命令の実行中に使用されるべきメモリ転送モードを示すモードビットを含み得る。ＧＰＵは、命令に規定されるメモリ転送モードに基づいてメモリ転送動作を行うように構成され得る。
【０２４６】
[0269]  追加の例では、ＧＰＵは、メモリ転送動作を行うために使用されるべきメモリ転送モードを規定する、メモリ転送モード状態変数を含み得る。そのような例では、追加の命令は、ＧＰＵ  ＩＳＡに含まれる命令に追加され得る。追加の命令は、メモリ転送モード状態変数の状態を、メモリ転送動作を行うために使用されるべきメモリ転送モードを示す値へとプログラムするために使用され得る。ＧＰＵは、メモリ転送モード状態変数の状態に基づいてメモリ転送動作を行うように構成され得る。
【０２４７】
[0270]  さらなる例では、命令は、ＧＰＵドライバのためのアプリケーションプログラミングインターフェース（ＡＰＩ）に追加され得る。命令は、メモリ転送動作を行うために使用されるべきメモリ転送モードを示す、メモリ転送モードインジケータを含み得る。ＧＰＵドライバは、ＧＰＵに、メモリ転送モードインジケータに基づいてメモリ転送動作を行わせるように構成され得る。このようにして、ユーザアプリケーションは、メモリ転送動作を行うときにＧＰＵによって使用されるべきメモリ転送モードを規定可能であり得る。
【０２４８】
[0271]  本開示の例示的な態様は、データがインターリーブされるのではなく順番にまず読み込まれ次いで書き出されることを可能にするために、内部メモリバッファを使用することを含む。本開示の例示的な態様はさらに、ラスタ化パターンとのプリミティブの重複に基づいて、内部バッファを使用して自動的にラスタ化するための選択アルゴリズムを含む。従って、プリミティブトライアングルは、「狭い」セクションのために内部バッファを使用しなくてよいが、「広い」セクションのために「順次的モード」に切り替える。本開示の例示的な態様はさらに、「順次的モード」が使用されることを可能にすべきかどうかを示すモードビットを含む。モードビットは、動作がメモリ効率の限られているものであると推定されるかどうかに基づいて設定され得る。例示的な実装形態は、既存のキャッシュを使用するが、「順次的モード」の間はより大きなキャッシュラインを使用するために動作を変更することを伴い得る。
【０２４９】
[0272]  いくつかの例では、ＧＰＵドライバおよび／またはユーザアプリケーションは、（一方または他方をＧＰＵに行わせるのではなく）異なるメモリ転送モードの選択を可能にし得る。そのような例では、ＧＰＵは、いくつかの例では、ランタイム(run-time)中にＧＰＵによって発見される情報に基づいて、メモリ転送動作のために使用されるべきメモリ転送モードの最終的な決定を行い得る。
【０２５０】
[0273]  本開示で説明された技法は、少なくとも部分的に、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。例えば、説明された技法の様々な態様は、１つもしくは複数のマイクロプロセッサ、デジタル信号プロセッサ（ＤＳＰ）、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、または、任意の他の等価な集積回路またはディスクリート論理回路を含む、１つもしくは複数のプロセッサの中で、ならびにそのようなコンポーネントの任意の組合せの中で実装され得る。「プロセッサ」または「処理回路」という用語は、一般に、単独で、あるいは、他の論理回路または処理を行う個別ハードウェアなどの他の等価な回路との組合せで、上記の論理回路のいずれかを指し得る。
【０２５１】
[0274]  そのようなハードウェア、ソフトウェア、およびファームウェアは、本開示で説明される様々な動作および機能をサポートするために、同じデバイス内で、または別のデバイス内で実装され得る。さらに、説明されたユニット、モジュール、またはコンポーネントのいずれもが、個別であるが相互動作可能な論理デバイスとして、一緒に、または別々に実装され得る。モジュールまたはユニットとしての様々な機能の図は、様々な機能的態様を強調することが意図され、そのようなモジュールまたはユニットが別々のハードウェアまたはソフトウェアコンポーネントによって実現されなければならないことを必ずしも暗示しない。そうではなく、１つもしくは複数のモジュールまたはユニットと関連付けられる機能は、別々のハードウェアコンポーネント、ファームウェアコンポーネント、および／またはソフトウェアコンポーネントによって行われてよく、あるいは共通もしくは別々のハードウェアコンポーネント内またはソフトウェアコンポーネント内に組み込まれてよい。
【０２５２】
[0275]  また、本開示で説明される技法は、命令を記憶するコンピュータ可読記憶媒体のようなコンピュータ可読媒体中に、記憶され、具現化され、または符号化され得る。コンピュータ可読媒体中に埋め込まれるか、または符号化される命令は、例えば、それらの命令が１つまたは複数のプロセッサによって実行されたとき、１つまたは複数のプロセッサに本明細書で説明される技法を行わせ得る。コンピュータ可読記憶媒体は、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、プログラマブル読取り専用メモリ（ＰＲＯＭ）、消去可能プログラマブル読取り専用メモリ（ＥＰＲＯＭ）、電気的消去可能プログラマブル読取り専用メモリ（ＥＥＰＲＯＭ）、フラッシュメモリ、ハードディスク、ＣＤ−ＲＯＭ、フロッピー（登録商標）ディスク、カセット、磁気媒体、光学媒体、または他の有形のコンピュータ可読記憶媒体を含み得る。
【０２５３】
[0276]  コンピュータ可読媒体は、上で列挙されたような有形記憶媒体に対応するコンピュータ可読記憶媒体を含み得る。コンピュータ可読媒体はまた、例えば、通信プロトコルに従って、ある場所から別の場所へのコンピュータプログラムの転送を可能にする任意の媒体を含む通信媒体を備え得る。このようにして、「コンピュータ可読媒体」という句は、一般に、（１）非一時的である有形コンピュータ可読記憶媒体、および（２）一時的な信号または搬送波のような非有形コンピュータ可読通信媒体に対応し得る。
【０２５４】
[0277]  様々な態様および例が説明されてきた。しかしながら、以下の特許請求の範囲から逸脱することなく、本開示の構造または技法に変更が行われ得る。
以下に本願の出願当初の特許請求の範囲に記載された発明を付記する。
[Ｃ１]  １つまたは複数のプロセッサによって、メモリ転送動作の少なくとも一部を行うためのメモリ転送モードを選択することと、ここにおいて、前記メモリ転送モードは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含む少なくとも２つの異なるメモリ転送モードのセットから選択される、
グラフィックスプロセッシングユニット（ＧＰＵ）によって、前記選択されたメモリ転送モードに基づいて前記メモリ転送動作を行うことと
を備える方法。
[Ｃ２]  前記１つまたは複数のプロセッサによって前記メモリ転送モードを選択することが、
前記１つまたは複数のプロセッサによって、前記メモリ転送動作によって転送されるべきデータの量に基づいて前記メモリ転送モードを選択することを備える、Ｃ１に記載の方法。
[Ｃ３]  前記１つまたは複数のプロセッサによって、前記メモリ転送動作によって転送されるべきデータの前記量に基づいて前記メモリ転送モードを選択することが、
前記メモリ転送動作によって転送されるべきデータの前記量が閾値より大きい場合、前記１つまたは複数のプロセッサによって、前記メモリ転送モードとして前記順次的メモリ転送モードを選択することと、
前記メモリ転送動作によって転送されるべきデータの前記量が前記閾値より大きくない場合、前記１つまたは複数のプロセッサによって、前記メモリ転送モードとして前記インターリーブメモリ転送モードを選択することとを備える、Ｃ２に記載の方法。
[Ｃ４]  前記１つまたは複数のプロセッサによって前記メモリ転送モードを選択することが、
前記１つまたは複数のプロセッサによって、メモリ転送動作の宛先領域が有する固定されたスクリーン整列されたバッファ領域との重複の量に基づいて、前記固定されたスクリーン整列されたバッファ領域に関して前記メモリ転送動作を行うためのメモリ転送モードを選択することを備える、Ｃ１に記載の方法。
[Ｃ５]  前記１つまたは複数のプロセッサによって、前記メモリ転送動作の前記宛先領域が有する前記固定されたスクリーン整列されたバッファ領域との重複の量に基づいて、前記メモリ転送モードを選択することが、
前記宛先領域が前記固定されたスクリーン整列されたバッファ領域を完全に覆う場合、前記メモリ転送モードとして前記順次的メモリ転送モードを選択することと、
前記宛先領域が前記固定されたスクリーン整列されたバッファ領域を完全には覆わない場合、前記メモリ転送モードとして前記インターリーブメモリ転送モードを選択することとを備える、Ｃ４に記載の方法。
[Ｃ６]  前記メモリ転送動作を行うことがシェーダプログラムを実行することを備え、
前記１つまたは複数のプロセッサによって、前記メモリ転送モードを選択することが、前記シェーダプログラムの実行が前記メモリ転送動作の性能のボトルネックになる可能性が高いかどうかの決定に基づいて、前記メモリ転送モードを選択することを備える、Ｃ１に記載の方法。
[Ｃ７]  前記１つまたは複数のプロセッサによって、前記シェーダプログラムの前記実行が前記メモリ転送動作の前記性能のボトルネックになる可能性が高いかどうかの前記決定に基づいて、前記メモリ転送モードを選択することが、
前記シェーダプログラムの前記実行が前記メモリ転送動作の前記性能のボトルネックになる可能性が高くないと決定したことに応答して、前記メモリ転送モードとして前記順次的メモリ転送モードを選択することと、
前記シェーダプログラムの前記実行が前記メモリ転送動作の前記性能のボトルネックになる可能性が高いと決定したことに応答して、前記メモリ転送モードとして前記インターリーブメモリ転送モードを選択することとを備える、Ｃ６に記載の方法。
[Ｃ８]  前記メモリ転送動作を行うことがシェーダプログラムを実行することを備え、
前記１つまたは複数のプロセッサによって前記メモリ転送モードを選択することが、前記メモリ転送動作を行うために使用されるシェーダプログラムのサイズおよび前記メモリ転送動作を行うために使用される前記シェーダプログラムの複雑さの少なくとも１つに基づいて、前記メモリ転送モードを選択することを備える、Ｃ１に記載の方法。
[Ｃ９]  前記１つまたは複数のプロセッサによって、前記メモリ転送動作を行うために使用される前記シェーダプログラムの前記サイズおよび前記メモリ転送動作を行うために使用される前記シェーダプログラムの前記複雑さの前記少なくとも１つに基づいて、前記メモリ転送モードを選択することが、
前記シェーダプログラムの前記サイズと前記シェーダプログラムの前記複雑さの前記少なくとも１つが閾値より小さい場合、前記１つまたは複数のプロセッサによって、前記メモリ転送モードとして前記順次的メモリ転送モードを選択することと、
前記シェーダプログラムの前記サイズと前記シェーダプログラムの前記複雑さの前記少なくとも１つが前記閾値より小さくない場合、前記１つまたは複数のプロセッサによって、前記メモリ転送モードとして前記インターリーブメモリ転送モードを選択することとを備える、Ｃ８に記載の方法。
[Ｃ１０]  前記ＧＰＵによって前記メモリ転送動作を行うことが、
前記ＧＰＵによって、前記メモリ転送動作を行うための前記メモリ転送モードとしてインターリーブメモリ転送モードが選択されたことに応答して、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うことと、
前記ＧＰＵによって、前記メモリ転送動作を行うための前記メモリ転送モードとして順次的メモリ転送モードが選択されたことに応答して、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うこととを備える、Ｃ１に記載の方法。
[Ｃ１１]  前記ＧＰＵによって、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うことが、生産者−消費者パラダイムに基づいて、読取りエンジンに読取り要求を出させ、書込みエンジンに書込み要求を出させることを備え、
前記ＧＰＵによって、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うことが、相互排除のパラダイムに基づいて、前記読取りエンジンに読取り要求を出させ、前記書込みエンジンに書込み要求を出させることを備える、Ｃ１０に記載の方法。
[Ｃ１２]  前記ＧＰＵによって、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うことが、書込み要求を出すために十分なソースデータを前記ＧＰＵがメモリから受け取ったことに応答して、前記書込みエンジンに前記書込み要求を出させることと、前記書込み要求を出すために十分な前記ソースデータを前記書込みエンジンが消費したことに応答して、前記読取りエンジンに読取り要求を出させることとを備え、
前記ＧＰＵによって、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うことが、前記読取りエンジンおよび前記書込みエンジンに、別の時間間隔の間に、複数の連続的な読取り要求のグループを出すことと、複数の連続的な書込み要求のグループを出すこととを、交互に行わせることを備える、Ｃ１０に記載の方法。
[Ｃ１３]  前記ＧＰＵによって、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うことが、前記メモリ転送動作のための書込み要求を出すために十分なソースデータが前記ＧＰＵによってメモリから受け取られるたびに、前記書込みエンジンによって、少なくとも１つの他の書込み要求に対して後で受け取られるべき追加のソースデータを待機することなく、それぞれの前記ソースデータを消費することを備え、
前記ＧＰＵによって、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うことが、前記メモリ転送動作の少なくとも一部に対して、前記メモリ転送動作のための書込み要求を出すために十分なソースデータを前記ＧＰＵが前記メモリから受け取ったことに応答して、前記書込みエンジンによって、少なくとも１つの他の書込み要求を出すために十分な追加のソースデータが後で受け取られるまで前記ソースデータの消費を延期することを備える、Ｃ１０に記載の方法。
[Ｃ１４]  前記ＧＰＵによって、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うことが、前記メモリ転送動作のための書込み要求を出すために十分なソースデータを書込みエンジンが消費するたびに、読取りエンジンによって、少なくとも１つの他の書込み要求に対して前記書込みエンジンによって後で消費されるべき追加のソースデータを待機することなく、読取り要求を出すことを備え、
前記ＧＰＵによって、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うことが、前記メモリ転送動作の少なくとも一部に対して、前記メモリ転送動作のための書込み要求を出すために十分なソースデータを前記書込みエンジンが消費したことに応答して、読取りエンジンによって、少なくとも１つの他の書込み要求を出すために十分な追加のソースデータが前記書込みエンジンによって後で消費されるまで、後続の読取り要求の発行を延期することを備える、Ｃ１０に記載の方法。
[Ｃ１５]  前記ＧＰＵが、前記ＧＰＵによってメモリに出された読取り要求に応答して受け取られたソースデータを記憶するように構成されるバッファを備え、
前記ＧＰＵによって、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うことが、
１つまたは複数の読取り要求を出すことと、
前記複数の読取り要求に応答して前記メモリから受け取られたソースデータを前記バッファに配置することと、
前記複数の読取り要求の各々について、前記複数の読取り要求のそれぞれ１つに対して前記ソースデータが前記バッファに配置されたことに応答して、前記バッファに配置された前記ソースデータを消費し、前記消費されたソースデータに基づいて書込み要求を出すことと、
複数の書込み要求の各々について、前記書込み要求のそれぞれ１つに対してソースデータが前記バッファから消費されたことに応答して、後続の読取り要求を出すことと
を備え、
前記ＧＰＵによって、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うことが、
複数の読取り要求を出すことと、
前記複数の読取り要求に応答して前記メモリから受け取られたソースデータを前記バッファに配置することと、
前記バッファを埋めるために十分な読取り要求が出されたことを検出したことに応答して、読取り要求を出すことを止めることと、
前記バッファが満たされていることを検出したことに応答して、前記消費されたソースデータに基づいて、前記バッファ中のソースデータを消費し、複数の書込み要求を出すことと、
前記バッファが空であることを検出したことに応答して、前記バッファ中のソースデータを消費して書込み要求を出すことを止めることと、
前記バッファが空であることを検出したことに応答して、読取り要求の発行を再開することと
を備える、Ｃ１に記載の方法。
[Ｃ１６]  少なくとも２つの異なるメモリ転送モードの前記セットから選択された第１のメモリ転送モードを使用して、前記メモリ転送動作の第１の部分を行うことと、
少なくとも２つの異なるメモリ転送モードの前記セットから選択された第２のメモリ転送モードを使用して、前記メモリ転送動作の第２の部分を行うこととを備える、Ｃ１に記載の方法。
[Ｃ１７]  前記ＧＰＵによって前記メモリ転送動作を行うことが、
前記選択されたメモリ転送モードに基づいて、前記メモリ転送動作の間にメモリから取り出されるソースデータをバッファリングするために使用されるキャッシュのキャッシュラインサイズを選択することと、
前記選択されたキャッシュラインサイズに基づいて、前記メモリ転送動作のために前記キャッシュを構成することとを備える、Ｃ１に記載の方法。
[Ｃ１８]  前記キャッシュラインサイズを選択することが、
前記順次的メモリ転送モードが、前記メモリ転送動作を行うための前記メモリ転送モードとして選択されたことに応答して、前記キャッシュの容量全体に等しいキャッシュラインサイズを選択することと、
前記インターリーブメモリ転送モードが、前記メモリ転送動作を行うための前記メモリ転送モードとして選択されたことに応答して、前記キャッシュの前記容量全体より小さいキャッシュラインサイズを選択することとを備える、Ｃ１７に記載の方法。
[Ｃ１９]  前記１つまたは複数のプロセッサが前記ＧＰＵを備え、前記１つまたは複数のプロセッサによって前記メモリ転送モードを選択することが、前記ＧＰＵによって、前記メモリ転送動作の前記少なくとも一部を行うための前記メモリ転送モードを選択することを備える、Ｃ１に記載の方法。
[Ｃ２０]  前記１つまたは複数のプロセッサがＣＰＵを備え、前記１つまたは複数のプロセッサによって前記メモリ転送モードを選択することが、前記ＣＰＵによって、メモリ転送動作の前記少なくとも一部を行うための前記メモリ転送モードを選択することを備え、前記ＧＰＵに、前記選択されたメモリ転送モードに基づいて前記メモリ転送動作を行わせることをさらに備える、Ｃ１に記載の方法。
[Ｃ２１]  メモリ転送動作の少なくとも一部を行うためのメモリ転送モードを選択するように構成される１つまたは複数のプロセッサと、ここにおいて、前記メモリ転送モードは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含む少なくとも２つの異なるメモリ転送モードのセットから選択される、
前記選択されたメモリ転送モードに基づいて前記メモリ転送動作を行うように構成されるグラフィックスプロセッシングユニット（ＧＰＵ）と
を備えるデバイス。
[Ｃ２２]  前記１つまたは複数のプロセッサがさらに、前記メモリ転送動作によって転送されるべきデータの量に基づいて前記メモリ転送モードを選択するように構成される、Ｃ２１に記載のデバイス。
[Ｃ２３]  前記１つまたは複数のプロセッサがさらに、前記メモリ転送動作によって転送されるべきデータの前記量が閾値より大きい場合、前記メモリ転送モードとして前記順次的メモリ転送モードを選択し、前記メモリ転送動作によって転送されるべきデータの前記量が前記閾値より大きくない場合、前記メモリ転送モードとして前記インターリーブメモリ転送モードを選択するように構成される、Ｃ２２に記載のデバイス。
[Ｃ２４]  前記１つまたは複数のプロセッサがさらに、メモリ転送動作の宛先領域が有する固定されたスクリーン整列されたバッファ領域との重複の量に基づいて、前記固定されたスクリーン整列されたバッファ領域に関して前記メモリ転送動作を行うためのメモリ転送モードを選択するように構成される、Ｃ２１に記載のデバイス。
[Ｃ２５]  前記１つまたは複数のプロセッサがさらに、前記宛先領域が前記固定されたスクリーン整列されたバッファ領域を完全に覆う場合、前記メモリ転送モードとして前記順次的メモリ転送モードを選択し、前記宛先領域が前記固定されたスクリーン整列されたバッファ領域を完全には覆わない場合、前記メモリ転送モードとして前記インターリーブメモリ転送モードを選択するように構成される、Ｃ２４に記載のデバイス。
[Ｃ２６]  前記ＧＰＵがさらに、前記メモリ転送動作を行うためにシェーダプログラムを実行するように構成され、前記１つまたは複数のプロセッサがさらに、前記シェーダプログラムの実行が前記メモリ転送動作の性能のボトルネックになる可能性が高いかどうかの決定に基づいて、前記メモリ転送モードを選択するように構成される、Ｃ２１に記載のデバイス。
[Ｃ２７]  前記１つまたは複数のプロセッサがさらに、前記シェーダプログラムの前記実行が前記メモリ転送動作の性能のボトルネックになる可能性が高くないと決定したことに応答して、前記メモリ転送モードとして前記順次的メモリ転送モードを選択し、前記シェーダプログラムの前記実行が前記メモリ転送動作の性能のボトルネックになる可能性が高いと決定したことに応答して、前記メモリ転送モードとして前記インターリーブメモリ転送モードを選択するように構成される、Ｃ２６に記載のデバイス。
[Ｃ２８]  前記ＧＰＵがさらに、前記メモリ転送動作を行うためにシェーダプログラムを実行するように構成され、前記１つまたは複数のプロセッサがさらに、前記メモリ転送動作を行うために使用されるシェーダプログラムのサイズおよび前記メモリ転送動作を行うために使用される前記シェーダプログラムの複雑さの少なくとも１つに基づいて、前記メモリ転送モードを選択するように構成される、Ｃ２１に記載のデバイス。
[Ｃ２９]  前記１つまたは複数のプロセッサがさらに、前記シェーダプログラムの前記サイズと前記シェーダプログラムの前記複雑さの前記少なくとも１つが閾値より小さい場合、前記メモリ転送モードとして前記順次的メモリ転送モードを選択し、前記シェーダプログラムの前記サイズと前記シェーダプログラムの前記複雑さの前記少なくとも１つが前記閾値より小さくない場合、前記メモリ転送モードとして前記インターリーブメモリ転送モードを選択するように構成される、Ｃ２８に記載のデバイス。
[Ｃ３０]  前記ＧＰＵがさらに、前記メモリ転送動作を行うための前記メモリ転送モードとしてインターリーブメモリ転送モードが選択されたことに応答して、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行い、前記メモリ転送動作を行うための前記メモリ転送モードとして順次的メモリ転送モードが選択されたことに応答して、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うように構成される、Ｃ２１に記載のデバイス。
[Ｃ３１]  前記ＧＰＵがさらに、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うときに、生産者−消費者パラダイムに基づいて、読取りエンジンに読取り要求を出させ、書込みエンジンに書込み要求を出させるように構成され、
前記ＧＰＵがさらに、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うときに、相互排除のパラダイムに基づいて、前記読取りエンジンに読取り要求を出させ、前記書込みエンジンに書込み要求を出させるように構成される、Ｃ３０に記載のデバイス。
[Ｃ３２]  前記ＧＰＵがさらに、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うときに、書込み要求を出すために十分なソースデータを前記ＧＰＵがメモリから受け取ったことに応答して、前記書込みエンジンに前記書込み要求を出させ、書込み要求を出すために十分な、前記メモリから受け取られたソースデータを前記書込みエンジンが消費したことに応答して、前記読取りエンジンに読取り要求を出させるように構成され、
前記ＧＰＵがさらに、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うときに、前記読取りエンジンおよび前記書込みエンジンに、別の時間間隔の間に、複数の連続的な読取り要求のグループを出すことと、複数の連続的な読取り要求書込み要求のグループを出すこととを、交互に行わせるように構成される、Ｃ３０に記載のデバイス。
[Ｃ３３]  前記ＧＰＵがさらに、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うときに、前記メモリ転送動作のための書込み要求を出すために十分なソースデータが前記ＧＰＵによってメモリから受け取られるたびに、前記書込みエンジンによって、少なくとも１つの他の書込み要求に対して後で受け取られるべき追加のソースデータを待機することなく、それぞれの前記ソースデータを消費するように構成され、
前記ＧＰＵがさらに、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うときに、前記メモリ転送動作の少なくとも一部に対して、前記メモリ転送動作のための書込み要求を出すために十分なソースデータを前記ＧＰＵが前記メモリから受け取ったことに応答して、前記書込みエンジンによって、少なくとも１つの他の書込み要求を出すために十分な追加のソースデータが後で受け取られるまで前記ソースデータの消費を延期するように構成される、Ｃ３０に記載のデバイス。
[Ｃ３４]  前記ＧＰＵがさらに、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うときに、前記メモリ転送動作のための書込み要求を出すために十分なソースデータを書込みエンジンが消費するたびに、読取りエンジンによって、少なくとも１つの他の書込み要求に対して前記書込みエンジンによって後で消費されるべき追加のソースデータを待機することなく、読取り要求を出すように構成され、
前記ＧＰＵがさらに、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うときに、前記メモリ転送動作の少なくとも一部に対して、前記メモリ転送動作のための書込み要求を出すために十分なソースデータを前記書込みエンジンが消費したことに応答して、前記読取りエンジンによって、少なくとも１つの他の書込み要求を出すために十分なソースデータが前記書込みエンジンによって後で消費されるまで、後続の読取り要求の発行を延期するように構成される、Ｃ３０に記載のデバイス。
[Ｃ３５]  前記ＧＰＵが、前記ＧＰＵによってメモリに出された読取り要求に応答して受け取られたソースデータを記憶するように構成されるバッファを備え、
前記ＧＰＵがさらに、前記インターリーブメモリ転送モードに基づいて前記メモリ転送動作を行うときに、
１つまたは複数の読取り要求を出し、
前記複数の読取り要求に応答して前記メモリから受け取られたソースデータを前記バッファに配置し、
前記複数の読取り要求の各々について、前記複数の読取り要求のそれぞれ１つに対して前記ソースデータが前記バッファに配置されたことに応答して、前記バッファに配置された前記ソースデータを消費し、前記消費されたソースデータに基づいて書込み要求を出し、
複数の書込み要求の各々について、前記書込み要求のそれぞれ１つに対してソースデータが前記バッファから消費されたことに応答して、後続の読取り要求を出す
ように構成され、
前記ＧＰＵがさらに、前記順次的メモリ転送モードに基づいて前記メモリ転送動作を行うときに、
複数の読取り要求を出し、
前記複数の読取り要求に応答して前記メモリから受け取られたソースデータを前記バッファに配置し、
前記バッファを埋めるために十分な読取り要求が出されたことを検出したことに応答して、読取り要求を出すことを止め、
前記バッファが満たされていることを検出したことに応答して、前記消費されたソースデータに基づいて、前記バッファ中のソースデータを消費し、複数の書込み要求を出し、
前記バッファが空であることを検出したことに応答して、前記バッファ中のソースデータを消費して書込み要求を出すことを止め、
前記バッファが空であることを検出したことに応答して、読取り要求の発行を再開する
ように構成される、Ｃ２１に記載のデバイス。
[Ｃ３６]  前記ＧＰＵがさらに、少なくとも２つの異なるメモリ転送モードの前記セットから選択された第１のメモリ転送モードを使用して、前記メモリ転送動作の第１の部分を行い、前記少なくとも２つの異なるメモリ転送モードの前記セットから選択された第２のメモリ転送モードを使用して、前記メモリ転送動作の第２の部分を行うように構成される、Ｃ２１に記載のデバイス。
[Ｃ３７]  前記ＧＰＵがさらに、前記選択されたメモリ転送モードに基づいて、前記メモリ転送動作の間にメモリから取り出されるソースデータをバッファリングするために使用されるキャッシュのキャッシュラインサイズを選択し、前記選択されたキャッシュラインサイズに基づいて、前記メモリ転送動作のために前記キャッシュを構成するように構成される、Ｃ２１に記載のデバイス。
[Ｃ３８]  前記ＧＰＵがさらに、前記順次的メモリ転送モードが前記メモリ転送動作を行うための前記メモリ転送モードとして選択されたことに応答して、前記キャッシュの容量全体に等しいキャッシュラインサイズを選択し、前記インターリーブメモリ転送モードが前記メモリ転送動作を行うための前記メモリ転送モードとして選択されたことに応答して、前記キャッシュの前記容量全体より小さいキャッシュラインサイズを選択するように構成される、Ｃ３７に記載のデバイス。
[Ｃ３９]  前記１つまたは複数のプロセッサが前記ＧＰＵを備え、前記ＧＰＵが、メモリ転送動作の前記少なくとも一部を行うための前記メモリ転送モードを選択するように構成される、Ｃ２１に記載のデバイス。
[Ｃ４０]  前記１つまたは複数のプロセッサが、前記メモリ転送動作の前記少なくとも一部を行うための前記メモリ転送モードを選択し、前記ＧＰＵに、前記メモリ転送モードに基づいて前記メモリ転送動作を行わせるように構成される、ＣＰＵを備える、Ｃ２１に記載のデバイス。
[Ｃ４１]  ワイヤレス通信デバイスを備える、Ｃ２１に記載のデバイス。
[Ｃ４２]  携帯電話ハンドセットを備える、Ｃ２１に記載のデバイス。
[Ｃ４３]  メモリ転送動作の少なくとも一部を行うためのメモリ転送モードを選択するための手段と、ここにおいて、前記メモリ転送モードは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含む少なくとも２つの異なるメモリ転送モードのセットから選択される、
前記選択されたメモリ転送モードに基づいて前記メモリ転送動作を行うための手段とを備える装置。
[Ｃ４４]  前記メモリ転送モードを選択するための前記手段が、
前記メモリ転送動作によって転送されるべきデータの量、前記メモリ転送動作を行うために使用されるシェーダプログラムのサイズ、および前記メモリ転送動作を行うために使用される前記シェーダプログラムの複雑さの少なくとも１つに基づいて、前記メモリ転送モードを選択するための手段を備える、Ｃ４３に記載の装置。
[Ｃ４５]  前記メモリ転送モードを選択するための前記手段が、
メモリ転送動作の宛先領域が有する固定されたスクリーン整列されたバッファ領域との重複の量に基づいて、前記固定されたスクリーン整列されたバッファ領域に関して前記メモリ転送動作を行うためのメモリ転送モードを選択するための手段を備える、Ｃ４３に記載の装置。
[Ｃ４６]  前記メモリ転送動作を行うための前記手段が、グラフィックスプロセッシングユニット（ＧＰＵ）を備え、
前記メモリ転送モードを選択するための前記手段が、ＣＰＵと前記ＧＰＵの少なくとも１つを備える、Ｃ４３に記載の装置。
[Ｃ４７]  実行されたとき、１つまたは複数のプロセッサに、
メモリ転送動作の少なくとも一部を行うためのメモリ転送モードを選択させ、ここにおいて、前記メモリ転送モードは、インターリーブメモリ転送モードと順次的メモリ転送モードとを含む少なくとも２つの異なるメモリ転送モードのセットから選択される、
前記選択されたメモリ転送モードに基づいて前記メモリ転送動作を行わせる命令を記憶したコンピュータ可読記憶媒体。
[Ｃ４８]  実行されたとき、前記１つまたは複数のプロセッサに、前記メモリ転送モードを選択させる前記命令が、実行されたとき、前記１つまたは複数のプロセッサに、
前記メモリ転送動作によって転送されるべきデータの量、前記メモリ転送動作を行うために使用されるシェーダプログラムのサイズ、および前記メモリ転送動作を行うために使用される前記シェーダプログラムの複雑さの少なくとも１つに基づいて、前記メモリ転送モードを選択させる命令を備える、Ｃ４７に記載のコンピュータ可読記憶媒体。
[Ｃ４９]  実行されたとき、前記１つまたは複数のプロセッサに、前記メモリ転送モードを選択させる前記命令が、実行されたとき、前記１つまたは複数のプロセッサに、
メモリ転送動作の宛先領域が有する固定されたスクリーン整列されたバッファ領域との重複の量に基づいて、前記固定されたスクリーン整列されたバッファ領域に関して前記メモリ転送動作を行うためのメモリ転送モードを選択させる命令を備える、Ｃ４７に記載のコンピュータ可読記憶媒体。
[Ｃ５０]  実行されたとき、前記１つまたは複数のプロセッサに、前記メモリ転送動作を行わせる前記命令が、実行されたとき、グラフィックスプロセッシングユニット（ＧＰＵ）に、前記選択されたメモリ転送モードに基づいて前記メモリ転送動作を行わせる命令を備え、
実行されたとき、前記１つまたは複数のプロセッサに、前記メモリ転送動作を選択させる前記命令が、実行されたとき、ＣＰＵと前記ＧＰＵの少なくとも１つに、メモリ転送動作の前記少なくとも一部を行うための前記メモリ転送モードを選択させる命令を備える、Ｃ４７に記載のコンピュータ可読記憶媒体。
【図１】
0006009692.tif 000002
【図２】
0006009692.tif 000003
【図３】
0006009692.tif 000004
【図４】
0006009692.tif 000005
【図５】
0006009692.tif 000006
【図６】
0006009692.tif 000007
【図７】
0006009692.tif 000008
【図８】
0006009692.tif 000009
【図９Ａ】
0006009692.tif 000010
【図９Ｂ】
0006009692.tif 000011
【図１０】
0006009692.tif 000012
【図１１Ａ】
0006009692.tif 000013
【図１１Ｂ】
0006009692.tif 000014
【図１２】
0006009692.tif 000015
【図１３】
0006009692.tif 000016
【図１４】
0006009692.tif 000017
【図１５】
0006009692.tif 000018
【図１６】
0006009692.tif 000019
【図１７】
0006009692.tif 000020
【図１８】
0006009692.tif 000021
【図１９】
0006009692.tif 000022
【図２０】
0006009692.tif 000023
【図２１】
0006009692.tif 000024
【図２２】
0006009692.tif 000025
【図２３】
0006009692.tif 000026
【図２４】
0006009692.tif 000027
【図２５】
0006009692.tif 000028
【図２６】
0006009692.tif 000029
【図２７】
0006009692.tif 000030