グラフィクス処理装置(GPU)のシングル・インストラクション・マルチプル・データ(SIMD)アーキテクチャなどのSIMDアーキテクチャでは、複数の処理レーンが存在する。各処理レーンは、同じ命令の動作を、しかし異なるデータに対して実行している。いくつかの場合、処理レーンは、シャッフルと呼ばれる状況において、別の処理レーンによって消費されるべきデータを出力することがある。シャッフルの一例は、各処理レーンがその左隣の処理レーンからデータを受信するというものである。任意の1つの処理レーンが任意の他の処理レーンへ出力することを可能にする1つの方法は、完全な全レーン対全レーンクロスバー(たとえば、ある処理レーンからすべての他の処理レーンへの電気的接続)を介するものであり、これはチップ面積および電力消費が非常に大きい。また、処理レーンの増大につれて、そのような完全な全レーン対全レーンクロスバーのコストは二次関数的に増大する。
本開示は、完全な全レーン対全レーンクロスバーを必要とせずにレーンのシャッフルを実施するための例示的な技法を説明する。SIMD構造を有するデバイス(たとえば、GPU)は、処理レーンの総数より少ない処理レーンからデータを受信するシャッフラー回路を含む(たとえば、64個の処理レーンがある場合、シャッフラー回路は一度に8個の処理レーンからデータを受信する)。このシャッフラー回路は、(処理レーンの総数より少ない)ソース処理レーンのサブセットからデータを受信し、データに対してシャッフルを実行し(たとえば、レーン間でデータを並べ替え)、並べ替えられたデータをすべての処理レーンに出力する。しかしながら、処理レーンのサブセットのみが、並べ替えられたデータを記憶のために対応するレジスタに書き込むことができ、処理レーンの残りは、受信された並べ替えられたデータを廃棄することができる。シャッフラー回路は、処理レーンの連続するソースサブセットと、並べ替えられたデータをそれぞれの対応するレジスタに書き込むことが可能である処理レーンの連続する宛先サブセットとについて、これらのステップを繰り返す。
たとえば、処理レーンの各々は、対応するレジスタにデータを書き込み、対応するレジスタからデータを受信することができる。処理レーンの宛先サブセットは、並べ替えられたデータを対応するレジスタに記憶し、これは、並べ替えられたデータが実際に対応するレジスタに記憶されることを意味する。処理レーンの宛先サブセット以外の処理レーンは、受信された並べ替えられたデータを廃棄し、これは、処理レーンがデータを試して対応するレジスタに記憶し得るが、対応するレジスタが実際にはデータを記憶しないことがあることを意味する。
本開示では、処理レーンが並べ替えられたデータを対応するレジスタに記憶することは、処理レーンが並べ替えられたデータを対応するレジスタに記憶することに成功できること、または、処理レーンが並べ替えられたデータを対応するレジスタに記憶するように構成されることを意味する。処理レーンが並べ替えられたデータを廃棄することは、処理レーンが並べ替えられたデータを対応するレジスタに記憶することに成功しなかったこと、および、さらなる活動がデータに対して行われないこと、または処理レーンが並べ替えられたデータを対応するレジスタに記憶するように構成されないことを意味する。
シャッフラー回路は、処理レーンのサブセットのみからのデータが各々の所与の時間(すなわち、各々の繰返し)において並べ替えられているので、複数の繰返しを利用してシャッフル動作を完了することができる。しかしながら、各処理レーンは他の処理レーンの各々に結合される必要はないので、GPUのサイズおよび電力消費は低減され得る。
例示的な技法がGPUに関して説明されるが、本技法はそのようには限定されない。本技法は、様々なタイプの処理装置に、および一般に、シングル・インストラクション・マルチプル・データ(SIMD)構造を含む処理装置に適用可能であり得る。
図1は、本開示で説明される1つまたは複数の例示的な技法を実行するように構成された、画像処理のためのデバイスのブロック図である。デバイス10の例は、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、コンピュータワークステーション、ビデオゲームプラットフォームもしくはコンソール、ワイヤレス通信デバイス(たとえば、携帯電話、セルラー電話、衛星電話、および/または携帯電話ハンドセットなど)、固定電話、インターネット電話、ポータブルビデオゲームデバイスもしくは携帯情報端末(PDA)などのハンドヘルドデバイス、タブレットコンピュータ、パーソナル音楽プレーヤ、ビデオプレーヤ、ディスプレイデバイス、カメラデバイス、テレビ、テレビセットトップボックス、サーバ、中間ネットワークデバイス、メインフレームコンピュータ、またはグラフィカルデータを処理および/もしくは表示する任意の他のタイプのデバイスを含む。
図1の例に示されるように、デバイス10は、中央処理装置(CPU)16、グラフィカル処理装置(GPU)12、およびGPU12のローカルメモリ20、ユーザインターフェース22、システムメモリ30へのアクセスを提供するメモリコントローラ24、ならびにディスプレイ28上にグラフィカルデータを表示させる信号を出力するディスプレイインターフェース26を含む。GPU12は、シャッフラー回路14を含むものとして示される。このさらなる詳細において説明されるように、シャッフラー回路14は、GPU12が実行すべきシャッフル命令の動作を実行するように構成され得る。シャッフラー回路14はGPU12の内部にあるとして示されているが、いくつかの例では、シャッフラー回路14はGPU12の外部にあり得る。この説明では、簡単にするために、シャッフラー回路14はGPU12の内部にあるものとして説明される。
いくつかの例では、シャッフラー回路14は、GPU12のコアとGPU12のロード/ストアユニットとの間にあり得る。GPU12のロード/ストアユニットは、ローカルメモリ20とシステムバス32の両方に接続する。このことは、シャッフラー回路14が場合によっては、データをローカル/グローバルメモリに記憶する前に、またはそこからデータをロードした後にデータをスウィズルすることなどの、他の目的に再使用されることを可能にする。GPU12のコアとGPU12のロード/ストアユニットとの間のシャッフラー回路14の位置は、単なる一例として与えられ、限定するものと見なされるべきではない。
理解を簡単にするために、GPU12に関して例示的な技法が説明される。しかしながら、例示的な技法は、GPU12に限定されず、CPU16またはメモリコントローラ24などの他の構成要素に適用可能であり得る。一般に、本開示において説明される技法は、2つ以上の処理レーンを含む処理装置に適用可能であり得る。GPUは多数の処理レーンを含む傾向があるので、GPU12が説明の目的で使用される。しかしながら、GPUは、2つ以上の処理レーンを含む唯一のタイプの処理装置ではない。
また、様々な構成要素が別個の構成要素として示されるが、いくつかの例では、構成要素はシステムオンチップ(SoC)を形成するように組み合わせられ得る。ある例として、CPU16、GPU12、およびディスプレイインターフェース26は、共通のチップ上に形成され得る。いくつかの例では、CPU16、GPU12、およびディスプレイインターフェース26の1つまたは複数が、別々のチップの中にあり得る。
図1に示される様々な構成要素は、1つもしくは複数のマイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、デジタル信号プロセッサ(DSP)、または他の等価な集積論理回路構成もしくは個別論理回路構成の中に形成され得る。ローカルメモリ20の例は、たとえば、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)、消去可能プログラマブルROM(EPROM)、電気的消去可能プログラマブルROM(EEPROM)、フラッシュメモリ、磁気データ媒体、または光記憶媒体などの、1つまたは複数の揮発性または不揮発性のメモリまたは記憶デバイスを含む。
図1に示される様々なユニットは、バス32を使用して互いに通信する。バス32は、第3世代バス(たとえば、HyperTransportバスまたはInfiniBandバス)、第2世代バス(たとえば、Advanced Graphics Portバス、Peripheral Component Interconnect (PCI)エクスプレスバス、またはAdvanced eXentisible Interface (AXI)バス)、または別のタイプのバスもしくはデバイス相互接続などの、様々なバス構造のいずれかであり得る。図1に示される異なる構成要素間のバスおよび通信インターフェースの特定の構成が例にすぎず、同じまたは異なる構成要素を有するコンピューティングデバイスおよび/または他の画像処理システムの他の構成が、本開示の技法を実施するために使用され得ることに留意されたい。
CPU16は、デバイス10の動作を制御する汎用プロセッサまたは専用プロセッサを備え得る。ユーザは、1つまたは複数のソフトウェアアプリケーションをCPU16に実行させるために、コンピューティングデバイス10への入力を行い得る。CPU16上で実行するソフトウェアアプリケーションは、たとえば、オペレーティングシステム、ワードプロセッサアプリケーション、電子メールアプリケーション、スプレッドシートアプリケーション、メディアプレーヤアプリケーション、ビデオゲームアプリケーション、グラフィカルユーザインターフェースアプリケーション、または別のプログラムを含み得る。ユーザは、キーボード、マウス、マイクロフォン、タッチパッド、またはユーザインターフェース22を介してコンピューティングデバイス10に結合されている別の入力デバイスなどの、1つまたは複数の入力デバイス(図示せず)を介して、コンピューティングデバイス10への入力を行い得る。
メモリコントローラ24は、システムメモリ30に出入りするデータの転送を容易にする。たとえば、メモリコントローラ24は、コンピューティングデバイス10の中の構成要素にメモリサービスを提供するために、メモリ読取りおよび書込みコマンドを受信し、メモリ30に対してそのようなコマンドをサービスし得る。メモリコントローラ24は、システムメモリ30に通信可能に結合されている。メモリコントローラ34は、CPU16とシステムメモリ30のどちらとも別個の処理モジュールであるものとして、図1の例示的なコンピューティングデバイス10に示されるが、他の例では、メモリコントローラ24の機能の一部またはすべてが、CPU16およびシステムメモリ30のうちの一方または両方において実装され得る。
システムメモリ30は、CPU16およびGPU12によってアクセス可能な、プログラムモジュールおよび/または命令および/またはデータを記憶し得る。たとえば、システムメモリ30は、ユーザアプリケーション、GPU12からの得られた画像などを記憶し得る。システムメモリ30は、加えて、コンピューティングデバイス10の他の構成要素により使用される情報、および/またはそうした構成要素によって生成される情報を、記憶し得る。たとえば、システムメモリ30は、デバイス10のためのデバイスメモリとして活動し得る。システムメモリ30は、たとえば、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)、読取り専用メモリ(ROM)、消去可能プログラマブルROM(EPROM)、電気的消去可能プログラマブルROM(EEPROM)、フラッシュメモリ、磁気データ媒体、または光記憶媒体などの、1つまたは複数の揮発性または不揮発性のメモリまたは記憶デバイスを含み得る。
いくつかの態様では、システムメモリ30は、CPU16、GPU12、およびディスプレイインターフェース26に、本開示においてこれらの構成要素に帰せられる機能を実行させる命令を含み得る。したがって、システムメモリ30は、実行されると、1つまたは複数のプロセッサ(たとえば、CPU16、GPU12、およびディスプレイインターフェース26)に様々な機能を実行させる命令を記憶したコンピュータ可読記憶媒体であり得る。
いくつかの例では、システムメモリ30は非一時的記憶媒体である。「非一時的」という用語は、記憶媒体が搬送波または伝搬される信号において具現化されないことを示す。しかしながら、「非一時的」という用語は、システムメモリ30が非可動であること、またはその内容が静的であることを意味するものと解釈されるべきでない。一例として、システムメモリ30は、デバイス10から取り外されてよく、別のデバイスに移動されてよい。別の例として、システムメモリ30と実質的に類似のメモリが、デバイス10の中に挿入されてよい。いくつかの例では、非一時的記憶媒体は、経時的に変化することができるデータを(たとえば、RAMの中に)記憶し得る。
CPU16およびGPU12は、画像データなどを、システムメモリ30内に割り振られているそれぞれのバッファに記憶し得る。ディスプレイインターフェース26は、システムメモリ30からデータを取り出し、レンダリングされた画像データによって表される画像を表示するようにディスプレイ28を構成し得る。いくつかの例では、ディスプレイインターフェース26は、システムメモリ30から取り出されたデジタル値をディスプレイ28によって消費可能なアナログ信号に変換するように構成される、デジタルアナログ変換器(DAC)を含み得る。他の例では、ディスプレイインターフェース26は、ディスプレイ28の一部を形成することがあり、または、処理のためにデジタル値を直接ディスプレイ28に伝えることがある。
ディスプレイ28は、モニタ、テレビ、投影デバイス、液晶ディスプレイ(LCD)、プラズマディスプレイパネル、発光ダイオード(LED)アレイ、陰極線管(CRT)ディスプレイ、電子ペーパー、表面伝導電子放出ディスプレイ(SED)、レーザーテレビディスプレイ、ナノ結晶ディスプレイ、または別のタイプのディスプレイユニットを含み得る。ディスプレイ28は、コンピューティングデバイス10内に統合され得る。たとえば、ディスプレイ28は、携帯電話ハンドセットまたはタブレットコンピュータの画面であり得る。代わりに、ディスプレイ28は、有線通信リンクまたはワイヤレス通信リンクを介してコンピューティングデバイス10に結合されたスタンドアロンデバイスであり得る。たとえば、ディスプレイ28は、ケーブルリンクまたはワイヤレスリンクを介してパーソナルコンピュータに接続されたコンピュータモニタまたはフラットパネルディスプレイであり得る。
本開示において説明される例示的な技法において、GPU12は、グラフィクス動作を、およびいくつかの場合、非グラフィクス動作も実行するように構成される、特別なハードウェア回路であり得る。GPU12は、シングル・インストラクション・マルチプル・データ(SIMD)構造を用いて設計される。SIMD構造において、GPU12は複数のSIMD処理レーンを含み、各SIMD処理レーンは、同じプログラムの命令を、ただし異なるデータに対して実行する。特定のSIMD処理レーン上で実行されている特定の命令は、スレッドと呼ばれる。所与のスレッドについてのデータは異なることがあるので、各SIMD処理レーンは異なるスレッドを実行すると見なされることがあるが、ある処理レーン上で実行されているスレッドは、その他の処理レーン上で実行されている命令と同じ命令である。このようにして、SIMD構造は、GPUが多数のタスクを同時に実行することを可能にする。
多数のグラフィクス動作は、同じ処理が並列に実行されること(たとえば、画素をレンダリングすること)を必要とする。したがって、グラフィクス処理のために、CPU16は、GPU12によって実行されるように、そのようなグラフィクス処理タスクをGPU12にオフロードする。いくつかの例では、行列乗算などの非グラフィクス動作は、グラフィクス処理のためのものではない場合であっても、GPU12上での実行から利益を得ることがある。したがって、いくつかの例では、CPU16はいくつかの非グラフィクス動作をGPU12にオフロードすることがあり、それは、GPU12がそのような動作を実行するのにより適していることがあるからである。
頂点処理のための、グラフィクス処理の例として、GPU12は、各頂点に対して同じタスクを実行し得るが、各頂点に対する頂点データは異なることがある(たとえば、異なる座標、異なる色値など)。SIMD構造は、GPU12が、異なるSIMD処理レーン上で頂点シェーダの同じインスタンスを実行することによって、並列に多数の頂点を処理することを可能にする。この例では、各SIMD処理レーンは頂点シェーダのスレッドを実行することができ、各スレッドは頂点シェーダの1つのインスタンスに対するものである。
SIMD処理レーンは1つまたは複数の算術論理装置(ALU)を含み、SIMD処理レーンは1つまたは複数の汎用レジスタ(GPR)に結果を記憶する。複数のGPRは、汎用レジスタファイル(GPRF)と呼ばれる。GPRFは、1つまたは複数のSIMD処理レーンから得られたデータを記憶するための専用レジスタを含む。GPRは、GPU12のローカルキャッシュまたはローカルメモリ20とは別であり、異なるものであり得る。
全レーン共有メモリにアクセスすることを介してデータを交換する代わりに、レーンシャッフルと呼ばれる、処理レーンにデータを共有させて互いに直接データを交換させることは、reduce and scan(これらはOpenCLCの標準的な内蔵機能である)、ブロードキャスト、転置、バイトニックソート、フーリエ変換などの、レーンにまたがるデータ通信を必要とする一部の並列アルゴリズムを大きく高速化することができる。一例として、行列を転置するために、処理レーンのALUは、処理レーンが動作している対象の値を、別の処理レーンのALUに送信することができる。別の例として、特定の色の画素がどれだけあるかを決定するために、処理レーンのALUは、各処理レーンが動作している対象の画素の色を示す情報を別の処理レーンに出力することができ、反復的な処理を通じて、その特定の色の画素がどれだけあるかを決定することが可能であり得る。レーンのシャッフルが有用である理由についての他の例があることがあり、本開示において説明される技法は、レーンのシャッフルの使用事例のいずれにも限定されない。
レーンのシャッフルを実施するための1つの方法は、スイッチングネットワークを介して、各処理レーンを1つおきの処理レーンに選択的に相互接続することである。任意の処理レーンが任意の他の処理レーンに結合することを可能にするそのような相互接続は、完全な全レーン対全レーンクロスバーと呼ばれる。完全な全レーン対全レーンクロスバーは、チップ面積の点で非常に高価であり、高い消費電力を必要とすることがある。また、チップ面積および電力消費の増大は、二次関数的に処理レーンの増大を招く。
全レーン対全レーンクロスバーを必要とすることなくレーンのシャッフル(たとえば、ほとんどすべてのタイプのレーンのシャッフル)を可能にするために、本開示はシャッフラー回路14を説明する。いくつかの例では、シャッフラー回路14は、固定された機能(たとえば、プログラム可能ではない)を実行するように構成される、固定機能ハードウェア回路である。しかしながら、例示的な技法は限定されない。いくつかの例では、シャッフラー回路14は、本開示において説明される例示的な技法を実行するために使用されるソフトウェア/ハードウェアがその上で実行される、プログラマブル回路によって形成され得る。この例では、ソフトウェア/ファームウェアは、本開示において説明される例示的な動作を実行するようにシャッフラー回路14を構成し得る。他の例では、シャッフラー回路14は、固定機能ハードウェア回路およびプログラマブル処理回路の組合せによって形成され得る。
シャッフラー回路14がプログラム可能回路である例では、システムメモリ30は、シャッフラー回路14に本開示において説明される例示的な技法を実行させる命令を記憶し得る。そのような例では、シャッフラー回路14はGPU12のプログラム可能コアの一部であることがあり、CPU16は、シャッフラー回路14が本開示において説明される例示的な技法を実行すべきであるときに命令を実行するようにシャッフラー回路14に命令することがある。たとえば、CPU16は、シャッフラー回路14がそこから命令を取り出すべき、システムメモリ30内のメモリ位置を特定する情報をシャッフラー回路14に提供し、命令を実行するためにコマンドをシャッフラー回路14に提供することができる。いずれの場合でも、説明を簡単にするために、本開示は固定機能回路としてシャッフラー回路14を説明する。
すべての処理レーンを互いに相互接続するのではなく、シャッフラー回路14は、処理レーンのサブセット(処理レーンのソースサブセットと呼ばれる)からデータを選択的に出力することを可能にする。たとえば、シャッフラー回路14は、処理レーンのうちのM個からデータを受信し、M個の処理レーンからのデータを並べ替え、並べ替えられたデータを出力する。いくつかの例では、シャッフラー回路14は、すべての処理レーンに並べ替えられたデータを出力し得る。しかしながら、処理レーンのサブセットのみが、シャッフラー回路14からの並べ替えられたデータを対応するレジスタ(処理レーンの宛先サブセットと呼ばれる)に記憶することが可能であり得る。シャッフラー回路14は処理レーンのサブセットからのデータを並べ替えるので、処理レーンからのデータを互いに転送することを完了するために、複数のクロック周期を利用することがある。
たとえば、シャッフル動作は、各処理レーンに、ある数のレーンだけ離れた処理レーンへデータを出力させることであり得る。この場合、シャッフラー回路14は、処理レーンのソースサブセットからのデータを受信して並べ替え、並べ替えられたデータを場合によってはすべての処理レーンに出力し得る。しかしながら、処理レーンのそれぞれのソースサブセットからある数のレーンだけ離れた処理レーンの宛先サブセットのみが、シャッフラー回路14からの並べ替えられたデータを対応するレジスタに記憶することが可能であることがある。シャッフラー回路14は次いで、処理レーンの次のソースサブセットについてこれらの動作を繰り返し得る。処理レーンのサブセットからデータを受信すること、データを並べ替えること、およびデータを出力することの、これらの反復の各々が、複数のクロック周期を通じて処理される。
処理レーンの各々は、汎用レジスタファイル(GPRF)の1つまたは複数のレジスタに対応する。処理レーンは、対応するレジスタからデータを受信し、対応するレジスタにデータを出力する。本開示において説明される例示的な技法では、処理レーンの宛先サブセットは並べ替えられたデータを対応するレジスタに記憶することができ、他の処理レーンは並べ替えられたデータを廃棄することができる。たとえば、処理レーンの宛先サブセットの対応するレジスタは並べ替えられたデータを記憶することが許容されることがあるが、他の処理レーンの対応するレジスタは並べ替えられたデータを記憶することが許容されないことがある。マルチプレクサ(MUX)がレジスタの各々に結合されることがあり、処理レーンの宛先サブセットに対応するレジスタのためのMUXは、並べ替えられたデータが対応するレジスタに記憶されることを許容し、処理レーンの宛先サブセットに対応しないレジスタのためのMUXは、(たとえば、処理レーンがデータを廃棄するように)並べ替えられたデータが対応するレジスタに記憶されることを許容しない。データを記憶するかまたはデータを記憶しない(たとえば、データを廃棄する)かのいずれかであるように処理レーンを構成することなどの、データを記憶することまたはデータを記憶しないことを対応するレジスタに対して許容するための、他の方法があり得る。
処理レーンが並べ替えられたデータを記憶することは、処理レーンが並べ替えられたデータを記憶しようとしていることだけではなく、並べ替えられたデータが対応するレジスタに実際に記憶されることを意味する。処理レーンが並べ替えられたデータを廃棄することは、並べ替えられたデータが対応するレジスタに記憶されなかったことを意味する。いくつかの例では、レジスタは、データを記憶することを許容されることがあり、またはデータを記憶することを許容されないことがある。いくつかの例では、処理レーンは、データを記憶するように構成されることがあり、またはデータを記憶するように構成されないことがある。いくつかの例では、これらの2つの組合せが可能である。処理レーンが並べ替えられたデータを記憶することは、並べ替えられたデータを記憶するためのこれらの技法のあらゆる可能性を指す。処理レーンが並べ替えられたデータを廃棄することは、並べ替えられたデータを記憶しないためのこれらの技法のあらゆる可能性を指す。
本開示では、ソース処理レーンおよび宛先処理レーンはすべて、GPU12の処理レーンである。たとえば、各処理レーンが隣接処理レーンにデータを出力すべきである場合、処理レーン5は処理レーン6のソース処理レーンであり、処理レーン6は処理レーン5の宛先処理レーンである。また、処理レーン5は処理レーン4の宛先処理レーンであり、処理レーン4は処理レーン5のソース処理レーンである。したがって、シャッフル動作では、各処理レーンがある処理レーンのソース処理レーンであることがあり、別の処理レーンの宛先処理レーンであることがある。
GPU12の処理レーンが互いにデータを出力すべきであるときに、CPU16は「シャッフル命令」をGPU12に出すことができる。GPU12の多くの例において、GPU12は自己反応的である。これは、CPU16およびGPU12が命令ごとに協力しないことを意味する。むしろ、CPU16は実行のためにプログラム全体をGPU12に送信する。GPU12は自身で、そのプログラムの命令のグループをフェッチ/復号/実行する。CPU16およびGPU12は、システムメモリ30を介して入力/結果データを交換する。本開示では、CPU16がシャッフル命令をGPU12に出すことは、実行するようにCPU16がGPU12に命令したプログラムがシャッフル命令を含むことを意味する。しかしながら、CPU16およびGPU12が命令ごとに協力する例では、CPU16は、命令ごとにGPU12にシャッフル命令を出力することができる。
シャッフル命令はシャッフルモードおよびオフセットを定義する。シャッフルモードは、どの処理レーンがどの処理レーンに出力すべきかについての方向を示し(たとえば、データを左もしくは右の処理レーンに、またはすべての処理レーンに出力する)、データを受信する処理レーンがデータを出力する処理レーンからどれだけ離れているかを決定するためにオフセットが使用される。シャッフルモードの一例であるブロードキャストモードでは、ソースレーンの固有のインデックスが、各レーンに対するオフセットを決定するために使用される。
いくつかの例では、オフセットはソースレーンがどれだけ離れているかを示す。これは、すべてのレーンがアクティブである、または範囲内にあるとは限らないことがあり(たとえば、オフセットが、あるソースレーンがすべての利用可能なレーンの範囲外にあることを示す)、そのオフセットがソースレーンを基準とする場合、有効なソースレーンのないいくつかのレーンが見落とされることがあるからである。また、非アクティブなレーンまたは範囲外のレーンにデータを送信することは、何の役にも立たないことがある。代わりに、各々の有効な宛先レーンは、データを受信するのに有効な宛先レーンにのみデータが送信されるように、どれがその宛先レーンのソースレーンであるかを示す。しかしながら、ソースレーンが無効である(たとえば、非アクティブである、または範囲外にある)場合、デフォルトで、宛先レーンは自身をソースレーンとして使用し得る(たとえば、宛先レーンが自分自身のデータを複製する自己複製を実行し得る)。本開示では、オフセットは、ソースレーンまたは宛先レーンのいずれかが基準であると見なすことができ、いくつかの場合、宛先レーンはオフセットに基づいてそのソースレーンを定義することがあり、いくつかの場合、ソースレーンはオフセットに基づいて宛先レーンを定義することがあることを理解されたい。
GPU12のSIMD構造が原因で、シャッフル命令が処理レーンの各々に適用され得る。やはり、処理レーンの各々は、同じ命令を、しかし異なるデータについて実行し得るので、各処理レーンがシャッフル命令を実行する(たとえば、各処理レーンがデータを1つの他の処理レーンに出力することになる)。オフセットはシャッフル命令によって定義されるので、オフセットは各処理レーンに対して同じであり得る(すなわち、オフセットはすべての処理レーンに対して均一である)。本開示は、処理レーンの各々が同じシャッフル命令を実行し得ることを説明するが、いくつかの例では、処理レーンの必ずしもすべてではないが少なくとも一部が、同じシャッフル命令を実行することが可能であり得る。
オフセットが、ある処理レーンに範囲外の処理レーンへ出力させるようなものである場合、そのオフセットは、処理レーンに、出力を範囲内の処理レーンへラップアラウンドさせる。たとえば、シャッフルモードおよびオフセットは、各処理レーンがすぐ左の処理レーンに出力すべきである(たとえば、シャッフルモードがshuffle upでありオフセットが1に等しい)ことを定義し得る。この場合、一番左の処理レーンは、データを一番右の処理レーンに出力する(たとえば、ラップアラウンド)。
出力のラップアラウンドは、rotate-up/rotate-downモードと呼ばれるシャッフルモードにおいて発生し得る。しかしながら、普通のup/downモードでは、ソース処理レーンは自己複製を実行し得る(たとえば、ソース処理レーンおよび宛先処理レーンは同じである)。いくつかの例では、各宛先レーンはMUX-2に結合される。ラップアラウンドがない普通のup/downモードの場合、宛先レーンは、ソースレーンが有効であればシャッフラー回路14からデータを受信するようにMUXを構成し、ラップアラウンドがないのでソースレーンが無効であれば自身からデータを受信するようにMUXを構成する。
本開示では、シャッフラー回路14が並べ替えられたデータを処理レーンに出力することは、シャッフラー回路14がそれぞれの並べ替えられたデータをそれぞれの処理レーンに出力することを意味することを理解されたい。たとえば、シャッフル命令およびオフセットは、各処理レーンが20レーン左にある処理レーンに出力すべきである(たとえば、シャッフルモードがshuffle upでありオフセットが20に等しい)ことを定義し得る。この例では、シャッフラー回路14は8個の入力および8個の出力を含むと仮定する。シャッフラー回路14はレーン0〜7からデータを受信することができ、ここで、シャッフラー回路14の第1の入力は処理レーン0からデータを受信し、シャッフラー回路14の第2の入力は処理レーン1からデータを受信し、以下同様である。以下で説明される理由で、シャッフラー回路14は、シャッフラー回路14の第1の出力が処理レーン4から受信されたデータを出力し、シャッフラー回路14の第2の出力が処理レーン5から受信されたデータを出力し、シャッフラー回路14の第3の出力が処理レーン6から受信されたデータを出力し、シャッフラー回路14の第4の出力が処理レーン7から受信されたデータを出力し、シャッフラー回路14の第5の出力が処理レーン0から受信されたデータを出力し、シャッフラー回路14の第6の出力が処理レーン1から受信されたデータを出力し、シャッフラー回路14の第7の出力が処理レーン2から受信されたデータを出力し、シャッフラー回路14の第8の出力が処理レーン3から受信されたデータを出力するように、受信されたデータを並べ替えることができる。
別の見方をすると、シャッフラー回路14の第1から第8の入力はそれぞれ、処理レーン0〜7からデータを受信する。シャッフラー回路14は次いで、以下の理由で、シャッフラー回路14の対応する第1から第8の出力がそれぞれ、処理レーン4、5、6、7、0、1、2、および3から受信されるデータを出力するように、データを並べ替える。本開示では、シャッフラー回路14が処理レーンからデータを受信するものとして、または並べ替えられたデータを処理レーンに出力するものとして説明されるとき、本開示は、シャッフラー回路14がそれぞれの処理レーンからデータを受信してそれぞれのデータをそれぞれの処理レーンに出力することを指している。
また、本開示は、処理レーンからのデータが受信または出力される特定の時間的順序があることを意味するものと解釈されるべきではない。たとえば、シャッフラー回路14の第1から第8の入力は、第1の入力が最初にデータを受信し、第2の入力が2番目にデータを受信することなどを意味するものと解釈されるべきではない。データのそのような順番の受信が可能であるが、例示的な技法はそのように限定されず、シャッフラー回路14の第1から第8の入力は、データを並列に(たとえば同時に)または何らかの組合せで受信し得る。同様に、シャッフラー回路14の第1から第8の出力は、第1の出力が最初にデータを出力し、第2の出力が2番目にデータを出力することなどを意味するものと解釈されるべきではない。データのそのような順番の送信が可能であるが、例示的な技法はそのように限定されず、シャッフラー回路14の第1から第8の出力は、データを並列に(たとえば同時に)または何らかの組合せで出力し得る。また、シャッフラー回路14は、8個より多数または少数の入力および出力を含み得る。
本開示において説明される例示的な技法では、処理レーンは、各バンクが1つまたは複数の処理レーンを含む複数のバンクとして形成され得る。たとえば、64個の処理レーンがある場合、8個のバンクがあることがあり、各バンクが8個の処理レーンを含む。処理レーンのソースサブセットは、1つのバンクの処理レーンであり得る。これらの例では、シャッフラー回路14が処理レーンのソースサブセットからデータを受信することは、シャッフラー回路14が複数のバンクのうちの1つのバンクからデータを受信することと実質的に同じであると見なされ得る。
いくつかの例では、シャッフラー回路14は、一度に1つのバンクからデータを受信することだけが可能であり得る。シャッフラー回路14の入力と処理レーンとの間の相互接続は、シャッフラー回路14の第1の入力が各バンクのそれぞれの第1の処理レーンからの入力のみを受信することができ、シャッフラー回路14の第2の入力が各バンクのそれぞれの第2の処理レーンからの入力のみを受信することができ、以下同様となるようなものであり得る。シャッフラー回路14が第1のバンクからデータを受信する(たとえば、シャッフラー回路14のそれぞれの入力が第1のバンクのそれぞれの処理レーンからデータを受信する)場合、シャッフル動作を実行するための別の処理の反復において、シャッフラー回路14は第2のバンクからデータを受信する(たとえば、シャッフラー回路14のそれぞれの入力は第2のバンクのそれぞれの処理レーンからデータを受信する)。シャッフラー回路14が同じ反復の間に異なるバンクにおいて処理レーンからデータを受信することを可能にするような相互接続はないことがある。
データを並べ替えた後で、シャッフラー回路14は、並べ替えられたデータを処理レーンに出力することができ、いくつかの例では、並べ替えられたデータをバンクの各々に出力することができる。各バンクとシャッフラー回路14の出力との間に相互接続があることがある(たとえば、各バンクの各処理レーンは、シャッフラー回路14の1つの出力、場合によっては唯一の出力からデータを受信することができる)。たとえば、各々のそれぞれのバンクの第1の処理レーンは、シャッフラー回路14の第1の出力からデータを受信するように構成されることがあり、各々のそれぞれのバンクの第2の処理レーンは、シャッフラー回路14の第2の出力からデータを受信するように構成されることがあり、以下同様である。
シャッフル回路14がデータを出力するとき、データがすべての処理レーンにブロードキャストされる。たとえば、バンクの各々における第1の処理レーンの各々がシャッフラー回路14の第1の出力を受信し、バンクの各々における第2の処理レーンの各々がシャッフラー回路14の第2の出力を受信し、以下同様である。
シャッフラー回路14の出力がバンクの各々にブロードキャストされるので、シャッフラー回路14は受信されたデータを並べ替える。たとえば、各処理レーンが10レーン離れた処理レーンにデータを出力すべきであると仮定する。やはり、簡単にするために、シャッフラー回路14は8個の入力および8個の出力を含み、各バンクが8個の処理レーンを含むと仮定する。この例では、処理レーンのソースサブセットは、第1のバンクの処理レーン(たとえば、処理レーン7〜0)を含む。この例では、第1の入力が処理レーン0からデータを受信すると仮定する。この場合、処理レーン0からのデータは、処理レーン10に出力されることになる。
しかしながら、シャッフラー回路14の第1の出力は接続されず、処理レーン10に接続可能ではないことがある。むしろ、シャッフラー回路14の第1の出力は、それぞれのバンクのそれぞれの第1の処理レーンに接続される。たとえば、処理レーン10は、処理レーン8〜15を含む第2のバンクの中にあり得る。この場合、シャッフラー回路14の第1の出力は処理レーン8に結合される。したがって、シャッフラー回路14が入力データを並べ替えなければ、シャッフラー回路14の第1の出力は、処理レーン10ではなく処理レーン8に出力するであろう。
したがって、シャッフラー回路14は、出力データがブロードキャストされるときに正しい処理レーンがデータを受信するように、入力データを並べ替えることができる。この文脈では、並べ替えとは、シャッフラー回路14のそれぞれの出力が出力するデータがシャッフラー回路14の対応する入力上のデータと異なるように、シャッフラー回路14が入力データをシフトすることを意味する。たとえば、シャッフラー回路14の第1の出力はシャッフラー回路14の第1の入力上でデータを出力せず、シャッフラー回路14の第2の出力はシャッフラー回路14の第2の入力上でデータを出力せず、以下同様である。代わりに、シャッフラー回路14は、ブロードキャストされるそれぞれの出力が、正しい宛先処理レーンによって受信されるように、データを並べ替える。宛先処理レーンは、データが出力されるべき処理レーンである(たとえば、処理レーン10に処理レーン0のデータを出力する、ここで処理レーン10は宛先処理レーンであり、処理レーン0はソース処理レーンである)。
シャッフラー回路14は、剰余関数に基づいて入力データを並べ替えることができる。たとえば、シャッフラー回路14内の処理回路またはGPU12のコントローラ回路または何らかの他の回路が、シャッフラー回路14の入力/出力の数でオフセットを割り、その除算の剰余を決定することができる。シャッフラー回路14は、その剰余に基づくラップアラウンドを用いて、各入力を左または右にシフトすることができる。シャッフラー回路14の出力は、このシフトされたラップアラウンドデータ(たとえば、並べ替えられたデータ)を出力することができる。
GPU12の中のすべての処理レーンの間に相互接続がない(たとえば、全レーン対全レーンクロスバーではない)ことがあるが、シャッフラー回路14の入力の各々が、シャッフラー回路14の出力のいずれかに選択的に結合され得る。たとえば、シャッフラー回路14は、任意の入力が任意の出力に結合されることを可能にする複数のスイッチを含み得る。シャッフラー回路14内の処理回路または別の回路(たとえば、GPU12のコントローラ回路)からの制御信号が、選択的にスイッチの閉と開を切り替えて、シャッフラー回路14の意図される入力および出力を結合してデータを並べ替えることができる。
並べ替えるために入力上のデータをどれだけシフトすべきかを剰余がどのように特定するかということの例として、上のように、各処理レーンが10レーン離れた処理レーンに出力すべきである(たとえば、オフセットが10に等しい)と仮定する。シャッフラー回路14の入力/出力の数は8であり、10/8は1余り2に等しい。この例では、シャッフラー回路14は、各入力がラップアラウンドを用いて2だけ左にシフトされるように、内部のスイッチを切り替えることができる。たとえば、シャッフラー回路14への入力がバンク0の処理レーン0〜7である場合、シャッフラー回路14の第1から第8の入力はそれぞれ、処理レーン0〜7からのデータである。
シャッフラー回路14は、2という剰余に基づいて入力データをシフトするので、シャッフラー回路14の第3の出力がシャッフラー回路14の第1の入力上でデータを出力し、シャッフラー回路14の第4の出力がシャッフラー回路14の第2の入力上でデータを出力し、以下同様となる。ラップアラウンドにより、シャッフラー回路14の第1の出力はシャッフラー回路14の第7の入力上でデータを出力し、シャッフラー回路14の第2の出力はシャッフラー回路14の第8の入力を出力する。
この例では、入力データ(たとえば、第1から第8の入力上のデータ)の順序はそれぞれ、処理レーン0〜7からのデータである。並べ替えの後で、出力データ(たとえば、第1から第8の出力上のデータ)の順序はそれぞれ、処理レーン6、7、0、1、2、3、4、および5からのデータである。
上で説明されたように、処理レーン10は、オフセットが10であるので処理レーン0のデータを受信することになる。処理レーン10は、処理レーン8〜15を含むバンク1の中にある。シャッフラー回路14の出力は各バンクにブロードキャストされ、各バンクの中の各処理レーンはシャッフラー回路14のそれぞれの出力に結合されるので、バンク1の第1の処理レーンはシャッフラー回路14の第1の出力からデータを受信し、バンク1の第2の処理レーンはシャッフラー回路14の第2の出力からデータを受信し、以下同様である。この例では、シャッフラー回路14の第1の出力は、バンク1の第1の処理レーン(たとえば、処理レーン8)が受信する処理レーン6のデータを出力する。シャッフラー回路14の第2の出力は、バンク1の第2の処理レーン(たとえば、処理レーン9)が受信する処理レーン7のデータを出力する。
次いで、シャッフラー回路14の第3の出力は、バンク1の第3の処理レーン(たとえば、処理レーン10)が受信する処理レーン0のデータを出力する。理解され得るように、この例では、処理レーン10は、データの並べ替えが原因で処理レーン0からデータを受信した。このパターンは、バンク1の残りのレーンに対して当てはまる(たとえば、処理レーン11は処理レーン1からデータを受信し、処理レーン12は処理レーン2からデータを受信し、最終的に、処理レーン15は処理レーン5からデータを受信する)。ここまでに、処理レーン10〜15は処理レーン0〜5からデータを受信した。
しかしながら、処理レーン16および17はそれぞれ、処理レーン6および7からもデータを受信することになる。処理レーン16および17はバンク2に属し、バンク2は処理レーン16〜23を含む。処理レーン16はバンク2の中の第1の処理レーンであり、処理レーン17はバンク2の中の第2の処理レーンである。上で説明されたように、シャッフラー回路14の出力は各バンクにブロードキャストされる。したがって、処理レーン16はシャッフラー回路14の第1の出力を受信し、処理レーン17はシャッフラー回路14の第2の出力を受信する。この例では、シャッフラー回路14の第1の出力は処理レーン6のデータであり、シャッフラー回路14の第2の出力は処理レーン7のデータである。入力上のデータをシフトしてラップアラウンドする(たとえば、データを並べ替える)ことによって、処理レーン6のデータは、10処理レーン離れた処理レーン(たとえば、処理レーン16)に出力され、同じことが、処理レーン17に出力される処理レーン7にも当てはまる。
上の例では、処理レーン0〜7からのデータは、処理レーン10〜17に出力されることになっていた。しかしながら、並べ替えの後で、処理レーン10〜17はそれぞれ、処理レーン0〜7からデータを正しく受信する一方で、様々な処理レーンが、10レーン離れていない処理レーンからデータを受信した。たとえば、上の例では、処理レーン8は処理レーン6からデータを受信し、処理レーン6は10処理レーン離れていない。
この問題に対処するために、処理レーンの宛先サブセット(たとえば、データを受信することになるもの)のみが、受信された並べ替えられたデータを記憶することができる。たとえば、GPU12のコントローラ回路は、処理レーン10〜17のGPRが、処理レーン0〜7が入力レーンであるときにデータを記憶することを可能にし得る(たとえば、GPRがデータを記憶することを可能にするように、処理レーン10〜17に対応するGPRに結合されたMUXを構成する)。処理レーンの残りのGPRは、データを記憶することが許容されないことがあり(たとえば、GPRがデータを記憶することを許容しないように、処理レーンの残りに対応するGPRに結合されたMUXを構成する)、それによりデータを廃棄する。したがって、データはブロードキャストされるが、データは意図されない処理レーンのいずれのGPRにも書き込まれない。
シャッフラー回路14は次いで、次の連続的なバンク(たとえば、処理レーン8〜15を含むバンク0)の入力を受信することができる。シャッフラー回路14は同様に、剰余に基づいてデータを並べ替え(たとえば、出力の順序が14、15、8、9、10、11、12、および13となるように2シフトしラップアラウンドする)、出力を処理レーンに(たとえば、各バンクに)ブロードキャストすることができる。コントローラ回路は、処理レーン18〜25のGPRがデータを記憶することを許容することがあり、他の処理レーンのGPRがデータを記憶することを許容しないことがある。シャッフラー回路14およびコントローラ回路は、すべてのソース処理レーンが自身の出力をそれぞれの宛先処理レーンに書き込まれた状態にするまで、これらの動作を繰り返すことができる。
上の例では、コントローラ回路は、処理レーンの宛先サブセットがデータを記憶し、またはデータを廃棄する1つの方法として、対応するGPRがデータを記憶することが可能であることを許容する、または許容しないものとして説明される。いくつかの例では、コントローラ回路は、処理レーンがデータを記憶する、またはデータを廃棄するための方法として、処理レーンがデータを記憶することまたはデータを記憶しないことを許容することがある。そのような技法の組合せも可能である。
したがって、図1はデータを処理するためのデバイスの例を提供し、デバイスはGPU12を含む。GPU12は複数の処理レーンを含み、処理レーンの各々はデータを処理するための回路(たとえば、ALU)を含み、処理レーンはSIMD構造で構成される。GPU12はまた、処理レーンのソースサブセットから(たとえば、バンクの処理レーンから)データを受信するシャッフラー回路14を含む。シャッフラー回路14は、データを処理レーンの別の1つへ出力するように処理レーンの各々に命令する(たとえば、CPU16からの)命令に基づいて、処理レーンのソースサブセットから受信されたデータを並べ替える。シャッフラー回路14は、並べ替えられたデータを処理レーンに出力する(たとえば、出力がバンクにブロードキャストされる)。いくつかの例では、処理レーンの宛先サブセットは対応するレジスタに受信された並べ替えられたデータを記憶し、処理レーンの宛先サブセット以外の処理レーンは受信された並べ替えられたデータを廃棄する。
上の例では、シャッフラー回路14が受信するデータは、処理レーンのソースサブセットの各処理レーンに対する全体のスカラー値またはベクトル値であり得る。たとえば、シャッフラー回路14が受信しているデータは、データ全体のサブバイトではないことがあり、むしろ、全体のスカラー値またはベクトル値である。シャッフラー回路14はまた、処理レーンのソースサブセットの各処理レーンから受信された全体のスカラー値またはベクトル値を並べ替えるように構成されることがあり、並べ替えられたデータの全体のスカラー値またはベクトル値を処理レーンに出力することがある。
また、上記は、シャッフル動作において、ある処理レーンがデータを別の処理レーンに出力することを説明する。いくつかの例では、ある処理レーンが別の処理レーンに出力したデータはまだ、その処理レーンとともに維持される。各処理レーンは、固有のデータを維持し、別の処理レーンからデータを受信する。いくつかの例では、処理レーン自体によって生成されるデータは削除されることがあり、別の処理レーンから受信されたデータだけが維持されることがある。
図2は、図1のGPUの一例をさらに詳細に示すブロック図である。たとえば、図2はGPU12の処理回路の一例を示す。GPU12は、コントローラ回路38、シャッフラー回路14、および汎用レジスタファイル(GPRF)56を含む。また示されるように、GPU12は複数のバンク46A〜46Xを含む。複数のバンク46A〜46Xの各々は、複数の処理レーン(PL)を含む。たとえば、バンク46Aは処理レーン42A,Aから42M,Aを含み、バンク46Xは処理レーン42A,Xから42M,Xを含む。したがって、図2では、処理レーン(たとえば、42A,Aから42M,Aまたは42A,Xから42M,X)は複数のバンク46A〜46Xへとグループ化され、複数のバンク46A〜46Xの各バンクは複数の処理レーンの1つまたは複数の処理レーンを含む。
ある例として、全体で64個の処理レーンがあると仮定する。この例では、8個のバンクがあり、各バンクは8個の処理レーンを含む。したがって、バンク46A〜46Xは8個のバンクを表し、PL 42A,Aから42M,Aはバンク46Aの8個の処理レーンを表し、PL 42A,Xから42M,Xはバンク46Xの8個の処理レーンを表す。
処理レーン42A,Aから42M,Xの各々はそれぞれ、1つまたは複数のALU44A,Aから44M,Xを含む。ALU44A,Aから44M,Xは、処理レーン42A,Aから42M,Xの各々に割り当てられる処理タスクを実行するように構成され得る。本開示では、ALU44A,Aから44M,Xは、GPU12の処理コア(シェーダコアとも呼ばれる)の一部であり得る。たとえば、GPU12は、シェーダプログラム(たとえば、頂点シェーダ、画素シェーダ、ジオメトリシェーダ、または非グラフィクスアプリケーションに使用される計算シェーダ)の命令を実行するように構成され得る。処理レーン42A,Aから42M,Xの各々は、シェーダプログラムの命令を並列に実行することができるが、データは異なることがある(たとえば、シェーダプログラムの複数のインスタンス化がある)。ALU44A,Aから44M,Xは、命令によって定義される動作を実行するハードウェア回路であり得る。
本開示は、処理レーンの各々が同じ命令を実行し得ることを説明するが、いくつかの例では、処理レーンの必ずしもすべてではないが少なくとも一部が、シャッフル命令を実行することが可能であり得る。たとえば、処理レーン42A,Aから42M,Xのサブセットは、同じ命令を並列に実行することがあるが、他のものはそうしないことがある。そのような例では、処理レーン42A,Aから42M,Xの少なくともいくつかがシャッフル命令を並列に実行しており、他のものがそうしていないということが可能であり得る。
GPRF56は、ローカルで生成されたデータを記憶するために処理レーン42A,Aから42M,Xのために割り振られたメモリである。たとえば、GPRF56は、処理レーン42A,Aから42M,Xに割り当てられた複数の汎用レジスタ(GPR)を含む。ALU44A,Aから44M,Xの各々が、処理のためにそれぞれの割り当てられたGPRからデータ(たとえば、処理のためのオペランドデータ)を取り出し、シェーダプログラムの命令が処理されていることに基づいてそのデータに対して数学的演算を実行し、得られたデータをそれぞれの割り当てられたGPRに返すことができる。
いくつかの例では、シャッフラー回路14は、処理レーン42A,Aから42M,XのGPRに結合され、いくつかの例では選択的に結合される。このようにして、シャッフラー回路14は、ソース処理レーンからのデータをそのソース処理レーンのGPRを介して受信し、データを宛先処理レーンのGPRに出力することによってデータをその宛先処理レーンに出力する。したがって、シャッフル動作は、シャッフラー回路14がソース処理レーンのGPRからデータを受信してデータを宛先処理レーンのGPRに出力することで実行され得る。
基本的な例として、命令が変数AおよびBによって表される値を加算するためのものである場合、処理レーン42A,Aから42M,Xの各々はこの加算命令を受信する。ALU44A,Aから44M,Xは、GPRF56の中のそれぞれのGPRから変数Aの値を取り出し、GPRF56の中のそれぞれのGPRから変数Bの値を取り出す。この例では、変数AおよびBの値は、処理レーン42A,Aから42M,Xに対して異なることがあるが、AおよびBを加算するための命令は同じである。それぞれのALU44A,Aから44M,Xは、変数Cによって表されるそれぞれの結果データを生成するために加算という数学的演算を実行することができ、それぞれのGPRの中のCという値をGPRF56に記憶することができる。次いで、変数Cがオペランドであるさらなる演算が必要である場合、それぞれのALU44A,Aから44M,Xは、処理のためにGPRF56のそれぞれのGPRからデータを取り出す。
コントローラ回路38は、GPU12の機能を制御することができる。コントローラ回路38は、ハードウェア構成要素として説明されるが、ソフトウェアが実行される構成要素でもあり得る。したがって、コントローラ回路38は、固定機能の回路とプログラム可能な回路の両方を指す。
本開示において説明される例では、コントローラ回路38は、処理レーン42A,Aから42M,Xの各々が処理することになる命令を出力するように構成され得る。たとえば、CPU16は、特定のシェーダプログラムを実行するためのコマンドをGPU12に出力し得る。それに応答して、コントローラ回路38は、システムメモリ30からシェーダプログラムの命令を取り出し、シェーダプログラムの命令を実行するように処理レーン42A,Aから42M,Xの各々をスケジューリングするように構成され得る。
本開示において説明される例示的な技法では、コントローラ回路38は、処理レーン42A,Aから42M,Xの各々に、データを処理レーン42A,Aから42M,Xの別のものへ出力するように命令する、命令を受信することがある(たとえば、コントローラ回路38はシャッフル命令を受信する)。シャッフル命令は、シャッフルモード(たとえば、処理レーン42A,Aから42M,Xの各々がデータを出力すべき方向)およびオフセット(たとえば、処理レーン42A,Aから42M,Xの各々がデータを出力すべき処理レーンまでどれだけの数の処理レーン離れているか)を定義することができる。たとえば、命令はshuffle rotate-up(shuffle leftとも呼ばれる)としてシャッフルモードを定義することがあり、このとき、処理レーン42A,Aから42M,Xの各々は、左に位置する処理レーンにデータを出力することになる。オフセットは10であることがあり、処理レーン42A,Aから42M,Xの各々が左に10レーン離れた処理レーンにデータを出力することになることを意味する。左に10レーン離れたレーンがない場合、オフセットはラップアラウンドする。
本開示では、1つのレーンが別のレーンの左または右にあることは、レーンがGPU12のSIMDアーキテクチャ内で左または右に物理的に位置していることを意味し得る。しかしながら、いくつかの例では、1つのレーンが別のレーンの左または右にあることは、論理的な指定であり得る。たとえば、現在のレーンより小さいアドレスを有するレーンは右にあるものとして見なされることがあり、現在のレーンより大きいアドレスを有するレーンは左にあるものとして見なされることがある。したがって、左および右という用語はレーンの物理的位置に限定されるものとして見なされるべきではないが、いくつかの例では、左および右はGPU12のSIMDアーキテクチャにおけるレーンの文字通りの位置を指していることがある。
上で説明されたように、シャッフラー回路14は、処理レーン42A,Aから42M,Xがそれぞれのシャッフル動作を実行できるように、データを並べ替えるように構成される。シャッフル動作を実行するために、シャッフラー回路14は、処理レーン42A,Aから42M,Xのソースサブセットからデータを受信する。たとえば、シャッフラー回路14は、1つのバンクの処理レーンからデータを受信することがあり、2つ以上のバンクにわたる処理レーンからデータを受信しないことがある(たとえば、バンク46Aの処理レーン42A,Aから42M,Aからデータを受信することがある)。
シャッフラー回路14が1つのバンクからの処理レーンからデータを受信することを可能にするために、シャッフラー回路14はマルチプレクサ(MUX)48に結合されることがあり、MUX48はバンク46A〜46Xの各々に結合されることがある。たとえば、MUX48は、バンク46Aの処理レーン42A,A〜42M,Aからデータを受信するための入力第1のグループ、および次のバンクの処理レーンからデータを受信するための入力の第2のグループなどを、バンク46Xの処理レーン42A,X〜42M,Xからデータを受信するための入力のグループを含めて含む。コントローラ回路38は、入力のグループの1つ(たとえば、バンク46A〜46Xの1つ)を選択して入力の選択されたグループからデータを出力する(たとえば、バンク46A〜46Xのうちの1つの処理レーンからデータを出力する)ようにMUX48に命令するコマンドをMUX48に出力し得る。
シャッフラー回路14は、バンク46A〜46Xのうちの1つの処理レーンからのデータであり得る、MUX48の出力を受信する入力インターフェース50を含む。入力インターフェース50がそこからデータを受信している処理レーンは、処理レーンのソースサブセットと呼ばれる。入力インターフェース50は複数の入力ポートを含む。たとえば、バンク46A〜46Xの各々が8個の処理レーンを含む場合、入力インターフェース50は8個の入力ポートを含み、各ポートはバンク46A〜46Xのうちの選択された1つの処理レーンの1つからデータを受信するように構成される。
シャッフル命令の中のシャッフルモードおよびオフセットに基づいて、コントローラ回路38は、受信されたデータを並べ替えるためにそれぞれの入力ポートをそれぞれの出力ポートに結合するように、シャッフラー回路14内のスイッチを選択的に切り替える(すなわち、開閉する)ために、コマンドをシャッフラー回路14に出力し得る。示されるように、シャッフラー回路14は、複数の出力ポートを含む出力インターフェース52を含む。出力ポートの各々は入力ポートの各々に対応する(たとえば、入力インターフェース50の第1の入力ポートは出力インターフェース52の第1の出力ポートに対応し、以下同様である)。本開示において説明される例示的な技法では、コントローラ回路38は、入力ポートからのデータが対応する出力ポートに出力されず、代わりに出力ポートの別の1つに出力されるように、シャッフラー回路14のスイッチを閉じさせ得る。入力ポートおよび出力ポートを一緒に選択的に結合することによって、シャッフラー回路14は入力インターフェース50上で受信されるデータを並べ替えることができる。
出力インターフェース52は、並べ替えられたデータをデマルチプレクサ(DEMUX)54に出力する。上で説明されたように、並べ替えられたデータはバンク46A〜46Xの各々にブロードキャストされる。示される例では、DEMUX54は、出力インターフェース52がバンク46A〜46Nに出力するデータをブロードキャストし得る。たとえば、DEMUX54は、バンク46Aの処理レーン42A,A〜42M,Aからデータを出力する出力の第1のグループ、および次のバンクの処理レーンにデータを出力する出力の第2のグループなどを、バンク46Xの処理レーン42A,X〜42M,Xにデータを出力する出力のグループを含めて含む。いくつかの例では、DEMUX54の出力のグループの各々の第1の出力はバンク46A〜46Xの各々の第1の処理レーンに結合され、DEMUX54の出力のグループの各々の第2の出力はバンク46A〜46Xの各々の第2の処理レーンに結合され、以下同様である。このようにして、バンク46A〜46Xの各々がシャッフラー回路14の出力を受信する。
しかしながら、いくつかの場合、すべての処理レーンが受信されたデータを実際に処理するとは限らない。したがって、コントローラ38は、処理レーンのサブセットだけが対応するGPRにシャッフラー回路14からの出力を記憶することを許容し得る。対応するGPRに並べ替えられたデータを記憶する処理レーンは、処理レーンの宛先サブセットと呼ばれる。他の処理レーンは受信された並べ替えられたデータを廃棄し得る。
本開示において説明された例示的な技法では、シャッフラー回路14は区分的なシャッフルを実行する。たとえば、シャッフラー回路14はまず、オフセットに基づいてシャッフラー回路14の入力上のデータを並べ替えることによって、および処理レーンの宛先サブセットがデータを受信することを選択的に可能にすることによって、バンク46Aの処理レーン42A,A〜42M,A(たとえば、処理レーンのソースサブセット)からのデータを正しい処理レーン(たとえば、処理レーンの宛先サブセット)に出力し得る。上で説明されたように、入力上のデータを並べ替えるための1つの例示的な方法は、シャッフラー回路14の入力ポートまたは出力ポートの数でオフセットを除算した剰余に基づいて、入力上のデータをシフトしてラップアラウンドすることである。シャッフラー回路14は次いで、バンク46Xまで次のバンク(たとえば、46B)などについてこれらの動作を繰り返し得る。
したがって、シャッフラー回路14は複数のクロック周期(N個のクロック周期)を利用してシャッフル動作全体を実行し得る。Nは、処理レーンの総数をシャッフラー回路14の入力ポートまたは出力ポートの数で割ったものに等しい。Wを処理レーンの総数に等しいものとし、Mをシャッフラー回路14の入力ポートまたは出力ポートの数に等しいものとする。この場合、NはW/Mに等しい。
いくつかの場合、シャッフラー回路14を設計するとき、シャッフラー回路14は、シャッフラー動作を実行する際の望ましいレイテンシに基づいて、ある数の入力ポートおよび出力ポートを含むように設計され得る。たとえば、多段パイプラインで実施されるシャッフル(本開示で説明される例など)では、Nはボトルネックである段のレイテンシに等しくなければならない。シャッフラー回路14は、処理レーンからのすべてのオペランド(たとえば、データ)を読み取るために4周期を使用し、次いで、レーン間でシャッフルを実行するためにN周期を使用し、次いで結果をライトバックするために8周期を使用し得る。この例では、ライトバックがボトルネックであるのでNは8でなければならない。どれだけの周期がシャッフル動作を実行するために必要であるかに基づいて、シャッフラー回路14の入力ポートおよび出力ポートの数は、処理レーンの総数をシャッフル動作を実行するのに必要な周期の数で割ることによって計算され得る(たとえば、MはW/Nに等しい)。
読取りのために4周期および書込みのために8周期が必要であると理解されるべきではない。一般に、読取りおよび書込みに必要な周期の数は、バスの幅によって決定される。32レーン*32ビットのデータを転送するために、広いバス(たとえば、1024ビット)が1周期を使用することがあり、または狭いバス(たとえば、256ビット)が4周期を使用することがある。さらに、受信側において、この論理は取扱幅を有し得る。取扱幅がさらに狭い(たとえば、128ビット/周期)と仮定する。この例では、データのすべてをGPRに書き込むのに8周期で十分である。より広いハードウェアは常により拡張性がある。よって、これらの数字は性能/コストのトレードオフの結果である。この読取り-シャッフル-書込みのパイプラインにおいて、書込み段が8周期を使用する場合、シャッフラー回路14は、コストを下げるには可能な限り狭くなければならないが、処理を8周期で終えることができないほど狭くてはならない。
本開示では、狭いとは、並列処理レーンの数を指す相対的な用語である。たとえば、シャッフラー回路14は、GPU12における処理レーンの数に対して相対的に狭いハードウェアである(たとえば、GPU12の中のレーンの数より少ないレーンに対してデータをシャッフルする)。狭いハードウェアを使用することによって、シャッフラー回路14はより多くの周期を使用するが、完了するのにより少ない電力しかかからない。
ある例として、128個の処理レーンがある(たとえば、Wが128に等しい)と仮定する。この例では、シャッフラー回路14は、シャッフル動作が8周期で完了し得るように、16個の入力ポートおよび16個の出力ポートのみを含む(たとえば、シャッフラー回路14は16レーンの幅のクロスバーである)ことが必要であり得る(たとえば、128/16は8に等しい)。
全レーン対全レーンクロスバーが使用される例でも、ボトルネックは処理レーンへのデータの書込みであり得る。したがって、ボトルネックのクロック周期以内にシャッフル動作を実行することが可能となるようにシャッフラー回路14を設計することによって、例示的な技法は、全レーン対全レーンクロスバーを使用する例と比較して、システム全体に大きなレイテンシを加えないことがある。たとえば、全レーン対全レーンクロスバーにおいて、シャッフル動作は1クロック周期を必要とすることがあり、ライトバックは8クロック周期を必要とすることがある。上の例では、シャッフラー回路14は、シャッフル動作を完了するのに8クロック周期を、ライトバックを完了するのに8クロック周期を必要とすることがある。しかしながら、ライトバックが行われている間にシャッフラー回路14がシャッフル動作を実行するので、クロック周期の総数は8クロック周期に限定されることがあり、これは全レーン対全レーンクロスバーの例で必要とされるクロック周期の総数と同じである。
本開示において説明される例示的な技法では、全レーン対全レーンクロスバーが使用される例と比較して、レイテンシの大きな増大はないことがある。しかしながら、例示的な技法はチップ面積の低減をもたらし得る。たとえば、64レーンの全レーン対全レーンクロスバーと比較すると、例示的な技法は(64/16)2倍の面積を節約する(たとえば、シャッフラー面積を16倍節約する)ことができる。
図3は、シャッフル動作を実行するための例示的な技法を示す概念図である。図3は、複数のソース処理レーンおよび複数の宛先処理レーンを示す。ソース処理レーンおよび宛先処理レーンはレーンの同じセットである。たとえば、あるレーンは、別のレーンのソースレーンであり、別のレーンの宛先レーンである(たとえば、あるレーンが同時にソースレーンであり宛先レーンであり得る)。
示される例では、全体で64個の処理レーン(たとえば、処理レーン0〜63)がある。各々が複数の処理レーンを含む、8個のバンク(バンク0からバンク7)がある。言い換えると、64個の処理レーンは複数のバンクへとグループ化され、複数のバンクの各バンクが1つまたは複数の処理レーンを含む。たとえば、バンク0は処理レーン0〜7を含み、バンク1は処理レーン8〜15を含み、以下同様である。また、示される例では、シャッフラー回路14は8個の入力ポートおよび8個の出力ポートを含む。
この例では、CPU16が35というオフセットとともにshuffle rotate upを実行するようにGPU12に命令したと仮定する(たとえば、処理レーン0は処理レーン35に出力することになり、処理レーン1は処理レーン36に出力することになり、以下同様であり、ここで処理レーン28は処理レーン63に出力することになる)。処理レーン29について、このオフセットは、処理レーン29に処理レーン64へ出力させるが、処理レーン64は存在しない。しかしながら、オフセットはラップアラウンドし、処理レーン29は処理レーン0に出力することになり、処理レーン30は処理レーン1に出力することになり、以下同様であり、処理レーン63は処理レーン34に出力する。
この例では、上で説明されたように、シャッフラー回路14は、処理レーンのソースサブセットから出力を受信し得る。処理レーンは1つのバンクの処理レーン(たとえば、バンク0の処理レーン7〜0)であり得る。シャッフラー回路14は、MUX48を介してバンク0の処理レーン7〜0からデータを受信し得る。図3に示されるように、シャッフラー回路14の入力ポートの各々は、処理レーン7〜0のうちの1つからデータを受信する。たとえば、シャッフラー回路14の第1の入力ポートは処理レーン0からデータを受信し、シャッフラー回路14の第2の入力ポートは処理レーン1からデータを受信し、以下同様である。
処理レーン0からのデータは、処理レーン35に出力されることになる。処理レーン0からのデータが処理レーン35に出力されることを確実にするために、コントローラ38は、シャッフラー回路14のどの出力ポートがDEMUX54を介して処理レーン35に結合されるかを決定し得る。上で説明されたように、DEMUX54は、シャッフラー回路14の第1の出力ポートに各バンクの第1の処理レーンを結合し、シャッフラー回路14の第2の出力ポートに各バンクの第2の処理レーンを結合し、以下同様である。図3に示される例では、処理レーン0〜7はそれぞれ、DEMUX54を通じて、シャッフラー回路14の第1から第8の出力ポートに結合され、処理レーン8〜15はそれぞれ、DEMUX54を通じて、シャッフラー回路14の第1から第8の出力ポートに結合され、以下同様である。
シャッフラー回路14のどの出力ポートが処理レーン35に結合されるかを決定するために、コントローラ回路38は、シャッフラー回路14の入力/出力ポートの数でオフセットを割ることができる(たとえば、35割る8)。この除算の商は処理レーン35が位置するバンクを示し、剰余は処理レーン35がそのバンクにおいて何番目のレーンであるかを示す。たとえば、35割る8の商は4であり、剰余は3である。したがって、コントローラ回路38は、処理レーン35がバンク4の中にあり、バンク4において3レーン中にあると決定することができる。示されるように、バンク4は処理レーン32〜39を含むので、処理レーン35はバンク4において3レーン中にある。
この例では、コントローラ回路38は、処理レーン35に結合するシャッフラー回路14の出力ポートが処理レーン0からデータを受信するように、シャッフラー回路14のそれぞれの入力ポート上のデータがラップアラウンドを用いて3つのポートによってシフトされるべきであると決定し得る。たとえば、シャッフラー回路14の第1から第8の出力ポートはそれぞれ、処理レーン32〜39に結合する。これは、シャッフラー回路14の第4の出力ポートが処理レーン35に結合することを意味する。したがって、シャッフラー回路14の第1の入力ポート上のデータをシャッフラー回路14の第4の出力ポートに出力することによって、処理レーン35は処理レーン0からデータを受信する。
この場合、コントローラ回路38は、シャッフラー回路14に、処理レーン0からのデータが処理レーン35に出力されるように第1の入力ポートを第4の出力ポートへ相互接続させ、処理レーン0からのデータが処理レーン36に出力されるように第2の入力ポートを第5の出力ポートへ相互接続させ、以下同様であり得る。第6の入力ポートについて、ラップアラウンドが原因で、コントローラ回路38は、シャッフラー回路14に、第6の入力ポートを第1の出力ポートへ相互接続させ、第7の入力ポートを第2の出力ポートへ相互接続させ、第8の入力ポートを第3の出力ポートへ相互接続させ得る。
図3に示されるように、第4の出力ポートは第1の入力ポートのデータを受信し(たとえば、第4の出力ポートは処理レーン0からのデータを出力する)、第5の出力ポートは第2の入力ポートからのデータを受信し(たとえば、第5の出力ポートは処理レーン1からのデータを出力する)、以下同様である。したがって、シャッフラー回路14は、オフセットに基づいて受信されたデータを並べ替えることができる。示されるように、シャッフラー回路14の第1の出力ポートは処理レーン5からのデータを出力し、シャッフラー回路14の第2の出力ポートは処理レーン6からのデータを出力し、シャッフラー回路14の第3の出力ポートは処理レーン7からデータを出力し、シャッフラー回路14の第4の出力ポートは処理レーン0からのデータを出力し、シャッフラー回路14の第5の出力ポートは処理レーン1からのデータを出力し、シャッフラー回路14の第6の出力ポートは処理レーン2からのデータを出力し、シャッフラー回路14の第7の出力ポートは処理レーン3からのデータを出力し、シャッフラー回路14の第8の出力ポートは処理レーン4からのデータを出力する。
DEMUX54は、シャッフラー回路14の出力をバンクの各々にブロードキャストする。示されるように、バンク4の処理レーン32〜34はそれぞれ、処理レーン5〜7からデータを受信する。バンク4の処理レーン35〜39はそれぞれ、処理レーン0〜4からデータを受信する。シャッフラー回路14の出力のブロードキャストが原因で、バンク5の処理レーン40〜47はシャッフラー回路14からデータを受信する。たとえば、処理レーン40〜42はそれぞれ、処理レーン5〜7からデータを受信する。処理レーン43〜47はそれぞれ、処理レーン0〜4からデータを受信する。
この場合、処理レーン35〜39は処理レーン0〜4からデータを正しく受信した(たとえば、オフセットが35であるので、処理レーン35〜39は処理レーン0〜4からデータを受信することになる)。しかしながら、処理レーン32〜34が処理レーン5〜7からデータを受信したが、(ラップアラウンドにより)処理レーン32〜34が処理レーン61〜63からデータを受信することになっていた。同様に、処理レーン40〜42は処理レーン5〜7からデータを正しく受信した(たとえば、オフセットが35であるので、処理レーン40〜42は処理レーン5〜7からデータを受信することになる)。しかしながら、処理レーン43〜47は処理レーン0〜4からデータを正しく受信したが、処理レーン43〜47は処理レーン8〜12からデータを受信することになっていた。この例では、バンク0〜3、6、および7のいずれもが、正しい処理レーンからデータを受信しなかった。
本開示において説明される技法では、処理レーンはデータを受信し得るが、処理レーンはデータを取得してそれをGPRにライトバックするためにアクティブではないことがある。コントローラ回路38は、並べ替えられたデータを受信することになる処理レーンの宛先サブセットをアクティブ化するように構成され得る。たとえば、上で説明されたように、処理レーン40〜42および35〜39は35というオフセットを用いてシャッフルを実施するために正しい処理レーンからデータを受信し、処理レーン43〜47および32〜34は35というオフセットを用いてシャッフルを実施するために正しい処理レーンからデータを受信しなかった。この例では、コントローラ回路38は、これらの処理レーンのみが対応するGPRにデータを記憶するように、処理レーン40〜42および35〜39のみをアクティブ化し得る。処理レーンの残りは、対応するGPRにデータを記憶しないことがあり、むしろ、データを廃棄することがある(すなわち、データはそれでも処理レーンの残りにブロードキャストされるが、処理レーンの残りは対応するGPRにデータを記憶できないので、データが廃棄される)。処理レーンは、GPRがデータを受信することを許容されないので、または処理レーンがデータを記憶しないように構成されるので、対応するGPRにデータを記憶することが可能ではないことがある。
コントローラ回路38は、オフセットおよびシャッフラー回路14の出力ポートの数に基づいて、どの処理レーンがアクティブ化されることになる(たとえば、データを記憶することが許容される)かを決定し得る。たとえば、コントローラ回路38は、35を8で割ることによる3という剰余に基づいて、処理レーン35が処理レーン0からデータを受信すべきであると決定した。この例では、コントローラ回路38は、処理レーン35および後続の7個の処理レーンが、対応するGPRにデータを記憶することを許容し得る。この例では、処理レーン35〜42は処理レーンの宛先サブセットである。処理レーンの残りへのデータは廃棄され得る。
処理レーンがデータを記憶することまたはデータを記憶しないことを、コントローラ回路38が可能にし得る様々な方法があり得る。コントローラ回路38は、GPRが対応する処理レーンからのデータを記憶することを許容するように、またはGPRが対応する処理レーンからのデータを記憶することを許容しないように、GPRに結合されたMUXを制御し得る。コントローラ回路38は、処理レーンが、対応するGPRにデータを記憶すること、または対応するGPRにデータを記憶しないことを可能にするように、処理レーンを制御し得る。いくつかの組合せ、ならびにこれらの例示的な技法以外の技法も可能である。これらの場合のいずれにおいても、処理レーンの宛先サブセットは対応するレジスタに並べ替えられたデータを記憶し、処理レーンの宛先サブセット以外の処理レーンは受信された並べ替えられたデータを廃棄する。
たとえば、コントローラ回路38は、どのGPRがシャッフル回路14に結合されるかを制御し得る。たとえば、コントローラ回路38は、この周期においてライトバックするためにどの8個の宛先レーンの宛先GPRが接続されるべきかを決定し得る。このようにして、コントローラ回路38は処理レーンをアクティブ化し得る(たとえば、それらの処理レーンのためのGPRにデータを提供することによって)。
この例では、シャッフラー回路14は、処理レーンの正しい宛先サブセットへのレーン0〜7からのデータの出力を終了した。しかしながら、その他の処理レーンが残っている(たとえば、シャッフラー回路14が残りのレーン8〜63からのデータを受信せず出力しなかった)。したがって、シャッフラー回路14およびコントローラ回路38は、シャッフル動作が完了するまでこれらのステップを繰り返し得る。たとえば、シャッフラー回路14は、レーン8〜15からデータを受信し、第1の出力ポートが処理レーン13からのデータを出力し、第2の出力ポートが処理レーン14からのデータを出力し、第3の出力ポートが処理レーン15からのデータを出力し、第4の出力ポートが処理レーン8からのデータを出力し、第5の出力ポートが処理レーン9からのデータを出力し、第6の出力ポートが処理レーン10からのデータを出力し、第7の出力ポートが処理レーン11からのデータを出力し、第8の出力ポートが処理レーン12からのデータを出力するように、データを並べ替える。この並べ替えられたデータはバンクのすべてにブロードキャストされるが、レーン43〜50のみが、対応するGPRに受信された並べ替えられたデータを記憶する。この例では、レーン48〜55を含むバンク6はそれぞれ、レーン13、14、15、8、9、10、11、および12からデータを受信する。バンク6のレーン48〜50のみがデータを記憶するので、レーン48〜50はレーン13〜15からデータを受信する。レーン40〜47を含むバンク4はそれぞれ、レーン13、14、15、8、9、10、11、および12からデータを受信する。レーン43〜47のみがデータを記憶するので、レーン43〜47はそれぞれ、レーン8〜12からデータを受信する。
したがって、この反復の後で、レーン35〜42のALUはそれぞれレーン0〜7からデータを受信し、レーン43〜50のALUはそれぞれレーン8〜15からデータを受信する。したがって、レーン0〜15からのデータは35レーンだけ左にシャッフルされた(上にシャッフルされた(shuffled up)とも呼ばれる)。シャッフラー回路14およびコントローラ回路38は、シャッフル動作を完了するために、連続するバンクに対してこれらを繰り返し得る。
図3の例では、GPU12を含むデバイス10、GPU12自体などの、データを処理するためのデバイス、またはSIMD構造を有する何らかの他のデバイス、複数の処理レーン0〜63があり、処理レーンの各々がデータを処理するための回路(たとえば、ALU44A,Aから44M,X)を含む。説明されたように、処理レーンはSIMD構造で構成される。
シャッフラー回路14は、MUX48を介してシャッフラー回路14の入力ポート上で処理レーンのソースサブセットからデータを受信する(たとえば、処理レーン0〜7からデータを受信する)ように構成され得る。いくつかの例では、ソースサブセットからデータを受信するために、シャッフラー回路14は1つだけのバンクからデータを受信し得る。シャッフラー回路14は、処理レーンの各々に処理レーンの別の1つへデータを出力するように命令する命令に応答して、処理レーンのソースサブセットから受信されたデータを並べ替え得る(たとえば、シャッフラー回路14はシャッフル命令に応答してデータを並べ替え得る)。シャッフラー回路14は、並べ替えられたデータを処理レーンに出力し得る。たとえば、DEMUX54は、並べ替えられたデータを処理レーンにブロードキャストし得る。このようにして、シャッフラー回路14が出力する並べ替えられたデータがバンクの各々に出力される。処理レーンのすべてがシャッフラー回路14の出力のうちの1つからデータを受信し得るが、コントローラ回路38は、処理レーンの宛先サブセットのみが、並べ替えられたデータを対応するレジスタに記憶することを許容し得る。他の処理レーンは受信された並べ替えられたデータを廃棄し得る。
シャッフラー回路14およびコントローラ回路38は、処理レーンの連続するソースサブセットおよび宛先サブセットに対して上の例示的な動作を実行するように構成され得る。たとえば、シャッフラー回路14は、処理レーンの連続するソースサブセットからデータを受信し、処理レーンの連続するソースサブセットから受信されたデータを並べ替え、並べ替えられたデータを処理レーンに出力することができ、処理レーンの連続する宛先サブセットは、受信された並べ替えられたデータを対応するレジスタに記憶する。
図2および図3に示されるように、処理レーンは複数のバンクへとグループ化される。コントローラ回路38は、複数のバンク0〜7のうちの1つに対するバンク識別情報(たとえば、図3の例ではbank ID 4)と、オフセットに基づく決定されたバンク識別情報を有するバンク4内の処理レーン(たとえば、処理レーン35)のレーン識別情報(たとえば、図3の例ではlane ID 3)とを決定し得る。この例では、コントローラ回路38は、決定されたバンク識別情報およびレーン識別情報(たとえば、バンク4の処理レーン35〜39およびバンク5の処理レーン40〜42に対応するGPRがデータを記憶することが許容される)に基づいて、処理レーンの宛先サブセットの対応するGPRが並べ替えられたデータを記憶することを可能にするように構成される。
一般に、上で説明されたように、シャッフラー回路14が受信できる処理レーンの数がMであり、W個の処理レーンがある場合、シャッフラー回路14はシャッフル動作をN周期で実行することができ、ここでN=W/Mである。例示的な技法は、全レーン対全レーンクロスバーと比較してより多数の周期を利用し得るが、本開示において説明される技法は、電力およびサイズの大きな低減を実現しながら、使用事例の大半(たとえば、90%以上)で大きなレイテンシなしで機能するはずである。使用事例の他の10%に対して、シャッフル動作を実行するためにソフトウェアが使用されることがあり、これはより低い性能をもたらすが、これは限られた場合だけである。
上の例では、シャッフル動作はすべての処理レーンにわたって発生した。しかしながら、いくつかの例では、シャッフル命令は、指定された幅にわたって(たとえば、処理レーンのすべてではないがあるグループにわたって)シャッフル動作を定義し得る。そのような例では、コントローラ回路38は、その上でシャッフル動作が発生する予定のない処理レーンのALUを無効にし得る。一般に、処理レーンの数は低減されるものと考えられ得る。レーンのそのような低減は、少数の処理レーンにわたるshuffle upおよびdownなどのある動作に対して有用であることがあり、高速な行列転置を実施するためのものであり得る。
図4A〜図4Rは、シャッフルモードの様々な例を示す概念図である。図4A〜図4Rにおいて、理解を簡単にするために4つの処理レーンが示されている。これらの例は任意の数の処理レーンに拡張され得る。図4A〜図4Rの各々において、一番上の行はソース処理レーン(たとえば、ソース処理レーンのためのソースレジスタ)であり、一番下の行は宛先処理レーン(たとえば、宛先処理レーンのための宛先レジスタ)である。また、シャッフラー回路14は簡潔にするために示されていない。
図4A〜図4Cは、shuffle rotate-down(shuffle rightまたはshuffle downとも呼ばれる)の例を示す。図4Aに示される例では、オフセットは1であるので、各処理レーンは右隣の処理レーンに出力する。第1の処理レーンについて、右に処理レーンはないので、第1の処理レーンは最後の処理レーンに出力する。この場合、シャッフラー回路14が使用されるとすると、コントローラ回路38は、ラップアラウンドを用いて、入力ポートの各々のデータを1だけ右へシフトさせるであろう。図4Bに示される例では、オフセットは2であるので、各処理レーンは2レーン右の処理レーンに出力する。第1の処理レーンおよび第2の処理レーンについて、2レーン右の処理レーンはないので、第1の処理レーンは最後から2番目の処理レーンに出力し、第2の処理レーンは最後の処理レーンに出力する。この場合、シャッフラー回路14が使用されるとすると、コントローラ回路38は、ラップアラウンドを用いて、入力ポートの各々のデータを2だけ右へシフトさせるであろう。図4Cに示される例では、オフセットは3であるので、各処理レーンは3レーン右の処理レーンに出力する。最初の3つの処理レーンについて、3レーン右に処理レーンはないので、最初の3つの処理レーンは最後の3つの処理レーンに出力する。この場合、シャッフラー回路14が使用されるとすると、コントローラ回路38は、ラップアラウンドを用いて、入力ポートの各々のデータを3だけ右へシフトさせるであろう。
図4A〜図4Cに示される例では、シャッフラー回路14はシャッフルモードおよびオフセットに基づいてデータを並べ替え得る。たとえば、shuffle rotate-downというシャッフルモードは、シャッフラー回路14が入力ポート上のデータを右にシフトすることを示し、オフセット(たとえば、オフセットとシャッフラー回路14のポートの数の除算の剰余に基づく)は、シャッフラー回路14がデータをどれだけ右にシフトするかを示す。
図4D〜図4Fは、shuffle rotate-up(shuffle leftまたはshuffle upとも呼ばれる)の例を示す。図4Dに示される例では、オフセットは1であるので、各処理レーンは左隣の処理レーンに出力する。最後の処理レーンについて、左に処理レーンはないので、最後の処理レーンは最初の処理レーンに出力する。この場合、シャッフラー回路14が使用されるとすると、コントローラ回路38は、ラップアラウンドを用いて、入力ポートの各々のデータを1だけ左へシフトさせるであろう。図4Eに示される例では、オフセットは2であるので、各処理レーンは2レーン左の処理レーンに出力する。最後の2つの処理レーンについて、2レーン左に処理レーンはないので、最後の2つの処理レーンは最初の2つの処理レーンに出力する。この場合、シャッフラー回路14が使用されるとすると、コントローラ回路38は、ラップアラウンドを用いて、入力ポートの各々のデータを2だけ左へシフトさせるであろう。図4Fに示される例では、オフセットは3であるので、各処理レーンは3レーン左の処理レーンに出力する。最後の3つの処理レーンについて、3レーン左に処理レーンはないので、最後の3つの処理レーンは最初の3つの処理レーンに出力する。この場合、シャッフラー回路14が使用されるとすると、コントローラ回路38は、ラップアラウンドを用いて、入力ポートの各々のデータを3だけ左へシフトさせるであろう。
図4D〜図4Fに示される例では、シャッフラー回路14はシャッフルモードおよびオフセットに基づいてデータを並べ替え得る。たとえば、shuffle rotate-upというシャッフルモードは、シャッフラー回路14が入力ポート上のデータを左にシフトすることを示し、オフセット(たとえば、オフセットとシャッフラー回路14のポートの数の除算の剰余に基づく)は、シャッフラー回路14がデータをどれだけ左にシフトするかを示す。
図4G〜図4Iは、ブロードキャストシャッフルモードを示す。これらの例では、オフセットは、どの処理レーンからブロードキャストを開始するかを示す(すなわち、オフセットはどの処理レーンがブロードキャストを開始するかを示すインデックスである)。いくつかの例では、ブロードキャストシャッフルモードでは、オフセットはないことがあり、代わりに処理レーンインデックスが使用されることがある。しかしながら、代わりにオフセットを処理レーンインデックスとして使用することが可能であり得る。たとえば、図4Gでは、オフセットは1であるので、第2の処理レーンからのデータはすべての他の処理レーンにブロードキャストされる。図4Iでは、オフセットは2であるので、第3の処理レーンからのデータがすべての他の処理レーンにブロードキャストされる。図4Hでは、オフセットは3であるので、第4の処理レーンからのデータがすべての他の処理レーンにブロードキャストされる。これらの例の各々において、シャッフラー回路14は、異なるバンクからではなく同じバンクから連続的にデータを受信することができ、出力を右または左にシフトすることができ、各反復に対して、出力が右または左にシフトされる量を増やすことができる(ラップアラウンドにより、シャッフラー回路14がデータを右と左のどちらの方向にシフトするかは重要ではないことがある)。たとえば、シャッフラー回路14は第1の反復においてデータを1だけ右にシフトすることができ、それらの宛先レーンは対応するGPRにデータを記憶することができる。次いで、次の反復において、シャッフラー回路14はデータを2だけ右にシフトすることができ、それらの宛先レーンは対応するGPRにデータを記憶することができ、以下同様である。
図4J〜図4Lはshuffle XORの例を示す。shuffle XOR(バタフライシャッフルとも呼ばれる)では、シャッフラー回路14は、ビットごとに、設計に基づいてオフセット値およびソース処理レーンまたは宛先処理レーンの値へ、XOR関数を適用する。この例では、この説明は宛先レーンがソースレーンを特定することに基づく。たとえば、図4Jにおいて、オフセット値は1であり、その二進数は01である。宛先レーン0(すなわち、00)に対して、01(オフセット)と宛先レーン(00)の値とのXORは01である。たとえば、宛先レーンとオフセットの両方の最初の二進値が0であり、0と0のXORは0である。宛先レーンの2番目の二進値は0であり、オフセットの2番目の二進値は1であり、0と1のXORは1である。したがって、結果は01である。値01は1に等しく、宛先レーン0はソースレーン1からデータを受信する。
図4Jにおいて、宛先レーン1(すなわち、01)に対して、01と01というオフセット値とのXORは00(すなわち、0)であり、宛先レーン1はソースレーン0からデータを受信する。宛先レーン2(すなわち、10)に対して、10と01というオフセット値とのXORは11(すなわち、3)であり、宛先レーン2はソースレーン3からデータを受信する。宛先レーン3(すなわち、11)に対して、11と01というオフセット値とのXORは10(すなわち、2)であり、宛先レーン3はソースレーン2からデータを受信する。
図4Kにおいて、オフセット値は2(すなわち、二進数で10)である。図4Kにおいて、宛先レーン0(すなわち、00)に対して、00と10というオフセット値とのXORは10(すなわち、2)であり、宛先レーン0はソースレーン2からデータを受信する。宛先レーン1(すなわち、01)に対して、01と10というオフセット値とのXORは11(すなわち、3)であり、宛先レーン1はソースレーン3からデータを受信する。宛先レーン2(すなわち、10)に対して、10と10というオフセット値とのXORは00(すなわち、0)であり、宛先レーン2はソースレーン0からデータを受信する。宛先レーン3(すなわち、11)に対して、11と10というオフセット値とのXORは01(すなわち、1)であり、宛先レーン3はソースレーン1からデータを受信する。
図4Lにおいて、オフセット値は3(すなわち、二進数で11)である。図4Lにおいて、宛先レーン0(すなわち、00)に対して、00と11というオフセット値とのXORは11(すなわち、3)であり、宛先レーン0はソースレーン3からデータを受信する。宛先レーン1(すなわち、01)に対して、01と11というオフセット値とのXORは10(すなわち、2)であり、宛先レーン1はソースレーン2からデータを受信する。宛先レーン2(すなわち、10)に対して、10と11というオフセット値とのXORは01(すなわち、1)であり、宛先レーン2はソースレーン1からデータを受信する。宛先レーン3(すなわち、11)に対して、11と11というオフセット値とのXORは00(すなわち、0)であり、宛先レーン3はソースレーン0からデータを受信する。
図4M〜図4Oは、shuffle downモードを示す。shuffle downモードは、図4A〜図4Cのshuffle rotate downモードと類似している。しかしながら、shuffle downモードでは、ラップアラウンドはない。たとえば、図4Mでは、オフセットが1であるので、各宛先レーンはその左隣のソースレーンからデータを受信する。宛先レーン3では、左にソースレーンはない。ラップアラウンドがないので、宛先レーン3は自己複製を実行し、自身からデータを受信する(たとえば、宛先レーン3のソースレーンはソースレーン3である)。図3には示されていないが、宛先レーンの各々はMUXを含むことがあり、宛先レーンが自己複製を実行することになる場合、MUXはソースレーンから受信されたデータを出力せず、宛先レーンがソースレーンからデータを受信することになる場合、MUXはソースレーンからデータを出力する。
図4Nでは、オフセットが2であるので、各宛先レーンは2レーン左のソースレーンからデータを受信する。宛先レーン3および2に対して、2レーン左のソースレーンはない。ラップアラウンドがないので、宛先レーン3および2は自己複製を実行し、自身からデータを受信する(たとえば、宛先レーン3のソースレーンはソースレーン3であり、宛先レーン2のソースレーンはソースレーン2である)。図4Oでは、オフセットが3であるので、各宛先レーンは3レーン左のソースレーンからデータを受信する。宛先レーン3、2、および1では、3レーン左のソースレーンはない。ラップアラウンドがないので、宛先レーン3、2、および1は自己複製を実行し、自身からデータを受信する(たとえば、宛先レーン3のソースレーンはソースレーン3であり、宛先レーン2のソースレーンはソースレーン2であり、宛先レーン1のソースレーンはソースレーン1である)。
図4P〜図4Rは、shuffle upモードを示す。shuffle upモードは、図4D〜図4Fのshuffle rotate downモードと類似している。しかしながら、shuffle upモードでは、ラップアラウンドはない。たとえば、図4Pでは、オフセットが1であるので、各宛先レーンはその右隣のソースレーンからデータを受信する。宛先レーン0では、右にソースレーンはない。ラップアラウンドがないので、宛先レーン0は自己複製を実行し、自身からデータを受信する(たとえば、宛先レーン0のソースレーンはソースレーン0である)。上で説明されたように、宛先レーンの各々は、そのような自己複製を可能にするためにMUXを含み得る。
図4Qでは、オフセットが2であるので、各宛先レーンは2レーン右のソースレーンからデータを受信する。宛先レーン0および1に対して、2レーン右のソースレーンはない。ラップアラウンドがないので、宛先レーン0および1は自己複製を実行し、自身からデータを受信する(たとえば、宛先レーン0のソースレーンはソースレーン0であり、宛先レーン1のソースレーンはソースレーン1である)。図4Rでは、オフセットが3であるので、各宛先レーンは3レーン右のソースレーンからデータを受信する。宛先レーン0、1、および2では、3レーン右のソースレーンはない。ラップアラウンドがないので、宛先レーン0、1、および2は自己複製を実行し、自身からデータを受信する(たとえば、宛先レーン0のソースレーンはソースレーン0であり、宛先レーン1のソースレーンはソースレーン1であり、宛先レーン2のソースレーンはソースレーン2である)。
図4M〜図4Rではラップアラウンドがないが、シャッフラー回路14は、シャッフル動作の完了を可能にするために必要に応じてデータを内部的にラップアラウンドできることを理解されたい。shuffle up/downでは、ラップアラウンドはないが、代わりに、ソースレーンが無効である(たとえば、範囲外のレーンである)場合に自己複製がある。shuffle.xor(XORモード)およびshuffle.idx(インデックスまたはブロードキャスティングモード)では、範囲外の場合はない。しかしながら、XORモードに対して非アクティブなレーンがある場合、シャッフラー回路14は自己複製を実行する。ブロードキャストモードおよびXORシャッフルモードでは、ラップアラウンドはない。shuffle rotate-down/upでは、範囲外の場合のラップアラウンドはない。
以下は、図4A〜図4Rに示される例を実施するための疑似コードである。疑似コードは、本開示において説明される技法のいくつかの例を実行するように、GPU12またはシャッフラー回路14によって実行可能であり得るコードを表す。例として、この疑似コードは、シャッフラー回路14が実行することになるシャッフル動作を呼び出す、GPU12上で実行されるシェーダアプリケーションの一部であり得る。疑似コードにおけるシンタックスは、shfl.md[.w][.dt] dst, src0, src1である。また、以下では、処理レーンと同義である「ファイバー」という用語を使用する。
ウェーブ内でファイバー間でデータを交換するために。データがソースファイバーの中のsrc0 GPRから実行中のファイバーの中のdst GPRに複製される。ソースファイバーは、シャッフルモード(md)に従ってソースファイバーオフセット(src1)から計算される。
md: shuffle mode = [idx|xor|up|down|rup|rdown]
rup/downはrotate-up/rotate-downを表す
[dt]: data type = [u16|u32]; //デフォルトではu32
shflは実際のデータ型を気にしない。16ビットか32ビットかを区別するだけである。
すべての16/32ビットのデータ型がu16/u32として扱われる。型のキャスティングは不要である。
[w]: width = [w4|w8].
wが指定される場合、4個または8個のファイバーのグループ内のシャッフル。
wが指定されない場合、ウェーブ全体(width = wave_size)内でのシャッフル。
「width>offset」がコンパイラまたはアセンブラによって保証されなければならない。
dst: データを保持すべき宛先GPR
src0: データを保持すべきソースGPR
src1: ソースファイバーオフセットこの値はウェーブごとに均一でなければならない。
直接の数字(IMM)またはGPR IDであり得る。
IMMの場合:
32というウェーブサイズに対して0〜31の範囲の5ビットの数である。
64というウェーブサイズに対して0〜63の範囲の6ビットの数である。
128というウェーブサイズに対して0〜127の範囲の7ビットの数である。
GPR IDの場合:
uGPRが好まれる
GPRが使用される場合、すべてのファイバーの中のこのGPRの値は同じでなければならない。
64というウェーブサイズに対するHW論理の記述。
input [1:0] mode = md; //シャッフルモード
input [5:0] offset = src1; //ソースファイバーIDまたはファイバーIDオフセット(0..63)
input [7:0] src = src0; //ソースレジスタアドレス
input [7:0] dst = dst; //宛先レジスタアドレス
input isActive [0:63] = get_active_mask();
wire [5:0] srcFid;
wire [31:0] srcData [0:63];
wire srcValid [0:63];
wire srcInRange [0:63];
input [5:0] Fid = get_fiber_id();
input [5:0] minFid = 0;
input [5:0] maxFid = get_wave_size() - 1;
if(width is defined) {
minFid = Fid & 〜 (width-1);
maxFid = minFid | (width-1);
}
//(1)そのファイバーがアクティブである場合ソースレジスタから値を読み出す
if (isActive[Fid] ) {
srcData[Fid] = GPR[Fid][src];
srcValid[Fid] = 1;
} else {
srcData[Fid] = xxx; //古い状態値
srcValid[Fid] = 0;
}
//(2)シャッフル - ソースファイバーIDを計算してそれが範囲の中にあるかどうかを見分ける
switch (mode) {
case .idx: srcFid = offset;
srcInRange = (minFid <=srcFid <= maxFid); break;
case .xor: srcFid = Fid ^ offset;
srcInRange = 1; break;
srcInRange = (srcFid <= maxFid); break;
case .up: srcFid = Fid - offset;
srcInRange = (srcFid >= minFid); break;
case .down: srcFid = Fid + offset;
srcInRange = (srcFid <= maxFid); break;
case .rotate-up: srcFid = minFid | (Fid - offset) & (width-1);
srcInRange = 1; break;
case .rotate-down: srcFid = minFid | (Fid + offset) & (width-1);
srcInRange = 1; break;
}
//(3)アクティブなファイバーに対してデータを宛先GPRに書き込む
if(isActive(Fid)) {
//ソースファイバーからのデータを、それが範囲の中にありアクティブである場合に複製する
if (srcInRange[Fid] && srcValid[srcFid])
GPR[Fid][dst] = srcData [srcFid];
//それ以外の場合、自分自身のファイバーから複製する
else
GPR[Fid][dst] = GPR[Fid][src];
}
図5は、シャッフル命令とともに使用される動作を示す概念図である。シャッフル命令は、OpenGL APIなどの特定のAPIに準拠し得る。シャッフル命令の一例は、shuffle.mode.datatype rDest rSrc laneOffsetである。この例では、shuffle.mode.datatypeは、shuffle upが実行されるか、shuffle downが実行されるか、shuffle broadcastが実行されるか、またはshuffle XORが実行されるかを示し、datatype(datawidthとも呼ばれる)は、データが16ビットであるかまたは32ビットであるかを示す。シャッフラー回路14は、少数のバイトではなく各処理レーンのスカラー値またはベクトル値全体を、受信し、並べ替え、出力することができる。rDestは、データが記憶されるべき対応する処理レーンの宛先レジスタを示し、rSrcは、データがそこから取り出される対応する処理レーンのソースレジスタを示す。laneOffsetはオフセットを示す。
ある例として、プログラムの中のシャッフル命令がGPU12によって実行されることに応答して、GPU12は、shfl.bfly.b32 Ry, Rx, 0x4などのシャッフル命令の演算を実行することができる。この例では、処理レーンはXORシャッフルを実行することになり、ここで、ソース処理レーンのRxレジスタからの値は、4に等しいオフセットを用いて宛先処理レーンのRyレジスタに記憶される。この動作は、shuffle XORオフセット=4である図5に示されている。対角方向の太い矢印が処理を強調するために使用される矢印であり、対角方向の破線の矢印が、処理が他の処理レーンに対しても行われていることを示すために使用されている。この例では、ソース処理レーンのRxレジスタからの値は、宛先処理レーンのRyレジスタに出力される。これは、下方を指す真っ直ぐな矢印で図5において示されているように、各処理レーンに対するRxレジスタに記憶されている値がまだ利用可能であることを意味する。太い直線の矢印が処理を強調しており、破線の真っ直ぐな矢印が、処理が他の処理レーンに対しても行われていることを示すために使用されている。
処理レーンのALUは次いで、add.f32 Rx, Ry, Rxという演算を実行することができる。この例では、処理レーンのALUは各々、それぞれのRxレジスタの中の値をそれぞれのRyレジスタからの値と加算し、結果をそれぞれのRxレジスタに記憶する。Ryレジスタの中の値は別の処理レーンのRxレジスタから来るので、加算演算は、各ALUが2つの処理レーンからのデータ値を加算するものと見なされ得る。
次に、各処理レーンは、shfl.bfly.b32 Ry, Rx, 0x2という演算を実行し得る。上と同様に、この例では、処理レーンはXORシャッフルを実行することになり、ここで、ソース処理レーンのRxレジスタからの値は、宛先処理レーンのRyレジスタへ、ただし2に等しいオフセットを用いて記憶される。この動作は、shuffle XORオフセット=2である図5に示されている。処理レーンのALUは次いで、add.f32 Rx, Ry, Rxという演算を実行することができる。この例では、処理レーンのALUは各々、それぞれのRxレジスタの中の値をそれぞれのRyレジスタからの値と加算し、結果をそれぞれのRxレジスタに記憶する。この例では、Ryレジスタは、演算の実行の前に、2つの処理レーンとRxレジスタの合計の値を記憶し、2つの処理レーンの合計の値を記憶する。したがって、加算命令の実行の後に、それぞれのRxレジスタに記憶されている得られた値は、4つの処理レーンの合計である(やはり、この処理は各処理レーンにおいて行われている)。
各処理レーンは次いで、shfl.bfly.b32 Ry, Rx, 0x1という演算を実行し得る。上と同様に、この例では、処理レーンはXORシャッフルを実行することになり、ここで、ソース処理レーンのRxレジスタからの値は、宛先処理レーンのRyレジスタへ、ただし1に等しいオフセットを用いて記憶される。この動作は、shuffle XORオフセット=1である図5に示されている。処理レーンのALUは次いで、add.f32 Rx, Ry, Rxという演算を実行することができる。この例では、処理レーンのALUは各々、それぞれのRxレジスタの中の値をそれぞれのRyレジスタからの値と加算し、結果をそれぞれのRxレジスタに記憶する。この例では、Ryレジスタは、演算の実行の前に、4つの処理レーンとRxレジスタの合計の値を記憶し、4つの処理レーンの合計の値を記憶する。したがって、加算命令の実行の後に、それぞれのRxレジスタに記憶されている得られた値は、8つの処理レーンの合計である(やはり、この処理は各処理レーンにおいて行われている)。
最終的に、処理レーンの各々のRxレジスタの各々が、処理レーンの各々からのデータの合計を示す同じ値を記憶し得る。この例では、シャッフル動作はすべての処理レーンにわたるデータの加算を可能にし得る。本開示において説明される技法によれば、シャッフラー回路14は、高価な全レーン対全レーンクロスバーを必要とすることなく、代わりに、シャッフラー回路14内のはるかに小さいクロスバー(たとえば、8x8のクロスバー)でこの加算を可能にするように、このシャッフルを支援し得る。
以下は、図5に示される例を実行するための疑似コードである。
使用例:
//32ファイバーの32ビットのXORリダクション
shfl.xor.u32 Ry, Rx, 16;
(ss) add.f32 Rx, Ry, Rx;
shfl.xor.u32 Ry, Rx, 8;
(ss) add.f32 Rx, Ry, Rx;
shfl.xor.u32 Ry, Rx, 4;
(ss) add.f32 Rx, Ry, Rx;
shfl.xor.u32 Ry, Rx, 2;
(ss) add.f32 Rx, Ry, Rx;
shfl.xor.u32 Ry, Rx, 1;
(ss) add.f32 Rx, Ry, Rx;
//これですべてのファイバーがRxに合計を保持する
図6は、データを処理する例示的な方法を示すフローチャートである。たとえば、図6は、シャッフル動作を実行するための例を示す。コントローラ回路38は、シャッフラー回路14の入力ポートをバンクのそれぞれの処理レーンに結合するようにMUX48を構成する(60)。このようにして、シャッフラー回路14は、一例として処理レーンのソースサブセットからデータを受信し得る(62)。たとえば、シャッフラー回路14は、1つだけのバンクからデータを受信し得る。
シャッフラー回路14は、処理レーンの少なくともいくつか(たとえば、処理レーンの各々または処理レーンのサブセット)に、データを処理レーンの別のものへ出力するように命令する命令に応答して(たとえば、シャッフル命令に応答して)、バンクの処理レーンから受信されたデータを並べ替え得る(64)。たとえば、制御回路38は、オフセットに基づいて、複数のバンクのうちの1つのバンク識別情報と、決定されたバンク識別情報を有するバンクについての処理レーンのレーン識別情報とを決定し得る。コントローラ回路38は、シャッフラー回路14の第1の入力ポートが、決定されたバンクの中の決定されたレーン識別情報を有する処理レーンに出力するシャッフラー回路14の出力ポートに出力するように、シャッフラー回路14のスイッチを相互接続させ得る。コントローラ回路38は、シャッフラー回路14の中の入力ポートまたは出力ポートの数でオフセットを割ることができる。剰余およびシャッフルモードは、入力ポート上のデータをどのように右または左にシフトするかをコントローラ回路38に示すことができる。コントローラ回路38は、シャッフラー回路14のスイッチに、剰余の数のポートの分だけ離れた出力ポートへ入力ポートを相互接続させる(たとえば、剰余が3である場合、第1の入力ポートは第4の出力ポートに出力する)。
DEMUX54は、シャッフラー回路14からの並べ替えられた出力をバンクの各々にブロードキャストする(66)。このようにして、シャッフラー回路14は、並べ替えられたデータを処理レーンに出力する。しかしながら、処理レーンのすべてが受信されたデータを記憶するとは限らない。たとえば、処理レーンの宛先サブセット(たとえば、すべての処理レーン未満)が、並べ替えられたデータを対応するレジスタに記憶し得る。いくつかの例では、コントローラ回路38は、処理レーンの宛先サブセットの対応するレジスタが、並べ替えられたデータを記憶することを可能に得る。コントローラ回路38は、処理レーンのどの対応するGPRに、オフセットとシャッフラー回路14の第1の入力ポートからの出力を受信する処理レーンのレーン識別情報とに基づく記憶を許容するかを、決定し得る。
コントローラ回路38およびシャッフラー回路14は、シャッフル動作が完了するまでこれらの動作を繰り返し得る。たとえば、シャッフラー回路14は、処理レーンの連続するソースサブセットからデータを受信し得る(たとえば、MUX48は、シャッフラー回路14の入力に連続するバンクの処理レーンを結合し得る)。シャッフラー回路14は、連続するソースサブセットから受信されたデータを並べ替えることができる(たとえば、シャッフラー回路14のポートの数でオフセットを割ったときの剰余に基づいて、入力ポート上のデータを出力ポートにシフトする)。シャッフラー回路14は、並べ替えられたデータを処理レーンに出力することができ、処理レーンの連続する宛先サブセットは、受信された並べ替えられたデータを対応するレジスタに記憶する。
1つまたは複数の例では、説明された機能は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せとして実装され得る。ソフトウェアで実装される場合、機能は、1つまたは複数の命令またはコードとしてコンピュータ可読媒体上に記憶されてよく、ハードウェアベースの処理装置によって実行されてよい。コンピュータ可読媒体は、データ記憶媒体などの有形媒体に相当するコンピュータ可読記憶媒体を含み得る。このようにして、コンピュータ可読媒体は、一般に、非一時的である有形コンピュータ可読記憶媒体に相当し得る。データ記憶媒体は、本開示で説明された技法の実装のための命令、コード、および/またはデータ構造を取り出すために、1つもしくは複数のコンピュータまたは1つもしくは複数のプロセッサによってアクセスされ得る任意の利用可能な媒体であり得る。コンピュータプログラム製品はコンピュータ可読媒体を含み得る。
限定ではなく例として、そのようなコンピュータ可読記憶媒体は、RAM、ROM、EEPROM、CD-ROMもしくは他の光ディスクストレージ、磁気ディスクストレージもしくは他の磁気記憶デバイス、フラッシュメモリ、または、命令もしくはデータ構造の形態の所望のプログラムコードを記憶するために使用されコンピュータによってアクセスされ得る任意の他の媒体を備え得る。コンピュータ可読記憶媒体およびデータ記憶媒体は、搬送波、信号、または他の一時的媒体を含まないが、代わりに、非一時的な有形記憶媒体を対象とすることを理解されたい。本明細書で使用するディスク(disk)およびディスク(disc)は、コンパクトディスク(disc)(CD)、レーザーディスク(登録商標)(disc)、光ディスク(disc)、デジタル多用途ディスク(disc)(DVD)、フロッピーディスク(disk)およびBlu-ray(登録商標)ディスク(disc)を含み、ディスク(disk)は通常、データを磁気的に再生し、ディスク(disc)は、レーザーを用いてデータを光学的に再生する。上記の組合せもまた、コンピュータ可読媒体の範囲内に含まれるべきである。
命令は、1つもしくは複数のデジタル信号プロセッサ(DSP)、汎用マイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブルロジックアレイ(FPGA)、または他の等価な集積論理回路もしくはディスクリート論理回路などの、1つまたは複数のプロセッサによって実行され得る。したがって、本明細書において使用される「プロセッサ」という用語は、上記の構造、または本明細書において説明される技法の実装に適した任意の他の構造のいずれかを指すことがある。加えて、いくつかの態様では、本明細書において説明される機能は、符号化および復号のために構成された専用のハードウェアモジュールおよび/もしくはソフトウェアモジュール内で与えられることがあり、または複合コーデックに組み込まれることがある。また、技法は、1つまたは複数の回路または論理要素で全体的に実装され得る。
本開示の技法は、ワイヤレスハンドセット、集積回路(IC)、またはICのセット(たとえば、チップセット)を含む、多種多様なデバイスまたは装置に実装され得る。開示される技法を実行するように構成されたデバイスの機能的態様を強調するために、様々な構成要素、モジュール、またはユニットが本開示で説明されるが、それらは必ずしも異なるハードウェアユニットによる実現を必要とするとは限らない。むしろ、上で説明されたように、様々なユニットは、コーデックハードウェアユニットにおいて組み合わせられてよく、または適切なソフトウェアおよび/もしくはファームウェアとともに、上で説明されたような1つまたは複数のプロセッサを含む、相互動作可能なハードウェアユニットの集合によって提供されてよい。
様々な例が説明された。これらおよび他の例は、以下の特許請求の範囲内に入る。