本開示は、並列コンピューティングシステムにおいてタスク間通信をサポートするための技法について説明する。タスク間通信をサポートするための技法は、ハードウェアベースのアトミック動作を使用して、パイプの状態を維持し得る。パイプは、様々なタスクがデータ製作者またはデータ消費者としてバッファと対話することを可能にする、先入れ先出し(FIFO)編成バッファを指すことがある。様々なパイプ実装形態は、複数の状態パラメータを使用して、パイプの状態を定義し得、これらの状態パラメータは、データ製作者または消費者がパイプと対話するたびに、修正される必要があり得る。本開示で説明するハードウェアベースのアトミック動作は、複数のパイプ状態パラメータをアトミックな方式で修正し得る。複数のパイプ状態パラメータをアトミックな方式で修正することで、さもなければ複数の製作者および/または複数の消費者が同時にパイプの状態を修正することを試みるときに発生するであろう競合状態を回避し得る。このようにして、パイプベースのタスク間通信が、並列コンピューティングシステムにおいてサポートされ得る。
計算的な問題は、1つまたは複数のプロセッサコア上で逐次、同時、および/または並列に実行される複数のタスクに分割され得る。タスクは、並列コンピューティングシステムによって実行されるプログラムを指すことがある。スレッドは、並列コンピューティングシステムにおいて単一の処理要素によって実行されるタスクのインスタンスを指すことがある。タスクを、本明細書では代替的にカーネルと呼ぶことがあり、スレッドを、本明細書では代替的に作業項目と呼ぶことがある。場合によっては、並列コンピューティングシステムによって実行される異なるタスクは、互いに通信する必要があり得る。たとえば、あるタスクは、別のタスクによって生成されるデータに基づいて、データを生成し得る。
パイプは、異なるタスクが互いに通信することを可能にするために使用され得る。プログラマーの観点から、パイプは、様々なタスクがデータ製作者またはデータ消費者としてバッファと対話することを可能にする、FIFO編成バッファを提供し得る。FIFO編成バッファは、書込みインターフェースおよび読取りインターフェースがFIFOの原理に従って動作するバッファを指すことがある。FIFOの原理に従って動作する書込みインターフェースは、バッファ内にすでに記憶されている任意のデータの終了に書き込まれるようにデータをアペンドするインターフェースを指すことがある。FIFOの原理に従って動作する読取りインターフェースは、バッファに書き込まれるべき最も早い、未読のデータを選択し、バッファから除去するインターフェースを指すことがある。
パイプはFIFO編成バッファを実装し得るので、パイプはまた、FIFOの原理に従って動作する書込みインターフェースと読取りインターフェースとを有すると言われることもある。プログラマーの観点から、FIFOの原理に従って動作する書込みインターフェースを有するパイプでは、データをパイプに書き込むタスクは、必ずしも、その中にデータを書き込むべきパイプ内の特定のロケーションを指定するとは限らないことがある。代わりに、パイプは、パイプ内にすでに記憶されている任意のデータの終了に書き込まれるようにデータをアペンドし得る。同様に、FIFOの原理に従って動作する読取りインターフェースを有するパイプでは、パイプからデータを読み取るタスクは、必ずしも、それからデータを読み取るべきパイプ内の特定のロケーションを指定するとは限らないことがある。代わりに、パイプは、パイプに書き込まれるべき最も早い、未読のデータであった、パイプ内に記憶されたデータを選択し、戻し得る。FIFOの原理に従って動作する読取りインターフェースと書込みインターフェースとを提供することによって、パイプは、それによって、データを記憶するために使用されるメモリの内部編成をプログラマーが心配する必要なしに、製作者タスクおよび消費者タスクが互いに効率的に通信し得る、抽象データ構造を提供し得る。
本開示で説明するパイプは、いくつかの例では、パイプに対してデータを書き込み、データを読み取るためのデータの基本単位として、データパケットを使用し得る。空ではないパイプは、1つまたは複数のパケットのシーケンスを含み得る。パイプのための開始パケットは、パイプ内に記憶されているパケットのシーケンス内の最初のパケットに対応するパケットを指すことがある。パイプのための終了パケットは、パイプ内に記憶されているパケットのシーケンス内の最後のパケットに対応するパケットを指すことがある。空であるパイプは、いかなるパケットをも含まなくてよい。
パイプは、パケットエントリの各々が単一のデータパケットを記憶することが可能である、データパケットを記憶するための複数のパケットエントリを含み得る。空ではないパイプのためのパケットのシーケンスは、パイプのためのパケットエントリの連続したセット内に記憶され得る。場合によっては、パケットエントリは、メモリ空間内に記憶され得、パケットエントリの連続したセットは、メモリ空間の終了からメモリ空間の開始までラップアラウンドし得る。空ではないパイプのための開始パケットエントリは、そのパイプの開始パケットを記憶するパケットエントリを指すことがある。空ではないパイプのための終了パケットエントリは、そのパイプの終了パケットを記憶するパケットエントリを指すことがある。最初のパケットオフセットパラメータは、空ではないパイプのための開始パケットエントリを示す値であり得る。空のパイプでは、最初のパケットオフセットパラメータは、データがパイプに書き込まれるときに、データが書き込まれることになる最初のパケットエントリを示す値であり得る。
様々なパイプ実装形態は、複数の状態パラメータを使用して、パイプの状態を定義し得、これらの状態パラメータは、データ製作者または消費者がパイプと対話するたびに、修正される必要があり得る。並列コンピューティングシステムにおける並列性のために、パイプは、各々が同時にパイプと対話し、パイプ状態パラメータを修正することを潜在的に試み得る、複数のデータ製作者および/または複数のデータ消費者をサポートする必要があり得る。複数のデータ製作者および/または消費者が潜在的に同時に複数のパイプ状態パラメータを修正することを可能にすることで、パイプが適切に機能することを妨げ得る競合状態につながり得る。
本開示のいくつかの態様に従って、ハードウェアベースのアトミック動作を実行して、パイプの状態を維持するための技法について説明する。たとえば、プロセッサ内に含まれるハードウェアユニットは、パイプの状態を示す2つ以上のパイプ状態パラメータを修正する、ハードウェアベースのアトミック読取り修正書込み動作を実行するように構成され得る。ハードウェアベースのアトミック読取り修正書込み動作を使用して、2つ以上のパイプ状態パラメータをアトミックな方式で修正することで、さもなければ複数のデータ製作者および/または消費者が同時にパイプの状態を修正することを試みるときに発生するであろう競合状態を回避し得る。このようにして、複数の状態パラメータを使用して、パイプの状態を定義するパイプのために、適切な機能が達成され得る。
複数の状態パラメータを使用して、パイプの状態を定義するパイプの一例は、リングバッファ(すなわち、サーキュラーバッファ)として実装されるパイプである。リングバッファとして実装されるパイプは、リングバッファとして編成されるパイプエントリを有し得る。リングバッファは、バッファがエンドツーエンドで接続されているかのような、単一の固定サイズのバッファを使用するデータ構造を指すことがある。言い換えれば、固定サイズのバッファの両端にあるパケットエントリは、概念的にリングバッファを実装するために互いに隣接していると見なされ得る。
リングバッファは、固定の開始パケットエントリと固定の終了パケットエントリとを有していないので、リングバッファとして実装されるパイプの状態を完全に定義するために、複数の状態パラメータが一般に必要とされる。たとえば、最初のパケットオフセットパラメータは、パイプの開始パケットエントリをポイントし得、パケットカウントパラメータは、パイプ内に含まれたパケットの数を示し得る。別の例として、最初のパケットオフセットパラメータは、パイプの開始パケットエントリをポイントし得、最後のパケットオフセットパラメータは、パイプの最後のパケットエントリをポイントし得る。データが、リングバッファとして実装されるパイプに追加されるか、またはそのパイプから除去されるたびに、状態パラメータの各々が更新される必要があり得る。したがって、パイプがリングバッファとして実装されるとき、複数のパイプ状態パラメータが更新される必要があり得る。
複数の状態パラメータを使用して、パイプの状態を定義するパイプの別の例は、予約をサポートするパイプである。パイプ予約は、製作者スレッドがパイプ内のパケットエントリの連続したセットを予約し、それに書き込むことを可能にし、消費者スレッドがパイプ内のパケットエントリの連続したセットを予約し、それから読み取ることを可能にし得る。パイプ予約は、複数の製作者が同時に2つ以上のパケットをパイプに書き込むことを試みる、および/または、複数の消費者が同時に2つ以上のパケットをパイプから読み取ることを試みるときに生じ得る、インターリーブ問題を緩和するために使用され得る。
概して、複数の製作者および/または複数の消費者が2つ以上のパケットをパイプに書き込むこと、および/または2つ以上のパケットをパイプから読み取ることを試みる問題は、パイプが、製作者または消費者のいずれかとしてパイプにバインドされている複数のタスクをサポートする状況において生じ得る。この問題はまた、単一のタスクが製作者または消費者としてパイプにバインドされ、そのタスクの実行が、並列に実行される複数のスレッド(すなわち、タスクのインスタンス)に分散される状況においても生じ得る。これは、たとえば、データ並列性をサポートする並列コンピューティングシステム(たとえば、単一命令多重データ(SIMD)実行ユニット、および/または単一プログラム多重データ(SPMD)実行ユニットを含む並列コンピューティングシステム)において発生し得る。
予約をサポートするパイプを使用するために、製作者は、書込みのためにパイプ内のパケットエントリの連続したセットを予約し、パケットデータを予約済みパケットエントリに書き込み、予約済みパケットエントリをパイプにコミットし得る。同様に、消費者は、読取りのためにパイプ内のパケットエントリの連続したセットを予約し、予約済みパケットエントリからパケットデータを読み取り、予約済みパケットエントリをパイプにコミットし得る。
複数の製作者が、同時にパイプのためのパケットエントリを予約し、および/または同時に予約済みパケットエントリに書き込み得るので、複数の書込み予約が、パイプに対して所与の時間に未処理(すなわち、コミットされていない)であり得る。そのような場合、パイプは、データパケットがパイプの予約済みパケットエントリに書き込まれたことを反映するように、パイプ状態パラメータを更新するより前に、すべての未処理の書込み予約がコミットされるまで待機し得る。
同様に、複数の消費者が、同時にパイプのためのパケットエントリを予約し、および/または同時に予約済みパケットエントリから読み取り得るので、複数の読取り予約が、パイプに対して所与の時間に未処理(すなわち、コミットされていない)であり得る。そのような場合、パイプは、予約済みパケットエントリ内に含まれたデータパケットがそのパイプから読み取られ、除去されたことを反映するように、パイプ状態パラメータを更新するより前に、すべての未処理の読取り予約がコミットされるまで待機し得る。
予約をサポートするパイプの状態を維持するために、1つまたは複数のパイプ状態パラメータが、パイプの予約状態を定義するために必要とされ得る。これらのパイプ状態パラメータは、予約状態パラメータと呼ばれることがある。たとえば、第1の予約状態パラメータは、パイプに対していくつの未処理の予約があるかを示し得、第2の予約状態パラメータは、いくつのパケットエントリがパイプ内で予約されているかを示し得る。パケットエントリがパイプ内で予約および/またはコミットされるたびに、予約状態パラメータが更新される必要があり得る。加えて、すべての未処理の予約がパイプにコミットされるとき、予約状態パラメータおよび他のパイプ状態パラメータが更新される必要があり得る。したがって、パケットエントリが、予約をサポートするパイプから予約され、および/またはそのパイプにコミットされるとき、複数のパイプ状態パラメータが更新される必要があり得る。
上記で説明したように、パイプがリングバッファとして編成されるとき、および/またはパイプが予約をサポートするとき、複数のパイプ状態パラメータが、パイプの状態を定義するために必要とされ得る。並列コンピューティングシステムにおける並列性のために、パイプは、各々が同時にパイプと対話し、パイプ状態パラメータを修正することを潜在的に試み得る、複数のデータ製作者および/または複数のデータ消費者をサポートする必要があり得る。複数のデータ製作者および/または消費者が潜在的に同時に複数のパイプ状態パラメータを修正することを可能にすることで、パイプが適切に機能することを妨げ得る競合状態につながり得る。
本開示のいくつかの態様に従って、ハードウェアベースのアトミック動作を実行して、パイプの状態を維持するための技法について説明する。たとえば、プロセッサ内に含まれるハードウェアユニットは、パイプの状態を示す2つ以上のパイプ状態パラメータを修正する、ハードウェアベースのアトミック読取り修正書込み動作を実行するように構成され得る。ハードウェアベースのアトミック読取り修正書込み動作を使用して、2つ以上のパイプ状態パラメータをアトミックな方式で修正することで、さもなければ複数のデータ製作者および/または消費者が同時にパイプの状態を修正することを試みるときに発生するであろう競合状態を回避し得る。このようにして、たとえば、リングバッファとして実装されるパイプ、および/または予約をサポートするパイプなど、複数の状態パラメータを使用するパイプのために、適切な機能が達成され得る。
複数のパイプ状態パラメータを更新するときに競合状態を回避するための別の解決策は、スレッドによるパイプの状態を修正するための試みを、そのスレッドのためのコンパイル済みコードのクリティカルセクション内に配置すること、および、ミューテックスロックを使用して、コードのクリティカルセクションを実施することを伴う。ミューテックスロックは、2つのスレッドが同時にそれらのクリティカルセクション内で実行中ではないことを保証し、それによって、2つのスレッドが同時にパイプ状態パラメータを修正することができないことを保証し得る。ミューテックスロックは、たとえば、比較交換アトミック動作を使用することによって実装され得る。しかしながら、ミューテックスロックが使用されるとき、多数のスレッドがロックを求めて競合し、それによって、ロックの獲得の成功のために複数の試みが行われる結果となり得る。スレッドによってロックを獲得するために繰り返される試みは、性能および/または電力効率を低減させ得る。
しかしながら、本開示で説明するハードウェアベースのアトミック動作は、2つのスレッドが同時にパイプのパイプ状態パラメータを修正することができないことを保証し得、ミューテックスロックの使用を必要とすることなく、そのような挙動を達成し得る。たとえば、本開示のハードウェアベースのアトミック動作を実施するハードウェアユニットが、パイプのための複数のパイプ状態パラメータを修正するための、複数のスレッドからの複数の要求を受信するとき、ハードウェアユニットは、第1のスレッドからの第1の要求に関連付けられたすべてのパイプ状態パラメータ修正が、第2のスレッドからの第2の要求に関連付けられたパイプ状態パラメータ修正のいずれかを実行するより前に完了されるように、それらの要求を逐次処理し得る。そのようなハードウェアユニットを使用することで、複数の同時に実行するスレッドが同時に複数のパイプ状態パラメータを修正することを試みる並列コンピューティングシステムにおいて、適切なパイプ機能を達成することが可能になり得る。このようにして、パイプベースのタスク間通信が、パイプ状態パラメータを修正するためにソフトウェアベースの相互排除技法を使用することに関連する性能の欠点および/または電力消費の欠点を伴うことなく、並列コンピューティングシステムにおいて提供され得る。
いくつかの例では、本開示で説明するハードウェアベースのアトミック動作は、パイプの状態を示す2つ以上のパイプ状態パラメータを修正する、ハードウェアベースのアトミック読取り修正書込み動作を含み得る。読取り修正書込み動作は、その読取り修正書込み動作を要求したタスクまたはスレッドと同時に実行中である他のタスクおよび/またはスレッドによって要求され得るいかなる他の読取り修正書込み動作からの割込みもなしに、動作が開始から終了まで実行されるという意味で、アトミックであり得る。言い換えれば、アトミック読取り修正書込み動作の実行中に、他のスレッドおよび/またはタスクは、その読取り修正書込み動作によって修正されるパイプ状態パラメータを読み取るかまたは修正することが可能であり得ない。このようにして、2つ以上のタスクおよび/またはスレッドが、同時にパイプのパイプ状態パラメータを修正することを試みる場合に、競合状態が回避され得る。
アトミック読取り修正書込み動作は、そのアトミック読取り修正書込み動作が、ハードウェアユニットに通信可能に結合されているスレッドおよび/またはタスクによって呼び出され得る単一の分割不可能な動作として、そのハードウェアユニットによって実施され得るという意味で、ハードウェアベースであり得る。単一の分割不可能な動作は、その読取り修正書込み動作を要求したタスクまたはスレッドと同時に実行中である他のタスクおよび/またはスレッドによって要求され得る他の読取り修正書込み動作を実行するために、その動作に割り込むことなく、ハードウェアユニットがその動作を開始から終了まで実行するという意味で、分割不可能であり得る。たとえば、ハードウェアユニットが、アトミック読取り修正書込み動作を実行するための複数の要求を受信する場合、ハードウェアユニットは、一度に1つのアトミック読取り修正書込み動作が実行されるように、および、各アトミック読取り修正書込み動作の実行が、別のアトミック読取り修正書込み動作を実行することを開始するより前に完了されるように、それらの要求の各々のためにアトミック読取り修正書込み動作を逐次実行し得る。ハードウェアベースのアトミック読取り修正書込み動作を使用することによって、タスクおよび/またはスレッドがミューテックスロックを使用することを必要とすることなく、それらのタスクおよび/またはスレッドを同時に実行することによって、複数のパイプ状態パラメータが修正され得る。
いくつかの例では、2つ以上のパイプ状態パラメータを修正するハードウェアベースのアトミック読取り修正書込み動作を実行するために、ハードウェアユニットは、割込み不可能な動作のセットを実行するように構成され得る。たとえば、割込み不可能な動作のセットは、メモリサブシステムからパイプのパイプ状態パラメータに対応する値を読み取る動作と、パイプ状態パラメータのための修正された値を生成する動作と、パイプ状態パラメータのための修正された値をメモリサブシステムに書き込む動作とを含み得る。動作のセットは、他の読取り修正書込み動作(たとえば、現在実行中の読取り修正書込み動作を要求したタスクまたはスレッドと同時に実行中であるタスクおよび/またはスレッドによって要求される他の読取り修正書込み動作)に関連付けられ得る他の動作を実行するための割込み実行なしに、それらの動作が開始から終了まで実行されるという意味で、割込み不可能であり得る。ハードウェアユニットに、このようにして割込み不可能な読取り修正書込みシーケンスを実行させることで、ハードウェアユニットが、そのような動作を要求し得る同時に実行中のスレッドおよび/またはタスクのためにアトミック読取り修正書込み動作を実施することが可能になる。
本開示のいくつかの態様によれば、本開示によるハードウェアベースのアトミック読取り修正書込み動作を実施するハードウェアユニットは、異なるパイプ状態パラメータのための異なる修正動作を、単一のアトミック読取り修正書込み動作の一部として実行し得る。たとえば、ハードウェアユニットは、第1の修正関数に基づいて第1のパイプ状態パラメータのための修正された値を生成する第1の修正動作と、第2の修正関数に基づいて第2のパイプ状態パラメータのための修正された値を生成する第2の修正動作とを実行し得る。第2の修正関数は、第1の修正関数とは異なり得る。異なる修正関数を使用して、異なるパイプ状態パラメータを単一のアトミック読取り修正書込み動作の一部として修正することで、異なるパイプ状態パラメータが単一のアトミック動作において異なる方法で更新されることが可能になり得る。
たとえば、アトミックパイプ予約動作をサポートするために、第1の修正関数は、予約済みパケットカウントパラメータを、パイプ予約のために要求されるパケットの数だけインクリメントするために使用され得、第2の修正関数は、予約カウントを1の定数値だけインクリメントするために使用され得る。別の例として、アトミックパイプコミット動作をサポートするために、第1の修正関数は、予約カウントを1の定数値だけデクリメントするために使用され得、第2の修正関数は、パケットカウントパラメータを予約カウントパラメータだけインクリメントまたはデクリメントするために使用され得、第3の修正関数は、予約済みパケットカウントパラメータを0にリセットするために使用され得る。他の例が可能であり、本開示の範囲内である。
本開示の追加の態様によれば、本開示によるハードウェアベースのアトミック読取り修正書込み動作を実施するハードウェアユニットは、アトミック動作の実行中にメモリサブシステムから取得される1つまたは複数の追加のパイプ状態パラメータの値に基づいて、1つまたは複数のパイプ状態パラメータの値を修正し得る。たとえば、ハードウェアユニットは、単一の読取り修正書込み動作中に、それぞれパイプの第1のパイプ状態パラメータおよび第2のパイプ状態パラメータに対応する第1の値と第2の値とを読み取り、第2のパイプ状態パラメータのための修正された値が、第1のパイプ状態パラメータに対応する第1の値に基づいて生成されるように、第1のパイプ状態パラメータおよび第2のパイプ状態パラメータのための修正された値を生成し得る。単一のアトミック読取り修正書込み動作中に、異なるパイプ状態パラメータ値に基づいてパイプ状態パラメータ値を修正することで、パイプ状態パラメータが、パイプの現在の状態に基づいて、単一のアトミック動作において更新されることが可能になり得る。
たとえば、アトミックコミット動作をサポートするために、パケットカウントパラメータが、コミット動作が読取りコミット動作であるか書込みコミット動作であるかに応じて、予約済みパケットカウントパラメータだけデクリメントまたはインクリメントされ得る。別の例として、アトミック読取りコミット動作をサポートするために、最初のパケットオフセットパラメータが、予約済みパケットカウントパラメータに基づいて調整され得る。他の例が可能であり、本開示の範囲内である。
本開示の追加の態様によれば、異なるパイプ状態パラメータ値に基づいてパイプ状態パラメータ値を修正することは、異なるパイプ状態パラメータ値に基づいてパイプ状態パラメータ値を条件付きで更新することを伴い得る。パイプ状態パラメータ値を条件付きで更新することは、異なるパイプ状態パラメータ値に基づいてパイプ状態パラメータ値を更新するか更新しないかを決定することを伴い得る。他のパイプ状態パラメータ値に基づいてパイプ状態パラメータ値を条件付きで更新することで、パイプ状態パラメータが、パイプの現在の状態に基づいて更新されるかまたは更新されないことが可能になり得る。
本開示の追加の態様によれば、本開示によるハードウェアベースのアトミック読取り修正書込み動作を実施するハードウェアユニットは、パイプ状態パラメータ値を要求側スレッドおよび/またはタスクに戻し得る。場合によっては、戻されたパイプ状態パラメータ値は、ハードウェアベースのアトミック読取り修正書込み動作によって実行される修正より前のパイプの状態を反映し得る。値を要求側スレッドおよび/またはタスクに戻すことで、スレッドまたはタスクは、どのパケットエントリが予約動作のために予約されたかと、予約済みパケットエントリが、パイプのためのパケットエントリを記憶するメモリ空間内のどこにあるかとを決定することが可能になり得る。
いくつかの例では、本開示のハードウェアベースのアトミック読取り修正書込み動作は、アトミック書込み予約動作を含み得る。アトミック書込み予約動作は、パイプ状態パラメータのうちの1つまたは複数に基づいて、書込み予約要求をサポートするのに十分なほどの、コミットされていない、および未予約のエントリをパイプが有するか否かを決定し得る。書込み予約要求をサポートするのに十分なほどの、コミットされていない、および未予約のエントリをパイプが有すると決定することに応答して、アトミック書込み予約動作は、パイプ状態パラメータのための修正された値を、書込み予約がそのパイプのために行われたことをその修正された値が反映するように生成し得る。
さらなる例では、本開示のハードウェアベースのアトミック読取り修正書込み動作は、アトミック読取り予約動作を含み得る。アトミック読取り予約動作は、パイプ状態パラメータのうちの1つまたは複数に基づいて、読取り予約要求をサポートするのに十分なほどの、パケットデータが記憶される未読および未予約のパケットエントリをパイプが有するか否かを決定し得る。読取り予約要求をサポートするのに十分なほどの、パケットデータが記憶される未読および未予約のパケットエントリをパイプが有すると決定することに応答して、アトミック読取り予約動作は、パイプ状態パラメータのための修正された値を、読取り予約がそのパイプのために行われたことをその修正された値が反映するように生成し得る。
追加の例では、本開示のハードウェアベースのアトミック読取り修正書込み動作は、アトミック書込みコミット動作を含み得る。アトミック書込みコミット動作は、パイプがアトミック書込みコミット動作を実行するより前に有していたコミットされていない予約の数に対して、1つ少ないコミットされていない予約をパイプが有することを、第1のパイプ状態パラメータのための修正された値が反映するように、その修正された値を生成し得る。アトミック書込みコミット動作は、パイプ状態パラメータのうちの1つまたは複数に基づいて、パイプのためのすべての予約がコミットされたか否かをさらに決定し得る。パイプのためのすべての予約がコミットされたと決定することに応答して、アトミック書込みコミット動作は、パイプ状態パラメータのための1つまたは複数の修正された値を、コミットされたエントリがパイプに配置されたことをその修正された値が反映するように生成し得る。
さらなる例では、本開示のハードウェアベースのアトミック読取り修正書込み動作は、アトミック読取りコミット動作を含み得る。アトミック読取りコミット動作は、パイプがアトミック読取りコミット動作を実行するより前に有していたコミットされていない予約の数に対して、1つ少ないコミットされていない予約をパイプが有することを、第1のパイプ状態パラメータのための修正された値が反映するように、その修正された値を生成し得る。アトミック読取りコミット動作は、パイプ状態パラメータのうちの1つまたは複数に基づいて、パイプのためのすべての予約がコミットされたか否かをさらに決定し得る。パイプのためのすべての予約がコミットされたと決定することに応答して、アトミック読取りコミット動作は、パイプ状態パラメータのための1つまたは複数の修正された値を、コミットされたエントリがパイプから除去されたことをその修正された値が反映するように生成し得る。
本開示の追加の態様によれば、単一のアトミック読取り修正書込み動作中に読み取られ、書き込まれる複数のパイプ状態パラメータを記憶するために使用されるビット数は、単一のメモリトランザクション中にデータストレージユニットから読み取られるか、またはデータストレージユニットに書き込まれるデータのブロック内に含まれるビット数以下であり得る。たとえば、複数のパイプ状態パラメータを記憶するために使用されるビット数は、メモリワード内のビット数および/またはキャッシュライン内のビット数以下であり得る。場合によっては、メモリサブシステム内に記憶されたパイプの各々のためのパイプ状態パラメータは、パイプのためのパイプ状態パラメータのすべてがメモリサブシステムの単一のメモリワードおよび/または単一のキャッシュライン内に記憶されるように整合され得る。このようにして、アトミック読取り修正書込み動作は、2つ以上のメモリ読取りトランザクションまたは2つ以上のメモリ書込みトランザクションを必要とすることなく、複数のパイプ状態パラメータを修正することが可能であり得る。
いくつかの例では、パイプの状態を定義するパイプ状態パラメータは、いくつのパケットがパイプ内に現在記憶されているかを示すパケットカウントパラメータと、パイプのための開始パケットを記憶するパケットエントリを示す最初のパケットオフセットパラメータとを含み得る。これらのパラメータは、リングバッファとして実装されるパイプの状態を定義するために使用され得る。
さらなる例では、パイプの状態を定義するパイプ状態パラメータは、いくつのコミットされていない予約がパイプのために現在保留中であるかを示す予約カウントパラメータと、いくつのパケットエントリがパイプ内で現在予約されているかを示す予約済みパケットカウントパラメータとを含み得る。これらのパラメータは、予約状態パラメータと呼ばれることがあり、予約をサポートするパイプの状態を定義するために使用され得る。
追加の例では、パイプの状態を定義するパイプ状態パラメータは、パケットカウントパラメータと、最初のパケットオフセットパラメータと、予約カウントパラメータと、予約済みパケットカウントパラメータとを含み得る。このパイプ状態パラメータの組合せは、予約をサポートし、リングバッファとして実装される、パイプの状態を定義するために使用され得る。
本開示のハードウェアベースのアトミック読取り修正書込み動作について、主にパイプ状態パラメータの修正に関して説明するが、同じまたは同様のタイプの動作が異なるタイプのデータに適用され得ることを理解されたい。概して、本開示のハードウェアベースのアトミック読取り修正書込み動作は、たとえば、2つ以上の値が単一の動作の一部としてアトミックな方式で修正される必要がある適用例において使用され得る。ハードウェアベースのアトミック読取り修正書込み動作を使用して、2つ以上の値をアトミックな方式で修正することで、同時に実行中のタスクおよび/またはスレッドが、ロックおよび/またはコードのクリティカルセクションの使用を必要とすることなく、共有オブジェクトを修正することが可能になり得る。
図1は、本開示のハードウェアベースのアトミック動作を実施する、例示的なコンピューティングシステム10を示すブロック図である。コンピューティングシステム10は、1つまたは複数のタスクを実行するように構成され得る。タスクは、コンピューティングシステム10によって実行されるコンピュータプログラムを指すことがある。いくつかの例では、コンピューティングシステム10は、並列コンピューティングシステムであり得る。たとえば、コンピューティングシステム10は、異なる計算ユニット上で並列に2つ以上のタスクを実行し得る。別の例として、1つまたは複数のタスクでは、コンピューティングシステム10は、それぞれのタスクの複数のインスタンスを並列に実行し得る。スレッドは、コンピューティングシステム10において単一の処理要素によって実行されるタスクのインスタンスを指すことがある。
コンピューティングシステム10は、計算ユニット12A〜12B(総称して「計算ユニット12」)と、アトミック動作ユニット14と、データストレージシステム16とを含む。図1に示すように、計算ユニット12は、アトミック動作ユニット14に通信可能に結合され、アトミック動作ユニット14は、データストレージシステム16に通信可能に結合される。計算ユニット12は、アトミック動作ユニット14を介して間接的に、データストレージシステム16に通信可能に結合され得る。図1に特に示していないが、計算ユニット12は、いくつかの例では、データストレージシステム16に間接的に結合されることに加えて、データストレージシステム16に直接的に通信可能に結合され得る。
計算ユニット12は、1つまたは複数のタスクを実行するように構成される。場合によっては、計算ユニット12は、タスクを並列に実行し得る。計算ユニット12の各々は、同じタスクまたは異なるタスクを実行し得る。計算ユニット12によって実行されるタスクは、データ並列性を活用し得る。したがって、タスクの実行は、複数のスレッド(すなわち、タスクのインスタンス)に分散され得、そこで、スレッドの各々は、異なるデータに対して同じプログラム/タスクを実行する。複数のスレッドは、スレッドグループ内で実行され得、そこで、スレッドグループごとに、スレットが並列に実行される。したがって、計算ユニット12の各々は、所与の時点で1つのタスクを実行し得るが、同時にタスクの複数のインスタンス(すなわち、スレッド)を実行し得る。スレッドは、代替的に作業項目と呼ばれることがあり、スレッドグループは、代替的に作業グループと呼ばれることがある。
図1に示すように、計算ユニット12は、1つまたは複数のスレッドを実行するように構成される。たとえば、計算ユニット12Aは、スレッド18A、18Bを実行するように構成され、計算ユニット12Bは、スレッド20A、20Bを実行するように構成される。
計算ユニット12の各々は、1つまたは複数の処理要素を含み得る。計算ユニット12内の処理要素の各々は、単一のスレッドを実行し得る。計算ユニット12のうちの1つまたは複数が複数の処理要素を含む例では、単一または複数の計算ユニット12内の処理要素は、まとめて、スレッドのグループ(たとえば、作業グループ)を並列に実行するように構成され得、処理要素の各々は、スレッドのグループ(すなわち、作業グループ)内のスレッドのそれぞれの1つを実行し得る。いくつかの例では、計算ユニット12の各々はまた、ローカルメモリ、命令ストア、定数メモリなどのうちの1つまたは複数を含み得る。
いくつかの例では、計算ユニット12の単一のものにおける処理ユニットは、まとめて、単一命令多重データ(SIMD)プロセッサおよび/または単一プログラム多重データ(SPMD)プロセッサを実装し得る。両方のタイプのプロセッサは、複数の処理要素上でタスクの複数のインスタンスを同時に実行し得る。SIMDプロセッサ内で、すべてのアクティブな処理要素は、異なるデータに対して所与の命令サイクル中に等しい命令を実行し得、処理要素の各々は、共通のプログラムカウンタを共有し得る。SPMDプロセッサ内で、すべての処理要素は、異なるデータに対して等しいプログラムを実行し得、処理要素の各々は、それ自体のプログラムカウンタを有し得る。SPMDプロセッサでは、処理要素は、同時に同じプログラムの異なる命令を実行し得る。
計算ユニット12の各々は、プログラマブル計算ユニットであり得る。計算ユニットは、その計算ユニットがプログラムまたはタスクを実行するように構成されるハードウェアを含み得るという意味で、プログラマブルであり得る。対照的に、非プログラマブルまたは固定機能ハードウェアは、プログラムを実行するように構成されないハードウェアを指すことがある。固定機能ハードウェアは構成可能であり得るが、ハードウェアの構成可能性は、ハードウェアによって実行されるユーザ定義プログラムに基づくものとは対照的に、固定機能ハードウェアによって受信される1つまたは複数の制御信号に基づく。
いくつかの例では、計算ユニット12の一方または両方は、並列プログラミングアプリケーションプログラミングインターフェース(API)、異種コンピューティングプラットフォームAPI、および/または、たとえば、オープンコンピューティング言語(OpenCL(商標))APIなど、コプロセッサコンピューティングプラットフォームAPIに従って動作し得る。さらなる例では、計算ユニット12の一方または両方は、OpenCL(商標)仕様に従って定義されたOpenCL(商標)計算ユニットに対応し得る。OpenCL(商標)APIに関するさらなる詳細は、「The OpenCL Specification」、Version:2.0、Document Revision 19、Khronos OpenCL Working Group、2013年11月14日と、「The OpenCL C Specification」、Version:2.0、Document Revision 19、Khronos OpenCL Working Group、2013年11月14日と、「The OpenCL Extension Specification」、Version:2.0、Document Revision 19、Khronos OpenCL Working Group、2013年11月14日とにおいて見いだすことができる。
いくつかの例では、計算ユニット12の各々は、1つまたは複数の処理ユニット内に含まれ得る。処理ユニットは、たとえば、中央処理ユニット(CPU)、マルチコアCPU、グラフィックス処理ユニット(GPU)、デジタル信号プロセッサ(DSP)、セルブロードバンドエンジン(Cell/B.E.)プロセッサ、並列プロセッサ、コプロセッサなどを含み得る。いくつかの例では、処理ユニットは、異種コンピューティングプラットフォーム、並列処理コンピューティングプラットフォーム、および/またはコプロセッサコンピューティングプラットフォーム内の計算デバイスであり得る。さらなる例では、処理ユニットは、OpenCL(商標)仕様に従って定義されたデバイスおよび/または計算デバイスに対応し得る。
いくつかの例では、計算ユニット12の各々は、同じ処理ユニットおよび/または計算デバイス内に含まれ得る。たとえば、計算ユニット12の各々は、単一のグラフィックス処理ユニット(GPU)内に含まれ得る。さらなる例では、計算ユニット12の各々は、異なる処理ユニットおよび/または計算デバイス内に含まれ得る。たとえば、計算ユニット12Aは、GPU内に含まれ得、計算ユニット12Bは、マルチコアCPU内に含まれ得る。
計算ユニット12の一方または両方がGPU内に含まれる例では、計算ユニット12の各々は、いくつかの例では、GPUのそれぞれのシェーダユニットに対応し得る。GPUのシェーダユニットは、たとえば、グラフィックス固有のシェーダプログラムおよび/または汎用シェーダプログラム(たとえば、計算シェーダプログラム)など、シェーダプログラムを実行するように構成され得る。
いくつかの例では、ホストプログラムとともに計算ユニット12によって実行されるプログラムまたはタスクは、コンピューティングアプリケーションを形成し得る。ホストプログラムは、計算ユニット12を含む処理ユニットのうちの1つまたは複数と同じ処理ユニット上で、または異なる処理ユニット上で実行し得る。ホストプログラムを実行する処理ユニットは、ホストデバイスと呼ばれることがある。コンピューティングアプリケーションを実行するための例示的な構成は、CPUとGPUとを含み得、GPUはホストプログラムを実行し、GPUは、タスクおよび/またはスレッドを実行する計算ユニット12を含む。
計算ユニット12によって実行されるタスクが、ホストプログラムを含むコンピューティングアプリケーションの一部である例では、計算ユニット12によって実行されるタスクのためのプログラムコードは、ホストプログラムによって提供され得る。場合によっては、ホストプロセッサは、計算ユニット12がタスクをより効率的に実行することができるように、計算ユニット12内に含まれたオンチップメモリに、および/または、計算ユニット12を含む1つもしくは複数の処理ユニットのオンチップメモリに、タスクのためのプログラムコードをロードし得る。いくつかの例では、ホストプログラムは、タスクに対応するスレッドを作業グループおよび作業グループ内の処理要素にマッピングし、計算ユニット12の一方または両方を含むコンピューティングデバイス上でタスクの実行を呼び出し得る。計算ユニット12の一方または両方がその一部である処理ユニット(たとえば、計算デバイス)内に含まれた制御ユニットは、特定の作業グループを、実行のために計算ユニット12のうちの特定のものに割り当て得る。
図1の例示的なコンピューティングシステム10は、例示のために各々が2つのスレッドを実行する2つの計算ユニット12を含むものとして示されている。本開示の技法を実施する他の例示的なコンピューティングシステムは、同じまたは異なる数の計算ユニットを有し得、同じ数または異なる数のスレッドを実行し得る。計算ユニットの各々によって同時に実行されるスレッドの数は、同じであっても異なってもよい。いくつかの例では、本開示の技法を実施するコンピューティングシステムは、単一の計算ユニットを有し得る。さらなる例では、本開示の技法を実施するコンピューティングシステムは、単一のスレッドを実行する1つまたは複数の計算ユニットを有し得る。
アトミック動作ユニット14は、本開示で説明するハードウェアベースのアトミック動作を実行するように構成され得る。いくつかの例では、アトミック動作ユニット14は、パイプの状態を維持する1つまたは複数のハードウェアベースのアトミック読取り修正書込み動作を実行し得る。たとえば、アトミック動作ユニット14は、パイプの状態を示す2つ以上のパイプ状態パラメータを修正する、ハードウェアベースのアトミック読取り修正書込み動作を実行し得、その場合、パイプは、タスク間通信をサポートするためのFIFO編成データバッファに対応する。いくつかの例では、ハードウェアベースのアトミック読取り修正書込み動作は、読取り予約動作と、書込み予約動作と、読取りコミット動作と、書込みコミット動作とを含み得る。
アトミック動作ユニット14は、計算ユニット12のうちの1つまたは複数から、様々なアトミック動作を実行するためのコマンドを受信し、コマンドを処理し得る。いくつかの例では、アトミック動作ユニット14は、アトミック動作のアトミック性を保証するために、コマンドを逐次処理し得る。言い換えれば、アトミック動作ユニット14は、後続のコマンドを処理するより前に、単一のコマンドを開始から終了まで処理し得る。いくつかの例では、コマンドは、アトミック読取り予約コマンドと、アトミック書込み予約コマンドと、アトミック読取りコミットコマンドと、アトミック書込みコミットコマンドとを含み得る。
アトミック動作ユニット14は、アトミック読取り修正書込み動作を実行するとき、データストレージシステム16と対話し得る。たとえば、アトミック動作ユニット14は、アトミック読取り修正書込み動作の読取り構成要素と書込み構成要素とを実行するために、読取り要求と書込み要求とをデータストレージシステム16に発行し得る。
いくつかの例では、アトミック動作ユニット14は、アトミックコマンドを処理することに応答して、1つまたは複数のパイプ状態パラメータを戻し得る。たとえば、予約動作の一部として、アトミック動作ユニット14は、1つまたは複数のパイプ状態パラメータを要求側タスクに戻し得る。他の例では、アトミック動作ユニット14は、アトミックコマンドを実行することに応答して、いかなるデータも戻さなくてよい。
アトミック動作ユニット14は、1つまたは複数のプロセッサ上で実装されるハードウェアユニットであり得る。ハードウェアユニットは、本開示によるアトミック動作ユニット14に起因する機能を実施するための回路を含み得る。たとえば、ハードウェアユニットは、いくつかの例では、デジタル回路、アナログ回路、算術論理ユニット(ALU)、データパスなどのうちの1つまたは複数を含み得る。
いくつかの例では、アトミック動作ユニット14は、固定機能(すなわち、非プログラマブル)ハードウェアユニットであり得る。言い換えれば、アトミック動作ユニット14は、そのような例では、必ずしもユーザ指定のプログラムを受信および実行するように構成されるとは限らないことがある。
アトミック動作ユニット14は、同じ処理ユニット上、または、計算ユニット12の一方もしくは両方とは異なる処理ユニット上で実装され得る。いくつかの例では、アトミック動作ユニット14は、計算ユニット12の一方または両方をも含む、グラフィックス処理ユニット(GPU)内に含まれ得る。さらなる例では、アトミック動作ユニット14は、異種コンピューティングプラットフォーム、並列処理コンピューティングプラットフォーム、および/またはコプロセッサコンピューティングプラットフォーム内に含まれる、デバイスおよび/または計算デバイス(たとえば、OpenCL(商標)仕様に従って定義されたデバイスおよび/または計算デバイス)内に含まれ得る。
いくつかの例では、アトミック動作ユニット14は、データストレージシステム16の全部または一部を含むメモリサブシステム内に含まれ得る。たとえば、アトミック動作ユニット14は、処理ユニットのキャッシュユニット(たとえば、GPUのキャッシュユニット)の一部であり得る。追加の例では、アトミック動作ユニット14は、異種コンピューティングプラットフォーム、並列処理コンピューティングプラットフォーム、および/またはコプロセッサコンピューティングプラットフォーム内に含まれる、デバイスおよび/または計算デバイス(たとえば、OpenCL(商標)仕様に従って定義されたデバイスおよび/または計算デバイス)に関連付けられる、メモリサブシステムの一部分に統合され得る。
データストレージシステム16は、タスク間通信のために使用されるべきパイプの状態とコンテンツとを示すデータを記憶するように構成され得る。データストレージシステム16は、パイプ状態パラメータ22とパイプデータバッファ24とを含む。データストレージシステム16は、たとえば、揮発性メモリ、不揮発性メモリ、キャッシュ、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)など、1つまたは複数のデータストレージユニットを含み得る。
いくつかの例では、データストレージシステム16は、メモリストレージユニットなど、単一のストレージユニットを含み得る。メモリストレージユニットは、計算ユニット12を含む処理ユニット上にあるオンチップメモリ、または、計算ユニット12を含む処理ユニットの外部であるオフチップメモリであり得る。
さらなる例では、データストレージシステム16は、複数のストレージユニットを含み得る。たとえば、データストレージシステム16は、キャッシュストレージユニットと、下位メモリストレージユニットとを含み得る。下位メモリストレージユニットは、パイプ状態パラメータ22および/またはパイプデータバッファ24のソースコピーを記憶し得、キャッシュストレージユニットは、パイプ状態パラメータ22および/またはパイプデータバッファ24のキャッシュされたコピーを記憶し得る。キャッシュされたコピーは、ソースコピーの不完全なバージョンであり得る。
データストレージシステム16がキャッシュストレージユニットと下位メモリストレージユニットとを含む例では、キャッシュストレージユニットは、いくつかの例では、オンチップキャッシュであり得、下位メモリストレージユニットは、オフチップメモリストレージユニットであり得る。言い換えれば、キャッシュストレージユニットは、計算ユニット12を含む処理ユニット上にあり得、メモリストレージユニットは、計算ユニット12を含む処理ユニットの外部であり得る。
パイプ状態パラメータ22は、パイプの状態を示す。パイプ状態パラメータ22は、いくつのパケットがパイプ内に現在記憶されているかを示すパケットカウントパラメータ、パイプのための開始パケットを記憶するパケットエントリを示す最初のパケットオフセットパラメータ、いくつのコミットされていない予約がパイプのために現在保留中であるかを示す予約カウントパラメータ、および、いくつのパケットエントリがパイプ内で現在予約されているかを示す予約済みパケットカウントパラメータのうちの1つまたは複数を含み得る。
パケットカウントパラメータおよび最初のパケットオフセットパラメータは、たとえば、リングバッファとして実装されるパイプの状態を定義するために使用され得る。予約カウントパラメータおよび予約済みパケットカウントパラメータは、たとえば、予約をサポートするパイプの予約状態を定義するために使用され得る。
上記で説明したパイプ状態パラメータ22は、本開示の技法とともに使用され得るパイプ状態パラメータのセットの例にすぎない。他の例では、同じ数または異なる数のパイプ状態パラメータが使用されてよく、使用されるパイプ状態パラメータのタイプは、同じであっても異なってもよい。
パイプデータバッファ24は、パイプのデータコンテンツに対応するデータパケットを記憶するように構成される複数のパケットエントリを含み得る。空ではないパイプでは、パイプデータバッファ24は、パケットエントリの連続したセット内に記憶されるパケットのシーケンスを含み得る。場合によっては、パケットエントリの連続したセットは、パイプデータバッファ24の終了からパイプデータバッファ24の開始までラップアラウンドし得る。空のパイプでは、パイプデータバッファ24内のパケットエントリの各々が空であり得る。
いくつかの例では、パイプデータバッファ24は、リングバッファとして編成され得る。リングバッファは、バッファがエンドツーエンドで接続されているかのような、単一の固定サイズのバッファを使用するデータ構造を指すことがある。言い換えれば、パイプデータバッファ24の両端にあるパケットエントリは、概念的にリングバッファを実装するために互いに隣接していると見なされ得る。
パイプ状態パラメータ22およびパイプデータバッファ24は、FIFO編成バッファを実装するために使用され得る。FIFO編成バッファは、書込みインターフェースおよび読取りインターフェースがFIFOの原理に従って動作するバッファを指すことがある。FIFOの原理に従って動作する書込みインターフェースは、バッファ内にすでに記憶されている任意のデータの終了に書き込まれるようにデータをアペンドするインターフェースを指すことがある。FIFOの原理に従って動作する読取りインターフェースは、バッファに書き込まれるべき最も早い、未読のデータを選択し、バッファから除去するインターフェースを指すことがある。
いくつかの例では、計算ユニット12、アトミック動作ユニット14、およびデータストレージシステム16のうちの1つまたは複数の全部または一部は、同じプロセッサユニットの一部であり得る。たとえば、計算ユニット12、アトミック動作ユニット14、および、データストレージシステム16の一部に対応するキャッシュユニットは、すべてGPU内に含まれ得る。この例では、下位メモリストレージユニットは、GPUと同じチップ上にはないオフチップメモリ内に含まれ得る。
アトミック動作ユニット14がコンピューティングデバイスの一部である例では、計算ユニット12Aおよび計算ユニット12Bが、異なるコンピューティングデバイスの一部である場合、各コンピューティングデバイスは、アトミック動作ユニット14を含み得る。そのような例では、図1に示すように、計算ユニット12Aと計算ユニット12Bの両方が単一のアトミック動作ユニット14に通信可能に結合されるのではなく、計算ユニット12Aおよび計算ユニット12Bは、それらのそれぞれのコンピューティングデバイス内のそれらのそれぞれのアトミック動作ユニットに通信可能に結合され得る。
次に、コンピューティングシステム10の動作について説明する。以下で説明する例示的な動作では、パイプ(たとえば、パイプ状態パラメータ22およびパイプデータバッファ24)は、すでにデータストレージシステム16内で割り振られており、タスクの実行は、スレッド18A、18Bが計算ユニット12A上で同時に実行中であり、スレッド20A、20Bが計算ユニット12B上で同時に実行中であるように、計算ユニット12の各々において呼び出されている。
スレッド18、20のうちの1つまたは複数は、アトミック動作コマンドをアトミック動作ユニット14に発行する。アトミック動作ユニット14は、アトミック動作コマンドを実行する。たとえば、アトミック動作ユニット14は、アトミック動作コマンドに対応するアトミック動作を実行し得る。
アトミック動作ユニット14によって実行されるアトミック動作は、2つ以上のパイプ状態パラメータをアトミックな方式で読み取り、修正し、書き込む、アトミック読取り修正書込み動作であり得る。アトミック読取り修正書込み動作を実行するために、アトミック動作ユニット14は、割込み不可能な動作のセットを実行し得る。割込み不可能な動作のセットは、データストレージシステム16からパイプ状態パラメータ22に対応する値を読み取る動作と、パイプ状態パラメータ22のための修正された値を生成する動作と、パイプ状態パラメータ22のための修正された値をデータストレージシステム16に書き込む動作とを含み得る。
読取り動作を実行するために、アトミック動作ユニット14は、読取り要求をデータストレージシステム16に発行し得る。データストレージシステム16は、パイプ状態パラメータ22をアトミック動作ユニット14に与え得る。いくつかの例では、パイプのためのすべてのパイプ状態パラメータ22は、単一の読取り要求に応答して与えられ得る。追加の例では、パイプのためのすべてのパイプ状態パラメータ22は、単一の読取りサイクルの一部として与えられ得る。さらなる例では、すべてのパイプ状態パラメータ22は、単一のメモリトランザクション中に準備ができている単一のデータワードを形成し得る。修正動作を実行するために、アトミック動作ユニット14は、1つまたは複数のデータパスを使用し得る。データパスは、たとえば、1つまたは複数のALUを含み得る。書込み動作を実行するために、アトミック動作ユニット14は、書込み要求をデータストレージシステム16に発行し、パイプ状態パラメータ22のための修正された値をデータストレージシステム16に与え得る。
アトミック動作ユニット14は、実行されているアトミック動作のタイプに基づいて、受信されたパイプ状態パラメータ値を修正し得る。例示的なタイプのアトミック動作は、アトミック読取り予約動作と、アトミック書込み予約動作と、アトミック書込みコミット動作と、アトミック読取りコミット動作とを含む。
いくつかの例では、読取り動作を実行した後、アトミック動作ユニット14は、データストレージシステム16から読み取られたパイプ状態パラメータ値のうちの1つまたは複数を、コマンドを発行した要求側スレッドへ戻す、戻し動作を実行し得る。戻り値は、アトミック読取り修正書込み動作を実行する直前のパイプの状態に対応し得る。
アトミック動作ユニット14は、計算ユニット12から受信されたアトミック動作コマンドのタイプに基づいて、異なるタイプのアトミック読取り修正書込み動作を実行し得る。たとえば、アトミック動作ユニット14は、計算ユニット12からアトミック書込み予約コマンドを受信することに応答して、アトミック書込み予約動作を実行すること、計算ユニット12からアトミック読取り予約コマンドを受信することに応答して、アトミック読取り予約動作を実行すること、計算ユニット12からアトミック書込みコミットコマンドを受信することに応答して、アトミック書込みコミット動作を実行すること、および/または、計算ユニット12からアトミック読取りコミットコマンドを受信することに応答して、アトミック読取りコミット動作を実行することを行い得る。
アトミックコマンドを、本明細書では代替的に要求と呼ぶことがあり、コマンドを発行するスレッドを、本明細書では代替的にリクエスタと呼ぶことがある。たとえば、スレッド18Aが、書込み予約コマンドをアトミック動作ユニット14に発行するとき、スレッド18Aは、書込み予約要求を発行するリクエスタであると言われることがある。
次に、本開示で説明するアトミック動作およびアトミックコマンドの例示的な使用事例について説明する。アプリケーションプログラミングインターフェース(API)は、複数のタスクおよび/またはスレッドが同時に実行し得るコンピューティング環境において、タスク間通信を可能にするパイプのサポートを提供し得る。パイプ内のインターリーブを回避するために、APIは、パイプ内のパケットエントリの連続したセットが、読取りまたは書込みのためにスレッドによって予約されることを可能にし得る。そのようなパイプは、予約をサポートすると言われることがある。
予約をサポートするために、APIは、パイプ予約コマンドと、パイプ読取りおよび書込みコマンドと、パイプコミットコマンドとを提供し得る。これらのコマンドが、プログラマーおよび/または他のソースコード生成者によってソースコードに配置されて、タスクおよび/またはスレッドがパイプに書き込むこと、およびパイプから読み取ることが可能になり得る。
プログラマーの観点から、データをパイプに書き込むために使用される動作の一般的なシーケンスは、以下のものであり得、すなわち、書込みのためにパケットエントリを予約し、データを予約済みパケットエントリに書き込み、予約済みパケットエントリをパイプにコミットすることである。データをパイプに書き込むための上述の動作のシーケンスを実行するために、書込みのコマンドのシーケンスがソースコードに配置され得る。書込みのコマンドのシーケンスは、パイプ書込み予約コマンドと、パイプ書込みコマンドと、パイプ書込みコミットコマンドとを含み得る。いくつかの例では、上述の書込みのコマンドのシーケンス内のコマンドは、それぞれ、OpenCL(商標)仕様に従って定義されているようなreserve_write_pipeコマンド、write_pipeコマンド、およびcommit_write_pipeに対応し得る。
パイプ書込み予約コマンドは、書込みのためにパイプ内の要求された数のパケットエントリを予約し、予約を示すデータ(たとえば、予約ハンドル)を戻し得る。パイプ書込みコマンドは、データ(たとえば、パケット)を、予約ハンドルによって示された予約済みパケットエントリに書き込み得る。パイプ書込みコミットコマンドは、予約済みパケットエントリをパイプにコミットし得る。予約済みパケットエントリをパイプにコミットすることで、製作者タスクがデータをパイプの予約済みパケットエントリに書き込むことを終了したこと、および、そのようなパケットエントリが消費者タスクにとって利用可能にされる準備ができていることを示し得る。
プログラマーの観点から、パイプからデータを読み取るために使用される動作の一般的なシーケンスは、以下のものであり得、すなわち、読取りのためにパケットエントリを予約し、予約済みパケットエントリからデータを読み取り、予約済みパケットエントリをパイプにコミットすることである。パイプからデータを読み取るための上述の動作のシーケンスを実行するために、読取りのコマンドのシーケンスがソースコードに配置され得る。読取りのコマンドのシーケンスは、パイプ読取り予約コマンドと、パイプ読取りコマンドと、パイプ読取りコミットコマンドとを含み得る。いくつかの例では、上述の読取りのコマンドのシーケンス内のコマンドは、それぞれ、OpenCL(商標)仕様に従って定義されているようなreserve_read_pipeコマンド、read_pipeコマンド、およびcommit_read_pipeに対応し得る。
パイプ読取り予約コマンドは、読取りのために要求された数のパケットエントリを予約し、予約を示すデータ(たとえば、予約ハンドル)を戻し得る。パイプ読取りコマンドは、予約ハンドルによって示された予約済みパケットエントリからデータ(たとえば、パケット)を読み取り得る。パイプ読取りコミットコマンドは、予約済みパケットエントリをパイプにコミットし得る。予約済みパケットエントリをパイプにコミットすることで、消費者タスクがパイプの予約済みパケットエントリからデータを読み取ることを終了したこと、および、そのようなパケットエントリがパイプからクリアおよび/または除去され得ることを示し得る。
上記で説明した読取りおよび書込みのコマンドのシーケンス(パイプ予約コマンドとパイプコミットコマンドとを含む)は、ソースコードレベルコマンドであり得る。コンパイラは、ソースコードレベルコマンドをコンパイルして、コンパイル済みコードレベルコマンドを含むコンパイル済みコードを生成し得る。コンパイル済みコードレベルコマンドは、本開示で説明するアトミック予約コマンドとアトミックコミットコマンドとを含み得る。
次に、コンピューティングシステム10の例示的な動作について、スレッド18、20のうちの1つがパイプ予約を使用してデータをパイプに書き込み、パイプ予約を使用してパイプからデータを読み取る場合について説明する。この例では、スレッド18、20の各々は、本開示のアトミック予約コマンドとアトミックコミットコマンドとを含む、コンパイル済みコードを実行し得る。
この説明のために、スレッド18Aについては、データをパイプに書き込むものとして説明し、スレッド20Aについては、パイプからデータを読み取るものとして説明する。しかしながら、他の例では、スレッド18、20のいずれかが同様の方式でデータをパイプに書き込み、パイプからデータを読み取り得る。
データをパイプに書き込むために、スレッド18Aは、アトミック書込み予約コマンドをアトミック動作ユニット14に発行し得る。アトミック書込み予約コマンドは、データが書き込まれるべきであるパイプを示すパラメータと、書込みのために予約されるべきパケットエントリの要求された数を示すパラメータの一方または両方を含み得る。データが書き込まれるべきであるパイプを示すパラメータは、いくつかの例では、パイプアドレスパラメータであり得る。たとえば、パイプアドレスパラメータは、パイプ状態パラメータ22が、アクセスされている特定のパイプのために記憶される、メモリサブシステム(たとえば、データストレージシステム16)内のロケーションに対応するメモリアドレスであり得る。パイプアドレスパラメータは、データストレージシステム16が2つ以上のパイプのためのデータを含むとき、データストレージシステム16内でどのパイプを修正するべきかを識別するため、および、パイプデータが記憶されるデータストレージシステム16内のロケーションを識別するために使用され得る。
アトミック書込み予約コマンドを受信することに応答して、アトミック動作ユニット14は、アトミック書込み予約動作を実行し得る。アトミック書込み予約動作は、本開示で説明するような2つ以上のパイプ状態パラメータを修正するアトミック読取り修正書込み動作の一例であり得る。
アトミック書込み予約動作を実行するために、アトミック動作ユニット14は、データストレージシステム16からパイプ状態パラメータを取得し、データストレージシステム16から取得されるパイプ状態パラメータのうちの1つまたは複数をスレッド18Aに戻し得る。いくつかの例では、アトミック動作ユニット14によって戻されるパイプ状態パラメータは、最初のパケットオフセットパラメータと、パケットカウントパラメータと、予約済みパケットカウントパラメータとを含み得る。
アトミック動作ユニット14は、パイプ状態パラメータのうちの1つまたは複数に基づいて、書込み予約要求をサポートするのに十分なほどの、コミットされていない、および未予約のエントリをパイプが有するか否かをさらに決定し得る。書込み予約要求をサポートするのに十分なほどの、コミットされていない、および未予約のエントリをパイプが有すると決定することに応答して、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値を、書込み予約がそのパイプのために行われたことをその修正された値が反映するように生成し得る。書込み予約要求をサポートするのに十分なほどの、コミットされていない、および未予約のエントリをパイプが有していないと決定することに応答して、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値を、その修正された値がパイプ状態パラメータのための以前の値に等しいように(すなわち、書込み予約がそのパイプのために行われていないことを、その修正された値が反映するように)生成し得る。
パイプ状態パラメータのための修正された値を決定した後、アトミック動作ユニット14は、パイプ状態パラメータ22のための修正された値をデータストレージシステム16に書き込み得る。アトミック書込み予約コマンドに起因する機能は、いくつかの例では、割込み不可能な動作のセットの一部として実行され得る。言い換えれば、アトミック動作ユニット14は、他のアトミック動作コマンド(たとえば、アトミック書込み予約コマンドを発行したタスクまたはスレッドと同時に実行中であるタスクおよび/またはスレッドによって発行される他のアトミック動作コマンド)に関連付けられ得る他の動作を実行するための割込み実行なしに、アトミック書込み予約コマンドに起因する機能を開始から終了まで実行し得る。このようにして割込み不可能な動作のセットを実行することで、アトミック動作ユニット14は、同時に実行中のスレッドおよび/またはタスクが同時に書込みのためにパイプを予約することを試み得る場合でも、パイプの適切な機能を保証するアトミック書込み予約コマンドを実施することが可能になる。アトミック書込み予約コマンドの例示的な実装形態に関するさらなる詳細について、以下で図2に関して説明する。
スレッド18Aは、戻されたパイプ状態パラメータに基づいて、書込み予約が成功したか否かを決定し得る。書込み予約が成功したか否かを決定するために、スレッド18Aは、いくつかの例では、以下でさらに詳細に説明するように、アトミック動作ユニット14が同じ決定を行い得る方法と同様の方法で、戻されたパイプ状態パラメータに基づいて、書込み予約要求をサポートするのに十分なほどの、コミットされていない、および未予約のエントリをパイプが有するか否かを決定し得る。戻されたパイプ状態パラメータは、書込み予約動作の実行より前のパイプの状態を示し得る。
書込み予約が成功しなかった場合、スレッド18Aは、書込み予約動作の完了に応答して、データをパイプに書き込むこと、またはデータをパイプにコミットすることを行わなくてよい。いくつかの例では、書込み予約が成功しなかった場合、スレッド18Aは、エラー状態とともに実行を終了し得る。さらなる例では、書込み予約が成功しなかった場合、スレッド18Aは、その状態に対処するために1つまたは複数の動作を実行し得る。たとえば、スレッド18Aは、書込み予約を実行しようと試みることを停止し、他の動作の実行を継続し得る。別の例として、スレッド18Aは、ある時間期間後に書込み予約動作を繰り返すことを試み得る。これによって、1つまたは複数のパケットをパイプから読み取るための消費者スレッド時間が可能になり、それによって、後続の書込み予約動作において予約され得る追加のパケットエントリが解放され得る。
書込み予約が成功した場合、スレッド18Aは、アトミック書込み予約コマンドを処理するとき、アトミック動作ユニット14によって戻された1つまたは複数のパイプ状態パラメータに基づいて、その中にデータを書き込むべきパイプデータバッファ24の物理パケットエントリを決定し得る。スレッド18Aが最初のパケットオフセットパラメータと、パケットカウントパラメータと、予約済みパケットカウントパラメータとを受信する例では、スレッド18Aは、たとえば、これらのパラメータの各々の値を一緒に加算することによって、その中にデータを書き込むべきパイプデータバッファ24の最初の物理パケットエントリを決定し得る。スレッド18Aは、決定された最初の物理パケットエントリと、予約されたパケットエントリの数までの後続のパケットエントリとにデータを書き込み得る。予約された数のパケットエントリが書き込まれる前に、パイプデータバッファ24の終了に達する場合、スレッド18Aは、パイプデータバッファ24の開始までラップアラウンドして、追加の物理パケットエントリに書き込み得る。
データをパイプデータバッファ24内の予約済みパケットエントリに書き込むために、スレッド18Aは、いくつかの例では、書き込まれるべきパイプに関連付けられるパイプアドレスに基づいて、および、その中にデータを書き込むべき決定された物理パケットエントリに基づいて、ならびに/または、戻されたパイプ状態パラメータに基づいて、パケットエントリのうちの1つまたは複数のための物理メモリアドレスを決定し得る。いくつかの例では、パイプアドレスは、データストレージシステム16内でパイプを割り振ったホストプログラムによって、スレッド18Aに与えられ得る。そのような例では、パイプアドレスは、いくつかの例では、計算ユニット12Aのオンチップ定数メモリ内に記憶され得る。たとえば、ホストプロセッサ上で実行するホストプログラムは、いくつかの例では、計算ユニット12A上でスレッド18Aの実行を呼び出す関数への引数として、パイプアドレスを与え得る(たとえば、定数パラメータが、カーネル引数としてスレッド18Aに与えられ得る)。
いくつかの例では、スレッド18Aは、データストレージシステム16内に含まれる予約済みパケットエントリにパケットデータを書き込むために、1つまたは複数のメモリ書込み要求をデータストレージシステム16に発行し得る。書込み要求の各々は、その中にデータを書き込むべきデータストレージシステム16内の物理ロケーション(たとえば、メモリアドレス)と、書き込まれるべきデータとを指定し得る。書込み要求は、予約済みパケットエントリのすべてに、パケットデータをまとめて書き込み得る。
スレッド18Aは、いくつかの例では、データストレージシステム16、および/またはデータストレージシステム16を含むメモリサブシステムに直接、メモリ書込み要求を発行し得る。言い換えれば、そのような例では、コンピューティングシステム10は、アトミック動作ユニット14をバイパスする、計算ユニット12Aとデータストレージシステム16との間の通信インターフェースを含み得、スレッド18Aは、メモリ書込み要求がデータストレージシステム16によって受信されるが、アトミック動作ユニット14を通過しないように、その通信インターフェースを介して、メモリ書込み要求をデータストレージシステム16に発行し得る。
パケットデータがパイプデータバッファ24内の予約済みパケットエントリに書き込まれた後、スレッド18Aは、アトミック書込みコミットコマンドをアトミック動作ユニット14に発行し得る。アトミック書込みコミットコマンドは、スレッド18Aがデータをパイプの予約済みパケットエントリに書き込むことを終了したこと、および、そのようなパケットエントリが消費者タスクにとって利用可能にされる準備ができていることを示し得る。
アトミック書込みコミットコマンドは、データが書き込まれたパイプを示すパラメータを含み得る。データが書き込まれたパイプを示すパラメータは、いくつかの例では、パイプアドレスパラメータであり得る。たとえば、パイプアドレスパラメータは、パイプ状態パラメータ22が、アクセスされている特定のパイプのために記憶される、メモリサブシステム(たとえば、データストレージシステム16)内のロケーションに対応するメモリアドレスであり得る。パイプアドレスパラメータは、データストレージシステム16が2つ以上のパイプのためのデータを含むとき、データストレージシステム16内でどのパイプを修正するべきかを識別するため、および、パイプデータが記憶されるデータストレージシステム16内のロケーションを識別するために使用され得る。
アトミック書込みコミットコマンドを受信することに応答して、アトミック動作ユニット14は、アトミック書込みコミット動作を実行し得る。アトミック書込みコミット動作は、本開示で説明するような2つ以上のパイプ状態パラメータを修正するアトミック読取り修正書込み動作の一例であり得る。
アトミック書込みコミット動作を実行するために、アトミック動作ユニット14は、データストレージシステム16からパイプ状態パラメータを取得し得る。アトミック書込み予約動作とは異なり、アトミック動作ユニット14は、いくつかの例では、アトミック書込みコミット動作を実行するとき、データストレージシステム16から取得されるいかなるパイプ状態パラメータをもスレッド18Aに戻さなくてよい。
アトミック動作ユニット14は、パイプがアトミック書込みコミット動作を実行するより前に有していたコミットされていない予約の数に対して、1つ少ないコミットされていない予約をパイプが有することを、第1のパイプ状態パラメータのための修正された値が反映するように、その修正された値を生成し得る。いくつかの例では、第1のパイプ状態パラメータは、予約カウントパラメータであり得、アトミック動作ユニット14は、パイプがアトミック書込みコミット動作を実行するより前に有していたコミットされていない予約の数に対して、1つ少ないコミットされていない予約をパイプが有することを反映するために、予約カウントパラメータをデクリメントし得る。
アトミック動作ユニット14は、パイプ状態パラメータのうちの1つまたは複数に基づいて、パイプのためのすべての予約がコミットされたか否かをさらに決定し得る。パイプのためのすべての予約がコミットされたと決定することに応答して、アトミック動作ユニット14は、パイプ状態パラメータのための1つまたは複数の修正された値を、コミットされたエントリがパイプに配置されたことをその修正された値が反映するように生成し得る。いくつかの例では、アトミック動作ユニット14は、予約済みパケットカウントパラメータに等しい量だけ、パケットカウントパラメータをインクリメントし得、コミットされたエントリがパイプに配置されたことを反映するために、予約済みパケットカウントパラメータを0にリセットし得る。パイプのためのすべての予約がコミットされたのではないと決定することに応答して、アトミック動作ユニット14は、第1のパイプ状態パラメータ以外のパイプ状態パラメータ(たとえば、予約カウントパラメータ)のための修正された値を、その修正された値がパイプ状態パラメータのための以前の値に等しいように生成し得る。
パイプ状態パラメータのための修正された値を決定した後、アトミック動作ユニット14は、パイプ状態パラメータ22のための修正された値をデータストレージシステム16に書き込み得る。アトミック書込みコミットコマンドに起因する機能は、いくつかの例では、割込み不可能な動作のセットの一部として実行され得る。言い換えれば、アトミック動作ユニット14は、他のアトミック動作コマンド(たとえば、アトミック書込みコミットコマンドを発行したタスクまたはスレッドと同時に実行中であるタスクおよび/またはスレッドによって発行される他のアトミック動作コマンド)に関連付けられ得る他の動作を実行するための割込み実行なしに、アトミック書込みコミットコマンドに起因する機能を開始から終了まで実行し得る。このようにして割込み不可能な動作のセットを実行することで、アトミック動作ユニット14は、同時に実行中のスレッドおよび/またはタスクが、書き込まれたパケットエントリを同時にパイプにコミットすることを試み得る場合でも、パイプの適切な機能を保証するアトミック書込みコミットコマンドを実施することが可能になる。アトミック書込みコミットコマンドの例示的な実装形態に関するさらなる詳細について、以下で図3に関して説明する。
パイプからデータを読み取るために、スレッド20Aは、アトミック読取り予約コマンドをアトミック動作ユニット14に発行し得る。アトミック読取り予約コマンドは、それからデータが読み取られるべきであるパイプを示すパラメータと、読取りのために予約されるべきパケットエントリの数を示すパラメータの一方または両方を含み得る。それからデータが読み取られるべきであるパイプを示すパラメータは、いくつかの例では、パイプアドレスパラメータであり得る。たとえば、パイプアドレスパラメータは、パイプ状態パラメータ22が、アクセスされている特定のパイプのために記憶される、メモリサブシステム(たとえば、データストレージシステム16)内のロケーションに対応するメモリアドレスであり得る。パイプアドレスパラメータは、データストレージシステム16が2つ以上のパイプのためのデータを含むとき、データストレージシステム16内でどのパイプにアクセスするべきかを識別するため、および、パイプデータが記憶されるデータストレージシステム16内のロケーションを識別するために使用され得る。
アトミック読取り予約コマンドを受信することに応答して、アトミック動作ユニット14は、アトミック読取り予約動作を実行し得る。アトミック読取り予約動作は、本開示で説明するような2つ以上のパイプ状態パラメータを修正するアトミック読取り修正書込み動作の一例であり得る。
アトミック読取り予約動作を実行するために、アトミック動作ユニット14は、データストレージシステム16からパイプ状態パラメータを取得し、パイプ状態パラメータのうちの1つまたは複数に基づいて、読取り予約要求をサポートするのに十分なほどの、パケットデータが記憶される未読および未予約のパケットエントリをパイプが有するか否かを決定し得る。読取り予約要求をサポートするのに十分なほどの、パケットデータが記憶される未読および未予約のパケットエントリをパイプが有すると決定することに応答して、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値を、読取り予約がそのパイプのために行われたことをその修正された値が反映するように生成し得る。読取り予約要求をサポートするのに十分なほどの、パケットデータが記憶される未読および未予約のパケットエントリをパイプが有していないと決定することに応答して、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値を、その修正された値がパイプ状態パラメータのための以前の値に等しいように(すなわち、読取り予約がそのパイプのために行われていないことを、その修正された値が反映するように)生成し得る。
パイプ状態パラメータのための修正された値を決定した後、アトミック動作ユニット14は、パイプ状態パラメータ22のための修正された値をデータストレージシステム16に書き込み得る。アトミック読取り予約コマンドに起因する機能は、いくつかの例では、割込み不可能な動作のセットの一部として実行され得る。言い換えれば、アトミック動作ユニット14は、他のアトミック動作コマンド(たとえば、アトミック読取り予約コマンドを発行したタスクまたはスレッドと同時に実行中であるタスクおよび/またはスレッドによって発行される他のアトミック動作コマンド)に関連付けられ得る他の動作を実行するための割込み実行なしに、アトミック読取り予約コマンドに起因する機能を開始から終了まで実行し得る。このようにして割込み不可能な動作のセットを実行することで、アトミック動作ユニット14は、同時に実行中のスレッドおよび/またはタスクが同時に読取りのためにパイプを予約することを試み得る場合でも、パイプの適切な機能を保証するアトミック読取り予約コマンドを実施することが可能になる。アトミック読取り予約コマンドの例示的な実装形態に関するさらなる詳細について、以下で図4に関して説明する。
スレッド20Aは、読取り予約が成功したか否かを決定し得る。読取り予約が成功したか否かを決定するために、スレッド20Aは、いくつかの例では、以下でさらに詳細に説明するように、アトミック動作ユニット14が同じ決定を行い得る方法と同様の方法で、戻されたパイプ状態パラメータに基づいて、読取り予約要求をサポートするのに十分なほどの未読および未予約のパケットエントリをパイプが有するか否かを決定し得る。戻されたパイプ状態パラメータは、読取り予約動作の実行より前のパイプの状態を示し得る。
読取り予約が成功しなかった場合、スレッド20Aは、読取り予約動作の完了に応答して、パイプからデータを読み取ること、または読み取られたパケットをパイプにコミットすることを行わなくてよい。いくつかの例では、読取り予約が成功しなかった場合、スレッド20Aは、エラー状態とともに実行を終了し得る。さらなる例では、読取り予約が成功しなかった場合、スレッド20Aは、その状態に対処するために1つまたは複数の動作を実行し得る。たとえば、スレッド20Aは、読取り予約を実行しようと試みることを停止し、他の動作の実行を継続し得る。別の例として、スレッド20Aは、ある時間期間後に読取り予約動作を繰り返すことを試み得る。これによって、1つまたは複数のパケットをパイプに書き込むための製作者スレッド時間が可能になり、それによって、後続の読取り予約動作において予約され得る追加のパケットエントリが追加され得る。
読取り予約が成功した場合、スレッド20Aは、アトミック読取り予約コマンドを処理するとき、アトミック動作ユニット14によって戻された1つまたは複数のパイプ状態パラメータに基づいて、それからデータを読み取るべきパイプデータバッファ24の物理パケットエントリを決定し得る。スレッド20Aが最初のパケットオフセットパラメータと、パケットカウントパラメータと、予約済みパケットカウントパラメータとを受信する例では、スレッド20Aは、たとえば、最初のパケットオフセットパラメータに対応するパケットエントリを使用することによって、それからデータを読み取るべきパイプデータバッファ24の最初の物理パケットエントリを決定し得る。スレッド20Aは、決定された最初の物理パケットエントリと、予約されたパケットエントリの数までの後続のパケットエントリとから、データを読み取り得る。予約された数のパケットエントリが読み取られる前に、パイプデータバッファ24の終了に達する場合、スレッド20Aは、パイプデータバッファ24の開始までラップアラウンドして、追加の物理パケットエントリを読み取り得る。
パイプデータバッファ24内の予約済みパケットエントリからデータを読み取るために、スレッド20Aは、いくつかの例では、読み取られるべきパイプに関連付けられるパイプアドレスに基づいて、および、それからデータを読み取るべき決定された物理パケットエントリに基づいて、ならびに/または、戻されたパイプ状態パラメータに基づいて、パケットエントリのうちの1つまたは複数のための物理メモリアドレスを決定し得る。いくつかの例では、パイプアドレスは、データストレージシステム16内でパイプを割り振ったホストプログラムによって、スレッド20Aに与えられ得る。そのような例では、パイプアドレスは、いくつかの例では、計算ユニット12Bのオンチップ定数メモリ内に記憶され得る。たとえば、ホストプロセッサ上で実行するホストプログラムは、いくつかの例では、計算ユニット12B上でスレッド20Aの実行を呼び出す関数への引数として、パイプアドレスを与え得る(たとえば、定数パラメータが、カーネル引数として計算ユニット12Bに与えられ得る)。
いくつかの例では、スレッド20Aは、データストレージシステム16内に含まれる予約済みパケットエントリからパケットデータを読み取るために、1つまたは複数のメモリ読取り要求をデータストレージシステム16に発行し得る。読取り要求の各々は、それからデータを読み取るべきデータストレージシステム16内の物理ロケーション(たとえば、メモリアドレス)を指定し得る。読取り要求は、予約済みパケットエントリのすべてから、パケットデータをまとめて読み取り得る。
スレッド20Aは、いくつかの例では、データストレージシステム16、および/またはデータストレージシステム16を含むメモリサブシステムに直接、メモリ読取り要求を発行し得る。言い換えれば、そのような例では、コンピューティングシステム10は、アトミック動作ユニット14をバイパスする、計算ユニット12Bとデータストレージシステム16との間の通信インターフェースを含み得、スレッド20Aは、メモリ読取り要求がデータストレージシステム16によって受信されるが、アトミック動作ユニット14を通過しないように、その通信インターフェースを介して、メモリ読取り要求をデータストレージシステム16に発行し得る。
パケットデータがパイプデータバッファ24内の予約済みパケットエントリから読み取られた後、スレッド20Aは、アトミック読取りコミットコマンドをアトミック動作ユニット14に発行し得る。アトミック読取りコミットコマンドは、スレッド20Aがパイプの予約済みパケットエントリからデータを読み取ることを終了したこと、および、そのようなパケットエントリがパイプから除去される準備ができていることを示し得る。
アトミック読取りコミットコマンドは、それに対してデータが読み取られたパイプを示すパラメータを含み得る。それに対してデータが読み取られたパイプを示すパラメータは、いくつかの例では、パイプアドレスパラメータであり得る。たとえば、パイプアドレスパラメータは、パイプ状態パラメータ22が、アクセスされている特定のパイプのために記憶される、メモリサブシステム(たとえば、データストレージシステム16)内のロケーションに対応するメモリアドレスであり得る。パイプアドレスパラメータは、データストレージシステム16が2つ以上のパイプのためのデータを含むとき、データストレージシステム16内でどのパイプにアクセスするべきかを識別するため、および、パイプデータが記憶されるデータストレージシステム16内のロケーションを識別するために使用され得る。
アトミック読取りコミットコマンドを受信することに応答して、アトミック動作ユニット14は、アトミック読取りコミット動作を実行し得る。アトミック読取りコミット動作は、本開示で説明するような2つ以上のパイプ状態パラメータを修正するアトミック読取り修正書込み動作の一例であり得る。
アトミック読取りコミット動作を実行するために、アトミック動作ユニット14は、データストレージシステム16からパイプ状態パラメータを取得し得る。アトミック読取り予約動作とは異なり、アトミック動作ユニット14は、いくつかの例では、アトミック読取りコミット動作を実行するとき、データストレージシステム16から取得されるいかなるパイプ状態パラメータをもスレッド20Aに戻さなくてよい。
アトミック動作ユニット14は、パイプがアトミック読取りコミット動作を実行するより前に有していたコミットされていない予約の数に対して、1つ少ないコミットされていない予約をパイプが有することを、第1のパイプ状態パラメータのための修正された値が反映するように、その修正された値を生成し得る。いくつかの例では、第1のパイプ状態パラメータは、予約カウントパラメータであり得、アトミック動作ユニット14は、パイプがアトミック読取りコミット動作を実行するより前に有していたコミットされていない予約の数に対して、1つ少ないコミットされていない予約をパイプが有することを反映するために、予約カウントパラメータをデクリメントし得る。
アトミック動作ユニット14は、パイプ状態パラメータのうちの1つまたは複数に基づいて、パイプのためのすべての予約がコミットされたか否かをさらに決定し得る。パイプのためのすべての予約がコミットされたと決定することに応答して、アトミック動作ユニット14は、パイプ状態パラメータのための1つまたは複数の修正された値を、コミットされたエントリがパイプから除去されたことをその修正された値が反映するように生成し得る。いくつかの例では、アトミック動作ユニット14は、予約済みパケットカウントパラメータに等しい量だけ、パケットカウントパラメータをデクリメントし得、コミットされたエントリがパイプから除去されたことを反映するために、予約済みパケットカウントパラメータを0にリセットし得る。そのような例では、アトミック動作ユニット14はまた、予約済みパケットカウントパラメータに等しい量だけ、最初のパケットオフセットパラメータをインクリメントし得る。予約済みパケットエントリの数が、最初のパケットオフセットパラメータがパイプデータバッファ24の終了を過ぎてインクリメントされることを引き起こす場合、最初のパケットオフセットパラメータは、リングバッファのような方式で、パイプデータバッファ24の開始までラップアラウンドされ得る。パイプのためのすべての予約がコミットされたのではないと決定することに応答して、アトミック動作ユニット14は、第1のパイプ状態パラメータ以外のパイプ状態パラメータ(たとえば、予約カウントパラメータ)のための修正された値を、その修正された値がパイプ状態パラメータのための以前の値に等しいように生成し得る。
パイプ状態パラメータのための修正された値を決定した後、アトミック動作ユニット14は、パイプ状態パラメータ22のための修正された値をデータストレージシステム16に書き込み得る。アトミック読取りコミットコマンドに起因する機能は、いくつかの例では、割込み不可能な動作のセットの一部として実行され得る。言い換えれば、アトミック動作ユニット14は、他のアトミック動作コマンド(たとえば、アトミック読取りコミットコマンドを発行したタスクまたはスレッドと同時に実行中であるタスクおよび/またはスレッドによって発行される他のアトミック動作コマンド)に関連付けられ得る他の動作を実行するための割込み実行なしに、アトミック読取りコミットコマンドに起因する機能を開始から終了まで実行し得る。このようにして割込み不可能な動作のセットを実行することで、アトミック動作ユニット14は、同時に実行中のスレッドおよび/またはタスクが、読み取られたパケットエントリを同時にパイプにコミットすることを試み得る場合でも、パイプの適切な機能を保証するアトミック読取りコミットコマンドを実施することが可能になる。アトミック読取りコミットコマンドの例示的な実装形態に関するさらなる詳細について、以下で図5に関して説明する。
パイプは、パケットエントリの各々がパイプのためのデータパケットを記憶するように構成可能である、複数のパケットエントリを含み得る。パイプのサイズは、パイプ内に含まれたパケットエントリの数を指し得る。いくつかの例では、パイプをサポートするAPIは、プログラマーが特定の制限内で任意のサイズのパイプを指定することを可能にし得る。しかしながら、APIをサポートするランタイムプログラム(たとえば、ドライバ)は、いくつかの例では、パイプのために割り振られた物理メモリ内に含まれたパケットエントリの数が、プログラマーによって指定されたパケットエントリの数とは異なるように、パイプを実装し得る。たとえば、ランタイムプログラムは、パイプの各々のために割り振られた物理メモリ内に含まれたパケットエントリの数が常に2の累乗であるように、パイプを実装し得る。ランタイムプログラムによって物理メモリ内で割り振られたパケットエントリの数が、ホストプログラムによって指定されたパケットエントリの数とは異なり得るにもかかわらず、ランタイムプログラムは、パイプを使用中であるタスクの観点から、パイプがホストプログラムによって指定された数のパケットエントリのみを有するように見えるような方法で、パイプの状態を制御し得る。
たとえば、ランタイムプログラムが、各パイプのために割り振られた物理メモリ内に含まれたパケットエントリの数が常に2の累乗であるように、パイプを実装する場合、および、プログラマーが、11個のパケットエントリのパイプサイズを指定する場合、ランタイムプログラムは、物理メモリがパイプのための16個のパケットエントリを含むように、物理メモリを割り振り得る。この例では、ランタイムプログラムは、16個のパケットエントリが物理メモリ内でパイプのために割り振られたにもかかわらず、パイプを使用中であるタスクの観点から、パイプが11個のパケットエントリのみを有するように見えるような方法で、パイプの状態を制御し得る。
ソースコードおよび/またはプログラマーの観点から見られるときのパイプのパケットエントリを、本明細書では論理パケットエントリと呼ぶことがあり、パイプのために物理メモリ内で実際に割り振られるパケットエントリを、本明細書では物理パケットエントリと呼ぶことがある。同様に、ソースコードおよび/またはプログラマーによって指定されるパイプのサイズ(たとえば、パケットエントリの数)を、本明細書ではパイプの論理サイズと呼ぶことがあり、パイプのためにメモリ内で実際に割り振られるパケットエントリの数を、本明細書ではパイプの物理サイズと呼ぶことがある。
アトミック書込み予約コマンドに戻ると、データが書き込まれるべきであるパイプを示すパラメータと、書込みのために予約されるべきパケットエントリの数を示すパラメータとを含むことに加えて、アトミック書込み予約コマンドは、いくつかの例では、パイプの論理サイズを示すパラメータ、および/または、パイプの物理サイズ-1を示すパラメータをさらに含み得る。アトミック書込み予約動作は、パイプの論理サイズを示すパラメータを使用して、書込み予約要求をサポートするのに十分なほどの、コミットされていない、および未予約のエントリをパイプが有するか否かを決定し得る。たとえば、アトミック動作ユニット14は、パイプにコミットされたパケットの総数と、書込みのために予約されたパケットエントリの総数とを、パイプの論理サイズから減算し、その差が、書込みのために予約されるべき予約要求によって要求されたパケットの数以上であるか否かを決定し得る。その差が、書込みのために予約されるべき予約要求によって要求されたパケットの数以上である場合、アトミック動作ユニット14は、書込み予約要求をサポートするのに十分なほどの、コミットされていない、および未予約のエントリをパイプが有すると決定し得る。さもなければ、その差が、書込みのために予約されるべき予約要求によって指定されたパケットの数以上ではない場合、アトミック動作ユニット14は、書込み予約要求をサポートするのに十分なほどの、コミットされていない、および未予約のエントリをパイプが有していないと決定し得る。
同様に、アトミック読取り予約コマンドでは、いくつかの例では、それからデータが読み取られるべきであるパイプを示すパラメータと、読取りのために予約されるべきパケットエントリの数を示すパラメータとを含むことに加えて、アトミック読取り予約コマンドは、パイプの論理サイズを示すパラメータ、および/または、パイプの物理サイズ-1を示すパラメータをさらに含み得る。アトミック読取り予約動作は、パイプの論理サイズを示すパラメータを使用して、読取り予約要求をサポートするのに十分なほどの、パケットデータが記憶される未読および未予約のパケットエントリをパイプが有するか否かを決定し得る。たとえば、アトミック動作ユニット14は、読取りのために以前に予約されたパケットの数と、読取りのために予約されるべき予約要求によって要求されたパケットの数とを加算し、その和が、パイプ内に記憶されたパケットの総数(すなわち、書き込まれ、パイプにコミットされたパケットの総数)以下であるか否かを決定し得る。その和が、パイプ内に記憶されたパケットの総数以下である場合、アトミック動作ユニット14は、読取り予約要求をサポートするのに十分なほどのパケットエントリをパイプが有すると決定し得る。さもなければ、その和が、パイプ内に記憶されたパケットの総数以下ではない場合、アトミック動作ユニット14は、パイプが読取り予約要求をサポートするのに十分なほどのパケットエントリを有していないと決定し得る。
また、アトミック読取りコミットコマンドでは、いくつかの例では、それからデータが読み取られたパイプを示すパラメータを含むことに加えて、アトミック読取りコミットコマンドは、パイプの物理サイズ-1を示すパラメータをさらに含み得る。パイプの物理サイズ-1パラメータは、アトミック読取りコミットコマンドによって、すべての読取り予約がコミットされたとき、最初のパケットオフセットパラメータを更新するために使用され得る。たとえば、パイプの物理サイズ-1パラメータは、最初のパケットオフセットパラメータがインクリメントされる量が、最初のパケットオフセットパラメータがパイプデータバッファ24の終了を過ぎてインクリメントされることを引き起こすとき、最初のパケットオフセットパラメータが、物理パケットエントリの終了から物理パケットエントリの開始までラップアラウンドすることを可能にする、モジュラス演算を実施するために使用され得る。
いくつかの例では、データが書き込まれるべきであるパイプを示すパラメータ、パイプのサイズを示すパラメータ、およびパイプのサイズ-1を示すパラメータのうちの1つまたは複数が、データストレージシステム16内でパイプを割り振ったホストプログラムによってスレッド18Aおよび/またはスレッド20Aに与えられ得る。そのようなパラメータは、パイプが割り振られるときに決定され得、スレッド18、20の実行全体にわたって一定のままであり得るので、そのようなパラメータは定数パラメータと呼ばれることがある。そのような例では、定数パラメータは、いくつかの例では、計算ユニット12Aおよび/または計算ユニット12Bのオンチップ定数メモリ内に記憶され得る。ホストプロセッサ上で実行するホストプログラムは、いくつかの例では、計算ユニット12A上のスレッド18A、および/または計算ユニット12B上のスレッド20Aの実行を呼び出す関数への引数として、定数パラメータを与え得る(たとえば、定数パラメータが、カーネル引数としてスレッド18Aおよびスレッド20Aに与えられ得る)。
次に、アトミック予約コマンドおよびアトミックコミットコマンドのためにアトミック動作ユニット14によって実行される例示的な機能に関するさらなる詳細について、図2〜図5に関して説明する。図2〜図5に示すアトミック動作コマンドの各々のための機能は、ハードウェアにおいて実装され得、コマンドの各々は、本開示で説明するような2つ以上のパイプ状態パラメータを修正するハードウェアベースのアトミック読取り修正書込み動作の一例であり得る。
図2は、本開示による例示的なアトミック書込み予約コマンドのインターフェースと機能とを定義する、例示的な擬似コードを示す概念図である。擬似コードの1〜4行目は、この例においてアクセスおよび/または修正されるべきパイプ状態パラメータを、アレイのそれぞれの要素にマッピングする。パイプ状態パラメータは、パイプのための開始パケットを記憶するパケットエントリを示す最初のパケットオフセットパラメータ(すなわち、「FST_PKT」)と、いくつのパケットがパイプ内に現在記憶されているかを示すパケットカウントパラメータ(すなわち、「PKT_CNT」)と、いくつのパケットエントリがパイプ内で現在予約されているかを示す予約済みパケットカウントパラメータ(すなわち、「RES_CNT」)と、いくつのコミットされていない予約がパイプのために現在保留中であるかを示す予約カウントパラメータ(すなわち、「NUM_RES」)とを含む。このマッピングは、最初のパケットオフセットパラメータをアレイの第1の要素に、パケットカウントパラメータをアレイの第2の要素になど、マッピングする。
擬似コードの5〜11行目は、アトミック書込み予約コマンドのためのインターフェースを指定する。5行目は、コマンドの名前を指定し、7〜10行目は、コマンドを呼び出すときに使用されるべき引数またはパラメータを指定する。7行目は、アクセスされるべきパイプのためのパイプ状態パラメータ22を記憶するデータストレージシステム16内のメモリの領域をポイントし得る、パイプアドレスパラメータを指定する。いくつかの例では、パイプアドレスパラメータは、マシンアドレスに基づく32ビットアドレスまたは64ビットアドレスであり得る。8行目は、データストレージシステム16内のパイプのために割り振られる物理パケットエントリの数-1に対応する、物理パイプサイズ-1パラメータを指定する。9行目は、パイプが作成されたときにホストプログラムからソースコードによって要求された論理パイプエントリの数を示す、論理パイプサイズパラメータ(すなわち、プログラマーの観点からのパイプのサイズ)を指定する。10行目は、要求側タスクが書込みのために予約することを要求中であるパケットの数を示す、要求されたパケット数パラメータを指定する。いくつかの例では、アトミック書込み予約コマンドのためのインターフェースは、物理パイプサイズ-1パラメータを含まなくてよい。
アトミック書込み予約コマンドがスレッドによって呼び出されるとき、アトミック動作ユニット14は、データストレージシステム16から、この例で使用される4つのパイプ状態パラメータを読み取る読取り動作を実行し得る(13行目)。図2に示すように、アトミック動作ユニット14は、データストレージシステム16から、すべての4つのパイプ状態パラメータを含むアレイを読み取り得る。いくつかの例では、パラメータの各々は32ビットであり得、読取り動作は単一の128ビットロード動作であり得る。言い換えれば、いくつかの例では、単一の読取り動作および/またはロード動作がデータストレージシステム16に対して使用されて、アトミック動作中にアクセスおよび/または修正されるパイプ状態パラメータのすべてがロードされ得る。このようにして、アトミック読取り修正書込み動作は、2つ以上のメモリ読取りトランザクションを必要とすることなく、複数のパイプ状態パラメータを修正することが可能であり得る。
パイプ状態パラメータを読み取った後、アトミック動作ユニット14は、データストレージシステム16から読み取られたパイプ状態パラメータのうちの3つを要求側スレッドに戻し得る(14〜15行目)。この例で戻される3つのパイプ状態パラメータは、最初のパケットオフセットパラメータ、パケットカウントパラメータ、および予約済みパケットカウントパラメータである。要求側スレッド(たとえば、スレッド18A)は、戻されたパイプ状態パラメータに基づいて、その中にデータを書き込むべきパイプデータバッファ24の物理パケットエントリを決定し得る。たとえば、スレッド18Aは、たとえば、これらのパラメータの各々の値を一緒に加算することによって、その中にデータを書き込むべきパイプデータバッファ24の最初の物理パケットエントリを決定し得る。スレッド18Aは、決定された最初の物理パケットエントリと、予約されたパケットエントリの数までの後続のパケットエントリとにデータを書き込み得る。予約された数のパケットエントリが書き込まれる前に、パイプデータバッファ24の終了に達する場合、スレッド18Aは、パイプデータバッファ24の開始までラップアラウンドして、追加の物理パケットエントリに書き込み得る。
パイプ状態パラメータを読み取った後、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値を生成する修正動作を実行し得る(16〜20行目)。修正動作を実行するために、アトミック動作ユニット14は、パイプ状態パラメータのうちの1つまたは複数に基づいて、書込み予約要求をサポートするのに十分なほどの、コミットされていない、および未予約のエントリをパイプが有するか否かを決定し得る(16行目)。より具体的には、この例では、アトミック動作ユニット14は、論理パイプサイズ-パケットカウントパラメータ-予約済みパケットカウントパラメータが、要求されたパケットの数以上であるか否かを決定し得る(16行目)。書込み予約要求をサポートするのに十分なほどの、コミットされていない、および未予約のエントリをパイプが有すると決定することに応答して、アトミック動作ユニット14は、17〜20行目で指定されているように、パイプ状態パラメータのための修正された値を生成し得る。
たとえば、アトミック動作ユニット14は、予約済みパケットカウントパラメータを要求されたパケットの数に等しい量だけインクリメントする、インクリメント動作を実行し得(17行目)、要求されたパケットの数が0に等しくない場合、アトミック動作ユニット14は、予約カウントパラメータを1だけインクリメントする、1だけインクリメント動作を実行し得る(18〜20行目)。18行目の条件節内に1だけインクリメント動作を含めることで、要求されたパケットの数が0に等しいとき、予約カウントパラメータが修正されないことが保証され得る。ユーザは、要求されたパケットの数を0に等しく設定し、アトミック書込み予約コマンドを発行して、予約を行うことなく(すなわち、書込み予約が発生したことを反映するように、パラメータを修正することなく)、パイプの現在の状態を取得し得る。
概念的に、書込み予約要求をサポートするのに十分なほどの、コミットされていない、および未予約のエントリをパイプが有すると決定することに応答して、アトミック動作ユニット14は、要求されたパケットの数が0よりも大きいか否かに応じて、異なる方法でパイプ状態パラメータを修正し得る。要求されたパケットの数が0よりも大きい場合、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値を、書込み予約がそのパイプのために行われたことをその修正された値が反映するように生成し得る(17〜19行目)。要求されたパケットの数が0に等しい場合、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値を、その修正された値がパイプ状態パラメータのための以前の値に等しいように(すなわち、書込み予約がそのパイプのために行われていないことを、その修正された値が反映するように)生成し得る(17〜19行目)。
書込み予約要求をサポートするのに十分なほどの、コミットされていない、および未予約のエントリをパイプが有していないと決定することに応答して、または、予約カウントパラメータが0に等しいことに応答して、アトミック動作ユニット14は、パイプ状態が同じままであるように、パイプ状態パラメータ値を更新しなくてよい。パイプ状態が同じままであるように、パイプ状態パラメータ値を更新しないことは、パイプ状態パラメータのための修正された値を、その修正された値がパイプ状態パラメータのための以前の値に等しいように(すなわち、書込み予約がそのパイプのために行われていないことを、その修正された値が反映するように)生成することに対応し得る。
修正されたパイプ状態パラメータ値を生成した後、アトミック動作ユニット14は、この例で使用された4つのパイプ状態パラメータをデータストレージシステム16に書き込む、書込み動作(たとえば、記憶動作)を実行し得る(21行目)。図2に示すように、アトミック動作ユニット14は、すべての4つのパイプ状態パラメータを含むアレイをデータストレージシステム16に書き込み得る。いくつかの例では、パラメータの各々は32ビットであり得、書込み動作は単一の128ビット記憶動作であり得る。言い換えれば、いくつかの例では、単一の書込み動作および/または記憶動作がデータストレージシステム16に対して使用されて、アトミック動作中にアクセスおよび/または修正されるパイプ状態パラメータのすべてが記憶され得る。このようにして、アトミック読取り修正書込み動作は、2つ以上のメモリ書込みトランザクションを必要とすることなく、複数のパイプ状態パラメータを修正することが可能であり得る。次に、アトミック書込み予約動作の処理が完了する。
いくつかの例では、アトミック書込み予約コマンドのシンタックスは、以下の形式をとり得る。
PIPE_RSV_WRITE Dest, Src0, Src1
ただし、Destは、アトミック書込み予約コマンドによって戻される出力パイプ状態パラメータを受信するべきである3つの汎用レジスタ(GPR)レジスタのグループ内の第1のGPRのGRP識別情報(ID)に対応し、Src0は、要求されたパケットの数を含むレジスタのためのGPR IDに対応し、Src1は、物理パイプサイズ-1と、論理パイプサイズと、パイプアドレスとを含む、4つの定数レジスタのグループ内の第1のレジスタのための定数IDに対応する。パイプアドレスは、パイプ状態パラメータ22をポイントする32ビットまたは64ビットアドレスを含む、1つまたは2つのレジスタ内に記憶され得る。いくつかの例では、物理パイプサイズは、物理パイプサイズ-1が2の累乗-1であるように、2の累乗であり得る。
上記で説明したように、アトミック書込み予約動作は、最初のパケットオフセットパラメータと、パケットカウントパラメータと、予約済みパケットカウントパラメータとを戻し得る。したがって、このコマンドは、return atomicの一例であり得る。いくつかの例では、計算ユニット12の一方または両方は、1つまたは複数のクワッドレジスタグループを含み得、そこで、各クワッドレジスタグループが4つのレジスタを含み、4つのレジスタのためのデータが、単一のキャッシュトランザクションおよび/またはメモリトランザクションの一部としてメモリから読み取られ、および/またはメモリ内に記憶され得る。そのような例では、アトミック書込み予約動作によって戻される3つのパイプ状態パラメータは、いくつかの例では、クワッドレジスタグループ内の3つの連続するレジスタ内で戻され得る。このようにして、3つのパイプ状態パラメータは、単一のキャッシュトランザクションおよび/またはメモリトランザクションの一部として、計算ユニット12の一方または両方によってフェッチされ得る。
いくつかの例では、アトミック書込み予約コマンドは、OpenCL(商標)C仕様に従って定義されているようなreserve_write_pipeコマンドを実施するために使用され得る。追加の例では、予約カウントパラメータを0に等しく設定することによって、アトミック書込み予約コマンドは、予約をパイプに追加することなく、パイプの現在の状態を戻し得る。このようにして、アトミック書込み予約コマンドはまた、OpenCL(商標)C仕様に従って定義されているようなget_pip_num_packetsコマンドを実施するためにも使用され得る。
図3は、本開示による例示的なアトミック書込みコミットコマンドのインターフェースと機能とを定義する、例示的な擬似コードを示す概念図である。擬似コードの1〜4行目は、この例においてアクセスおよび/または修正されるべきパイプ状態パラメータを、アレイのそれぞれの要素にマッピングする。パイプ状態パラメータおよびマッピングは、図2に関して上記で説明したものと同じである。
擬似コードの5行目は、コマンドの名前と、コマンドを呼び出すときに使用されるべき引数またはパラメータとを含む、アトミック書込みコミットコマンドのためのインターフェースを指定する。より具体的には、アトミック書込みコミットコマンドは、パイプ状態パラメータ22を記憶するデータストレージシステム16内のメモリの領域をポイントする、パイプアドレスパラメータを使用し得る。いくつかの例では、パイプアドレスパラメータは、マシンアドレスに基づく32ビットアドレスまたは64ビットアドレスであり得る。
アトミック書込みコミットコマンドがスレッドによって呼び出されるとき、アトミック動作ユニット14は、データストレージシステム16から、この例で使用される4つのパイプ状態パラメータを読み取る読取り動作を実行し得る(7行目)。図3に示すように、アトミック動作ユニット14は、データストレージシステム16から、すべての4つのパイプ状態パラメータを含むアレイを読み取り得る。いくつかの例では、パラメータの各々は32ビットであり得、読取り動作は単一の128ビットロード動作であり得る。言い換えれば、いくつかの例では、単一の読取り動作および/またはロード動作がデータストレージシステム16に対して使用されて、アトミック動作中にアクセスおよび/または修正されるパイプ状態パラメータのすべてがロードされ得る。このようにして、アトミック読取り修正書込み動作は、2つ以上のメモリ読取りトランザクションを必要とすることなく、複数のパイプ状態パラメータを修正することが可能であり得る。
パイプ状態パラメータを読み取った後、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値を生成する修正動作を実行し得る(8〜12行目)。修正動作を実行するために、アトミック動作ユニット14は、予約カウントパラメータを1だけデクリメントする1つの動作によって、デクリメントを実行し得る(8行目)。予約カウントパラメータを1だけデクリメントすることは、パイプがアトミック書込みコミット動作を実行するより前に有していたコミットされていない予約の数に対して、1つ少ないコミットされていない予約をパイプが有することを、第1のパイプ状態パラメータのための修正された値が反映するように、その修正された値を生成することに対応し得る。
アトミック動作ユニット14は、パイプ状態パラメータのうちの1つまたは複数に基づいて、パイプのためのすべての予約がコミットされたか否かをさらに決定し得る(9行目)。より具体的には、この例では、予約カウントパラメータを1だけデクリメントした後、アトミック動作ユニット14は、予約カウントパラメータが0に等しいか否かを決定し得る。
パイプのためのすべての予約がコミットされたと決定することに応答して、アトミック動作ユニット14は、パイプ状態パラメータのための1つまたは複数の修正された値を、コミットされたエントリがパイプに配置されたことをその修正された値が反映するように生成し得る(10〜11行目)。より具体的には、この例では、アトミック動作ユニット14は、パケットカウントパラメータを予約済みパケットカウントパラメータに等しい量だけインクリメントする、インクリメント動作(10行目)と、予約済みパケットカウントパラメータを0にリセットする、リセット動作(11行目)とを実行し得る。
パイプのためのすべての予約がコミットされたとは限らないと決定することに応答して、アトミック動作ユニット14は、残りのパイプ状態パラメータが同じままであるように、すでに更新された予約カウントパラメータ以外の他のパイプ状態パラメータ値を更新しなくてよい。残りのパイプ状態パラメータが同じままであるように、残りのパイプ状態パラメータ値を更新しないことは、残りのパイプ状態パラメータのための修正された値を、その修正された値がパイプ状態パラメータのための以前の値に等しいように生成することに対応し得る。
修正されたパイプ状態パラメータ値を生成した後、アトミック動作ユニット14は、この例で使用された4つのパイプ状態パラメータをデータストレージシステム16に書き込む、書込み動作(たとえば、記憶動作)を実行し得る(13行目)。図3に示すように、アトミック動作ユニット14は、すべての4つのパイプ状態パラメータを含むアレイをデータストレージシステム16に書き込み得る。いくつかの例では、パラメータの各々は32ビットであり得、書込み動作は単一の128ビット記憶動作であり得る。言い換えれば、いくつかの例では、単一の書込み動作および/または記憶動作がデータストレージシステム16に対して使用されて、アトミック動作中にアクセスおよび/または修正されるパイプ状態パラメータのすべてが記憶され得る。このようにして、アトミック読取り修正書込み動作は、2つ以上のメモリ書込みトランザクションを必要とすることなく、複数のパイプ状態パラメータを修正することが可能であり得る。次に、アトミック書込みコミットコマンドの処理が完了する。
いくつかの例では、アトミック書込みコミットコマンドのシンタックスは、以下の形式をとり得る。
PIPE_CMT_WRITE Src0
ただし、Destレジスタは指定されず、Src0は、物理パイプサイズ-1と、論理パイプサイズと、パイプアドレスとを含む、4つの定数レジスタのグループ内の第1のレジスタのための定数IDに対応する。パイプアドレスは、パイプ状態パラメータ22をポイントする32ビットまたは64ビットアドレスを含む、1つまたは2つのレジスタ内に記憶され得る。いくつかの例では、物理パイプサイズは、物理パイプサイズ-1が2の累乗-1であるように、2の累乗であり得る。
アトミック書込みコミットコマンドは、この例では、いかなる値をも戻さない。したがって、このコマンドは、no-return atomicの一例であり得る。いくつかの例では、アトミック書込みコミットコマンドは、OpenCL(商標)C仕様に従って定義されているようなcommit_write_pipeコマンドを実施するために使用され得る。
図4は、本開示による例示的なアトミック読取り予約コマンドのインターフェースと機能とを定義する、例示的な擬似コードを示す概念図である。擬似コードの1〜4行目は、この例においてアクセスおよび/または修正されるべきパイプ状態パラメータを、アレイのそれぞれの要素にマッピングする。パイプ状態パラメータおよびマッピングは、図2に関して上記で説明したものと同じである。
擬似コードの5〜11行目は、アトミック読取り予約コマンドのためのインターフェースを指定する。5行目は、コマンドの名前を指定し、7〜10行目は、コマンドを呼び出すときに使用されるべき引数またはパラメータを指定する。7行目は、パイプ状態パラメータ22を記憶するデータストレージシステム16内のメモリの領域をポイントし得る、パイプアドレスパラメータを指定する。いくつかの例では、パイプアドレスパラメータは、マシンアドレスに基づく32ビットアドレスまたは64ビットアドレスであり得る。8行目は、データストレージシステム16内のパイプのために割り振られる物理パケットエントリの数-1に対応する、物理パイプサイズ-1パラメータを指定する。9行目は、パイプが作成されたときにホストプログラムからソースコードによって要求された論理パイプエントリの数を示す、論理パイプサイズパラメータ(すなわち、プログラマーの観点からのパイプのサイズ)を指定する。10行目は、要求側タスクが読取りのために要求中であるパケットの数を示す、要求されたパケット数パラメータを指定する。いくつかの例では、アトミック読取り予約コマンドのためのインターフェースは、物理パイプサイズ-1パラメータを含まなくてよい。
アトミック読取り予約コマンドがスレッドによって呼び出されるとき、アトミック動作ユニット14は、データストレージシステム16から、この例で使用される4つのパイプ状態パラメータを読み取る読取り動作を実行し得る(13行目)。図4に示すように、アトミック動作ユニット14は、データストレージシステム16から、すべての4つのパイプ状態パラメータを含むアレイを読み取り得る。いくつかの例では、パラメータの各々は32ビットであり得、読取り動作は単一の128ビットロード動作であり得る。言い換えれば、いくつかの例では、単一の読取り動作および/またはロード動作がデータストレージシステム16に対して使用されて、アトミック動作中にアクセスおよび/または修正されるパイプ状態パラメータのすべてがロードされ得る。このようにして、アトミック読取り修正書込み動作は、2つ以上のメモリ読取りトランザクションを必要とすることなく、複数のパイプ状態パラメータを修正することが可能であり得る。
パイプ状態パラメータを読み取った後、アトミック動作ユニット14は、データストレージシステム16から読み取られたパイプ状態パラメータのうちの3つを要求側スレッドに戻し得る(14〜15行目)。この例で戻される3つのパイプ状態パラメータは、最初のパケットオフセットパラメータ、パケットカウントパラメータ、および予約済みパケットカウントパラメータである。要求側スレッド(たとえば、スレッド20A)は、戻されたパイプ状態パラメータに基づいて、それからデータを読み取るべきパイプデータバッファ24の物理パケットエントリを決定し得る。たとえば、スレッド20Aは、たとえば、最初のパケットオフセットパラメータに対応するパケットエントリを最初のパケットエントリとして使用することによって、それからデータを読み取るべきパイプデータバッファ24の最初の物理パケットエントリを決定し得る。スレッド20Aは、決定された最初の物理パケットエントリと、予約されたパケットエントリの数までの後続のパケットエントリとから、データを読み取り得る。予約された数のパケットエントリが読み取られる前に、パイプデータバッファ24の終了に達する場合、スレッド20Aは、パイプデータバッファ24の開始までラップアラウンドして、追加の物理パケットエントリを読み取り得る。
パイプ状態パラメータを読み取った後、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値を生成する修正動作を実行し得る(16〜20行目)。修正動作を実行するために、アトミック動作ユニット14は、パイプ状態パラメータのうちの1つまたは複数に基づいて、読取り予約要求をサポートするのに十分なほどの、パケットデータが記憶される未読および未予約のパケットエントリをパイプが有するか否かを決定し得る(16行目)。より具体的には、この例では、アトミック動作ユニット14は、予約済みパケットカウントパラメータと要求されたパケットの数との和が、パケットカウントパラメータ以下であるか否かを決定し得る(16行目)。読取り予約要求をサポートするのに十分なほどの、パケットデータが記憶される未読および未予約のパケットエントリをパイプが有すると決定することに応答して、アトミック動作ユニット14は、17〜20行目で指定されているように、パイプ状態パラメータのための修正された値を生成し得る。
たとえば、アトミック動作ユニット14は、予約済みパケットカウントパラメータを要求されたパケットの数に等しい量だけインクリメントする、インクリメント動作を実行し得(17行目)、要求されたパケットの数が0に等しくない場合、アトミック動作ユニット14は、予約カウントパラメータを1だけインクリメントする、1だけインクリメント動作を実行し得る(18〜20行目)。18行目の条件節内に1だけインクリメント動作を含めることで、要求されたパケットの数が0に等しいとき、予約カウントパラメータが修正されないことが保証され得る。ユーザは、要求されたパケットの数を0に等しく設定し、アトミック読取り予約コマンドを発行して、予約を行うことなく(すなわち、読取り予約が発生したことを反映するように、パラメータを修正することなく)、パイプの現在の状態を取得し得る。
概念的に、読取り予約要求をサポートするのに十分なほどの、パケットデータが記憶される未読および未予約のパケットエントリをパイプが有すると決定することに応答して、アトミック動作ユニット14は、要求されたパケットの数が0よりも大きいか否かに応じて、異なる方法でパイプ状態パラメータを修正し得る。要求されたパケットの数が0よりも大きい場合、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値を、読取り予約がそのパイプのために行われたことをその修正された値が反映するように生成し得る(17〜19行目)。要求されたパケットの数が0に等しい場合、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値を、その修正された値がパイプ状態パラメータのための以前の値に等しいように(すなわち、読取り予約がそのパイプのために行われていないことを、その修正された値が反映するように)生成し得る(17〜19行目)。
読取り予約要求をサポートするのに十分なほどの、パケットデータが記憶される未読および未予約のパケットエントリをパイプが有していないと決定することに応答して、または、予約カウントパラメータが0に等しいことに応答して、アトミック動作ユニット14は、パイプ状態が同じままであるように、パイプ状態パラメータ値を更新しなくてよい。パイプ状態が同じままであるように、パイプ状態パラメータ値を更新しないことは、パイプ状態パラメータのための修正された値を、その修正された値がパイプ状態パラメータのための以前の値に等しいように(すなわち、読取り予約がそのパイプのために行われていないことを、その修正された値が反映するように)生成することに対応し得る。
修正されたパイプ状態パラメータ値を生成した後、アトミック動作ユニット14は、この例で使用された4つのパイプ状態パラメータをデータストレージシステム16に書き込む、書込み動作(たとえば、記憶動作)を実行し得る(21行目)。図4に示すように、アトミック動作ユニット14は、すべての4つのパイプ状態パラメータを含むアレイをデータストレージシステム16に書き込み得る。いくつかの例では、パラメータの各々は32ビットであり得、書込み動作は単一の128ビット記憶動作であり得る。言い換えれば、いくつかの例では、単一の書込み動作および/または記憶動作がデータストレージシステム16に対して使用されて、アトミック動作中にアクセスおよび/または修正されるパイプ状態パラメータのすべてが記憶され得る。このようにして、アトミック読取り修正書込み動作は、2つ以上のメモリ書込みトランザクションを必要とすることなく、複数のパイプ状態パラメータを修正することが可能であり得る。次に、アトミック読取り予約コマンドの処理が完了する。
いくつかの例では、アトミック読取り予約コマンドのシンタックスは、以下の形式をとり得る。
PIPE_RSV_READ Dest, Src0, Src1
ただし、Destは、アトミック読取り予約コマンドによって戻される出力パイプ状態パラメータを受信するべきである3つの汎用レジスタ(GPR)レジスタのグループ内の第1のGPRのGRP識別情報(ID)に対応し、Src0は、要求されたパケットの数を含むレジスタのためのGPR IDに対応し、Src1は、物理パイプサイズ-1と、論理パイプサイズと、パイプアドレスとを含む、4つの定数レジスタのグループ内の第1のレジスタのための定数IDに対応する。パイプアドレスは、パイプ状態パラメータ22をポイントする32ビットまたは64ビットアドレスを含む、1つまたは2つのレジスタ内に記憶され得る。いくつかの例では、物理パイプサイズは、物理パイプサイズ-1が2の累乗-1であるように、2の累乗であり得る。
上記で説明したように、アトミック読取り予約動作は、最初のパケットオフセットパラメータと、パケットカウントパラメータと、予約済みパケットカウントパラメータとを戻し得る。したがって、このコマンドは、return atomicの一例であり得る。いくつかの例では、計算ユニット12の一方または両方は、1つまたは複数のクワッドレジスタグループを含み得、そこで、各クワッドレジスタグループが4つのレジスタを含み、4つのレジスタのためのデータが、単一のキャッシュトランザクションおよび/またはメモリトランザクションの一部としてメモリから読み取られ、および/またはメモリ内に記憶され得る。そのような例では、アトミック読取り予約動作によって戻される3つのパイプ状態パラメータは、いくつかの例では、クワッドレジスタグループ内の3つの連続するレジスタ内で戻され得る。このようにして、3つのパイプ状態パラメータは、単一のキャッシュトランザクションおよび/またはメモリトランザクションの一部として、計算ユニット12の一方または両方によってフェッチされ得る。
いくつかの例では、アトミック読取り予約コマンドは、OpenCL(商標)C仕様に従って定義されているようなreserve_read_pipeコマンドを実施するために使用され得る。追加の例では、予約カウントパラメータを0に等しく設定することによって、アトミック読取り予約コマンドは、予約をパイプに追加することなく、パイプの現在の状態を戻し得る。このようにして、アトミック読取り予約コマンドはまた、OpenCL(商標)C仕様に従って定義されているようなget_pip_num_packetsコマンドを実施するためにも使用され得る。
図5は、本開示による例示的なアトミック読取りコミットコマンドのインターフェースと機能とを定義する、例示的な擬似コードを示す概念図である。擬似コードの1〜4行目は、この例においてアクセスおよび/または修正されるべきパイプ状態パラメータを、アレイのそれぞれの要素にマッピングする。パイプ状態パラメータおよびマッピングは、図2に関して上記で説明したものと同じである。
擬似コードの5行目は、コマンドの名前と、コマンドを呼び出すときに使用されるべき引数またはパラメータとを含む、アトミック読取りコミットコマンドのためのインターフェースを指定する。より具体的には、アトミック読取りコミットコマンドは、パイプ状態パラメータ22を記憶するデータストレージシステム16内のメモリの領域をポイントする、パイプアドレスパラメータと、データストレージシステム16内のパイプのために割り振られる物理パケットエントリの数-1に対応する、物理パイプサイズ-1パラメータとを使用し得る。いくつかの例では、パイプアドレスパラメータは、マシンアドレスに基づく32ビットアドレスまたは64ビットアドレスであり得る。
アトミック読取りコミットコマンドがスレッドによって呼び出されるとき、アトミック動作ユニット14は、データストレージシステム16から、この例で使用される4つのパイプ状態パラメータを読み取る読取り動作を実行し得る(7行目)。図5に示すように、アトミック動作ユニット14は、データストレージシステム16から、すべての4つのパイプ状態パラメータを含むアレイを読み取り得る。いくつかの例では、パラメータの各々は32ビットであり得、読取り動作は単一の128ビットロード動作であり得る。言い換えれば、いくつかの例では、単一の読取り動作および/またはロード動作がデータストレージシステム16に対して使用されて、アトミック動作中にアクセスおよび/または修正されるパイプ状態パラメータのすべてがロードされ得る。このようにして、アトミック読取り修正書込み動作は、2つ以上のメモリ読取りトランザクションを必要とすることなく、複数のパイプ状態パラメータを修正することが可能であり得る。
パイプ状態パラメータを読み取った後、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値を生成する修正動作を実行し得る(8〜13行目)。修正動作を実行するために、アトミック動作ユニット14は、予約カウントパラメータを1だけデクリメントする1つの動作によって、デクリメントを実行し得る(8行目)。予約カウントパラメータを1だけデクリメントすることは、パイプがアトミック読取りコミット動作を実行するより前に有していたコミットされていない予約の数に対して、1つ少ないコミットされていない予約をパイプが有することを、第1のパイプ状態パラメータのための修正された値が反映するように、その修正された値を生成することに対応し得る。
アトミック動作ユニット14は、パイプ状態パラメータのうちの1つまたは複数に基づいて、パイプのためのすべての予約がコミットされたか否かをさらに決定し得る(9行目)。より具体的には、この例では、予約カウントパラメータを1だけデクリメントした後、アトミック動作ユニット14は、予約カウントパラメータが0に等しいか否かを決定し得る。
パイプのためのすべての予約がコミットされたと決定することに応答して、アトミック動作ユニット14は、パイプ状態パラメータのための1つまたは複数の修正された値を、コミットされたエントリがパイプから除去されたことをその修正された値が反映するように生成し得る(10〜12行目)。より具体的には、この例では、アトミック動作ユニット14は、最初のパケットオフセットパラメータを予約済みパケットカウントパラメータに等しい量だけインクリメントする、モジュロ加算演算を実行し得、結果においてモジュロ演算を実行し、パイプの物理サイズがモジュラスである(10行目)。アトミック動作ユニット14はまた、パケットカウントパラメータを予約済みパケットカウントパラメータに等しい量だけデクリメントする、デクリメント動作(11行目)と、予約済みパケットカウントパラメータを0にリセットする、リセット動作(12行目)とを実行し得る。
パイプの物理サイズ-1パラメータは、アトミック読取りコミットコマンドによって、モジュロ加算演算を実行するために使用され得る。より具体的には、ビットワイズAND演算が、最初のパケットオフセットパラメータと予約済みパケットカウントパラメータとの和を最初のオペランドとして、および物理パイプサイズ-1をモジュラスとして使用して実行される。これによって、最初のパケットオフセットパラメータがインクリメントされる量が、最初のパケットオフセットパラメータがパイプデータバッファ24の終了を過ぎてインクリメントされることを引き起こすとき、最初のパケットオフセットパラメータが、リングバッファのような方式で、物理パケットエントリの終了から物理パケットエントリの開始までラップアラウンドすることが可能になり得る。
パイプのためのすべての予約がコミットされたとは限らないと決定することに応答して、アトミック動作ユニット14は、残りのパイプ状態パラメータが同じままであるように、すでに更新された予約カウントパラメータ以外の他のパイプ状態パラメータ値を更新しなくてよい。残りのパイプ状態パラメータが同じままであるように、残りのパイプ状態パラメータ値を更新しないことは、残りのパイプ状態パラメータのための修正された値を、その修正された値がパイプ状態パラメータのための以前の値に等しいように生成することに対応し得る。
修正されたパイプ状態パラメータ値を生成した後、アトミック動作ユニット14は、この例で使用された4つのパイプ状態パラメータをデータストレージシステム16に書き込む、書込み動作(たとえば、記憶動作)を実行し得る(14行目)。図5に示すように、アトミック動作ユニット14は、すべての4つのパイプ状態パラメータを含むアレイをデータストレージシステム16に書き込み得る。いくつかの例では、パラメータの各々は32ビットであり得、書込み動作は単一の128ビット記憶動作であり得る。言い換えれば、いくつかの例では、単一の書込み動作および/または記憶動作がデータストレージシステム16に対して使用されて、アトミック動作中にアクセスおよび/または修正されるパイプ状態パラメータのすべてが記憶され得る。このようにして、アトミック読取り修正書込み動作は、2つ以上のメモリ書込みトランザクションを必要とすることなく、複数のパイプ状態パラメータを修正することが可能であり得る。次に、アトミック読取りコミットコマンドの処理が完了する。
いくつかの例では、アトミック読取りコミットコマンドのシンタックスは、以下の形式をとり得る。
PIPE_CMT_READ Src0
ただし、Destレジスタは指定されず、Src0は、物理パイプサイズ-1と、論理パイプサイズと、パイプアドレスとを含む、4つの定数レジスタのグループ内の第1のレジスタのための定数IDに対応する。パイプアドレスは、パイプ状態パラメータ22をポイントする32ビットまたは64ビットアドレスを含む、1つまたは2つのレジスタ内に記憶され得る。いくつかの例では、物理パイプサイズは、物理パイプサイズ-1が2の累乗-1であるように、2の累乗であり得る。
アトミック読取りコミットコマンドは、この例では、いかなる値をも戻さない。したがって、このコマンドは、no-return atomicの一例であり得る。いくつかの例では、アトミック読取りコミットコマンドは、OpenCL(商標)C仕様に従って定義されているようなcommit_read_pipeコマンドを実施するために使用され得る。
いくつかの例では、パイプ状態パラメータにアクセスするために、単一の読取り/ロード動作と単一の書込み/記憶動作とが使用されることを可能にするために、アトミック動作中にアクセスおよび/または修正されるパイプ状態パラメータを記憶するために使用されるビット数は、単一のメモリトランザクション中にデータストレージシステム16から読み取られるか、またはデータストレージシステム16に書き込まれるデータのブロック内に含まれるビット数以下であり得る。たとえば、複数のパイプ状態パラメータを記憶するために使用されるビット数は、メモリワード内のビット数および/またはキャッシュライン内のビット数以下であり得る。場合によっては、メモリサブシステム内に記憶されたパイプの各々のためのパイプ状態パラメータは、パイプのためのパイプ状態パラメータのすべてがメモリサブシステムの単一のメモリワードおよび/または単一のキャッシュライン内に記憶されるように整合され得る。このようにして、アトミック読取り修正書込み動作は、2つ以上のメモリ読取りトランザクションまたは2つ以上のメモリ書込みトランザクションを必要とすることなく、複数のパイプ状態パラメータを修正することが可能であり得る。
いくつかの例では、データが書き込まれるべきであるパイプを示すパラメータ、パイプのサイズを示すパラメータ、およびパイプのサイズ-1を示すパラメータのうちの1つまたは複数が、データストレージシステム16内でパイプを割り振ったホストプログラムによってスレッド18Aおよび/またはスレッド20Aに与えられ得る。そのようなパラメータは、パイプが割り振られるときに決定され得、スレッド18、20の有効期間全体にわたって一定のままであり得るので、そのようなパラメータは定数パラメータと呼ばれることがある。そのような例では、定数パラメータは、いくつかの例では、計算ユニット12Aおよび/または計算ユニット12Bのオンチップ定数メモリ内に記憶され得る。ホストプロセッサ上で実行するホストプログラムは、いくつかの例では、計算ユニット12A上のスレッド18A、および/または計算ユニット12B上のスレッド20Aの実行を呼び出す関数への引数として、定数パラメータを与え得る(たとえば、定数パラメータが、カーネル引数としてスレッド18Aおよびスレッド20Aに与えられ得る)。
図6は、図1に示すアトミック動作ユニット14の一例をより詳細に示す、図1の例示的なコンピューティングシステム10のブロック図である。図6に示すように、アトミック動作ユニット14は、コマンドキュー26と、制御ユニット28と、アトミック動作データパス30とを含む。
コマンドキュー26は、計算ユニット12上で実行中であるスレッド18、20から受信される複数のアトミック動作コマンドを記憶し得る。アトミック動作コマンドは、たとえば、アトミック書込み予約コマンドと、アトミック書込みコミットコマンドと、アトミック読取り予約コマンドと、アトミック読取りコミットコマンドとを含み得る。これらのコマンドを、本明細書では代替的に要求と呼ぶことがある。
スレッド18、20のうちの1つからコマンドを受信することに応答して、コマンドキュー26は、別のコマンドがアトミック動作ユニット14によって現在処理されている場合でも、コマンドキュー26内にコマンドを記憶し得る。これによって、アトミック動作ユニット14は、コマンドを発行する前にアトミック動作ユニット14がフリーになるまで、スレッド18、20が待機することを必要とすることなく、および、アトミック動作ユニット14がビジーであるために、スレッド18、20がコマンドを複数回発行することを必要とすることなく、計算ユニット12上で同時に実行中である複数のスレッドおよび/またはタスクから複数のコマンドを受信することが可能になり得る。
制御ユニット28は、コマンドキュー26内に記憶されたアトミック動作コマンドを処理し得る。コマンドを処理するために、制御ユニット28は、処理されるコマンドに対応するアトミック動作を実行し得る。たとえば、アトミック書込み予約コマンドを処理するために、制御ユニット28は、本開示で説明するようなアトミック書込み予約動作を実行し得る。アトミック書込みコミットコマンドを処理するために、制御ユニット28は、本開示で説明するようなアトミック書込みコミット動作を実行し得る。アトミック読取り予約コマンドを処理するために、制御ユニット28は、本開示で説明するようなアトミック読取り予約動作を実行し得る。アトミック読取りコミットコマンドを処理するために、制御ユニット28は、本開示で説明するようなアトミック読取りコミット動作を実行し得る。
いくつかの例では、制御ユニット28は、一度に1つのアトミック読取り修正書込み動作が実行されるように、および、別のアトミック読取り修正書込み動作の実行を開始するより前に、各アトミック読取り修正書込み動作の実行が完了されるように、コマンドを逐次処理し得る。このようにしてコマンドを処理することで、アトミック動作のアトミック性が保証され得る。
いくつかの例では、上述のアトミック動作は、読取り修正書込み動作であり得る。そのような例では、アトミック動作ユニット14は、並列に実行中の複数のスレッドから、ハードウェアベースのアトミック読取り修正書込み動作を実行するための複数の要求を受信し、ハードウェアベースのアトミック読取り修正書込み動作を実行するための複数の要求を受信することに応答して、複数のハードウェアベースのアトミック読取り修正書込み動作を逐次実行し得る。ハードウェアベースのアトミック読取り修正書込み動作の各々は、複数の要求のそれぞれの1つに応答して実行され得る。
アトミック動作コマンドを処理するときに実行される動作は、そのアトミック動作を要求したタスクまたはスレッドと同時に実行中である他のタスクおよび/またはスレッドによって要求され得るいかなるアトミック動作からの割込みもなしに、それらの動作が開始から終了まで実行されるという意味で、アトミックであり得る。言い換えれば、アトミック動作の実行中に、他のスレッドおよび/またはタスクは、現在実行中のアトミック動作によって修正および/またはアクセスされるパイプ状態パラメータを読み取るかまたは修正することが可能であり得ない。このようにして、2つ以上のタスクおよび/またはスレッドが、同時にパイプのパイプ状態パラメータを修正することを試みる場合に、競合状態が回避され得る。
アトミック動作ユニット14によって実行されるアトミック動作は、ハードウェアベースのアトミック動作であり得る。アトミック動作は、それらのアトミック動作が、アトミック動作ユニット14に通信可能に結合されているスレッドおよび/またはタスクによって呼び出され得る単一の分割不可能な動作として、アトミック動作ユニット14によって実施され得るという意味で、ハードウェアベースであり得る。単一の分割不可能な動作は、そのアトミック動作を要求したタスクまたはスレッドと同時に実行中である他のタスクおよび/またはスレッドによって要求され得る他のアトミック動作を実行するために、その動作に割り込むことなく、アトミック動作ユニット14がその動作を開始から終了まで実行するという意味で、分割不可能であり得る。
図6の例示的なアトミック動作ユニット14では、ハードウェアベースのアトミック動作を実行するために、アトミック動作ユニット14は、1つまたは複数のアトミック動作データパス30を実装する回路を含み得る。アトミック動作データパス30の各々は、非プログラマブルデータパスであり得る。言い換えれば、アトミック動作データパス30の各々は、ユーザ指定のプログラムがデータパスによってダウンロードおよび実行されることを必要とすることなく、それぞれのデータバスに起因する機能を実行するように構成され得る。
アトミック動作データパス30は、いくつかの例では、本開示で説明するアトミック動作の各々のためのハードウェアベースのデータパスを実装し得る。いくつかの例では、回路が、アトミック動作の各々のための別個のハードウェアベースのデータパスを含み得る。さらなる例では、共通のハードウェアベースのデータパスが、本開示で説明するアトミック動作のうちの2つ以上を実行するように構成可能であり得る。いくつかの例では、共通のハードウェアベースのデータパスは、修正動作が、実行されるべきアトミック動作のタイプに基づいて異なる修正動作を実行するように構成可能である、読取り修正書込み動作データパスであり得る。いくつかの例では、アトミック動作データパス30の各々は、関連付けられたアトミック動作コマンドの修正動作を実行するために、1つまたは複数のALUを含み得る。
図7は、本開示によるデータストレージシステム16と対話する例示的なアトミック動作データパス32を示す概念図である。アトミック動作データパス32は、パイプの状態を示す2つ以上のパイプ状態パラメータを修正する、ハードウェアベースのアトミック読取り修正書込み動作を実行するように構成され得る。アトミック動作データパス32は、図6に関して上記で図示および説明したアトミック動作データパス30のうちの1つの一例であり得る。アトミック動作データパス32は、読取りブロック34と、修正ブロック36と、書込みブロック38とを含む。
読取りブロック34は、データストレージシステム16を含むメモリサブシステムから、パイプ状態パラメータ22に対応する値を読み取る、読取り動作を実行するように構成され得る。修正ブロック36は、パイプ状態パラメータのための修正された値を生成する修正動作を実行するように構成され得る。書込みブロック38は、パイプ状態パラメータのための修正された値を、データストレージシステム16を含むメモリサブシステムに書き込む、書込み動作を実行するように構成され得る。
読取りブロック34、修正ブロック36、および書込みブロック38の各々は、そのような構成要素に起因する機能を実行するように構成される回路とともに実装され得る。いくつかの例では、読取りブロック34、修正ブロック36、および書込みブロック38のうちの1つまたは複数は、アトミック動作データパス32内の別個のハードウェアブロックであり得る。さらなる例では、共通のハードウェアブロックは、読取りブロック34、修正ブロック36、および書込みブロック38のうちの1つまたは複数を実装するように構成可能であり得る。
図7に示すように、読取りブロック34、修正ブロック36、および書込みブロック38のうちの1つまたは複数は、アトミック動作ユニット14に発行されたアトミック動作コマンドとともに、アドミック動作ユニット14に与えられたコマンド引数(すなわち、パラメータ)を受信し得る。コマンド引数は、たとえば、パイプアドレス、物理パイプサイズ-1、論理パイプサイズ、および要求されたパケットの数のうちの1つまたは複数を含み得る。
次に、アトミック動作データパス32の動作について説明する。制御ユニット28は、アトミック動作コマンドを処理することに応答して、アトミック動作データパス32を使用して、アトミック読取り修正書込み動作の実行を開始し得る。制御ユニット28は、アトミック読取り修正書込み動作を実行するために、アトミック動作データパス32に1つまたは複数のコマンド引数を与え得る。
読取りブロック34は、パイプアドレスに基づいて読取り動作を実行し得る。パイプアドレスは、パイプ状態パラメータ22が記憶されるデータストレージシステム16内のロケーションをポイントするメモリアドレスであり得る。読取り動作を実行するために、読取りブロック34は、読取り要求をデータストレージシステム16に発行し得る。読取り要求は、パイプアドレスを含み得る。読取り要求を受信することに応答して、データストレージシステム16は、パイプの現在の状態に対応するパイプ状態パラメータ(PSP)値を読取りブロック34に与え得る。読取りブロック34は、PSP値を修正ブロック36に与え得る。
修正ブロック36は、PSP値を受信し、1つまたは複数の修正関数に基づいて、パイプ状態パラメータのための修正されたPSP値を生成し得る。いくつかの例では、修正ブロック36は、論理パイプサイズ、物理パイプサイズ-1、および要求されたパケットの数のうちの1つまたは複数に基づいて、修正されたPSP値を生成し得る。修正ブロック36は、修正されたPSP値を書込みブロック38に与え得る。
いくつかの例では、修正ブロック36によって、修正されたPSP値を生成するために使用される修正関数は、図2〜図5に示す擬似コードにおいて表現された修正関数に対応し得る。たとえば、アトミック書込み予約動作を実行するとき、修正ブロック36は、図2に示す擬似コードの16〜20行目に示す修正関数に基づいて、修正されたPSP値を生成し得る。別の例として、アトミック書込みコミット動作を実行するとき、修正ブロック36は、図3に示す擬似コードの8〜11行目に示す修正関数に基づいて、修正されたPSP値を生成し得る。
さらなる例として、アトミック読取り予約動作を実行するとき、修正ブロック36は、図4に示す擬似コードの16〜20行目に示す修正関数に基づいて、修正されたPSP値を生成し得る。追加の例として、アトミック読取りコミット動作を実行するとき、修正ブロック36は、図5に示す擬似コードの8〜12行目に示す修正関数に基づいて、修正されたPSP値を生成し得る。
書込みブロック38は、パイプアドレスに基づいて書込み動作を実行し得る。パイプアドレスは、パイプ状態パラメータ22が記憶されるデータストレージシステム16内のロケーションをポイントするメモリアドレスであり得る。書込み動作を実行するために、書込みブロック38は、書込み要求をデータストレージシステム16に発行し、データストレージシステム16内に記憶するために、修正されたPSP値をデータストレージシステム16に与え得る。書込み要求は、パイプアドレスを含み得る。書込み要求を受信することに応答して、データストレージシステム16は、修正されたPSP値を(たとえば、パイプ状態パラメータ22の一部として)データストレージシステム16内に記憶し得る。次に、アトミック読取り修正書込み動作が完了する。
アトミック動作データパス32は、読取り修正書込み動作を、割込み不可能な動作のセットとして実行するように構成され得る。言い換えれば、アトミック動作データパス32は、他の読取り修正書込み動作が、現在の読取り修正書込み動作の処理に割り込むことを可能にすることなく、現在の読取り修正書込み動作を実行するように構成され得る。このようにして、ハードウェアベースのアトミック読取り修正書込み動作は、そのような動作を要求し得る同時に実行中のスレッドおよび/またはタスクのために提供され得る。
本開示のいくつかの態様によれば、修正ブロック36は、異なるパイプ状態パラメータのための異なる修正動作を、単一のアトミック読取り修正書込み動作の一部として実行し得る。たとえば、修正ブロック36は、第1の修正関数に基づいて第1のパイプ状態パラメータのための修正された値を生成する第1の修正動作と、第2の修正関数に基づいて第2のパイプ状態パラメータのための修正された値を生成する第2の修正動作とを実行し得る。第2の修正関数は、第1の修正関数とは異なり得る。このようにして、異なるパイプ状態パラメータは、単一のアトミック動作の一部として、異なる方法で更新され得る。
たとえば、アトミック書込み予約動作またはアトミック読取り予約動作をサポートするために、第1の修正関数は、予約済みパケットカウントパラメータを、パイプ予約のために要求されるパケットの数だけインクリメントするために使用され得(図2、17行目、図4、17行目)、第2の修正関数は、予約カウントパラメータを1の定数値だけインクリメントするために使用され得る(図2、19行目、図4、19行目)。別の例として、アトミック書込みコミット動作またはアトミック読取りコミット動作をサポートするために、第1の修正関数は、予約カウントを1の定数値だけデクリメントするために使用され得(図3、8行目、図5、8行目)、第2の修正関数は、パケットカウントパラメータを、予約カウントパラメータに等しい量だけインクリメントまたはデクリメントするために使用され得(図3、10行目、図5、11行目)、第3の修正関数は、予約済みパケットカウントパラメータを0にリセットするために使用され得る(図3、11行目、図5、12行目)。他の例が可能であり、本開示の範囲内である。
本開示の追加の態様によれば、修正ブロックは、アトミック動作の実行中にメモリサブシステム(たとえば、データストレージシステム16)から取得される1つまたは複数の追加のパイプ状態パラメータの値に基づいて、1つまたは複数のパイプ状態パラメータのための修正された値を生成し得る。たとえば、読取りブロック34は、単一のアトミック読取り修正書込み動作中に、第1のパイプ状態パラメータに対応する第1の値と、第2のパイプ状態パラメータに対応する第2の値とを読み取り得る。同じアトミック読取り修正書込み動作の一部として、修正ブロック36は、第1のパイプ状態パラメータに対応する第1の値に基づいて、第2のパイプ状態パラメータのための修正された値を生成し得る。このようにして、パイプ状態パラメータは、パイプの現在の状態に基づいて、単一のアトミック動作において更新され得る。
たとえば、アトミックコミット動作をサポートするために、パケットカウントパラメータが、コミット動作が読取りコミット動作であるか書込みコミット動作であるかに応じて、予約済みパケットカウントパラメータだけデクリメントまたはインクリメントされ得る(図3、10行目、図5、11行目)。別の例として、アトミック読取りコミット動作をサポートするために、最初のパケットオフセットパラメータが、予約済みパケットカウントパラメータに基づいて調整され得る(図5、10行目)。他の例が可能であり、本開示の範囲内である。
本開示の追加の態様によれば、修正ブロック36は、異なるパイプ状態パラメータ値に基づいて、パイプ状態パラメータ値を条件付きで更新し得る。パイプ状態パラメータ値を条件付きで更新することは、異なるパイプ状態パラメータ値に基づいてパイプ状態パラメータ値を更新するか更新しないかを決定することを伴い得る。このようにして、パイプ状態パラメータは、単一のアトミック動作の一部として、パイプの現在の状態に基づいて、更新されても更新されなくてもよい。
たとえば、アトミック書込み予約動作またはアトミック読取り予約動作をサポートするために、修正ブロック36は、パケットカウントパラメータと予約済みパケットカウントパラメータとに基づいて、予約済みパケットカウントパラメータと予約カウントパラメータとを条件付きで更新し得る(図2、16〜20行、図4、16〜20行)。別の例として、アトミック書込みコミット動作またはアトミック読取りコミット動作をサポートするために、修正ブロック36は、予約カウントパラメータに基づいて、パケットカウントパラメータと予約済みパケットカウントパラメータとを条件付きで更新し得る(図3、9〜12行、図5、9〜13行)。他の例が可能であり、本開示の範囲内である。
図8は、本開示のハードウェアベースのアトミック動作を実施するために使用され得る、例示的なコンピューティングデバイス40を示すブロック図である。コンピューティングデバイス40は、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、コンピュータワークステーション、ビデオゲームプラットフォームもしくはコンソール、ワイヤレス通信デバイス(たとえば、モバイル電話、セルラー電話、衛星電話、および/もしくはモバイルフォンハンドセットなど)、固定電話、インターネット電話、ポータブルビデオゲームデバイスもしくは携帯情報端末(PDA)などのハンドヘルドデバイス、パーソナル音楽プレーヤ、ビデオプレーヤ、ディスプレイデバイス、テレビジョン、テレビジョンセットトップボックス、サーバ、中間ネットワークデバイス、メインフレームコンピュータ、または、グラフィカルデータを処理および/もしくは表示する任意の他のタイプのデバイスを備え得る。
図8の例に示すように、コンピューティングデバイス40は、ユーザ入力インターフェース42と、CPU44と、GPU46と、メモリコントローラ48と、メモリ50と、ディスプレイインターフェース52と、ディスプレイ54と、バス56とを含む。ユーザ入力インターフェース42、CPU44、GPU46、メモリコントローラ48、およびディスプレイインターフェース52は、バス56を使用して互いに通信し得る。図8に示す異なる構成要素間のバスおよび通信インターフェースの具体的な構成は例にすぎず、同じまたは異なる構成要素を有するコンピューティングデバイスおよび/または他のグラフィックス処理システムの他の構成が、本開示の技法を実施するために使用され得ることに留意されたい。
ユーザ入力インターフェース42は、1つまたは複数のユーザ入力デバイス(図示せず)がコンピューティングデバイス40に通信可能に結合されることを可能にし得る。ユーザ入力デバイスは、ユーザがユーザ入力インターフェース42を介してコンピューティングデバイス40に入力を与えることを可能にし得る。例示的なユーザ入力デバイスには、キーボード、マウス、トラックボール、マイクロフォン、タッチパッド、タッチセンシティブもしくはプレゼンスセンシティブディスプレイ、または別の入力デバイスが含まれる。タッチセンシティブまたはプレゼンスセンシティブディスプレイがユーザ入力デバイスとして使用される例では、ユーザ入力インターフェース42の全部または一部がディスプレイ54と統合され得る。
CPU44は、コンピューティングデバイス40の動作を制御する汎用または専用プロセッサを備え得る。図8に示すように、CPU44は、ホストプログラム58とGPUドライバ60とを実行し得る。ホストプログラム58は、様々なタスクの実行をGPU46にオフロードするコンピューティングアプリケーションのためのホストプログラムとして働き得る。いくつかの例では、タスクは、計算的に集中するタスク、および/または高度の並列性を含むタスク、たとえば、行列計算、信号処理計算、統計アルゴリズム、分子モデリングアプリケーション、金融アプリケーション、医療撮像、暗号解読アプリケーションなどであり得る。CPU44上で実行するホストプログラム58は、たとえば、汎用コンピューティングアプリケーション、並列処理アプリケーション、スプレッドシートアプリケーション、ワードプロセッサアプリケーション、電子メールアプリケーション、メディアプレーヤアプリケーション、ビデオゲームアプリケーション、グラフィカルユーザインターフェースアプリケーション、オペレーティングシステム、グラフィックスアプリケーション、または任意の他のタイプのアプリケーションを含む、任意のタイプのソフトウェアプログラムであり得る。
GPUドライバ60は、ホストプログラム58から命令を受信し、その命令にサービスすることをGPU46に行わせ得る。たとえば、GPUドライバ60は、1つまたは複数のコマンドを策定し、そのコマンドをメモリ50に配置し、そのコマンドを実行するようにGPU46に命令し得る。いくつかの例では、GPUドライバ60は、ホストプログラム58がパイプを作成することを可能にし、計算デバイス(たとえば、GPU46)上で実行するタスクがデータをパイプに書き込み、パイプからデータを読み取ることによって互いに通信することを可能にする、APIをサポートするランタイムプログラムを含み得る。
図8に示していないが、CPU44はまたコンパイラを実行し得る。コンパイラは、1つまたは複数の異なるタイプのタスクのためのソースコード(たとえば、カーネルおよび/または計算シェーダプログラム)を受信し、タスクのためのコンパイル済みコードを生成し得る。GPUドライバ60は、タスクのうちの1つまたは複数のためのコンパイル済みコードを、GPU46が実行するために、GPU46上に(たとえば、GPU46の計算ユニット内に含まれた命令ストアに)ロードし得る。
いくつかの例では、ホストプログラム58のためのソースコードは、たとえば、OpenCL(商標)APIなど、GPGPU API、並列プログラミングAPI、および/または異種コンピューティングプラットフォームAPIに適合し得る。さらなる例では、コンパイルされるタスクのためのソースコードは、たとえば、OpenCL(商標)C APIなど、GPGPU API、並列プログラミングAPI、および/または異種コンピューティングプラットフォームAPIに適合し得る。
GPU46は、CPU44によってGPU46に発行されるコマンドを実行するように構成され得る。GPU46によって実行されるコマンドは、汎用コンピューティングコマンド、タスク実行コマンド(たとえば、カーネル実行コマンド)、メモリ転送コマンドなどを含み得る。
GPU46は、CPU44上で実行するアプリケーションのための汎用コンピューティングを実行するように構成され得る。たとえば、CPU44上で実行中であるホストプログラム58が、計算タスクをGPU46にオフロードすることを決定するとき、CPU44は、汎用コンピューティングデータをGPU46に与え、1つまたは複数の汎用コンピューティングコマンドをGPU46に発行し得る。汎用コンピューティングコマンドは、たとえば、カーネル実行コマンド、メモリ転送コマンドなどを含み得る。いくつかの例では、CPU44は、コマンドと汎用コンピューティングデータとを、GPU46によってアクセスされ得るメモリ50に書き込むことによって、そのコマンドとデータとをGPU46に与え得る。
図8に示すように、GPU46は、アトミック動作ユニット14と計算ユニット12とを含む。計算ユニット12は、1つまたは複数のタスクを実行し得る。いくつかの例では、計算ユニット12は、複数のタスクを同時に実行し得る。さらなる例では、計算ユニット12のうちの1つまたは複数は、タスクの複数のインスタンスを同時に実行し得る。計算ユニット12のうちの1つによって実行されるタスクのインスタンスは、スレッドおよび/または作業項目と呼ばれることがある。タスクは、代替的にカーネルと呼ばれることがある。アトミック動作ユニット14は、計算ユニット12から1つまたは複数の異なるタイプのアトミック動作コマンドを受信すること、および、本開示で説明するような異なるタイプのアトミック動作コマンドの各々に対応するハードウェアベースのアトミック動作を実行することを行うように構成され得る。
いくつかの例では、汎用コンピューティングコマンドを実行することに加えて、GPU46は、グラフィックス動作を実行して、1つまたは複数のグラフィックスプリミティブをディスプレイ54にレンダリングするように構成され得る。そのような例では、CPU44上で実行するソフトウェアアプリケーションのうちの1つがグラフィックス処理を必要とするとき、CPU44は、グラフィックスデータをGPU46に与え、1つまたは複数のグラフィックスコマンドをGPU46に発行し得る。グラフィックスコマンドは、たとえば、ドローコールコマンド、GPU状態プログラミングコマンド、メモリ転送コマンド、ブリッティング(blitting)コマンドなどを含み得る。グラフィックスデータは、頂点バッファ、テクスチャデータ、表面データなどを含み得る。いくつかの例では、CPU44は、コマンドとグラフィックスデータとを、GPU46によってアクセスされ得るメモリ50に書き込むことによって、そのコマンドとグラフィックスデータとをGPU46に与え得る。
GPU46は、いくつかの事例では、CPU44よりも効率的なベクトル演算の処理を提供する高度並列構造を用いて構築され得る。たとえば、GPU46は、複数の頂点、制御点、ピクセル、および/または他のデータを並列の方法で操作するように構成される、複数の処理要素を含み得る。GPU46の高度並列の性質によって、いくつかの事例では、GPU46がCPU44よりも高速に、高度の並列性を含むタスクを処理することが可能になり得る。加えて、GPU46の高度並列の性質によって、いくつかの例では、GPU46が、CPU44を使用して画像をレンダリングするよりも高速に、グラフィックス画像(たとえば、GUIならびに2次元(2D)および/または3次元(3D)グラフィックスシーン)をディスプレイ54上にレンダリングすることが可能になり得る。
GPU46は、いくつかの事例では、コンピューティングデバイス40のマザーボードに統合され得る。他の事例では、GPU46は、コンピューティングデバイス40のマザーボード内のポート内にインストールされるグラフィックスカード上に存在し得、またはさもなければ、コンピューティングデバイス40と相互動作するように構成された周辺デバイス内に組み込まれ得る。さらなる事例では、GPU46は、システムオンチップ(SoC)を形成するCPU44と同じマイクロチップ上にあり得る。GPU46は、1つもしくは複数のマイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、デジタル信号プロセッサ(DSP)、または他の等価な統合もしくは離散論理回路など、1つまたは複数のプロセッサを含み得る。
いくつかの例では、GPU46は、メモリ50の全部または一部分のためのキャッシングサービスを提供し得る、GPUキャッシュを含み得る。そのような例では、GPU46は、キャッシュを使用して、オフチップメモリの代わりにローカルストレージを使用して、データをローカルで処理し得る。これによって、各読取りおよび書込みコマンド中に、重いバストラフィックを経験し得るバス56を介して、GPU46がメモリ50にアクセスする必要を低減することによって、GPU46がより効率的な方法で動作することが可能になる。しかしながら、いくつかの例では、GPU46は、別個のキャッシュを含まないことがあり、代わりにバス56を介してメモリ50を利用し得る。GPUキャッシュは、たとえば、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)など、1つまたは複数の揮発性または不揮発性のメモリまたはストレージデバイスを含み得る。
メモリコントローラ48は、メモリ50に入るデータおよびメモリ50から出るデータの転送を容易にする。たとえば、メモリコントローラ48は、メモリ読取りおよび書込みコマンドを受信し、コンピューティングデバイス40内の構成要素のためのメモリサービスを提供するために、そのようなコマンドをメモリ50に対してサービスし得る。メモリコントローラ48は、メモリ50に通信可能に結合される。メモリコントローラ48を、CPU44とメモリ50の両方とは別個である処理モジュールであるとして、図8の例示的なコンピューティングデバイス40内に示すが、他の例では、メモリコントローラ48の機能の一部または全部は、CPU44とメモリ50の一方または両方上で実施され得る。
メモリ50は、CPU44が実行するためにアクセス可能であるプログラムモジュールおよび/もしくは命令、ならびに/または、CPU44上で実行するプログラムが使用するためのデータを記憶し得る。たとえば、メモリ50は、CPU44上で実行するアプリケーションに関連付けられたプログラムコードおよびグラフィックスデータを記憶し得る。メモリ50は、加えて、コンピューティングデバイス40の他の構成要素によって使用するための、および/またはそれらによって生成される情報を記憶し得る。たとえば、メモリ50は、GPU46のためのデバイスメモリとして働き得、GPU46によって操作されるべきデータ、ならびにGPU46によって実行された動作から得られたデータを記憶し得る。たとえば、メモリ50は、バッファオブジェクト、パイプデータなどの任意の組合せを記憶し得る。加えて、メモリ50は、GPU46によって処理するためのコマンドストリーム(たとえば、コマンドキュー)を記憶し得る。メモリ50は、たとえば、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)、読取り専用メモリ(ROM)、消去可能プログラマブルROM(EPROM)、電気消去可能プログラマブルROM(EEPROM)、フラッシュメモリ、磁気データ媒体、または光学記憶媒体など、1つまたは複数の揮発性または不揮発性のメモリまたはストレージデバイスを含み得る。いくつかの例では、メモリ50は、図1に示すデータストレージシステム16の全部または一部に対応し得る。
CPU44および/またはGPU46は、メモリ50内に割り振られるフレームバッファ内にラスタライズされた画像データを記憶し得る。ディスプレイインターフェース52は、フレームバッファからデータを取り出し、ラスタライズされた画像データによって表現された画像を表示するように、ディスプレイ54を構成し得る。いくつかの例では、ディスプレイインターフェース52は、フレームバッファから取り出されたデジタル値を、ディスプレイ54によって消費可能なアナログ信号に変換するように構成されるデジタルアナログコンバータ(DAC)を含み得る。他の例では、ディスプレイインターフェース52は、処理のためにディスプレイ54に直接デジタル値を渡し得る。
ディスプレイ54は、モニタ、テレビジョン、投影デバイス、液晶ディスプレイ(LCD)、プラズマディスプレイパネル、発光ダイオード(LED)アレイ、陰極線管(CRT)ディスプレイ、電子ペーパー、表面伝導電子放出ディスプレイ(SED)、レーザーテレビジョンディスプレイ、ナノ結晶ディスプレイ、または別のタイプのディスプレイユニットを含み得る。ディスプレイ54は、コンピューティングデバイス40内に統合され得る。たとえば、ディスプレイ54は、モバイル電話ハンドセットまたはタブレットコンピュータの画面であり得る。代替的に、ディスプレイ54は、ワイヤードまたはワイヤレス通信リンクを介してコンピューティングデバイス40に結合されたスタンドアロンデバイスであり得る。たとえば、ディスプレイ54は、ケーブルまたはワイヤレスリンクを介してパーソナルコンピュータに接続されたコンピュータモニタまたはフラットパネルディスプレイであり得る。
バス56は、第1、第2、および第3世代バス構造およびプロトコル、共有バス構造およびプロトコル、ポイントツーポイントバス構造およびプロトコル、単方向バス構造およびプロトコル、ならびに双方向バス構造およびプロトコルを含む、任意の組合せのバス構造およびバスプロトコルを使用して実装され得る。バス56を実装するために使用され得る異なるバス構造およびプロトコルの例には、たとえば、HyperTransportバス、InfiniBandバス、Advanced Graphics Portバス、Peripheral Component Interconnect(PCI)バス、PCI Expressバス、Advanced Microcontroller Bus Architecture(AMBA) Advanced High-performance Bus(AHB)、AMBA Advanced Peripheral Bus(APB)、およびAMBA Advanced eXentisible Interface(AXI)バスが含まれる。他のタイプのバス構造およびプロトコルもまた使用され得る。
本開示によれば、GPU46(たとえば、アトミック動作ユニット14)は、パイプの状態を示す2つ以上のパイプ状態パラメータを修正する、ハードウェアベースのアトミック読取り修正書込み動作を実行し得る。パイプは、タスク間通信をサポートするための先入れ先出し(FIFO)編成データバッファに対応し得る。ハードウェアベースのアトミック読取り修正書込み動作を使用して、2つ以上のパイプ状態パラメータ値をアトミックな方式で修正することで、同時に実行中のタスクおよび/またはスレッドが、ロックおよび/またはコードのクリティカルセクションの使用を必要とすることなく、パイプの状態を修正することが可能になり得る。
いくつかの例では、ハードウェアベースのアトミック読取り修正書込み動作を実行するために、GPU46(たとえば、アトミック動作ユニット14)は、割込み不可能な動作のセットを実行し得る。割込み不可能な動作のセットは、メモリサブシステム(たとえば、メモリ50および/またはGPU46内に含まれたキャッシュ)から、パイプ状態パラメータに対応する値を読み取る動作と、パイプ状態パラメータのための修正された値を生成する動作と、パイプ状態パラメータのための修正された値をメモリサブシステムに書き込む動作とを含み得る。
次に、コンピューティングデバイス40の例示的な動作について説明する。ホストプログラム58は、パイプオブジェクトを作成するために、GPUドライバ60に命令を発行し得る。命令は、作成されるべきパイプの論理サイズを指定し得る。パイプの論理サイズは、パイプ内に含めるべき論理パケットエントリの数を指し得る。
パイプオブジェクトを作成するための命令を受信することに応答して、GPUドライバ60は、パイプオブジェクトのためにメモリ50内にメモリ空間を割り振り得る。割り振られるメモリ空間は、図1に示すようなパイプ状態パラメータ22およびパイプデータバッファ24のために割り振られるメモリ空間を含み得る。いくつかの例では、パイプのために割り振られた物理パケットエントリの数は、パイプのためにホストプログラム58によって指定された論理パケットエントリの数に必ずしも等しいとは限らないことがある。たとえば、GPUドライバ60は、物理パケットエントリの数が、ホストプログラム58によって要求された論理パケットエントリの数以上である最初の2の累乗であるように、パイプのためのメモリを割り振り得る。パイプを割り振った後、GPUドライバ60は、作成されたばかりのパイプを識別するハンドルを戻し得る。
ホストプログラム58は、GPU46によって実行されるべきであるタスクに基づいて、タスクオブジェクト(たとえば、カーネルオブジェクト)を作成し得る。ホストプログラム58は、タスクオブジェクトのための引数のうちの1つを、以前に作成されたパイプに対応するように設定(たとえば、パイプのためのハンドルに等しい引数を設定)し得る。ホストプログラム58は、タスクオブジェクトがGPU46によって実行されることを引き起こす命令を、GPUドライバ60に発行し得る。
タスクオブジェクトが実行されることを引き起こす命令を受信することに応答して、GPUドライバ60は、計算ユニット12のうちの1つまたは複数上でタスクオブジェクトに対応するタスクを実行することを、GPU46に行わせ得る。たとえば、GPUドライバ60は、GPU46にタスクを実行させるために、GPU46のためのコマンドキュー内にコマンドを配置し得る。
いくつかの例では、GPUドライバ60は、パイプの特性を指定する1つまたは複数のパラメータおよび/または引数を、GPU46に与え得る。たとえば、GPUドライバ60は、パイプのためのパイプアドレス、パイプのための物理パイプサイズ-1、および/またはパイプのための論理パイプサイズのうちの1つまたは複数を、GPU46に与え得る。いくつかの例では、GPUドライバ60および/またはGPU46は、タスクを実行中である計算ユニット12の定数メモリおよび/または定数レジスタが、パイプの特性を指定するパラメータでポピュレートされることを引き起こし得る。
タスクを実行するようにGPU46に命令するコマンドを受信することに応答して、GPU46は、計算ユニット12のうちの1つまたは複数にタスクを割り振る。タスクを実行するために割り振られる計算ユニット12のうちの1つまたは複数が、タスクを実行する。いくつかの例では、タスクを実行することは、複数のスレッド(すなわち、タスクのインスタンス)を並列に実行することを伴い得る。
計算ユニット12上で同時に実行中であるタスクおよび/またはスレッドは、1つまたは複数のアトミック動作コマンドをアトミック動作ユニット14に発行する。アトミック動作コマンドを受信することに応答して、アトミック動作ユニット14は、本開示で説明するような1つまたは複数のハードウェアベースのアトミック動作を実行する。タスクおよび/またはスレッドの実行は、完了するまで継続する。
図9は、本開示によるGPU46または別の計算デバイス内で使用され得る、例示的な計算ユニット12Aを示すブロック図である。計算ユニット12Aは、計算ユニット12Aにアクセス可能であるタスクのためのコンパイル済みプログラムコードに基づいて、1つまたは複数の異なるタイプのタスクを実行するように構成され得る。計算ユニット12Aは、制御ユニット72と、命令ストア74と、処理要素76A〜76H(総称して「処理要素76」)と、レジスタ78と、定数メモリ80と、ローカルメモリ82とを含む。
命令ストア74は、計算ユニット12Aによって実行されるべきである1つまたは複数のタスク(たとえば、カーネル)のためのプログラム命令の全部または一部を記憶するように構成される。命令ストア74は、たとえば、揮発性メモリ、不揮発性メモリ、キャッシュ、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)などを含む、任意のタイプのストレージユニットであり得る。命令ストア74がキャッシュであるとき、命令ストア74は、計算ユニット12Aの外部のメモリ内に記憶されるプログラム命令をキャッシュし得る。命令ストア74を計算ユニット12Aの内部であるように図示しているが、他の例では、命令ストア74は計算ユニット12Aの外部であり得る。
処理要素76は、タスクプログラムのスレッドを実行するように構成される。処理要素76の各々は、異なるスレッドを実行し得る。スレッドは、スレッドに特有であるデータ項目に対して実行されるタスクのインスタンスを指すことがある。したがって、処理要素76の各々は、潜在的に異なるデータ項目に対してタスクのインスタンスを実行すると言われることがある。共通の時点に処理要素76A〜76H上で並列に実行中であるスレッドの集合は、スレッドのウェーブと呼ばれることがある。
図9の例示的な計算ユニット12Aでは、処理要素76は、単一命令多重データ(SIMD)処理要素であり得る。SIMD処理要素は、アクティブ化されるとき、異なるデータに対して同時に同じ命令を実行するように構成される処理要素を指す。これによって、処理要素76は、異なるデータ項目に対して並列にタスクの複数のスレッドを実行することが可能になり得る。場合によっては、処理要素76の各々は、命令ストア74内に含まれた命令をポイントする共通プログラムカウンタに基づいて、タスクの命令を実行し得る。
処理要素76のうちの1つまたは複数が非アクティブ化される場合、そのような処理要素76は、所与の命令サイクルの間にプログラム命令を実行しない。場合によっては、制御ユニット72は、分岐条件がいくつかのスレッドについて満たされ、他のスレッドについて満たされない場合、条件付き分岐命令を実施するために、処理要素76のうちの1つまたは複数を非アクティブ化し得る。
いくつかの例では、処理要素76の各々は、算術論理ユニット(ALU)を含み、および/またはそれに対応し得る。さらなる例では、処理要素76の各々は、ALU機能を実施し得る。ALU機能は、加算、減算、乗算などを含み得る。追加の例では、処理要素76の各々は、スカラーALUまたはベクトルALUであり得る。スカラーALUはスカラーデータ項目を操作し得、ベクトルALUはベクトルデータ項目を操作し得る。スカラーデータ項目は、スカラーのための単一の成分に対応する単一の値を含み得る。ベクトルデータ項目は、ベクトルの複数の成分に対応する複数の値を含み得る。
処理要素76の各々は、命令ストア74から命令を読み取り、ならびに/または、レジスタ78、定数メモリ80、ローカルメモリ82、および外部メモリのうちの1つまたは複数からデータ項目を読み取り得る。処理要素76の各々は、レジスタ78、ローカルメモリ82、および外部メモリのうちの1つまたは複数に出力データを書き込み得る。
レジスタ78は、様々な処理要素76に動的に割り振られ得る。場合によっては、レジスタ78の一部または全部は、計算ユニット12A上で実行する様々なスレッドのための入力レジスタおよび/または出力レジスタとして働き得る。入力レジスタは、タスクプログラムのための入力データ項目を記憶するレジスタを指すことがあり、出力レジスタは、タスクプログラムのための出力データ項目を記憶するレジスタを指すことがある。
定数メモリ80は、計算ユニット12A上で実行するタスクによって使用される定数値を記憶し得る。定数メモリ80は、たとえば、揮発性メモリ、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)、電気消去可能プログラマブル読取り専用メモリ(EEPROM)などを含む、任意のタイプのメモリであり得る。
ローカルメモリ82は、計算ユニット12A上で実行するタスクによって使用するためのメモリストレージを提供し得る。ローカルメモリ82は、たとえば、揮発性メモリ、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)などを含む、任意のタイプのメモリであり得る。いくつかの例では、ローカルメモリ82のためのアドレス空間は、計算ユニット12A内に含まれた処理要素76にとってローカルであり得る。言い換えれば、GPU46の他の計算ユニットおよび/または他の部分は、ローカルメモリ82に直接アクセス可能ではないことがある。同様に、ホストデバイスは、ローカルメモリ82に直接アクセス可能ではないことがある。いくつかの例では、ローカルメモリ82は、計算ユニット12Aおよび/またはGPU46と同じチップ上で実装され得る。
次に、計算ユニット12Aの例示的な動作について説明する。GPU46は、実行のために計算ユニット12Aにタスクを割り当て得る。GPU46は、タスクのためのコンパイルコードを命令ストア74内に記憶し得る。GPU46は、タスクのための定数パラメータを定数メモリ80内に、および、タスクのための入力パラメータをレジスタ78内に記憶し得る。処理要素76は、タスクの複数のインスタンス(すなわち、スレッド)を並列に実行する。処理要素76上で実行するスレッドのうちの1つまたは複数は、本開示で説明するアトミック動作コマンドのうちの1つまたは複数を発行する。
アトミック動作コマンドを発行するために、処理要素76Aは、アトミック動作コマンドのための入力パラメータを含む、レジスタ78のうちの1つまたは複数を指定し得る。処理要素76Aは、アトミック動作コマンドをアトミック動作ユニット14に発行し得る。
いくつかの例では、アトミック書込みコミットコマンドおよびアトミック読取りコミットコマンドの場合、戻り値がアトミック動作ユニット14によって与えられない。アトミック書込み予約コマンドおよびアトミック読取り予約コマンドの場合、戻り値が与えられ得る。たとえば、アトミック動作ユニット14は、最初のパケットオフセットパラメータと、パケットカウントパラメータと、予約済みパケットカウントパラメータとを戻し得る。いくつかの例では、レジスタ78は、1つまたは複数のクワッドレジスタグループを含み得、そこで、各クワッドレジスタグループが4つのレジスタを含み、4つのレジスタのためのデータが、単一のキャッシュおよび/またはメモリトランザクションの一部としてメモリから読み取られ、および/またはメモリ内に記憶され得る。そのような例では、アトミック書込み予約動作および/またはアトミック読取り予約動作によって戻される3つのパイプ状態パラメータは、いくつかの例では、レジスタ78のクワッドレジスタグループ内の3つの連続するレジスタ内で戻され得る。このようにして、3つのパイプ状態パラメータは、単一のキャッシュおよび/またはメモリトランザクションの一部として、計算ユニット12Aによってフェッチされ得る。
図10は、例示的なGPU46およびメモリ構成をより詳細に示す、図1のコンピューティングシステム10の一部分を示すブロック図である。図10に示す構成は、図1のコンピューティングシステム10および/または図8のコンピューティングデバイス40を実装するために使用され得る。
図10に示すように、GPU46は、キャッシュユニット84を含む。キャッシュユニット84は、GPU46内の計算ユニット12のためのキャッシングサービスを提供し得る。キャッシュユニット84は、コマンドキュー26と、キャッシュ制御ユニット86と、アトミック動作データパス30と、キャッシュストレージユニット88とを含む。キャッシュストレージユニット88は、キャッシュされたパイプ状態パラメータ90とキャッシュされたパイプデータバッファ92の一方または両方を含み得る。キャッシュされたパイプ状態パラメータ90は、パイプ状態パラメータ22のキャッシュされたコピーであり得、キャッシュされたパイプデータバッファ92は、パイプデータバッファ24のキャッシュされたコピーであり得る。いくつかの例では、キャッシュされたコピーがキャッシュされるので、そのようなコピーは、それらのそれぞれのソースデータの不完全および/または部分的なコピーであり得る。
キャッシュユニット84およびメモリ50は、メモリサブシステムを形成し得、キャッシュストレージユニット88およびメモリ50は、メモリサブシステム内でデータストレージシステムを形成し得る。たとえば、データストレージシステムは、図1におけるデータストレージシステム16に対応し得る。
コマンドキュー26は、計算ユニット12から受信されたメモリアクセスコマンドと、計算ユニット12から受信されたアトミック動作コマンドとを記憶するように構成され得る。キャッシュ制御ユニット86は、メモリアクセスコマンドとアトミック動作コマンドとを処理し得る。いくつかの例では、キャッシュ制御ユニット86は、一度に1つのコマンドが処理されるように、コマンドを逐次処理し得る。
メモリアクセスコマンドでは、キャッシュ制御ユニット86は、対応する読取り要求と書込み要求とを、キャッシュストレージユニット88とメモリ50の一方または両方に発行し得る。アトミック動作コマンドでは、キャッシュ制御ユニット86は、アトミック動作データパス30のうちの1つまたは複数に、コマンドに対応するハードウェアベースのアトミック動作を実行させ得る。アトミック動作データパス30によって実装されるハードウェアベースのアトミック動作は、アトミック動作を実行するために、読取り要求と書込み要求とを、キャッシュストレージユニット88とメモリ50の一方または両方に発行し得る。
図10に示すように、アトミック動作ユニット14(図6)によって実行されるハードウェアベースのアトミック動作は、いくつかの例では、GPU46のキャッシュユニット84に組み込まれ得る。アトミック動作ユニット14によって実行されるハードウェアベースのアトミック動作をGPU46のキャッシュユニット84に組み込むことで、同様の機能を実行するハードウェアの一部が、アトミック動作ユニット14とキャッシュユニット84との間で共有されることが可能になり得る。このようにして、より小型の回路が、本開示のハードウェアベースのアトミック動作を実施するために使用され得る。
図11は、本開示によるハードウェアベースのアトミック動作を実行するための例示的な技法を示す流れ図である。図11に示す例示的な技法について、コンピューティングシステム10のアトミック動作ユニット14に関して説明する。いくつかの例では、アトミック動作ユニット14は、たとえば、GPU(たとえば、GPU46)、CPU、DSPなど、プロセッサおよび/または処理ユニット内に含まれ得る。
アトミック動作ユニット14は、計算ユニット12Aからアトミック動作コマンドを受信する(100)。アトミック動作ユニット14は、パイプの状態を示す2つ以上のパイプ状態パラメータを修正する、ハードウェアベースのアトミック読取り修正書込み動作を実行する(102)。パイプは、スレッド間通信をサポートするためのFIFO編成データバッファに対応し得る。
読取り修正書込み動作は、その読取り修正書込み動作を要求したタスクまたはスレッドと同時に実行中である他のタスクおよび/またはスレッドによって要求され得るいかなる他の読取り修正書込み動作からの割込みもなしに、その動作が開始から終了まで実行されるという意味で、アトミックであり得る。言い換えれば、アトミック読取り修正書込み動作の実行中に、他のスレッドおよび/またはタスクは、現在実行中の読取り修正書込み動作によって修正されるパイプ状態パラメータを読み取るかまたは修正することが可能であり得ない。このようにして、2つ以上のタスクおよび/またはスレッドが、同時にパイプのパイプ状態パラメータを修正することを試みる場合に、競合状態が回避され得る。
アトミック読取り修正書込み動作は、そのアトミック読取り修正書込み動作が、ハードウェアユニットに通信可能に結合されているスレッドおよび/またはタスクによって呼び出され得る単一の分割不可能な動作として、そのハードウェアユニットによって実施され得るという意味で、ハードウェアベースであり得る。単一の分割不可能な動作は、その読取り修正書込み動作を要求したタスクまたはスレッドと同時に実行中である他のタスクおよび/またはスレッドによって要求され得る他の読取り修正書込み動作を実行するために、その動作に割り込むことなく、ハードウェアユニットがその動作を開始から終了まで実行するという意味で、分割不可能であり得る。たとえば、ハードウェアユニットが、アトミック読取り修正書込み動作を実行するための複数の要求を受信する場合、ハードウェアユニットは、一度に1つのアトミック読取り修正書込み動作が実行されるように、および、各アトミック読取り修正書込み動作の実行が、別のアトミック読取り修正書込み動作を実行することを開始するより前に完了されるように、それらの要求の各々のためにアトミック読取り修正書込み動作を逐次実行し得る。ハードウェアベースのアトミック読取り修正書込み動作を使用することによって、同時に実行中のタスクおよび/またはスレッドがミューテックスロックを使用することを必要とすることなく、それらのタスクおよび/またはスレッドによって複数のパイプ状態パラメータが修正され得る。
いくつかの例では、アトミック動作ユニット14は、並列に実行中の複数のスレッドから、ハードウェアベースのアトミック読取り修正書込み動作を実行するための複数の要求(すなわち、コマンド)を受信し得る。そのような例では、アトミック動作ユニット14は、ハードウェアベースのアトミック読取り修正書込み動作を実行するための複数の要求を受信することに応答して、複数のハードウェアベースのアトミック読取り修正書込み動作を逐次実行し得る。ハードウェアベースのアトミック読取り修正書込み動作の各々は、複数の要求のそれぞれの1つに応答して実行され得る。複数のハードウェアベースのアトミック読取り修正書込み動作を逐次実行することは、第1のスレッドからの第1の要求に関連付けられたすべてのパイプ状態パラメータ修正が、第2のスレッドからの第2の要求に関連付けられたパイプ状態パラメータ修正のいずれかを実行するより前に完了されるように、ハードウェアベースのアトミック読取り修正書込み動作を実行することを伴い得る。
たとえば、アトミック動作ユニット14は、アトミック動作を実行するための第1のスレッドからの第1の要求を受信し得る。第1の要求を受信することに応答して、アトミック動作ユニット14は、第1の要求にサービスするために、第1のハードウェアベースのアトミック読取り修正書込み動作を実行し得る。第1のハードウェアベースのアトミック読取り修正書込み動作を完了するより前に、アトミック動作ユニット14は、アトミック動作を実行するための第2のスレッドからの第2の要求を受信し得る。第2の要求を受信することに応答して、アトミック動作ユニット14は、第1のハードウェアベースのアトミック読取り修正書込み動作の実行が完了するまで、第2の要求にサービスするための第2のハードウェアベースのアトミック読取り修正書込み動作の実行を開始することを待機し得る。第1のハードウェアベースのアトミック読取り修正書込み動作の実行が完了した後、アトミック動作ユニット14は、第2の要求にサービスするために、2つ以上のパイプ状態パラメータを修正する、第2のハードウェアベースのアトミック読取り修正書込み動作を実行し得る。
上記で説明した方法でハードウェアベースのアトミック読取り修正書込み動作を逐次実行することで、アトミック動作ユニット14は、動作のアトミック性を保証することが可能になり得る。このようにして、パイプベースのタスク間通信が、パイプ状態パラメータを修正するためにソフトウェアベースの相互排除技法を使用することに関連する性能の欠点および/または電力消費の欠点を伴うことなく、並列コンピューティングシステムにおいて提供され得る。
いくつかの例では、パイプ状態パラメータは、パイプの予約状態を示す1つまたは複数のパイプ予約状態パラメータを含み得る。たとえば、予約状態パラメータは、いくつのコミットされていない予約がパイプのために現在保留中であるかを示すパラメータ、および、いくつのパケットエントリがパイプ内で現在予約されているかを示すパラメータのうちの、少なくとも1つを含み得る。さらなる例では、パイプ状態パラメータは、いくつのパケットがパイプ内に現在記憶されているかを示すパラメータと、パイプのための開始パケットを記憶するパケットエントリを示すパラメータと、いくつのコミットされていない予約がパイプのために現在保留中であるかを示すパラメータと、いくつのパケットエントリがパイプ内で現在予約されているかを示すパラメータとを含み得る。
図12は、本開示によるハードウェアベースのアトミック動作を実行するための別の例示的な技法を示す流れ図である。図12に示す例示的な技法について、コンピューティングシステム10のアトミック動作ユニット14に関して説明する。いくつかの例では、アトミック動作ユニット14は、たとえば、GPU(たとえば、GPU46)、CPU、DSPなど、プロセッサおよび/または処理ユニット内に含まれ得る。いくつかの例では、図13に示す例示的な技法は、図11に示すプロセスブロック102を実施し得る。
アトミック動作ユニット14は、メモリサブシステムから2つ以上のパイプ状態パラメータに対応する値を読み取る、読取り動作を実行する(104)。アトミック動作ユニット14は、2つ以上のパイプ状態パラメータのための修正された値を生成する、修正動作を実行する(106)。アトミック動作ユニット14は、パイプ状態パラメータのための修正された値をメモリサブシステムに書き込む、書込み動作を実行する(108)。
いくつかの例では、メモリサブシステムは、データストレージシステム16を含み得る。そのような例では、値をメモリサブシステムに書き込むこと、およびメモリサブシステムから値を読み取ることは、メモリサブシステム内に含まれたデータストレージシステム16に値を書き込むこと、およびそれから値を読み取ることを伴い得る。
いくつかの例では、プロセスボックス104、106、および108は、割込み不可能な動作のセットの一部として実行され得る。これらの動作は、他の読取り修正書込み動作(たとえば、現在実行中の読取り修正書込み動作を要求したタスクまたはスレッドと同時に実行中であるタスクおよび/またはスレッドによって要求される他の読取り修正書込み動作)に関連付けられ得る他の動作を実行するための割込み実行なしに、それらの動作が開始から終了まで実行されるという意味で、割込み不可能であり得る。ハードウェアユニットに、このようにして割込み不可能な読取り修正書込みシーケンスを実行させることで、ハードウェアユニットが、そのような動作を要求し得る同時に実行中のスレッドおよび/またはタスクのためにアトミック読取り修正書込み動作を実施することが可能になる。
図13は、本開示によるアトミック書込み予約動作とアトミック読取り予約動作とを実行するための例示的な技法を示す流れ図である。図13に示す例示的な技法について、コンピューティングシステム10のアトミック動作ユニット14に関して説明する。いくつかの例では、アトミック動作ユニット14は、たとえば、GPU(たとえば、GPU46)、CPU、DSPなど、プロセッサおよび/または処理ユニット内に含まれ得る。いくつかの例では、図13に示す例示的な技法は、図12に示す例示的な技法を実施し得る。
アトミック動作ユニット14は、メモリサブシステムからパイプ状態パラメータ(PSP)値を読み取る、読取り動作を実行する(110)。読取り動作を実行した後、アトミック動作ユニット14は、パイプ状態パラメータ値のうちの1つまたは複数を要求側スレッドおよび/またはタスクに戻す、戻し動作を実行する(112)。
読取り動作を実行した後、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値を生成する修正動作を実行する(ブロック114〜118)。修正動作を実行するために、アトミック動作ユニット14は、パイプ状態パラメータのうちの1つまたは複数に基づいて、パイプが予約要求をサポートするのに十分なほどの、利用可能なエントリを有するか否かを決定する動作を実行する(114)。パイプが予約要求をサポートするのに十分なほどの、利用可能なエントリを有すると決定することに応答して、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値を、予約がそのパイプのために行われたことをその修正された値が反映するように生成する動作を実行する(116)。
パイプが予約要求をサポートするのに十分なほどの、利用可能なエントリを有していないと決定することに応答して、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値を、予約がそのパイプのために行われたことをその修正された値が反映するように生成する動作を実行しなくてよい(118)。言い換えれば、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値を、その修正された値がパイプ状態パラメータのための以前の値に等しいように(すなわち、予約がそのパイプのために行われていないことを、その修正された値が反映するように)生成し得る。
アトミック書込み予約動作が実行される例では、パイプが予約要求をサポートするのに十分なほどの、利用可能なエントリを有するか否かを決定するために、アトミック動作ユニット14は、パイプ状態パラメータのうちの1つまたは複数に基づいて、書込み予約要求をサポートするのに十分なほどの、コミットされていない、および未予約のエントリをパイプが有するか否かを決定し得る。アトミック読取り予約動作が実行される例では、パイプが予約要求をサポートするのに十分なほどの、利用可能なエントリを有するか否かを決定するために、アトミック動作ユニット14は、読取り予約要求をサポートするのに十分なほどの、パケットデータが記憶される未読および未予約のパケットエントリをパイプが有するか否かを決定し得る。
修正された値を生成した後、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値をメモリサブシステムに書き込む、書込み動作を実行する(120)。次に、予約動作が完了する。
いくつかの例では、予約動作は書込み予約動作であり得る。そのような例では、決定ブロック114は、いくつかの例では、図2の16行目に示す式を評価することによって実施され得る。加えて、プロセスブロック116に記載するように、予約がパイプのために行われたことを反映する、修正されたパイプ状態パラメータ値を生成するために、アトミック動作ユニット14は、図2の17〜20行目において指定された式に基づいて、パイプ状態パラメータ値を更新し得る。
さらなる例では、予約動作は読取り予約動作であり得る。そのような例では、決定ブロック114は、いくつかの例では、図4の16行目に示す式を評価することによって実施され得る。加えて、プロセスブロック116に記載するように、予約がパイプのために行われたことを反映する、修正されたパイプ状態パラメータ値を生成するために、アトミック動作ユニット14は、図4の17〜20行目において指定された式に基づいて、パイプ状態パラメータ値を更新し得る。
図14は、本開示によるアトミック書込みコミット動作とアトミック読取りコミット動作とを実行するための例示的な技法を示す流れ図である。図14に示す例示的な技法について、コンピューティングシステム10のアトミック動作ユニット14に関して説明する。いくつかの例では、アトミック動作ユニット14は、たとえば、GPU(たとえば、GPU46)、CPU、DSPなど、プロセッサおよび/または処理ユニット内に含まれ得る。いくつかの例では、図14に示す例示的な技法は、図12に示す例示的な技法を実施し得る。
アトミック動作ユニット14は、メモリサブシステムからパイプ状態パラメータ(PSP)値を読み取る、読取り動作を実行する(122)。読取り動作を実行した後、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値を生成する修正動作を実行する(ブロック124〜130)。修正動作を実行するために、アトミック動作ユニット14は、予約がコミットされたことを反映するように、第1のパイプ状態パラメータ(たとえば、予約カウントパラメータ)のための修正された値を生成し得る(124)。言い換えれば、アトミック動作ユニット14は、パイプがコミット動作を実行するより前に有していたコミットされていない予約の数に対して、1つ少ないコミットされていない予約をパイプが有することを、第1のパイプ状態パラメータのための修正された値が反映するように、第1のパイプ状態パラメータのための修正された値を生成する動作を実行し得る。
アトミック動作ユニット14は、パイプ状態パラメータのうちの1つまたは複数に基づいて、パイプのためのすべての予約がコミットされたか否かを決定する動作を実行する(126)。パイプのためのすべての予約がコミットされたと決定することに応答して、アトミック動作ユニット14は、パイプ状態パラメータのための1つまたは複数の修正された値を、エントリがパイプにコミットされたことをその修正された値が反映するように生成する動作を実行する(128)。
パイプのためのすべての予約がコミットされたとは限らないと決定することに応答して、アトミック動作ユニット14は、パイプ状態パラメータのための1つまたは複数の修正された値を、コミットされたエントリがパイプにコミットされたことをその修正された値が反映するように生成する動作を実行しない(130)。言い換えれば、アトミック動作ユニット14は、第1のパイプ状態パラメータ(たとえば、予約カウントパラメータ)以外のパイプ状態パラメータのための修正された値を、その修正された値がパイプ状態パラメータのための以前の値に等しいように生成し得る。
アトミック書込みコミット動作が実行される例では、エントリがパイプにコミットされたことを反映するようにパイプ状態パラメータ値を修正することは、コミットされたエントリがパイプに配置され、消費者タスクにとって利用可能であることを反映するように、パイプ状態パラメータ値を修正することを伴い得る。アトミック読取りコミット動作が実行される例では、エントリがパイプにコミットされたことを反映するようにパイプ状態パラメータ値を修正することは、コミットされたエントリがパイプから除去されたことを反映するように、パイプ状態パラメータ値を修正することを伴い得る。
修正された値を生成した後、アトミック動作ユニット14は、パイプ状態パラメータのための修正された値をメモリサブシステムに書き込む、書込み動作を実行する(132)。次に、コミット動作が完了する。
いくつかの例では、コミット動作は書込みコミット動作であり得る。そのような例では、プロセスブロック124は、いくつかの例では、図3の8行目に示す式に基づいて実施され得る。加えて、決定ブロック126は、いくつかの例では、図3の9行目に示す式を評価することによって実施され得る。さらに、プロセスブロック128に記載するように、エントリがパイプにコミットされたことを反映する、修正されたパイプ状態パラメータ値を生成するために、アトミック動作ユニット14は、図3の10〜11行目において指定された式に基づいて、パイプ状態パラメータ値を更新し得る。
さらなる例では、コミット動作は読取りコミット動作であり得る。そのような例では、プロセスブロック124は、いくつかの例では、図5の8行目に示す式に基づいて実施され得る。加えて、決定ブロック126は、いくつかの例では、図5の9行目に示す式を評価することによって実施され得る。さらに、プロセスブロック128に記載するように、エントリがパイプにコミットされたことを反映する、修正されたパイプ状態パラメータ値を生成するために、アトミック動作ユニット14は、図5の10〜12行目において指定された式に基づいて、パイプ状態パラメータ値を更新し得る。
いくつかの例では、本開示の技法は、OpenCL(商標)2.0パイプのための比較的に効率的な解決策を実施し得る。本技法は、いくつかの例では、OpenCL(商標)2.0パイプを実装するために、特殊なアトミック関数を使用し得る。
OpenCL(商標)2.0パイプは、予約機能を介して複数の製作者/複数の消費者によって使用され得るFIFOとして働く。パイプにアクセスするためのセマンティクスは、reserve(cnt)関数をコールすることを含み得、ただし、cntは、予約のために要求されたパケットの数を示す。reserve(cnt)関数が成功する場合、reserve(cnt)関数は、予約識別値(すなわち、reserve_id)を戻し得る。パイプにアクセスするためのセマンティクスは、reserve(cnt)関数が成功する場合、reserve_idと、0からcnt-1までのインデックスとを使用して、パイプ読取りコマンドをコールすることをさらに含み得る。インデックスは、どのパケットエントリがパイプから読み取られるべきであるかを示し得る。パイプにアクセスするためのセマンティクスは、パイプを読み取ることが終了されること、およびパケットがパイプから除去され得ることを示す、commit(reserve_id)コマンドをさらに含み得る。
パイプの状態を維持することは、複数のカウンタの同時(すなわち、アトミックな)修正を必要とし得る。これは、ミューテックスロックを使用して達成され得、ミューテックスロックは、比較交換アトミック動作を使用して実装され得る。しかしながら、ミューテックスロックを使用することは、多数の作業項目がロックを求めて競合し得るので、非効率的になり得る。これは、獲得成功のために複数の試行が必要とされる結果となり、それによって電力が無駄になることがある。
本開示の技法は、いくつかの例では、ハードウェアアトミック動作を使用し得、ハードウェアアトミック動作は、動作ごとに単一のハードウェア命令を使用して、パイプ予約、コミットおよびクエリ動作をサポートするように設計され得る。いくつかの例では、本開示で説明するアトミック動作は、グローバルGPUアトミックを実施するGPUパイプラインの一部分において実施され得る。さらなる例では、本開示で説明するアトミック動作は、実装形態が共有仮想メモリをサポートする場合、パイプがホストCPUとGPUとの間で使用されることを可能にし得る。
いくつかの例では、本開示の技法は、GPUのシェーダブロック内で組込みパイプ関数を実行し得、シェーダブロックのための命令セットアーキテクチャ(ISA)は、本開示で説明するアトミック動作コマンドのうちの1つまたは複数を含み得る。さらなる例では、本開示の技法は、アトミック動作を実施するために専用のハードウェア回路を使用し得る。
いくつかの例では、本開示の技法は、GPUのユニファイドキャッシュブロック(たとえば、L2キャッシュブロック)に特殊なアトミックを追加し得る。特殊なアトミックは、いくつかの例では、追加のISA命令を用いてアクセスされ得る。いくつかの例では、パイプは、予約機構(たとえば、reserve_read、read、commit_read、またはreserve_write、write、commit_write)を使用してアクセスされ得る。
いくつかの例では、パイプのためのパイプ状態は、4つの32ビット数、すなわち、(1)最初のパケットオフセット、(2)パケットカウント、(3)予約済みパケットカウント、および(4)予約カウントによって表され得る。そのような例では、これらの32ビット数は、いくつかの例では、本開示で説明するパイプ状態パラメータに対応し得る。そのような例では、4つの32ビット数(たとえば、パイプ状態パラメータ)は、単一のメモリトランザクションによる読取り/書込みを可能にするために、128ビット整合とともに128ビットブロック内に配置され得る。
いくつかの例では、割り振られるパイプのサイズは、2の累乗であり得る。しかしながら、パイプの実際の深さは、割り振られたサイズよりも小さくなり得る。これは、OpenCL(商標)APIの柔軟性によるものであり得る。
本開示の技法は、いくつかの例では、OpenCL(商標)パイプ予約、コミット、およびクエリのためのサポートを提供し得る。OpenCL(商標)パイプは、読取りのため(すなわち、入力パイプ)または書込みのため(すなわち、出力パイプ)のいずれかで使用され得る。カーネルは、いくつかの例では、所与のパイプから読み取るか、または所与のパイプに書き込むかのいずれかであり、両方ではないことがある。
いくつかの例では、本開示の技法は、GPUのシェーダプロセッサ、ストリームプロセッサ、および/またはユニファイドキャッシュ内で実装され得る。いくつかの例では、本開示の技法は、カーネルごとに無制限の数のパイプがサポートされる(たとえば、パイプ状態を保つために利用可能なメモリおよび定数レジスタのみによって制限される)ことを可能にし得る。さらなる例では、メモリ内でパイプ状態を保つ機能は、ホスト/デバイスにわたる、または複数のデバイスにわたるパイプを含むために、OpenCL(商標)2.0の共有仮想メモリ機能と結合され得る。
いくつかの例では、パイプは、FIFOとして編成されたデータを記憶するメモリオブジェクトであり得る。パイプは、代替的にパイプオブジェクトと呼ばれることがある。場合によっては、パイプオブジェクトは、パイプから読み取る、および/またはパイプに書き込む組込み関数を使用してアクセスされ得る。さらなる場合では、パイプオブジェクトは、ホストデバイスからアクセス可能ではないことがある。いくつかの例では、パイプオブジェクトは、以下の情報、すなわち、バイト単位のパケットサイズと、パケット内のパイプの最大容量と、現在パイプ内にあるパケットの数を示す情報と、パイプ内に含まれるデータパケットとをカプセル化し得る。
いくつかの例では、パイプメモリオブジェクトは、概念的にデータ項目の順序付きシーケンスに対応し得る。たとえば、パイプは、2つのエンドポイント、すなわち、それにデータ項目が挿入される書込みエンドポイントと、それからデータ項目が除去される読取りエンドポイントとを有し得る。いくつかの例では、任意の1回に、ただ1つのカーネルインスタンス(たとえば、タスク)がパイプに書き込み得、ただ1つのカーネルインスタンス(たとえば、タスク)がパイプから読み取り得る。いくつかの例では、パイプは、製作者-消費者設計パターンをサポートし得、その場合、あるカーネルインスタンスがパイプの書込みエンドポイントに(製作者として)接続し、別のカーネルインスタンスがパイプの読取りエンドポイントに(消費者として)接続する。
場合によっては、パイプは、一種のメモリオブジェクトであり得る。メモリオブジェクトは、いくつかの例では、グローバルメモリ(たとえば、システムメモリ)のコンテンツを含み得る。いくつかの例では、メモリオブジェクトは、グローバルメモリの参照カウント領域へのハンドルを指すことがある。
本開示で説明する技法は、少なくとも部分的に、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せにおいて実装され得る。たとえば、説明する技法の様々な態様は、1つまたは複数のマイクロプロセッサ、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、または、任意の他の等価な集積もしくは離散論理回路、ならびにそのような構成要素の任意の組合せを含む、1つまたは複数のプロセッサ内で実装され得る。「プロセッサ」または「処理回路」という用語は、一般に、単独の、もしくは他の論理回路と組み合わせた前述の論理回路のいずれか、または、処理を実行する離散ハードウェアなど、任意の他の等価な回路を指すことがある。
そのようなハードウェア、ソフトウェア、およびファームウェアは、本開示で説明する様々な動作および機能をサポートするために、同じデバイス内または別個のデバイス内で実装され得る。加えて、説明するユニット、モジュール、または構成要素のいずれも、一緒に、または、離散であるが相互動作可能な論理デバイスとして別個に実装され得る。異なる特徴をモジュールまたはユニットとして図示することは、異なる機能的態様を強調することを意図したものであり、必ずしも、そのようなモジュールまたはユニットが別個のハードウェアまたはソフトウェア構成要素によって実現されなければならないことを暗示するとは限らない。むしろ、1つまたは複数のモジュールまたはユニットに関連付けられた機能は、別個のハードウェア、ファームウェア、および/もしくはソフトウェア構成要素によって実行されるか、または、共通もしくは別個のハードウェアもしくはソフトウェア構成要素内で統合され得る。
本開示で説明する技法はまた、命令を記憶するコンピュータ可読記憶媒体など、コンピュータ可読媒体内で記憶、具現化、または符号化され得る。コンピュータ可読媒体内で埋め込まれたかまたは符号化された命令は、たとえば、命令が1つまたは複数のプロセッサによって実行されるとき、1つまたは複数のプロセッサに本明細書で説明する技法を実行させ得る。いくつかの例では、コンピュータ可読媒体は、非一時的コンピュータ可読記憶媒体であり得る。コンピュータ可読記憶媒体は、ランダムアクセスメモリ(RAM)、読取り専用メモリ(ROM)、プログラマブル読取り専用メモリ(PROM)、消去可能プログラマブル読取り専用メモリ(EPROM)、電気消去可能プログラマブル読取り専用メモリ(EEPROM)、フラッシュメモリ、ハードディスク、CD-ROM、フロッピーディスク、カセット、磁気媒体、光媒体、または、有形である他のコンピュータ可読記憶媒体を含み得る。
コンピュータ可読媒体は、上記に記載したものなどの有形記憶媒体に対応する、コンピュータ可読記憶媒体を含み得る。コンピュータ可読媒体はまた、たとえば、通信プロトコルに従って、ある場所から別の場所へのコンピュータプログラムの転送を容易にする任意の媒体を含む、通信媒体を含み得る。このようにして、「コンピュータ可読媒体」という句は、概して、(1)非一時的である有形のコンピュータ可読記憶媒体、および(2)一時的な信号もしくは搬送波などの非有形のコンピュータ可読通信媒体に対応し得る。
様々な態様および例について説明した。しかしながら、以下の特許請求の範囲から逸脱することなく、本開示の構造または技法に修正を行うことができる。