(57)【要約】例では、データを転送する方法は、障壁で第１のサブグループに対応する作業項目と第２のサブグループに対応する作業項目を同期することを含み得る。方法は、第１のサブグループと第２のサブグループとの間のインターサブグループデータ転送を実行することを含み得る。【選択図】図９
2019515384.tif 000002
【特許請求の範囲】
【請求項１】
方法であって、
処理ユニットが、第１の作業項目を実行すること、ここにおいて、前記第１の作業項目は、第１のサブグループに対応する、と、
前記処理ユニットが、第２の作業項目を実行すること、ここにおいて、前記第２の作業項目は、第２のサブグループに対応する、と、
前記処理ユニットが、前記第１のサブグループの各作業項目および前記第２のサブグループの各作業項目を同期する第１の障壁を実行することと、
前記処理ユニットが、一旦、前記第１のサブグループの各作業項目および前記第２のサブグループの各作業項目が前記第１の障壁によって同期されると、前記第１のサブグループと前記第２のサブグループとの間のインターサブグループデータ転送を実行することと、
前記処理ユニットが、前記第１のサブグループの各作業項目および前記第２のサブグループの各作業項目が、第２の障壁の先に進行することを可能にする前に、前記インターサブグループデータ転送が完了するのを確実にするために、前記第１のサブグループの各作業項目および前記第２のサブグループの各作業項目を同期する前記第２の障壁を実行することと
を備える、方法。
【請求項２】
前記処理ユニットは、１つまたは複数の計算ユニットを含み、前記１つまたは複数の計算ユニットの各々は、作業項目を実行するための１つまたは複数の処理要素を含み、前記処理ユニットは、前記１つまたは複数の計算ユニットの各々によってアクセス可能なローカルメモリを含み、前記処理ユニットは、前記１つまたは複数の計算ユニットによってアクセス可能なプライベートメモリを含む、
請求項１に記載の方法。
【請求項３】
前記ローカルメモリまたはグローバルメモリを使用せずに前記第１のサブグループと前記第２のサブグループとの間の前記インターサブグループデータ転送を実行すること、または
前記プライベートメモリを使用して前記第１のサブグループと前記第２のサブグループとの間の前記インターサブグループデータ転送を実行すること
のうちの少なくとも１つを備える、請求項２に記載の方法。
【請求項４】
前記インターサブグループデータ転送を実行することは、
前記第１のサブグループに関連付けられた第１のメモリロケーションから、前記第２のサブグループに関連付けられた第２のメモリロケーションにデータをコピーすること、または
前記第２のサブグループに関連付けられた前記第２のメモリロケーションから、前記第１のサブグループに関連付けられた前記第１のメモリロケーションにデータをコピーすること
のうちの少なくとも１つを備える、請求項１に記載の方法。
【請求項５】
前記第１のメモリロケーションは、第１のハードウェアレジスタであり、前記第２のメモリロケーションは、第２のハードウェアレジスタである、
請求項４に記載の方法。
【請求項６】
前記第１のハードウェアレジスタは、前記第１の作業項目に関連付けられ、前記第２のハードウェアレジスタは、前記第２の作業項目に関連付けられる、
請求項５に記載の方法。
【請求項７】
前記インターサブグループデータ転送を実行することは、
前記第１のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のハードウェアレジスタから、前記第２のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のハードウェアレジスタにデータをコピーすること、または
前記第２のサブグループに対応する前記１つまたは複数の作業項目に関連付けられた前記１つまたは複数のハードウェアレジスタから、前記第２のサブグループに対応する前記１つまたは複数の作業項目に関連付けられた前記１つまたは複数のハードウェアレジスタにデータをコピーすること
のうちの少なくとも１つを備える、請求項１に記載の方法。
【請求項８】
インターサブグループデータ転送メカニズムを使用して前記インターサブグループデータ転送を実行することをさらに備え、前記インターサブグループデータ転送メカニズムは、前記処理ユニットによって実行可能なソフトウェア関数を含み、前記ソフトウェア関数は、アプリケーションプログラミングインターフェース（ＡＰＩ）関数であり、前記アプリケーションプログラミングインターフェース（ＡＰＩ）関数は、
ｇｅｎｔｙｐｅ  ｃｏｐｙ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）、
ｇｅｎｔｙｐｅ  ｇｅｎｅｒａｌｉｚｅｄ＿ｓｈｕｆｆｌｅ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｆｉｂｅｒ＿ｉｄ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）、
ｇｅｎｔｙｐｅ  ｓｕｂｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｒｃＳｕｂｇｒｏｕｐＩｄ）、
ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｃｏｕｎｔ，  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＊ｂａｒｒｉｅｒ＿ａｒｒａｙ  ）、
ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｓｈｕｆｆｌｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｈｕｆｆｌｅ＿ｃｎｔ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｃｎｔ）、または
ｇｅｎｔｙｐｅ  ｇｅｎｅｒａｌｉｚｅｄ＿ｓｈｕｆｆｌｅ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｗｏｒｋｉｔｅｍ＿ｉｄ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）
のうちの少なくとも１つを含む請求項１に記載の方法。
【請求項９】
前記処理ユニットによってアクセス可能である、または前記処理ユニットの任意のメモリコントローラを使用せずに前記第１のサブグループと前記第２のサブグループとの間の前記インターサブグループデータ転送を実行することをさらに備える、
請求項１に記載の方法。
【請求項１０】
前記処理ユニットによってアクセス可能である、または前記処理ユニットの任意のメモリコントローラにメモリ要求を送らずに前記第１のサブグループと前記第２のサブグループとの間の前記インターサブグループデータ転送を実行することをさらに備える、
請求項１に記載の方法。
【請求項１１】
前記処理ユニットが、前記第１のサブグループの第２の作業項目と前記第１のサブグループの第３の作業項目との間、または前記第２のサブグループの第２の作業項目と前記第２のサブグループの第３の作業項目との間のイントラサブグループデータ転送を実行することをさらに備える、
請求項１に記載の方法。
【請求項１２】
デバイスであって、
処理ユニットを備え、前記処理ユニットは、
１つまたは複数の計算ユニット、前記１つまたは複数の計算ユニットの各々は、１つまたは複数の作業項目を実行するための１つまたは複数の処理要素を含む、と、
前記１つまたは複数の処理ユニットの各々によってアクセス可能なローカルメモリと、
前記１つまたは複数の処理要素の各々によってアクセス可能なプライベートメモリと
を含み、前記処理ユニットは、
第１の作業項目を実行すること、ここにおいて、前記第１の作業項目は、第１のサブグループに対応する、と、
第２の作業項目を実行すること、ここにおいて、前記第２の作業項目は、第２のサブグループに対応する、と、
前記第１のサブグループの各作業項目および前記第２のサブグループの各作業項目を同期する第１の障壁を実行すること、
一旦、前記第１のサブグループの各作業項目および前記第２のサブグループの各作業項目が前記第１の障壁によって同期されると、前記第１のサブグループと前記第２のサブグループとの間のインターサブグループデータ転送を実行することと、
前記第１のサブグループの各作業項目および前記第２のサブグループの各作業項目が、第２の障壁の先に進行することを可能にする前に、前記インターサブグループデータ転送が完了するのを確実にするために、前記第１のサブグループの各作業項目および前記第２のサブグループの各作業項目を同期する前記第２の障壁を実行することと
を行うように構成される、デバイス。
【請求項１３】
前記処理ユニットは、
前記処理ユニットによってアクセス可能である前記ローカルメモリまたはグローバルメモリを使用せずに前記第１のサブグループと前記第２のサブグループとの間の前記インターサブグループデータ転送を実行すること、または
前記プライベートメモリを使用して前記第１のサブグループと前記第２のサブグループとの間の前記インターサブグループデータ転送を実行すること
のうちの少なくとも１つを備える、請求項１２に記載のデバイス。
【請求項１４】
前記処理ユニットは、
前記第１のサブグループに関連付けられた第１のメモリロケーションから、前記第２のサブグループに関連付けられた第２のメモリロケーションにデータをコピーすること、または
前記第２のサブグループに関連付けられた前記第２のメモリロケーションから、前記第１のサブグループに関連付けられた前記第１のメモリロケーションにデータをコピーすること
のうちの少なくとも１つを実行するように構成されることによって前記インターサブグループデータ転送を実行するように構成される、請求項１２に記載のデバイス。
【請求項１５】
前記第１のメモリロケーションは、第１のハードウェアレジスタであり、前記第２のメモリロケーションは、第２のハードウェアレジスタである、
請求項１４に記載のデバイス。
【請求項１６】
前記第１のハードウェアレジスタは、前記第１の作業項目に関連付けられ、前記第２のハードウェアレジスタは、前記第２の作業項目に関連付けられる、
請求項１５に記載のデバイス。
【請求項１７】
前記処理ユニットは、
前記第１のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のレジスタから、前記第２のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のレジスタにデータをコピーすること、または
前記第２のサブグループに対応する前記１つまたは複数の作業項目に関連付けられた前記１つまたは複数のレジスタから、前記第２のサブグループに対応する前記１つまたは複数の作業項目に関連付けられた前記１つまたは複数のレジスタにデータをコピーすること
のうちの少なくとも１つを実行するように構成されることによって前記インターサブグループデータ転送を実行するように構成される、請求項１２に記載のデバイス。
【請求項１８】
前記処理ユニットは、インターサブグループデータ転送メカニズムを使用するように構成されることによって前記インターサブグループデータ転送を実行するように構成され、前記インターサブグループデータ転送メカニズムは、前記処理ユニットによって実行可能なソフトウェア関数を含み、前記ソフトウェア関数は、アプリケーションプログラミングインターフェース（ＡＰＩ）関数であり、前記ＡＰＩ関数は、
ｇｅｎｔｙｐｅ  ｃｏｐｙ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）、
ｇｅｎｔｙｐｅ  ｇｅｎｅｒａｌｉｚｅｄ＿ｓｈｕｆｆｌｅ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｆｉｂｅｒ＿ｉｄ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）、
ｇｅｎｔｙｐｅ  ｓｕｂｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｒｃＳｕｂｇｒｏｕｐＩｄ）、
ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｃｏｕｎｔ，  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＊ｂａｒｒｉｅｒ＿ａｒｒａｙ  ）、
ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｓｈｕｆｆｌｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｈｕｆｆｌｅ＿ｃｎｔ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｃｎｔ）、または
ｇｅｎｔｙｐｅ  ｇｅｎｅｒａｌｉｚｅｄ＿ｓｈｕｆｆｌｅ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｗｏｒｋｉｔｅｍ＿ｉｄ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）
のうちの少なくとも１つを含む請求項１２に記載のデバイス。
【請求項１９】
前記処理ユニットは、
前記処理ユニットによってアクセス可能である、または前記処理ユニットの任意のメモリコントローラを使用せずに前記第１のサブグループと前記第２のサブグループとの間の前記インターサブグループデータ転送を実行することを行うように構成される、
請求項１２に記載のデバイス。
【請求項２０】
前記処理ユニットは、
前記処理ユニットによってアクセス可能である、または前記処理ユニットの任意のメモリコントローラにメモリ要求を送らずに前記第１のサブグループと前記第２のサブグループとの間の前記インターサブグループデータ転送を実行することを行うように構成される、
請求項１２に記載のデバイス。
【請求項２１】
前記処理ユニットは、
前記第１のサブグループの第１の作業項目と前記第１のサブグループの第２の作業項目との間、または前記第２のサブグループの第１の作業項目と前記第２のサブグループの第２の作業項目との間のイントラサブグループデータ転送を実行することを行うように構成される、
請求項１２に記載のデバイス。
【請求項２２】
第１の作業項目を実行するための手段、ここにおいて、前記第１の作業項目は、第１のサブグループに対応する、と、
第２の作業項目を実行するための手段、ここにおいて、前記第２の作業項目は、第２のサブグループに対応する、と、
前記第１のサブグループの各作業項目および前記第２のサブグループの各作業項目を同期する第１の障壁を実行するための手段と、
一旦、前記第１のサブグループの各作業項目および前記第２のサブグループの各作業項目が前記第１の障壁によって同期されると、前記第１のサブグループと前記第２のサブグループとの間のインターサブグループデータ転送を実行するための手段と、
前記第１のサブグループの各作業項目および前記第２のサブグループの各作業項目が、第２の障壁の先に進行することを可能にする前に、前記インターサブグループデータ転送が完了するのを確実にするために、前記第１のサブグループの各作業項目および前記第２のサブグループの各作業項目を同期する前記第２の障壁を実行するための手段と
を行うように構成される、装置。
【請求項２３】
前記インターサブグループデータ転送を実行するための手段は、
前記第１のサブグループに関連付けられた第１のメモリロケーションから、前記第２のサブグループに関連付けられた第２のメモリロケーションにデータをコピーするための手段、または
前記第２のサブグループに関連付けられた前記第２のメモリロケーションから、前記第１のサブグループに関連付けられた前記第１のメモリロケーションにデータをコピーするための手段
のうちの少なくとも１つを含む、請求項２２に記載の装置。
【請求項２４】
前記第１のメモリロケーションは、第１のハードウェアレジスタであり、前記第２のメモリロケーションは、第２のハードウェアレジスタである、
請求項２３に記載の装置。
【請求項２５】
前記第１のハードウェアレジスタは、前記第１の作業項目に関連付けられ、前記第２のハードウェアレジスタは、前記第２の作業項目に関連付けられる、
請求項２４に記載の装置。
【請求項２６】
前記インターサブグループデータ転送を実行するための手段は、
前記第１のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のレジスタから、前記第２のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のレジスタにデータをコピーするための手段、または
前記第２のサブグループに対応する前記１つまたは複数の作業項目に関連付けられた前記１つまたは複数のレジスタから、前記第２のサブグループに対応する前記１つまたは複数の作業項目に関連付けられた前記１つまたは複数のレジスタにデータをコピーするための手段
のうちの少なくとも１つを含む、請求項２２に記載の装置。
【請求項２７】
前記インターサブグループデータ転送を実行するための手段は、アプリケーションプログラミングインターフェース（ＡＰＩ）関数を実行するための手段を含み、前記ＡＰＩ関数は、
ｇｅｎｔｙｐｅ  ｃｏｐｙ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）、
ｇｅｎｔｙｐｅ  ｇｅｎｅｒａｌｉｚｅｄ＿ｓｈｕｆｆｌｅ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｆｉｂｅｒ＿ｉｄ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）、
ｇｅｎｔｙｐｅ  ｓｕｂｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｒｃＳｕｂｇｒｏｕｐＩｄ）、
ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｃｏｕｎｔ，  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＊ｂａｒｒｉｅｒ＿ａｒｒａｙ  ）、
ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｓｈｕｆｆｌｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｈｕｆｆｌｅ＿ｃｎｔ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｃｎｔ）、または
ｇｅｎｔｙｐｅ  ｇｅｎｅｒａｌｉｚｅｄ＿ｓｈｕｆｆｌｅ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｗｏｒｋｉｔｅｍ＿ｉｄ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）
のうちの少なくとも１つを含む請求項２２に記載の装置。
【請求項２８】
前記処理ユニットによってアクセス可能である、または前記処理ユニットの任意のメモリコントローラを使用せずに前記第１のサブグループと前記第２のサブグループとの間の前記インターサブグループデータ転送を実行するための手段をさらに備える、
請求項２２に記載の装置。
【請求項２９】
前記処理ユニットによってアクセス可能である、または前記処理ユニットの任意のメモリコントローラにメモリ要求を送らずに前記第１のサブグループと前記第２のサブグループとの間の前記インターサブグループデータ転送を実行するための手段をさらに備える、
請求項２２に記載の装置。
【請求項３０】
実行されると、１つまたは複数のプロセッサに、
第１の作業項目を実行すること、ここにおいて、前記第１の作業項目は、第１のサブグループに対応する、と、
第２の作業項目を実行すること、ここにおいて、前記第２の作業項目は、第２のサブグループに対応する、と、
前記第１のサブグループの各作業項目および前記第２のサブグループの各作業項目を同期する第１の障壁を実行すること、
一旦、前記第１のサブグループの各作業項目および前記第２のサブグループの各作業項目が前記第１の障壁によって同期されると、前記第１のサブグループと前記第２のサブグループとの間のインターサブグループデータ転送を実行することと、
前記第１のサブグループの各作業項目および前記第２のサブグループの各作業項目が、第２の障壁の先に進行することを可能にする前に、前記インターサブグループデータ転送が完了するのを確実にするために、前記第１のサブグループの各作業項目および前記第２のサブグループの各作業項目を同期する前記第２の障壁を実行することと
を行わせる、その上に記憶された命令を有する非一時的コンピュータ可読記憶媒体。
【発明の詳細な説明】
【関連出願】
【０００１】
[0001]本出願は、２０１６年４月２７日に出願された米国非仮特許出願番号第６２／３２８，２２８号の利益を主張し、それは参照によって全体が本明細書に組み込まれる。
【技術分野】
【０００２】
[0002]本開示は、処理ユニット上でのインターサブグループデータ共有に関する。
【背景技術】
【０００３】
[0003]ＣＰＵまたはＧＰＵのような、処理ユニットは、複数の作業項目を実行し得る。各作業項目は、作業グループに属するまたはさもなければ対応し得る。各作業グループは、１つまたは複数の作業項目を含み、各作業グループは、１つまたは複数のサブグループを含み得る。各作業項目は、１つの作業グループおよび１つのサブグループに属し得る。処理ユニットは、同じサブグループの作業項目間のデータの共有を可能にし得る。
【発明の概要】
【０００４】
[0004]概して、本開示は、インターサブグループデータ転送を可能にするための１つまたは複数の技法を開示する。いくつかの例では、本明細書で説明されるインターサブグループデータ転送は、サブグループに関して、各サブグループに対応する１つまたは複数の作業項目に関して、および／または各作業項目に対応するメモリロケーションまたはメモリ空間に関して説明され得る。例えば、本開示は、２つ以上のサブグループ間のインターサブグループデータ転送を可能にするための１つまたは複数の技法を説明する。別の例として、本開示は、作業グループの２つ以上のサブグループ間のインターサブグループデータ転送を可能にするための１つまたは複数の技法を説明する。別の例として、本開示は、異なるサブグループの作業項目間のインターサブグループデータ転送を可能にするための１つまたは複数の技法を説明する。
【０００５】
[0005]１つの例では、本開示は、処理ユニットが、第１の作業項目を実行すること、ここにおいて、第１の作業項目は、第１のサブグループに対応する、と、処理ユニットが、第２の作業項目を実行すること、ここにおいて、第２の作業項目は、第２のサブグループに対応する、と、処理ユニットが、第１のサブグループの各作業項目と第２のサブグループの各作業項目とを同期する第１の障壁を実行することと、処理ユニットが、一旦、第１のサブグループの各作業項目と第２のサブグループの各作業項目とが第１の障壁によって同期されると、第１のサブグループおよび第２のサブグループの間のインターサブグループデータ転送を実行することと、処理ユニットが、第１のサブグループの各作業項目および第２のサブグループの各作業項目が第２の障壁の先に進行することを可能にする前にインターサブグループデータ転送が完了することを確実にするために、第１のサブグループの各作業項目と第２のサブグループの各作業項目とを同期する第２の障壁を実行することとを備える方法を説明する。
【０００６】
[0006]別の例では、本開示は、１つまたは複数の計算ユニットを含む処理ユニット、ここにおいて、１つまたは複数の計算ユニット、１つまたは複数の計算ユニットの各々は１つまたは複数の作業項目を実行するための１つまたは複数の処理要素を含む、と、１つまたは複数の計算ユニットによってアクセス可能なローカルメモリと、１つまたは複数の処理要素の各々によってアクセス可能なプライベートメモリ、処理ユニットは、第１の作業項目を実行すること、ここにおいて、第１の作業項目は、第１のサブグループに対応する、と、第２の作業項目を実行すること、ここにおいて、第２の作業項目は、第２のサブグループに対応する、と、第１のサブグループの各作業項目と第２のサブグループの各作業項目とを同期する第１の障壁を実行することと、一旦、第１のサブグループの各作業項目と第２のサブグループの各作業項目とが第１の障壁によって同期されると、第１のサブグループおよび第２のサブグループの間のインターサブグループデータ転送を実行することと、第１のサブグループの各作業項目および第２のサブグループの各作業項目が第２の障壁の先に進行することを可能にする前にインターサブグループデータ転送が完了することを確実にするために、第１のサブグループの各作業項目と第２のサブグループの各作業項目とを同期する第２の障壁を実行することとを行うように構成される、とを含む。
【０００７】
[0007]１つの例では、本開示は、第１の作業項目を実行するための手段、ここにおいて、第１の作業項目は、第１のサブグループに対応する、と、第２の作業項目を実行するための手段、ここにおいて、第２の作業項目は、第２のサブグループに対応する、と、第１のサブグループの各作業項目と第２のサブグループの各作業項目とを同期する第１の障壁を実行するための手段と、一旦、第１のサブグループの各作業項目と第２のサブグループの各作業項目とが第１の障壁によって同期されると、第１のサブグループおよび第２のサブグループの間のインターサブグループデータ転送を実行するための手段と、第１のサブグループの各作業項目および第２のサブグループの各作業項目が第２の障壁の先に進行することを可能にする前にインターサブグループデータ転送が完了することを確実にするために、第１のサブグループの各作業項目と第２のサブグループの各作業項目とを同期する第２の障壁を実行するための手段とを備える装置を説明する。
【０００８】
[0008]別の例では、本開示は、実行されると、１つまたは複数のプロセッサに、第１の作業項目を実行すること、ここにおいて、第１の作業項目は、第１のサブグループに対応する、と、第２の作業項目を実行すること、ここにおいて、第２の作業項目は、第２のサブグループに対応する、と、第１のサブグループの各作業項目と第２のサブグループの各作業項目とを同期する第１の障壁を実行することと、一旦、第１のサブグループの各作業項目と第２のサブグループの各作業項目とが第１の障壁によって同期されると、第１のサブグループおよび第２のサブグループの間のインターサブグループデータ転送を実行することと、第１のサブグループの各作業項目および第２のサブグループの各作業項目が第２の障壁の先に進行することを可能にする前にインターサブグループデータ転送が完了することを確実にするために、第１のサブグループの各作業項目と第２のサブグループの各作業項目とを同期する第２の障壁を実行することとを行わせる、その上に記憶された命令を有する非一時的コンピュータ記憶媒体を説明する。
【０００９】
[0009]本開示の１つまたは複数の例の詳細は、添付図面および以下の記述において述べられている。開示の他の特徴、目的及び利点は、本説明及び図面から並びに特許請求の範囲から明らかになるであろう。
【図面の簡単な説明】
【００１０】
【図１】本開示の技法をインプリメントするように構成され得るコンピューティングデバイスを例示するブロック図。
【図２】より詳細に本開示の技法をインプリメントするように構成され得る図１に示された１つまたは複数処理ユニットを例示する図。
【図３】より詳細に本開示の技法をインプリメントするように構成され得る例となる処理ユニットを例示する図。
【図４】本開示従う同期技法の１つの例を例示する図。
【図５】本開示従う同期技法の１つの例を例示する図。
【図６】本明細書に説明される技法に従う作業項目処理の例を例示する図。
【図７】本開示の例となる方法を示すフローチャート。
【図８】本開示の例となる方法を示すフローチャート。
【図９】本開示の例となる方法を示すフローチャート。
【発明の詳細な説明】
【００１１】
[0019]本開示は、インターサブグループデータ転送を可能にするための１つまたは複数の技法を説明する。いくつかの例では、本明細書で説明されるインターサブグループデータ転送は、サブグループに関して、各サブグループに対応する１つまたは複数の作業項目に関して、および／または各作業項目に対応するメモリロケーションまたはメモリ空間に関して説明され得る。例えば、本開示は、２つ以上のサブグループ間のインターサブグループデータ転送を可能にするための１つまたは複数の技法を説明する。別の例として、本開示は、作業グループの２つ以上のサブグループ間のインターサブグループデータ転送を可能にするための１つまたは複数の技法を説明する。別の例として、本開示は、異なるサブグループの作業項目間のインターサブグループデータ転送を可能にするための１つまたは複数の技法を説明する。
【００１２】
[0020]図１は、本開示の１つまたは複数態様をインプリメントするように構成され得る、例となるコンピューティングデバイス（例えばコンピューティングデバイス２）および／または処理ユニット（例えば、処理ユニット１Ａまたは処理ユニット１Ｂ）を例示するブロック図である。図１に示されるように、コンピューティングデバイス２は、例えば、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、タブレットコンピュータ、コンピュータワークステーション、ビデオゲームプラットフォールまたはコンソール、携帯電話（例えばセルラフォンまたは衛星電話）、ハンドヘルドデバイス（例えば、ポータブルビデオゲームデバイスまたは携帯情報端末（ＰＤＡ））、ウェアラブルコンピューティングデバイス、パーソナル音楽プレーヤ、ビデオプレーヤ、ディスプレイデバイス、テレビジョン、ネットワークデバイス、インターフェースネットワークデバイス、任意のコンピューティングデバイス、あるいは本開示の１つまたは複数態様をインプリメントするように構成され得るデバイスの任意の他のタイプであり得る。
【００１３】
[0021]コンピューティングデバイス２は、１つまたは複数処理ユニット１、トランシーバ３、ユーザインターフェース４、ディスプレイ処理ユニット５、ディスプレイ８、およびシステムメモリ１０を含み得る。図１の例では、コンピューティングデバイスは２つの処理ユニット：処理ユニット１Ａおよび処理ユニット１Ｂを含むよう示されるが、他の例は、示されるこれらよりも多いまたは少ない処理ユニットを有し得る。本明細で使用されるように、処理ユニット１への参照は、１つまたは複数処理ユニット、例えば、処理ユニット１Ａおよび／または処理ユニット１Ｂを参照し得る。例えば、処理ユニット１への参照は、処理ユニット１Ａを参照し得る。別の例として、処理ユニット１への参照は、処理ユニット１Ｂを参照し得る。別の例として、処理ユニット１への参照は、処理ユニット１Ａおよび／または処理ユニット１Ｂを参照し得る。別の例として、処理ユニット１への参照は、１つまたは複数の処理ユニット１を参照し得る。処理ユニット１は、他の処理ユニットと不均一に実行するように構成され得る。例えば、処理ユニット１Ａおよび処理ユニット１Ｂは、お互いと不均一に実行するように構成され得る。それ故、コンピューティングデバイス２が異種計算を実行するように構成され得ることが理解できる。処理ユニット１は、任意のコンピューティングデバイスに統合され得る。
【００１４】
[0022]図１の例においてコンピューティングデバイス２中に示される様々なコンポーネントは、コンピューティングデバイス２のあらゆる例において必要とされ得ない。例えば、コンピューティングデバイス２は、他の例では、図１の例において示された１つまたは複数のコンポーネント（例えば、ディスプレイ処理ユニット５）を含み得ない。他の例では、コンピューティングデバイス１０は、図１の例において例示されたコンポーネントに加えて１つまたは複数のコンポーネントを含み得る。
【００１５】
[0023]処理ユニット１は、中央処理ユニット（ＣＰＵ）、グラフィック処理ユニット（ＧＰＵ）、並列処理ユニット（例えば、並列処理を実行するように構成される任意の処理ユニット）、システムオンチップ（ＳｏＣ）または本明細書に説明される１つまたは複数の技法を実行するように構成され得る任意の処理ユニットであり得る。いくつかの例では、処理ユニット１は、汎用処理能力を持つＧＰＵであり、汎用処理タスク（例えば、非グラフィックに関するタスク）をインプリメントするときに汎用ＧＰＵ（ＧＰＧＰＵ）と呼ばれ得る。従って、本明細書に使用されるように、ＧＰＵへの参照は、汎用処理能力を持つあるいは持たないＧＰＵを意味し得る。いくつかの例では、処理ユニット１は、インターサブグループデータ共有および／またはイントラサブグループデータ共有を実行するように構成され得る任意の処理ユニットであり得る。いくつかの例では、処理ユニット１は、単一命令複数データ（ＳＩＭＤ：single instruction multiple data）プロセッサ、複数命令複数データ（ＭＩＭＤ：multiple instruction multiple data）プロセッサ、単一プログラム複数デイタ（ＳＰＭＤ：single program multiple data）プロセッサ、または複数プログラム複数データ（ＭＰＭＤ：multiple program multiple data）プロセッサであり得る。いくつかの例では、処理ユニット１Ａは、ＣＰＵであり、処理ユニット１Ｂは、ＧＰＵであり得る。他の例では、処理ユニット１Ｂは、ＣＰＵであり、処理ユニット１Ａは、ＧＰＵであり得る。
【００１６】
[0024]処理ユニット１は、１つまたは複数のプロセッサ（例えば、１つまたは複数のマイクロプロセッサ）、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、算術論理演算ユニット（ＡＬＵ）、デジタルシグナルプロセッサ（ＤＳＰ）、ディスクリート論理、ソフトウェア、ハードウェア、ファームウェア、他の同等な集積回路またはディスクリート論理回路、あるいはこれらの任意の組み合わせを含み得る。処理ユニット1はまた、処理ユニット1がマルチコアプロセッサと呼ばれ得るように、１つまたは複数のプロセッサコアを含み得る。いくつかの例では、処理ユニット１は、グラフィック処理のために適切な大量の並列処理能力を持つ処理ユニット１を提供する集積および／またはディスクリート論理回路を含み得る、専門化されたハードウェアであり得る。
【００１７】
[0025]処理ユニット１は、１つまたは複数の内部メモリ６および１つまたは複数のメモリコントローラを含み得る。１つまたは複数のメモリコントローラは、１つまたは複数のメモリ（例えば、１つまたは複数の内部メモリ６および／またはシステムメモリ１０）へのアクセスを制御するように構成され得る。いくつかの例では、１つまたは複数のメモリコントローラは、メモリ要求をシリアル化するように構成され得る。図１の例では、コンピューティングデバイスは、２つの処理ユニット：処理ユニット１Ａおよび処理ユニット１Ｂを含むように示される。本明細書に使用されるように、１つまたは複数の内部メモリへの参照は、１つまたは複数のメモリ６Ａおよび／または１つまたは複数の内部メモリ６Ｂを参照し得る。
【００１８】
[0026]描写される処理メモリ１０のように、処理ユニット１に対して外部にあるメモリは、処理ユニット１にアクセス可能であり得る。例えば、処理ユニット１は、バス（有線またはワイヤレスのどちらかの任意の通信媒体）を通してシステムメモリ１０に通信可能に結合され得る。
【００１９】
[0027]１つまたは複数の内部メモリ６は、例えば、ランダムアクセスメモリ（ＲＡＭ）、スタティックＲＡＭ（ＳＲＡＭ）、ダイナミックＲＡＭ（ＤＲＡＭ）、消去可能なプログラマブルＲＯＭ（ＥＰＲＯＭ）、電気的に消去可能なプログラマブルＲＯＭ（ＥＥＰＲＯＭ（登録商標））、フラッシュメモリ、磁気データ媒体、光記憶媒体、任意のオンチップメモリ（例えば、処理ユニット１の任意の集積メモリ）、または任意の他の内部メモリのような、１つまたは複数の揮発性または不揮発性メモリあるいは記憶デバイスを含み得る。
【００２０】
[0028]システムメモリ１０は、コンピューティングデバイス２のためのメモリとして考慮され得る。システムメモリ１０は、１つまたは複数のコンピュータ可読記憶媒体を備える。システムメモリ１０は、ランダムアクセスメモリ（ＲＡＭ）、スタティックＲＡＭ（ＳＲＡＭ）、ダイナミックＲＡＭ（ＤＲＡＭ）、消去可能なプログラマブルＲＯＭ（ＥＰＲＯＭ）、電気的に消去可能なプログラマブルＲＯＭ（ＥＥＰＲＯＭ（登録商標））、ＳＤＲＡＭ  ＤＤＲ  ＳＤＲＡＭ、磁気データ媒体、光記憶媒体、任意のオフチップメモリ（例えば、処理ユニット１に対して外部にある任意のメモリ）、任意の他のメモリ、または処理ユニット（例えば、処理ユニット１）によってアクセスされることができる１つまたは複数の命令および／またはデータ構造を記憶するように使用されることができる任意の他の媒体のような、１つまたは複数の揮発性または不揮発性メモリあるいは記憶デバイスを含み得る。システムメモリ１０は、いくつかの例に従う非一時的記憶媒体であり得る。「非一時的な」という用語は、記憶媒体が、搬送波または伝播信号で具現化されないことを示しうる。しかしながら、「非一時的」という用語は、システムメモリ１０が移動不可であること、またはそのコンテンツが静的であることを意味するように解釈されるべきではない。１つの例として、システムメモリ１０は、通信可能に結合される任意のデバイスから取り外され、別のデバイスに移動され得る。別の例として、システムメモリ１０と実質的に同様のメモリが、図１中に描写されるコンピューティングデバイス２のような、コンピューティングデバイスへと挿入され得る。
【００２１】
[0029]いくつかの例では、システムメモリ１０は、実行されると、処理ユニット１に、本開示における処理ユニット１に属されるものとみなされる機能を実行させる命令を含み得る。したがって、システムメモリ１０は、実行されると、１つまたは複数のプロセッサ（例えば、処理ユニット１）に、１つまたは複数の機能を実行させる命令を記憶したコンピュータ可読記憶媒体であり得る。
【００２２】
[0030]トランシーバモジュール３は、コンピューティングデバイス２と別のデバイスまたはネットワークとの間のワイヤレスまたは有線通信を可能にするための回路を含み得る。トランシーバ３は、変調器、復調器、増幅器、および有線またはワイヤレス通信のための他のそのような回路を含み得る。いくつかの例では、トランシーバ３は、処理ユニット１に統合され得るまたは統合され得ない。例えば、トランシーバ３は、処理ユニット１と同じ集積回路（ＩＣ）の一部であり得る、処理ユニット１の一部またはすべてを含むＩＣまたは複数のＩＣに対して外部のものであり得る、あるいは処理ユニット１の一部またはすべてを含むＩＣまたは複数のＩＣに対して外部にあるＩＣ中に形成され得る。例えば、トランシーバ３は、１つまたは複数のマイクロプロセッサ、デジタル信号プロセッサ（ＤＳＰ）、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、計算論理演算ユニット（ＡＬＵ）、ディスクリート論理、ソフトウェア、ハードウェア、ファームウェア、またはそれらのあらゆる組み合わせのような、様々な適切な符号器回路のいずれかとしてインプリメントされ得る。
【００２３】
[0031]ユーザインターフェース４の例は、トラックボール、マウス、キーボード、および任意の他の入力デバイスを含むが、それらに限定されるものではない。例えば、ユーザインターフェース４は、タッチスクリーンであり得、それは、ディスプレイ８の一部として組み込まれ得る。ディスプレイ８は、液晶ディスプレイ（ＬＣＤ）、陰極線管（ＣＴＴ）ディスプレイ、プラズマディスプレイ、タッチセンサー式のディスプレイ、存在センサー式のディスプレイ、またはディスプレイの任意の他のタイプを備え得る。ユーザインターフェース４がソフトウェア（例えば、グラフィカルユーザインターフェース）を使用して部分的にまたは完全にインプリメントされる場合の例では、ソフトウェアは、処理ユニット１または処理ユニット１と異なる処理ユニットによって実行され得、そしてソフトウェアは、メモリ（例えば、１つまたは複数の内部メモリ６のようなオンチップメモリ、またはシステムメモリ１０のようなオフチップメモリ）上に記憶され得る。処理ユニット１は、ユーザインターフェース４の１つまたは複数の態様をインプリメントするために、メモリ上に記憶されたソフトウェア命令にアクセスする、およびそれを実行するように構成され得る。
【００２４】
[0032]ディスプレイ処理ユニット５は、タイルベースアーキテクチャを利用し得るまたは利用し得ない。いくつかの例では、タイルは、１つまたは複数のピクセルである高さと、１つまたは複数のピクセル値である幅とを持つ高さおよび幅を備えるピクセルの領域表現である。このような例では、タイルは、実際、長方形または正方形であり得る。他の例では、タイルは、正方形または長方形と異なる形であり得る。ディスプレイ処理ユニット５は、少なくとも１つのメモリから複数の画像レイヤ（例えば、前景および背景）をフェッチするように構成され得る。例えば、ディスプレイ処理ユニット５は、処理ユニット（例えば、いくつかの例では、処理ユニット１Ｂのような、処理ユニット１）がピクセル表現の形式におけるグラフィカルデータを出力するフレームバッファおよび／または他のメモリから画像レイヤをフェッチするように構成され得る。複数の画像レイヤは、前景レイヤおよび／または背景レイヤを含み得る。本明細に使用されるように、「画像」という用語は、静止画像のみを意味するように意図されない。むしろ、画像または画像レイヤは、静止画像（例えば、混合されたときの画像または画像レイヤが画像であり得る）、またはビデオ（例えば、順々に見られるときが動画またはビデオを作り出す一連の画像中の単一画像である）に関連付けられ得る。
【００２５】
[0033]ディスプレイ処理ユニット５は、複数のレイヤからピクセルを処理するように構成され得る。ディスプレイ処理ユニット５によって実行され得る例のピクセル処理は、アップサンプリング、ダウンサンプリング、スケーリング、回転、および／または他のピクセル処理を含み得る。例えば、ディスプレイ処理ユニット５は、前景画像レイヤおよび／または背景画像レイヤに関連付けらられたピクセルを処理するように構成され得る。ディスプレイ処理ユニット５は、複数のレイヤからピクセルを混合し、タイルフォーマットにおけるメモリ中に混合されたピクセルをライトバック（write back）し得る。その後、混合されたピクセルは、ラスターフォーマットにおけるメモリから読み出され、表示のためにディスプレイ８に送られ得る。
【００２６】
[0034]処理ユニット１をこれから参照すると、処理ユニット１（例えば、処理ユニット１Ａ）は、アプリケーションの様々なタイプを実行するように構成され得る。１つまたは複数のアプリケーションの実行のための命令は、処理ユニット１によってアクセス可能なメモリ（例えば、１つまたは複数の内部メモリ６および／またはシステムメモリ１０）中に記憶され得る。処理ユニット１は、別の処理ユニットから１つまたは複数の処理タスクを送信および／または受信するように構成され得る。例えば、処理ユニット１Ａ（例えば、ＣＰＵ）は、処理ユニット１Ｂ（例えば、ＧＰＵ）に１つまたは複数の処理タスクをオフロードするように構成され得る。
【００２７】
[0035]処理ユニット１は、プログラミング言語、アプリケーションプログラムインターフェース（ＡＰＩ）、ライブラリ、および／またはランタイムシステムを含み得るコンピューティングプラットフォーム（例えば、並列プログラミングのためのフレームワーク）に従って１つまたは複数の処理を実行するように構成され得る。他の例では、コンピューティングプラットフォームは、コンピューティング標準および／またはコンピューティング仕様書を参照し得る。例えば、処理ユニット１は、ＯｐｅｎＣＬ  ＡＰＩを使用するＯｐｅｎＣＬコンピューティングプラットフォームに従って１つまたは複数の処理を実行するように構成され得る。本開示の態様は、ＯｐｅｎＣＬコンピューティングプラットフォームおよび／またはＯｐｅｎＣＬ  ＡＰＩに限定されない。例えば、処理ユニット１は、任意の並列コンピューティングプラットフォーム、任意の異種コンピューティングプラットフォーム、および同様なものに従って１つまたは複数の処理を実行するように構成され得る。例えば、処理ユニット１は、ＯｐｅｎＧＬコンピューティングプラットフォーム、ＣＵＤＡコンピューティングプラットフォーム、ＨＳＡファウンデーションコンピューティングプラットフォーム、Ｖｕｌｋａｎ  ＡＰＩ、および同様なものに従って１つまたは複数の処理を実行するように構成され得る。加えて、本開示において説明される技法は、ＡＰＩに従って機能するように要求されない。
【００２８】
[0036]図１に示され説明されるように、コンピューティングデバイス２は、例示の処理システムアーキテクチャと呼ばれ得る、例示のシステム（例えば、異種システム１１）中に示される１つまたは複数の処理ユニット１を含み得る。図２は、異種処理アーキテクチャに従ってより詳細にシステム１１の例を例示する。いくつかの例では、図２のシステム１１中に描写されるシステム異種処理システムアーキテクチャは、ＯｐｅｎＣＬコンピューティングプラットフォームに従って構成され得る。それ故、本明細書で説明される任意の図に関して使用される用語が特定のコンピューティングプラットフォーム（例えば、ＯｐｅｎＣＬ、ＯｐｅｎＧＬ、ＣＵＤＡ、等）に関して使用されることが理解される一方、例が特定のコンピューティングプラットフォームに限定されないことが理解されるべきである。例えば、図２の例は、ＯｐｅｎＣＬの専門用語を使用して説明されるが、図２の例はまた、同じまたは同様のコンポーネントを説明するためにこれらの他のコンピューティングプラットフォームが異なる専門用語を使用するにもかかわらず、他のコンピューティングプラットフォーム（例えば、ＣＵＤＡ）に適用する。例えば、ＯｐｅｎＣＬにおける「計算ユニット」という用語は、ＣＵＤＡにおける「ストリーミングマルチプロセッサ」または「マルチプロセッサ」、および汎用コンピュータ専門用語における「コア」に当てはまり得る。別の例では、ＯｐｅｎＣＬにおける「作業項目」、「サブグループ」「作業グループ」、「ＮＤＲＲａｎｇｅ」、「ローカルメモリ」、および「プライベートメモリ」という用語は、ＣＵＤＡにおける「スレッド」、「ワープ（warp）」、「ブロック」、「グリッド」、「共有メモリ」、「ローカルメモリ」にぞれぞれ当てはまり得る。いくつかの例では、「スレッド」という用語は、「ファイバー」に当てはまり得、逆もまた同様であり得る。別の例では、ＯｐｅｎＣＬにおける「処理要素」という用語は、ＣＵＤＡにおける「ＣＵＤＡプロセッサ」、および汎用コンピュータ専門用語における「レーン（lane）」に当てはまり得る。
【００２９】
[0037]本明細書に使用される任意の用語の意味は、いくつかの例では、任意のコンピューティングプラットフォーム（例えば、ＯｐｅｎＣＬ）に記載、または任意の用語が任意のコンピューティングプラットフォームにおいて使用されるコンテキストに基づく任意の明示の定義を含み得る。例えば、ＯｐｅｎＣＬ  Ｓｐｅｃｆｉｃａｔｉｏｎ  Ｖｅｒｓｉｏｎ Ｖｅｒｓｉｏｎ２．２  Ｄｏｃｕｍｅｎｔ  Ｒｅｖｉｓｉｏｎ０６は、「１つまたは複数の処理要素およびローカルメモリから成る」ような「計算ユニット」を定義する。従って、本明細書に使用されるような「計算ユニット」という用語は、いくつかの例におけるローカルメモリおよび１つまたは複数の処理要素に当てはまり得る。他の例では、「計算ユニット」という用語は、１つまたは複数の処理要素およびローカルメモリとは異なる何かを意味し得る。いくつかの例では、本明細書に使用されるような「作業グループ」という用語は、ＯｐｅｎＣＬ  Ｓｐｅｃｆｉｃａｔｉｏｎ  Ｖｅｒｓｉｏｎ  Ｖｅｒｓｉｏｎ２．２  Ｄｏｃｕｍｅｎｔ  Ｒｅｖｉｓｉｏｎ０６によって定義されるような、単一計算ユニット上で実行する関連する作業項目のコレクションに当てはまり得る。いくつかの例では、本明細書に使用されるような「サブグループ」という用語は、ＯｐｅｎＣＬ  Ｓｐｅｃｆｉｃａｔｉｏｎ  Ｖｅｒｓｉｏｎ  Ｖｅｒｓｉｏｎ２．２  Ｄｏｃｕｍｅｎｔ  Ｒｅｖｉｓｉｏｎ０６によって定義されるような、作業グループ内の作業項目のグループ化に当てはまり得る。いくつかの例では、本明細書に使用されるような「作業項目」という用語は、ＯｐｅｎＣＬ  Ｓｐｅｃｆｉｃａｔｉｏｎ  Ｖｅｒｓｉｏｎ２．２  Ｄｏｃｕｍｅｎｔ  Ｒｅｖｉｓｉｏｎ０６によって定義されるような、カーネルの並列実行のコレクションのうちの１つに当てはまり得る。別の例では、本明細書に使用されるような「作業項目」という用語は、他のコンピュータ専門用語に従うスレッドまたはファイバーに当てはまり得る。いくつかの例では、作業項目は、作業項目は、計算ユニット上で実行している作業グループの一部として１つまたは複数の処理要素によって実行され得る。
【００３０】
[0038]図２の例に示されるように、コンピューティングデバイス２は、ホスト２０および１つまたは複数の計算デバイス２２で構成され得る。ホスト２０および１つまたは複数の計算デバイス２２は、処理ユニット１を含み得る。例えば、ホスト２０は、ＣＰＵ（例えば、本明細書に説明されるような処理ユニット１の１つのタイプ）、であり、１つまたは複数の計算デバイス２２は、１つまたは複数のＧＰＵおよび／またはＣＰＵ（例えば、本明細書に説明されるように処理ユニット１の２つのタイプ）を含み得る。ホスト２０は、１つまたは複数のバスを通してまたは１つまたは複数の他の通信媒体を通して１つまたは複数の計算デバイスに結合され得る。計算デバイス22は、１つまたは複数の計算ユニットを含み得る。各計算ユニット24は、１つまたは複数の処理要素２６を含み得る。各計算ユニット２４は、メモリ（例えば、この用語としてプライベートメモリがＯｐｅｎＣＬコンピューティングプラットフォームによって定義される）を含み得る。例えば、アクセス可能なメモリ空間は、各計算ユニットに割り振られ得る。アクセス可能なメモリ空間は、１つまたは複数の物理メモリの一部であり得る。いくつかの例では、各計算ユニットに割り振られたアクセス可能なメモリ空間は、汎用レジスタのような、１つまたは複数のレジスタを含み得る。述べられたのと別な方法で、いくつかの例では、各計算ユニットのメモリ（例えば、プライベートメモリ）は、１つまたは複数のレジスタ（例えば、汎用レジスタ（ＧＰＲ））を使用してインプリメントされ得る。計算ユニットに関連付けられたメモリは、その計算ユニットの１つまたは複数の処理要素２６によってアクセス可能であり得る。いくつかの例では、１つまたは複数の処理要素２６は、作業項目が実行するように構成され得る１つまたは複数の仮想スカラープロセッサを参照し得る。
【００３１】
[0039]いくつかの例では、ホスト２０は、ＯｐｅｎＧＬ  ＡＰＩを使用してコンテキストとインタラクトするように構成されるとして説明され得る。コンテキストは、カーネルが実行する環境および同期およびメモリ管理が定義される領域を参照し得る。いくつかの例では、コンテキストは、デバイスのセット（例えば、２つ以上の処理ユニット１）、それらのデバイスにアクセス可能なメモリ、対応するメモリプロパティおよびカーネルの実行をスケジュールするために使用される１つまたは複数のコマンドキューまたはメモリオブジェクト上の動作を含み得る。
【００３２】
[0040]図３は、例示のシステム（例えば、異種システム）１１においてより詳細に、図２に示されるコンポーネントの例を例示する。例えば、ホスト２０は、ホストメモリ３２を含むように示される。１つまたは複数の計算デバイス２２は、計算デバイス２２−１および計算デバイス２２−Ｎとして示され、ここで、計算デバイス２２は、１つの計算デバイス２２を上回る計算デバイスを包含する例における追加の計算デバイスの任意の数を表す。１つまたは複数の計算ユニット２４は、計算ユニット２４−１および計算ユニット２４−Ｎとして示され、ここで、計算ユニット２４は、１つの計算ユニット２４より多くの計算ユニットを包含する例における追加の計算ユニットの任意の数を表す。各計算ユニット２４は、１つまたは複数の処理要素２６を含み得る。図２の例では、計算ユニット２４−１の１つまたは複数の処理要素２６は、処理要素２６Ａ−１および処理要素２６Ａ−Ｎとして示され、ここで、処理要素２６Ａ−Ｎは、計算ユニット２４−１のための１つの処理要素２６より多くの処理要素２６を包含する例における追加の処理要素の任意の数を表す。同様に、計算ユニット２４−Ｎの１つまたは複数の処理要素２６は、処理要素２６Ｂ−１および処理要素２６Ｎ−Ｎとして示され、ここで、処理要素２６Ｂ−Ｎは、計算ユニット２４−Ｎのための１つの処理要素２６より多くの処理要素２６を包含する例における追加の処理要素の任意の数を表す。
【００３３】
[0041]図２の例では、各計算ユニット22は、メモリ（例えば、この用語としてローカルメモリがＯｐｅｎＣＬコンピューティングプラットフォームによって定義される）を含み得る。例えば、アクセス可能なメモリ空間２７は、各計算デバイスに割り振られ得る。アクセス可能なメモリ空間２７は、１つまたは複数の物理メモリ（例えば、１つまたは複数の内部メモリ６）の一部であり得る。いくつかの例では、各計算デバイス２２−１乃至２２−Ｎに割り振られたアクセス可能なメモリ空間２７は、このような例では、計算デバイスの計算ユニットによって生じるメモリ要求が、メモリコントローラによって受信され処理される意味で、メモリコントローラを通じてアクセス可能になり得る。述べられたのと別の方法で、計算デバイス（例えば、計算デバイス２２−１乃至２２−Ｎのうちの１つ）のローカルメモリは、メモリコントローラによって制御され得る。
【００３４】
[0042]各計算ユニット２４は、メモリ（例えば、この用語としてプライベートメモリがＯｐｅｎＣＬコンピューティングプラットフォームによって定義される）を含み得る。例えば、アクセス可能なメモリ空間２８は、各計算ユニットに割り振られ得る。メモリ空間２８（例えば、メモリ空間２８Ａ−１乃至２８Ａ−Ｎおよびメモリ空間２８Ｂ−１乃至２８ＢＮ）は、いくつかの例では、プライベートメモリに対応し得る。アクセス可能なメモリ空間28は、１つまたは複数の物理メモリ（例えば、１つまたは複数の内部メモリ６）の一部であり得る。いくつかの例では、各計算ユニット２４−１乃至２４−Ｎに割り振られたアクセス可能なメモリ空間は、汎用レジスタのような、１つまたは複数のレジスタを含み得る。述べられたのと別な方法で、いくつかの例では、各計算ユニット２４−１乃至２４−Ｎのメモリ（例えば、プライベートメモリ）は、１つまたは複数のレジスタ（例えば、汎用レジスタ（ＧＰＲ））を使用してインプリメントされ得る。計算ユニットに関連付けられたメモリは、その計算ユニットの１つまたは複数の処理要素２６によってアクセス可能であり得る。計算ユニットに関連付けられたメモリは、特定の処理要素に割り振られ得る。例えば、メモリ空間２８Ａ−１は、処理要素２６Ａ−１による使用のために処理要素２６Ａ−１に割り振られ得る。同様に、メモリ空間２８Ａ−１乃至２８Ａ−Ｎは、処理要素２６Ａ−Ｎによる使用のために処理要素２６Ａ−１乃至２６Ａ−Ｎにそれぞれ割り振られ得る。同様に、メモリ空間２８Ｂ−１は、処理要素２６Ｂ−１による使用のために処理要素２６Ｂ−１に割り振られ得る。同様に、メモリ空間２８Ｂ−１乃至２８Ｂ−Ｎは、処理要素２６Ｂ−Ｎによる使用のために処理要素２６Ｂ−１乃至２６Ｂ−Ｎにそれぞれ割り振られ得る。各処理要素２６に割り振られたメモリ空間は、重複し得ない。例えば、処理要素２６Ａ−１に割り振られた任意のレジスタは、処理要素２６Ａ−Ｎに割り振られ得る。いくつかの例では、１つまたは複数の処理要素２６は、作業項目が実行するように構成され得る１つまたは複数の仮想スカラープロセッサを参照し得る。
【００３５】
[0043]処理ユニット１は、１つまたは複数の障壁を使用して複数の作業項目のために同期を実行するように構成され得る。いくつかの例では、処理ユニット１は、１つまたは複数の障壁を実行することによって１つまたは複数の障壁を使用して、複数の作業項目についての同期を実行するように構成され得る。処理ユニット１は、１つまたは複数の障壁（例えば、ＯｐｅｎＣＬコンピューティングプラットフォームによって定義されるような作業グループ障壁）を使用して作業グループの複数の作業項目についての同期を実行し得る。いくつかの例では、処理ユニット１は、１つまたは複数の障壁（例えば、ＯｐｅｎＣＬコンピューティングプラットフォームによって定義されるような作業グループ障壁）を使用して作業グループのすべての作業項目についての同期を実行し得る。別の例では、処理ユニット１は、１つまたは複数の障壁（例えば、ＯｐｅｎＣＬコンピューティングプラットフォームによって定義されるようなサブグループ障壁）を使用してサブグループの複数の作業項目についての同期を実行し得る。いくつかの例では、処理ユニット１は、１つまたは複数の障壁（例えば、ＯｐｅｎＣＬコンピューティングプラットフォームによって定義されるようなサブグループ障壁および／またはネームド障壁（named barrier））を使用してサブグループのすべての作業項目についての同期を実行し得る。
【００３６】
[0044]いくつかの例では、第１の障壁は、第１のサブグループの１つまたは複数の作業項目および第２のサブグループの１つまたは複数の作業項目を同期するように処理ユニット１によって実行され得る。第１のサブグループの１つまたは複数の作業項目および第２のサブグループの１つまたは複数の作業項目の同期は、データが例えば、生産者−消費者の関連性において消費される用意があることを示し得る。例えば、第１のサブグループの１つまたは複数の作業項目および／または第２のグループの１つまたは複数の作業項目は、実行される間データを生み出し、アクセス可能なメモリロケーションにおいて生み出されたデータを記憶し得る。一旦同期されると、処理ユニット１は、例えば、第１のサブグループと第２のサブグループとの間のインターサブグループデータ転送を実行するように構成され得る。処理ユニット１は、第１のサブグループの１つまたは複数の作業項目または第２のサブグループの１つまたは複数の作業項目が、第２の障壁の先に進行することを可能にする前に、インターサブグループデータ転送が完了するのを確実にするために、第１のサブグループの１つまたは複数の作業項目および第２のサブグループの１つまたは複数の作業項目を同期する第２の障壁を実行するように構成され得る。いくつかの例では、第２の障壁は、データ転送が完了する（例えば、生み出されたデータが消費者によって消費された）ことを保証するように説明され得る。一旦、実行が進行すべき第１のサブグループの１つまたは複数の作業項目および第２のサブグループの１つまたは複数の作業項目が第２の障壁を過ぎたら、いくつかの例では、第１のサブグループの１つまたは複数の作業項目および第２のサブグループの１つまたは複数の作業項目に対応するメモリロケーション（例えば、メモリロケーションに割り振られたレジスタ）は、例えば、異なるサブグループおよび／または作業グループに対応し得るまたはし得ない異なる作業項目に再割り振りされ得る。本明細書に説明される技法は、２つの異なるサブグループの間のデータの共有を可能にするために、処理ユニット１が、１つまたは複数の障壁を使用することによって限定されたメモリリソース（例えば、レジスタ）を再利用することと、その後、インターサブグループデータ転送の後のレジスタを再利用することとをできるようにする。
【００３７】
[0045]本明細書に使用されるように、障壁は、いくつかの例では、２つ以上の作業項目を同期する関数を参照し得る。例えば、障壁は、２つ以上の作業項目の各作業項目が障壁に到達される（例えば、実行される）まで２つ以上の作業項目の更なる実行を止めることによって２つ以上の作業項目を同期し得る。一旦、２つ以上の作業項目が障壁に到達される（例えば、実行される）と、障壁は、概念的にリフトされ、作業項目はその後、実行し続け得る。作業グループ障壁が、いくつかの例では、作業グループのすべての作業項目を同期する関数を参照することが理解される。例えば、作業グループ障壁は、作業グループのすべての作業項目が作業グループ障壁に到達するまで、作業グループの各作業項目の実行を休止し得る、またはさもなければ中断し得る。一旦、作業グループのすべての作業項目が作業グループ障壁に到達する（実行される）と、作業グループ障壁は、概念的にリフトされ、作業グループのすべての作業項目はその後、実行することを継続し得る。同様に、サブグループ障壁が、いくつかの例では、サブグループ（例えば作業グループの作業項目のサブグループ）のすべての作業項目を同期する関数を参照することが理解される。例えば、サブグループ障壁は、サブグループのすべての作業項目がサブグループ障壁に到達するまで、サブグループの各作業項目の実行を休止し得る、またはさもなければ中断し得る。一旦、サブグループのすべての作業項目がサブグループ障壁に到達する（実行される）と、サブグループ障壁は、概念的にリフトされ、サブグループのすべての作業項目はその後、実行することを継続し得る。
【００３８】
[0046]任意のステップ、機能、特徴、方法、および本明細書に記載されている同様なものを実行するように構成されている処理ユニット１への参照が、いくつかの例では、説明されるステップ、機能、特徴、方法、および同様なものを生じる１つまたは複数の命令を実行するように構成されている処理ユニット１を参照することが理解されるべきである。いくつかの例では、１つまたは複数の命令は、処理ユニットにアクセス可能なメモリ上に記憶され得る。例として、任意のステップ、機能、特徴、方法、および本明細書に記載されている同様なものを実行するように構成されている処理ユニット１への参照が、いくつかの例では、説明されるステップ、機能、特徴、方法、および同様なものを生じる１つまたは複数の命令を実行するように構成されている処理ユニット１の任意の計算デバイス、計算ユニット、および／または処理要素を参照し得る。いくつかの例では、１つまたは複数の命令は、計算デバイス、計算ユニット、および／または処理要素にアクセス可能なメモリ上に記憶され得る。処理ユニット１は、同じサブグループに対応する作業項目間のイントラサブグループデータ転送を実行するように構成され得る。例えば、処理ユニット１は、イントラサブグループデータ転送を実行するために起動され得る、またはさもなければ使用され得るイントラサブグループデータ転送メカニズムで構成され得る。
【００３９】
[0047]本明細書に使用されるように、データ転送は、データを移動することと、データをコピーすることと、データを共有することと、および同様なものを参照し得る。同様に、データを共有することへの参照は、データを転送することと、データを移動することと、データをコピーすることと、および同様なものを参照し得る。例えば、本明細書に参照されるインターサブグループデータ共有はまた、インターサブグループデータ移動、インターサブグループデータコピー、インターサブグループデータ転送と称され得る。例えば、インターサブグループデータ転送は、インターサブグループデータ共有と同義である。別の例として、インターサブグループデータ転送は、インターサブグループデータコピーと同義である。例えば、本明細書に参照されるイントラサブグループデータ共有はまた、イントラサブグループデータ移動、イントラサブグループデータコピー、イントラサブグループデータ転送と称され得る。例えば、イントラサブグループデータ転送は、イントラサブグループデータ共有と同義である。別の例として、イントラサブグループデータ転送は、イントラサブグループデータコピーと同義である。
【００４０】
[0048]いくつかの例では、イントラサブグループデータ転送メカニズムは、ＯｐｅｎＣＬコンピューティングプラットフォーム仕様書（例えば、ＯｐｅｎＣＬ  Ｅｘｔｅｎｓｉｏｎ＃３５）によって定義されるｃｌ＿ｉｎｔｅｌ＿ｓｕｂｇｒｏｕｐｓ  ＡＰＩのような、イントラサブグループシャッフルメカニズムと産業界が呼ぶことを含み得る。しかしながら、イントラサブグループデータ転送メカニズムは、１つまたは複数の障壁が使用されるかどうかにかかわらず、同じサブグループに属する作業項目の間のデータの転送のみを可能にすることに限定される。例えば、ＯｐｅｎＣＬコンピューティングプラットフォームのｃｌ＿ｉｎｔｅｌ＿ｓｕｂｇｒｏｕｐのイントラサブグループシャッフルメカニズムは、同じサブグループ中の作業項目に、ローカルメモリおよび障壁の使用無しにデータを共有することを許可するとしても、イントラサブグループデータ転送メカニズムは、異なるサブグループに属する作業項目の間のデータの共有を許可されない。
【００４１】
[0049]本開示は、異なるサブグループの作業項目の間のインターサブグループデータ転送を可能にするための１つまたは複数の技法を説明する（例えば、処理ユニット１は、このような１つまたは複数の技法で構成され得る）。例えば、本開示は、インターサブグループデータ転送を可能にするために、ソフトウェア、ハードウェア、それらの組み合わせにおいてインプリメントされ得る。いくつかの例では、１つまたは複数の新規関数は、ＡＰＩを含み得る。インターサブグループデータ転送を可能にする関数は、インターサブグループデータ転送関数、インターサブグループコピー関数、インターサブグループ共有関数、および同様なものと称され得る。いくつかの例では、インターサブグループデータ転送関数は、レジスタ（例えば汎用レジスタ）間のデータ共有を参照し得る。他の例では、インターサブグループデータ転送関数は、異なるサブグループに割り振られたメモリ空間（例えば、任意のメモリロケーション）の間のデータ転送を参照し得る。例えば、異なるサブグループに割り振られたメモリ空間は、コンポーネントユニットのプライベートメモリ中に割り振られたメモリ空間を含み得、それは、１つまたは複数のレジスタであり得る、またはあり得ない。
【００４２】
[0050]例では、本明細書に説明される１つまたは複数の技法がソフトウェアを使用してインプリメントされる場合には、このようなソフトウェアに対応する命令は、処理ユニット１によって（例えば、処理ユニット１の所領要素によって）実行されると、処理ユニット１に説明される特徴を実行させる処理ユニット１にアクセス可能なメモリ（例えば、コンピュータ可読記憶媒体として説明され得る、処理ユニット１のメモリ）上に記憶され得る。、例えば、処理ユニット１は、インターサブグループデータ転送を実行するために起動され得る、またはさもなければ使用され得るインターサブグループデータ転送メカニズムで構成され得る。例えば、インターサブグループデータ転送メカニズムがソフトウェアを使用してインプリメントされる場合には、処理ユニット１は、処理ユニット１にアクセス可能なメモリ（例えば、コンピュータ可読記憶媒体として説明され得る、処理ユニット１のメモリ）上に記憶されるインターサブグループデータ転送メカニズムに対応する１つまたは複数の命令を実行するように構成され得る。
【００４３】
[0051]いくつかの例では、インターサブグループデータ転送関数は、１つまたは複数のバリア（ＯｐｅｎＣＬにおける障壁およびＨＳＡにおけるｆ障壁（fbarriers）（例えば、異種システムアーキテクチャファウンデーションによって定義されるようなｆ障壁）と名付けられるような、１つまたは複数のサブグループ障壁）と共にインプリメントされ得る。サブグループ障壁は、サブグループが、例えば、いくつかのサブグループがサブグループ障壁で待つまたは立ち止まる一方、他のサブグループが実行を継続することができるという意味で、ペアワイズを同期するので、作業サブグループより軽い。従って、本開示は、異なるサブグループのサブグループに対応する作業項目の間のインターサブグループデータ転送を可能にするための１つまたは複数の技法を説明する、ここで、サブグループは、サブグループ障壁を使用して同期される、（例えば、処理ユニット１は、このような１つまたは複数の技法で構成され得る）。例えば、作業グループは、１６個のサブグループを含み得る。１つの例では、処理ユニット１は、第１のサブグループ障壁を使用してサブグループ１−８を同期するように構成され、第２のサブグループ障壁を使用してサブグループ９−１６を同期するように構成され得る。
【００４４】
[0052]１つの例では、インターサブグループデータ関数は、以下のシンタックス：ｇｅｎｔｙｐｅ  ｃｏｐｙ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）を有し得る。いくつかの例では、インターサブグループデータ関数は、３つの入力パラメータ：変数、ｓｕｂｇｒｏｕｐ＿ｉｄ、およびｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄを含み得る。変数は、メモリロケーション（例えば、プライベートメモリロケーション）を参照し、それは、レジスタ（例えば、ＧＰＲ）中に割り振られ得る。例では、変数がレジスタ（例えば、ＧＰＲ）を参照する場合には、この変数は、レジスタがコピーされ共有されることになるデータを包含すると示し得る。Ｓｕｂｇｒｏｕｐ＿ｉｄは、サブグループに割り当てられたまたはさもなければサブグループに対応する識別番号（例えばＩＤ）を参照し得る。Ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄは、（例えば、ＯｐｅｎＣＬコンピューティングプラットフォームによって定義されるような障壁またはＨＳＡコンピューティングプラットフォームによって定義されるようなｆ障壁と名付けられた）障壁に割り当てられたまたはさもなければ障壁に対応するＩＤを参照し得る。
【００４５】
[0053]例えば、例ｆｏｏ＝ｃｏｐｙ（ｂａｒ，６，ｂａｒ３）ここで、変数＝ｂａｒ，ｓｕｂｇｒｏｕｐ＿ｉｄ＝５、Ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ＝ｂａｒ３を取る。この例では、データがそれからコピーされるべきソースメモリ空間（例えば、ソースレジスタ）は、ｂａｒに割り振られたメモリ空間に対応し得、データがそれにコピーされるべき目的メモリ空間（例えば、目的レジスタ）は、ｆｏｏが割り振られるメモリ空間に対応し得る。
【００４６】
[0054]いくつかの例では、ｓｕｂｇｒｏｕｐ＿ｉｄおよびｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄは、これら２つの入力パラメータがサブグループ中の各作業項目のために同じ値を包含し得るという意味でサブグループユニフォームであり得る。以下のコードの例は、これを説明するように使用される：  
int foo;
if(sub_group_local_id() ==5 ){
subgroup_id = 3;
}
else{
subgroup_id = 7;
}
foo = copy(bar, subgroup_id, bar3);
【００４７】
[0055]この例では、ｓｕｂｇｒｏｕｐ＿ｉｄは、作業項目＃５がｓｕｂｇｒｏｕｐ＿ｉｄ＝７からのデータをコピーしたい一方、同じサブグループにおける他の作業項目がｓｕｂｇｒｏｕｐ＿ｉｄ＝５からのデータをコピーしたいのでサブグループユニフォームでない。しかしながら、ネームド障壁（つまり指定されたＮａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄに対応するネームド障壁は、すべての作業項目についてｂａｒ３であるのでサブグループユニフォームである。ｓｕｂｇｒｏｕｐ＿ｉｄおよび／またはＮａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄがサブグループユニフォームであり得る、またはあり得ないことが理解されるべきである。
【００４８】
[0056]別の例では、インターサブグループデータ転送は、ｍｏｖＸｗ命令セットアーキテクチャ（ＩＳＡ）命令を使用することを可能にし得る。例えば、処理ユニット１は、ｍｏｖＸｗ  ＩＳＡ命令を持つ異なるサブグループの異なる作業項目に対応するレジスタ（例えば、汎用レジスタ）の間でデータを共有するように構成され、それは、以下のシンタックスを有し得る：ｍｏｖＸｗ  Ｒｄ，Ｒｓ，ｓｒｃＳｕｂｇｒｏｕｐＩｄ。１つまたは複数の障壁（例えば、ネームド障壁）は、ｍｏｖＸｗ命令を取り囲み得る。例えば、インターサブグループデータ転送は、ｎｂａｒ  ＩＤ，Ｒｘの新規ＩＤＳ命令と共にｍｏｖＸｗを使用することを可能にし得、ここで、ＩＤは、障壁識別子として動作し、Ｒｘは、サブグループの数を指定する。１つの例のインプリメンテーションでは、各ネームド障壁（例えば、ｎｂａｒ）は、障壁識別子（つまりＩＤ）によってカウンターに関連付けられ得る。各ｎｂａｒ  ＩＤに関連付けられた各カウンターは、０で開始し得る。各ｎｂａｒ  ＩＤについて、それに対応するカウンターは、Ｎ個の命令につき１だけインクリメントし得る。特定のｎｂａｒについて、ｎｂａｒは、ｎｂａｒに対応するカウンターがＮの値に到達するまでサブグループに対応する作業項目の実行をブロックし（例えば、止め）得る。一旦、Ｎの値が到達すると、カウンターは、０にリセットされ、障壁によって止められた任意のサブグループに対応する作業項目は、解放される（例えば、作業項目は、これらの実行において継続し得る）。図４は、ｍｏｖＸｗによるサブグループの間のデータを移動するために使用されるｎｂａｒとの同期の１つの例を示す。図４の例では、サブグループ２のＲ２は、サブグループ１のＲ０にコピーされる。
【００４９】
[0057]１つの例では、インターサブグループデータ関数は、以下のシンタックス：  
gentype wg_shuffle
(
gentype var,
int srcSubgroupId, 
int srcSubgroupLocalId, 
named_barrier bar
)
【００５０】
[0058]ｗｇ＿ｓｈｕｆｆｌｅ関数は、指定されたサブグループｓｕｂｇｒｏｕｐＩｄの指定された変数ｖａｒからのデータおよび同期のために指定された障壁ｂａｒ（例えば、ネームド障壁ｂａｒ）を使用してサブグループ（ｓｒｃＳｕｂｇｒｏｕｐＬｏｃａｌＩｄ）から指定された作業項目をコピーし得る。いくつかの例では、ｗｇ＿ｓｈｕｆｆｌｅ関数は、以下のようにインプリメントされ得る：  
{
gentype tmp, ret;
bar.wait();
tmp = inter_subgroup_copy( srcSubgroupId)
bar.wait();
ret = intra_subgroup_shuffle ( srcSubgroupLocalId, tmp); 
return ret;
}
【００５１】
[0059]いくつかの例では、処理ユニット１は、単一ハードウェア命令を使用して本明細書において説明される任意の関数および／またはインプリメンテーション詳細をインプリメントするように構成され得る。
【００５２】
[0060]１つの例では、インターサブグループデータ関数は、以下のシンタックス：ｇｅｎｔｙｐｅ  ｓｕｂｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｒｃＳｕｂｇｒｏｕｐＩｄ）を有し得る。いくつかの例では、インターサブグループデータ関数は、２つの入力パラメータ：ｖａｒおよびｓｒｃＳｕｂｇｒｏｕｐＩｄを含み得る。ｖａｒは、メモリロケーション（例えば、プライベートメモリロケーション）を参照し、それは、レジスタ（例えば、ＧＰＲ）中に割り振られ得る。本明細書において使用されるように、レジスタは、ハードウェアレジスタを参照し得る。例では、変数がレジスタ（例えば、ＧＰＲ）を参照する場合には、この変数は、レジスタがコピーされ共有されることになるデータを包含すると示し得る。ｓｒｃＳｕｂｇｒｏｕｐＩｄは、サブグループに割り当てられたまたはさもなければサブグループに対応する識別番号（例えばＩＤ）を参照し得る。例えば、ＩＤ  ０、１、および２を有する３つのサブグループは、図５中に示される例においてサブグループ障壁Ｋ上で循環交換（circular exchange）をし得る。いくつかの例では、サブグループ内のすべての作業項目は、関数によって指定されたデータ転送に参加しなければならない。他の例では、データ転送関数が条件制御フロー中に埋め込まれ得るので、サブグループ内のすべてでない作業項目は、関数によって指定されたデータ転送に参加しなければならない。このような例では、サブグループ内のすべての作業項目が関数によって指定されたデータ転送に参加するように見えことになるように、関数によって指定されたデータ転送が定義されるとして、いくつかの作業項目は、条件制御フロー中に特定の分岐を取らないので、データ転送に参加しないことになる。
【００５３】
[0061]いくつかの例では、ｓｒｃＳｕｂｇｒｏｕｐＩｄは、ｓｒｃＳｕｂｇｒｏｕｐＩＤがサブグループ中の各作業項目のために同じ値を包含し得ることを意味するので、各サブグループにわたってユニフォームであり得る。そうでなければ述べられるように、サブグループユニフォームであるｓｒｃＳｕｂｇｒｏｕｐＩｄで、これは、サブグループ中のすべての作業項目が同じソースサブグループからデータをコピーすることになることを意味する。図５に示される例では、このコードは、循環データ転送が３つのサブグループにわたってインプリメントされ得ることを伝達する。例えば、サブグループ１からのデータは、サブグループ１にコピーされ、サブグループ２からのデータは、サブグループ１にコピーされ、サブグループ０からのデータは、サブグループ２にコピーされ得る。いくつかの例では、循環データ転送は、単一命令でインプリメントされ得る。各作業項目が論理的に、すべてのレジスタのそれ自身のコピーを有し得ることが理解されるべきである。
【００５４】
[0062]サブグループの間のデータ転送は、方向識別子を使用してインプリメントされ得る。例えば、サブグループの間のデータ転送は、アップおよびダウン識別子を使用してインプリメントされ得る。このような例では、アップは、モジュラーパターンにおいてｓｕｂｇｒｏｕｐ＿ｉｄ＝Ｎからｓｕｂｇｒｏｕｐ＿ｉｄ＝Ｎ＋１までを示し、ダウンは、ｓｕｂｇｒｏｕｐ＿ｉｄ＝Ｎからｓｕｂｇｒｏｕｐ＿ｉｄ＝Ｎ−１までを示し得る。いくつかの例では、ｘｏｒパターンが使用され得る。本明細書で使用されるように、ｘｏｒパターンは、データがグループ（例えば、サブグループ）内で交換されることになることを示すデータパターンを参照し得る。例えば、ｘｏｒ１は、以下のパターンにおいてデータを交換し得る：０⇔１，２⇔３，４⇔５，等。
【００５５】
[0063]いくつかの例では、インターサブグループデータ関数および／またはイントラおよびインターサブグループデータ関数は、これらの方向識別子および／またはｘｏｒパターンを使用してインプリメントされ得る。例えば、インターサブグループデータ関数は、以下のシンタックス：ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｃｏｕｎｔ，  ｎａｍｅｄ＿ｂａｒｒｉｅｒ  ＊ｂａｒｒｉｅｒ＿ａｒｒａｙ  ）を有し得る。この例では、インターサブグループデータ関数は、４つの入力パラメータ：ｖａｒ，ｃｏｕｎｔ，ｎａｍｅｄ＿ｂａｒｒｉｅｒ，およびｂａｒｒｉｅｒ＿ａｒｒａｙを有し得る。ｖａｒは、メモリロケーション（例えば、プライベートメモリロケーション）を参照し、それは、レジスタ（例えば、ＧＰＲ）中に割り振られ得る。例では、変数がレジスタ（例えば、ＧＰＲ）を参照する場合には、この変数は、レジスタがコピーされ共有されることになるデータを包含すると示し得る。カウントは、ロールオーバを計算するために使用され得る２のべき乗の定数を示し得る。例えば、カウントが８であり、動作が「アップ」である場合、その後、交換パターンは、「０＝＞１，１＝＞２，．．．，７＝＞０，８＝＞９，．．．，１５＝＞８，１６＝＞１７，．．．」になるだろう。Ｂａｒｒｉｅｒ＿ａｒｒａｙは、使用されることになるネームド障壁のアレイを示し得る。例えば、動作が「アップ」であり、サブグループサイズが３２であり、カウント（以前のパラメータ）が８である場合、その後、４つのネームド障壁を使用する必要があり得る（例えば、８つの隣接サブグループの各グループが１つの独立したネームド障壁を使用することになる）。
【００５６】
[0064]本開示は、同じサブグループに属しているまたは属していない任意の作業項目の間のデータ転送を可能にするために、インターサブグループデータ転送技法とイントラサブグループデータ転送技法を組み合わせるための１つまたは複数の技法を説明する（例えば、処理ユニット１は、１つまたは複数の技法で構成され得る）。例えば、本明細書に説明されるインターサブグループデータ転送技法は、同じサブグループに属しているまたは属していない任意の作業項目の間のデータ転送を可能にするために、イントラサブグループデータ転送技法（例えば、ｃｌ＿ｉｎｔｅｌ＿ｓｕｂｇｒｏｕｐｓ）と併用してインプリメントされ得る。別の例として、本開示は、イントラサブグループデータ転送およびインターサブグループデータ転送を可能にするために、ソフトウェア、ハードウェア、それらの組み合わせにおいてインプリメントされ得る１つまたは複数の新規の関数を説明する。このような例では、本開示は、イントラサブグループデータ転送およびインターサブグループデータ転送を可能にするために、ソフトウェア、ハードウェア、それらの組み合わせにおいてインプリメントされ得る単一関数の例を説明する。この単一関数は、以下のシンタックス：Ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｓｈｕｆｆｌｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  Ｉｎｔ  ｓｈｕｆｆｌｅ＿ｃｎｔ，  Ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｃｎｔ）を有し得る。｛｝がＢＮＦ表記を表すことが理解されるべきである。従って、上で識別される単一関数は、ｓｕｂ＿ｇｒｏｕｐ＿ｓｈｕｆｆｌｅ＿ｕｐ＿ｅｘｃｈａｎｇｅ＿ｕｐ（ｇｅｎｔｙｐｅ  ｖａｒ，  Ｉｎｔ  ｓｈｕｆｆｌｅ＿ｃｎｔ，  Ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｃｎｔ），  ｓｕｂ＿ｇｒｏｕｐ＿ｓｈｕｆｆｌｅ＿ｕｐ＿ｅｘｃｈａｎｇｅ＿ｄｏｗｎ（ｇｅｎｔｙｐｅ  ｖａｒ，  Ｉｎｔ  ｓｈｕｆｆｌｅ＿ｃｎｔ，  Ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｃｎｔ），  および  ｓｕｂ＿ｇｒｏｕｐ＿ｓｈｕｆｆｌｅ＿ｘｏｒ＿ｅｘｈａｎｇｅ＿ｘｏｒ（ｇｅｎｔｙｐｅ  ｖａｒ，  Ｉｎｔ  ｓｈｕｆｆｌｅ＿ｃｎｔ，  Ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｃｎｔ）のようなこの単一関数から９つの異なる可能性を表す。シャッフルは、イントラサブグループデータ転送を示すために使用され、交換は、インターサブグループデータ転送を示すために使用される。
【００５７】
[0065]上で示されるように、この単一関数は、方向識別子を使用してインプリメントされ得る。例えば、サブグループの間のデータ転送は、アップおよびダウン識別子を使用してインプリメントされ得る。このような例では、アップは、モジュラーパターンにおいて作業ｓｕｂｇｒｏｕｐ＿ｉｄ＝Ｎからｓｕｂｇｒｏｕｐ＿ｉｄ＝Ｎ＋１までを示し、ダウンは、ｓｕｂｇｒｏｕｐ＿ｉｄ＝Ｎからｓｕｂｇｒｏｕｐ＿ｉｄ＝Ｎ−１までを示し得る。いくつかの例では、ｘｏｒパターンが使用され得る。
【００５８】
[0066]処理ユニット１は、異なるサブグループに対応する作業項目間のインターサブグループデータ転送を実行するように構成され得る。例えば、処理ユニット１は、インターサブグループデータ転送を実行するために起動され得る、またはさもなければ使用され得るインターサブグループデータ転送メカニズムで構成され得る。別の例として、処理ユニット１は、それぞれ、異なるサブグループの間および／または同じサブグループの間のインターサブグループデータ転送および／またはイントラサブグループデータ転送を実行するために起動され、実行され、さもなければ使用され得るデータ転送メカニズムで構成され得る。本明細書に使用されるように、データ転送は、データを移動することと、データをコピーすることと、データを共有することと、および同様なものを参照し得る。同様に、データを共有することへの参照は、データを転送することと、データを移動することと、データをコピーすることと、および同様なものを参照し得る。
【００５９】
[0067]図６は、本明細書に説明される技法に従うサブグループ処理の例を例示する。図６の例では、処理ユニット１は、または複数の処理要素（例えば、Ｎが整数である、ＰＥ  １乃至ＰＥ  Ｎ）上で１つまたは複数のサブグループ（Ｍが整数である、サブグループ１乃至サブグループＭ）を実行するように構成され得る。より詳細に、処理ユニット１は、１つまたは複数の処理要素２６上で１つまたは複数の作業項目を実行するように構成され得（例えば、処理要素１−Ｎが各々、計算ユニット２４−１上で、処理要素２６Ａ−１から２６Ａ−Ｎまでからの処理要素である）、ここで、１つまたは複数の作業項目は、１つまたは複数のサブグループに対応する。示されるように、各サブグループは、１つまたは複数の作業項目を含む。例えば、図６中のサブグループ１の１つまたは複数の作業項目は、作業項目１−１、作業項目１−２、および作業項目１−Ｑによって表され、ここで、Ｑは、整数である。例えば、図６中のサブグループ２の１つまたは複数の作業項目は、作業項目２−１、作業項目２−２、および作業項目１−Ｑによって表され、ここで、Ｑは、整数である。例えば、図６中のサブグループ３の１つまたは複数の作業項目は、作業項目３−１、作業項目３−２、および作業項目１−Ｑによって表され、ここで、Ｑは、整数である。同様に、例えば、図６中のサブグループＭ（ここで、Ｍは、整数である）の１つまたは複数の作業項目は、作業項目Ｍ−１、作業項目Ｍ−２、および作業項目Ｍ−Ｑによって表され、ここで、Ｑは、整数である。
【００６０】
[0068]各作業項目は、処理要素１の処理要素を使用して処理され、各処理要素は、１つまたは複数のレジスタ（例えば汎用レジスタ）のバンクを含み得る。例えば、処理要素１、２、およびＮ（その各々が本明細書に説明される同じまたは異なる計算ユニット２４の異なる処理要素２６であり得る）は、異なるレジスタ（例えば、ＧＰＲ）が各作業項目に割り振られ得ることを意味するので、各作業項目のための異なるレジスタを含むここととして図６に示される。Ｎが整数である、処理要素Ｎは、任意の処理要素数を表す。例えば、処理要素１は、作業項目１−１、２−１、３−１、およびＭ−１にそれぞれ割り振られ得る、１つまたは複数のレジスタ１−１、１−２、１−３、および１−Ｐ（ここで、Ｐは、整数である）を含み得る。同様に、処理要素２は、作業項目１−２、２−２、３−２、およびＭ−２にそれぞれ割り振られ得る、１つまたは複数のレジスタ２−１、２−２、２−３、および２−Ｐ（ここで、Ｐは、整数である）を含み得る。同様に、処理要素Ｍは、作業項目１−Ｑ、２−Ｑ、３−Ｑ、およびＭ−Ｑ（ここで、ＭおよびＱは、各々整数である）にそれぞれ割り振られ得る、１つまたは複数のレジスタＭ−１、Ｍ−２、Ｍ−３、およびＭ−Ｐ（ここで、ＭおよびＰは、各々整数である）を含み得る。
【００６１】
[0069]処理要素１は、インターサブグループデータ転送としてラベルされる図６の右側の上下の矢印によって表されるような、異なるサブグループにおける作業項目に対応するレジスタの間のデータを転送するために、本明細書に説明される１つまたは複数の技法で構成され得る。処理要素１は、イントラサブグループデータ転送としてラベルされる図６の下部の矢印によって表されるような、同じサブグループにおける作業項目に対応するレジスタの間のデータを転送するために、本明細書に説明される１つまたは複数の技法で構成され得る。さもなければ述べられる、処理要素１は、水平または垂直にデータ転送を実行するように構成され得る。
【００６２】
[0070]図７は、本開示の例となる方法を示すフローチャートである。図７の方法は、１つまたは複数の処理ユニット１（例えば、１つまたは複数のＣＰＵ、１つまたは複数のＧＰＵ，１つまたは複数の並列処理ユニット（例えば、並列処理を実行するように構成された任意の処理ユニット）、１つまたは複数のＳｏＣ、またはこれらの任意の組み合わせ）によって実行され得る。図７は、本開示の１つまたは複数の技法と一致する１つの例の方法を描写する。
【００６３】
[0071]処理ユニット１は、障壁で第１のサブグループに対応する作業項目と第２のサブグループに対応する作業項目を同期するように構成され得る（７０２）。いくつかの例では、処理ユニットは、１つまたは複数の計算ユニットを含み得る。１つまたは複数の計算ユニットの各々は、１つまたは複数の処理要素を含み得る。処理ユニットは、１つまたは複数の計算ユニットの各々によってアクセス可能なローカルメモリを含み得る。
【００６４】
[0072]処理ユニット１は、第１のサブグループと第２のサブグループとの間のインターサブグループデータ転送を実行するように構成され得る（７０４）。いくつかの例では、処理ユニット１は、ローカルメモリを使用せずに第１のサブグループと第２のサブグループとの間のインターサブグループデータ転送を実行するように構成され得る。いくつかの例では、インターサブグループデータ転送は、第１のサブグループから第２のサブグループにデータをコピーすること、または第２のサブグループから第１のサブグループにデータをコピーすることを含み得る。いくつかの例では、インターサブグループデータ転送は、第１のサブグループに関連付けられた第１のメモリロケーション（例えば、第１のレジスタ）（例えば、第１のサブグループに割り振られた第１のメモリロケーション）から第２のサブグループに関連付けられた第２のメモリロケーション（例えば、第２のレジスタ）（例えば、第２のサブグループに割り振られた第２のメモリロケーション、第２のサブグループの作業項目に割り振られた第２のメモリロケーション、等）にデータをコピーすること、または第２のサブグループに関連付けられた第２のメモリロケーション（例えば、第２のレジスタ）から第１のサブグループに関連付けられた第１のメモリロケーション（例えば、第１のレジスタ）にデータをコピーすることを含み得る。第１のメモリロケーションおよび／または第２のメモリロケーションは、１つまたは複数のレジスタを含み得る。例えば、第１のメモリロケーションは、汎用レジスタであり、第２のメモリロケーションは、汎用レジスタであり得る。第１のメモリロケーションおよび第２のメモリロケーションは、処理ユニットの計算ユニットの処理要素に割り振られたメモリ空間に対応し得る。例えば、第１のメモリロケーションおよび第２のメモリロケーションは、処理要素に割り振られたプライベートメモリ空間に対応し得る。
【００６５】
[0073]いくつかの例では、インターサブグループデータ転送は、第１のサブグループに対応する１つまたは複数の作業項目から第２のサブグループに対応する１つまたは複数の作業項目にデータをコピーすること、または第２のサブグループに対応する１つまたは複数の作業項目から第１のサブグループに対応する１つまたは複数の作業項目にデータをコピーすることを含み得る。いくつかの例では、インターサブグループデータ転送は、インターサブグループデータ転送は、第１のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）から第２のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）にデータをコピーすること、または第２のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）から第１のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）にデータをコピーすることを含み得る。第１のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）および第２のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）は、汎用レジスタであり得る。１つまたは複数のレジスタは、処理ユニットの計算ユニットの処理要素に割り振られたメモリ空間に対応し得る。例えば、１つまたは複数のレジスタは、処理要素に割り振られたプライベートメモリ空間に対応し得る。
【００６６】
[0074]いくつかの例では、第１のサブグループに対応する作業項目は、第１の作業グループに対応し得（例えば、作業項目が第１の作業グループに属し得る第１のサブグループに属し得る）、第２のサブグループに対応する作業項目は、第２の作業グループに対応し得る（例えば、作業項目が第２の作業グループに属し得る第２のサブグループに属し得る）。他の例では、第１のサブグループに対応する作業項目は、第１の作業グループに対応し得（例えば、作業項目が第１の作業グループに属し得る第１のサブグループに属し得る）、第２のサブグループに対応する作業項目は、第１の作業グループに対応し得る（例えば、作業項目が第１の作業グループに属し得る第２のサブグループに属し得る）。
【００６７】
[0075]上で説明されるように、処理ユニット１は、障壁で第１のサブグループに対応する作業項目と第２のサブグループに対応する作業項目を同期するように構成され得る。いくつかの例では、障壁は、ネームド障壁または任意のサブグループ障壁であり得る。いくつかの例では、ネームド障壁は、サブグループ障壁１つのタイプであり得る。例えば、ネームド障壁およびサブグループ障壁は、ｗｏｒｋ＿ｇｒｏｕｐ＿ｎａｍｅｄ＿ｂａｒｒｉｅｒ  （ｕｉｎｔ  ｓｕｂ＿ｇｒｏｕｐ＿ｃｏｕｎｔ）を含み得る。この例では、ｓｕｂ＿ｇｒｏｕｐ＿ｃｏｕｎｔは、第１のサブグループおよび第２のサブグループが作業作業グループに属する場合には同期される作業グループ中のサブグループの数を示し得る。別の例では、ネームド障壁および任意のサブグループ障壁は、ＯｐｅｎＣＬコンピューティングプラットフォーム仕様書（例えば、ＯｐｅｎＣＬ  Ｃ＋＋仕様書、バージョン１．０、文書改訂２２）によって定義されるようなｃｌ＿ｋｈｒ＿ｓｕｂ＿ｇｒｏｕｐ＿ｎａｍｅｄ＿ｂａｒｒｉｅｒを含み得る。
【００６８】
[0076]いくつかの例では、処理ユニット１は、インターサブグループデータ転送メカニズムを使用してインターサブグループデータ転送を実行するように構成され得る。いくつかの例では、インターサブグループデータ転送メカニズムは、処理ユニットによって実行可能なソフトウェア関数を含み得る。ソフトウェア関数は、ＡＰＩ関数であり得る。いくつかの例では、ソフトウェア関数は、１つまたは複数のアトミック動作（atomic operation）を含み得る。いくつかの例では、ソフトウェア関数は、１つのアトミック動作（例えば、単一アトミック動作）のみを含み得る。他の例では、ソフトウェア関数は、複数のアトミック動作のみを含み得る。
【００６９】
[0077]いくつかの例では、第１のサブグループと第２のサブグループとの間のインターサブグループデータ転送は、同時に生じ得る。例えば、第１のサブグループから第２のサブグループにデータを転送することおよび第２のサブグループから第１のサブグループにデータを転送することは、同時に生じ得る。
【００７０】
[0078]いくつかの例では、インターサブグループデータ転送メカニズムに対応するソフトウェア関数（例えば、ＡＰＩ関数）は、ｇｅｎｔｙｐｅコピー（ｇｅｎｔｙｐｅ変数，ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）を含み得る。他の例では、ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｇｅｎｅｒａｌｉｚｅｄ＿ｓｈｕｆｆｌｅ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｆｉｂｅｒ＿ｉｄ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）を含み得る。他の例では、ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｓｕｂｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｒｃＳｕｂｇｒｏｕｐＩｄ）を含み得る。他の例では、ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｃｏｕｎｔ，  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＊ｂａｒｒｉｅｒ＿ａｒｒａｙ  ）を含み得る。他の例では、ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｓｈｕｆｆｌｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｈｕｆｆｌｅ＿ｃｎｔ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｃｎｔ）を含み得る。他の例では、ＡＰＩ関数は、  ｇｅｎｔｙｐｅ  ｇｅｎｅｒａｌｉｚｅｄ＿ｓｈｕｆｆｌｅ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｗｏｒｋｉｔｅｍ＿ｉｄ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）を含み得る。
【００７１】
[0079]いくつかの例では、処理ユニット１は、処理ユニットの任意のメモリコントローラを使用せずに第１のサブグループと第２のサブグループとの間のインターサブグループデータ転送を実行するように構成され得る。いくつかの例では、処理ユニット１は、処理ユニットの任意のメモリコントローラにメモリ要求を送らずに第１のサブグループと第２のサブグループとの間のインターサブグループデータ転送を実行するように構成され得る。
【００７２】
[0080]いくつかの例では、処理ユニット１は、第１のサブグループの第１の作業項目と第１のサブグループの第２の作業項目との間、または第２のサブグループの第１の作業項目と第２のサブグループの第２の作業項目との間のイントラサブグループデータ転送を実行するように構成され得る。イントラサブグループデータ転送は、異なるサブグループの間でデータを転送しない。例えば、イントラサブグループデータ転送は、異なるサブグループに属している作業項目の間のデータを転送しない。
【００７３】
[0081]処理ユニット１は、イントラサブグループデータ転送メカニズムを使用してイントラサブグループデータ転送を実行するように構成され得る。イントラサブグループデータ転送メカニズムは、処理ユニットによって実行可能なソフトウェア関数を含み得る。ソフトウェア関数は、ＡＰＩ関数であり得る。いくつかの例では、ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｓｈｕｆｆｌｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｈｕｆｆｌｅ＿ｃｎｔ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｃｎｔ）を含み得る。
【００７４】
[0082]図８は、本開示の例となる方法を示すフローチャートである。図８の方法は、１つまたは複数の処理ユニット１（例えば、１つまたは複数のＣＰＵ、１つまたは複数のＧＰＵ，１つまたは複数の並列処理ユニット（例えば、並列処理を実行するように構成された任意の処理ユニット）、１つまたは複数のＳｏＣ、またはこれらの任意の組み合わせ）によって実行され得る。図８は、本開示の１つまたは複数の技法と一致する１つの例の方法を描写する。
【００７５】
[0083]処理ユニット１は、１つまたは複数の障壁で複数のサブグループを同期するように構成され得る（８０２）。いくつかの例では、処理ユニットは、１つまたは複数の計算ユニットを含み得る。１つまたは複数の計算ユニットの各々は、１つまたは複数の処理要素を含み得る。処理ユニットは、１つまたは複数の計算ユニットの各々によってアクセス可能なローカルメモリを含み得る。いくつかの例では、複数のサブグループは、単一作業グループに属し得る。いくつかの例では、複数のサブグループは、２つのサブグループ、３つのサブグループ、４つのサブグループ、５つのサブグループ、６つのサブグループ、７つのサブグループ、または８つのサブグループを含み得る。他の例では、複数のサブグループは、１つまたは複数のサブグループを含み得る。
【００７６】
[0084]処理ユニット１は、複数のサブグループのうちの２つ以上のサブグループの間のインターサブグループデータ転送を実行するように構成され得る（804）。いくつかの例では、処理ユニット１は、ローカルメモリを使用せずに複数のサブグループのうちの２つ以上のサブグループの間のインターサブグループデータ転送を実行するように構成され得る。いくつかの例では、インターサブグループデータ転送は、複数のサブグループのうちの少なくとも１つのサブグループから複数のサブグループのうちの１つまたは複数の他のサブグループにデータをコピーすることを含み得る。いくつかの例では、インターサブグループデータ転送は、ｘｏｒパターンに従って、複数のサブグループのうちの少なくとも１つのサブグループから複数のサブグループのうちの１つまたは複数の他のサブグループにデータをコピーすることを含み得る。このような例では、複数のサブグループのうちの少なくとも１つのサブグループと複数のサブグループのうちの１つまたは複数の他のサブグループとの間のインターサブグループデータ転送は、同時に生じ得る。
【００７７】
[0085]処理ユニット１は、同時に、複数のサブグループのうちの１つまたは複数のサブグループの間のインターサブグループデータ転送を実行するように構成され得る。例えば、１つまたは複数のサブグループの間の任意のデータ転送は、同時に生じ得る。処理ユニット１は、同時に、異なるサブグループの２つ以上の作業項目の間のインターサブグループデータ転送を実行するように構成され得る。例えば、第１のサブグループの１つまたは複数の作業項目と第１のサブグループと異なる１つまたは複数のサブグループの１つまたは複数の作業項目との間の任意のデータ転送は、同時に生じ得る。
【００７８】
[0086]いくつかの例では、インターサブグループデータ転送は、第１のサブグループから第２のサブグループにデータをコピーすること、または第２のサブグループから第１のサブグループにデータをコピーすることのうちの少なくとも１つを含み得る。このような例では、複数のサブグループは、２つ以上のサブグループを含み得る。
【００７９】
[0087]いくつかの例では、インターサブグループデータ転送は、第１のサブグループから第２のサブグループにデータをコピーすること、第１のサブグループから第３のサブグループにデータをコピーすること、第２のサブグループから第１のサブグループにデータをコピーすること、第２のサブグループから第３のサブグループにデータをコピーすること、第３のサブグループから第１のサブグループにデータをコピーすること、または第３のサブグループから第２のサブグループにデータをコピーすることのうちの少なくとも１つを含み得る。このような例では、複数のサブグループは、３つ以上のサブグループを含み得る。
【００８０】
[0088]いくつかの例では、ｘｏｒパターンに従うインターサブグループデータ転送は、第１のサブグループから第２のサブグループにデータをコピーすること、第２のサブグループから第３のサブグループにデータをコピーすること、および第３のサブグループから第１のサブグループにデータをコピーすることを含み得る。このような例では、複数のサブグループは、３つ以上のサブグループを含み得る。
【００８１】
[0089]いくつかの例では、インターサブグループデータ転送は、第１のサブグループから第２のサブグループにデータをコピーすること、第１のサブグループから第３のサブグループにデータをコピーすること、第１のサブグループから第４のサブグループにデータをコピーすること、第２のサブグループから第１のサブグループにデータをコピーすること、第２のサブグループから第３のサブグループにデータをコピーすること、第２のサブグループから第４のサブグループにデータをコピーすること、第３のサブグループから第１のサブグループにデータをコピーすること、第３のサブグループから第２のサブグループにデータをコピーすること、第３のサブグループから第４のサブグループにデータをコピーすること、第４のサブグループから第１のサブグループにデータをコピーすること、第４のサブグループから第２のサブグループにデータをコピーすること、または第４のサブグループから第３のサブグループにデータをコピーすることのうちの少なくとも１つを含む。このような例では、複数のサブグループは、４つ以上のサブグループを含み得る。
【００８２】
[0090]いくつかの例では、ｘｏｒパターンに従うインターサブグループデータ転送は、第１のサブグループから第２のサブグループにデータをコピーすること、第２のサブグループから第１のサブグループにデータをコピーすること、第３のサブグループから第４のサブグループにデータをコピーすること、第４のサブグループから第３のサブグループにデータをコピーすることを含み得る。このような例では、複数のサブグループは、４つ以上のサブグループを含み得る。
【００８３】
[0091]他の例では、ｘｏｒパターンに従うインターサブグループデータ転送は、第１のサブグループから第２のサブグループにデータをコピーすること、第２のサブグループから第３のサブグループにデータをコピーすること、第３のサブグループから第４のサブグループにデータをコピーすること、第４のサブグループから第１のサブグループにデータをコピーすることを含み得る。このような例では、複数のサブグループは、４つ以上のサブグループを含み得る。
【００８４】
[0092]いくつかの例では、複数のサブグループは、２つのサブグループ、３つのサブグループ、４つのサブグループ、５つのサブグループ、６つのサブグループ、７つのサブグループ、８つのサブグループ、あるいはそれ以上のサブグループを含み得る。いくつかの例では、インターサブグループデータ転送は、（１）第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第１のサブグループから、第２のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループのうちの少なくとも１つにデータをコピーすること、（２）第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第２のサブグループから、第１のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループのうちの少なくとも１つにデータをコピーすること、（３）第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第３のサブグループから、第１のサブグループ、第２のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループのうちの少なくとも１つにデータをコピーすること、（４）第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第４のサブグループから、第１のサブグループ、第２のサブグループ、第３のサブグループ、第５のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループのうちの少なくとも１つにデータをコピーすること、（５）第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第５のサブグループから、第１のサブグループ、第２のサブグループ、第３のサブグループ、第４のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループのうちの少なくとも１つにデータをコピーすること、（６）第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第６のサブグループから、第１のサブグループ、第２のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第７のサブグループ、または第８のサブグループのサブグループのうちの少なくとも１つにデータをコピーすること、（７）第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第７のサブグループから、第１のサブグループ、第２のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、または第８のサブグループのサブグループのうちの少なくとも１つにデータをコピーすること、（８）第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第８のサブグループから、第１のサブグループ、第２のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、または第７のサブグループのサブグループのうちの少なくとも１つにデータをコピーすることのうちの少なくとも１つを含み得る。
【００８５】
[0093]いくつかの例では、複数のサブグループは、２つのサブグループ、３つのサブグループ、４つのサブグループ、５つのサブグループ、６つのサブグループ、７つのサブグループ、８つのサブグループ、あるいはそれ以上のサブグループを含み得る。いくつかの例では、インターサブグループデータ転送は、（１）第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第１のサブグループに関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）から、第２のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループに関連付けられた少なくとも１つのメモリロケーション（例えば、レジスタ）にデータをコピーすること、（２）第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第２のサブグループに関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）から、第１のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループに関連付けられた少なくとも１つのメモリロケーション（例えば、レジスタ）にデータをコピーすること、（３）第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第３のサブグループに関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）から、第１のサブグループ、第２のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループに関連付けられた少なくとも１つのレジスタへ第３のレジスタに関連付けられた少なくとも１つのメモリロケーション（例えば、レジスタ）にデータをコピーすること、（４）第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第４のサブグループに関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）から、第１のサブグループ、第２のサブグループ、第３のサブグループ、第５のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループに関連付けられた少なくとも１つのレジスタへ第４のレジスタに関連付けられた少なくとも１つのメモリロケーション（例えば、レジスタ）にデータをコピーすること、（５）第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第５のサブグループに関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）から、第１のサブグループ、第２のサブグループ、第３のサブグループ、第４のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループに関連付けられた少なくとも１つのメモリロケーション（例えば、レジスタ）にデータをコピーすること、（６）第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第６のサブグループに関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）から、第１のサブグループ、第２のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第７のサブグループ、または第８のサブグループのサブグループに関連付けられた少なくとも１つのメモリロケーション（例えば、レジスタ）にデータをコピーすること、（７）第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第７のサブグループに関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）から、第１のサブグループ、第２のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、または第８のサブグループのサブグループに関連付けられた少なくとも１つのメモリロケーション（例えば、レジスタ）にデータをコピーすること、（８）第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第８のサブグループに関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）から、第１のサブグループ、第２のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、または第７のサブグループのサブグループに関連付けられた少なくとも１つのメモリロケーション（例えば、レジスタ）にデータをコピーすることのうちの少なくとも１つを含み得る。１つまたは複数のレジスタは、処理ユニットの計算ユニットの処理要素に割り振られたメモリ空間に対応し得る。例えば、１つまたは複数のレジスタは、処理要素に割り振られたプライベートメモリ空間に対応し得る。
【００８６】
[0094]いくつかの例では、インターサブグループデータ転送は、複数のサブグループのうちの２つ以上のサブグループに関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）から、複数のサブグループのうちの２つ以上のサブグループに関連付けられた１つまたは複数の他のメモリロケーション（例えば、１つまたは複数のレジスタ）にデータをコピーすることを含み得る。２つ以上のサブグループに関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）および２つ以上のサブグループに関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数の他のレジスタ）は、汎用レジスタを含み得る。１つまたは複数のレジスタは、処理ユニットの計算ユニットの処理要素に割り振られたメモリ空間に対応し得る。例えば、１つまたは複数のレジスタは、処理要素に割り振られたプライベートメモリ空間に対応し得る。
【００８７】
[0095]いくつかの例では、１つまたは複数の障壁で複数のサブグループを同期するように構成され得る処理ユニット１は、複数のサブグループの各サブグループに対応する１つまたは複数の作業項目を同期するように構成されている処理ユニット１を含み得る。このような例では、処理ユニット１は、２つ以上のサブグループの２つ以上の作業項目の間のインターサブグループデータ転送を実行するように構成されていることによって、複数のサブグループのうちの２つ以上のサブグループの間のインターサブグループデータ転送を実行するように構成され、ここで、２つ以上の作業項目のうちの少なくとも２つは、２つ以上のグループの異なるサブグループに属する。
【００８８】
[0096]いくつかの例では、インターサブグループデータ転送は、複数のサブグループのうちの少なくとも１つのサブグループの１つまたは複数の作業項目に関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）から、複数のサブグループのうちの１つまたは複数の他のサブグループの１つまたは複数の他の作業項目に関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）にデータをコピーすることを含み得る。このような例では、複数のサブグループのうちの少なくとも１つのサブグループの１つまたは複数の作業項目に関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）および複数のサブグループのうちの１つまたは複数の他のサブグループの１つまたは複数の他のサブグループの１つまたは複数の他の作業項目に関連付けられた１つまたは複数のメモリロケーション（例えば、１つまたは複数のレジスタ）は、汎用レジスタであり得る。１つまたは複数のレジスタは、処理ユニットの計算ユニットの処理要素に割り振られたメモリ空間に対応し得る。例えば、１つまたは複数のレジスタは、処理要素に割り振られたプライベートメモリ空間に対応し得る。
【００８９】
[0097]上で説明されるように、処理ユニット１は、１つまたは複数の障壁で複数のサブグループを同期するように構成され得る。１つまたは複数の障壁は、１つまたは複数のサブグループ障壁を含み得る。いくつかの例では、１つまたは複数の障壁は、１つまたは複数のネームド障壁および／または１つまたは複数のサブグループ障壁を含み得る。いくつかの例では、ネームド障壁は、サブグループ障壁１つのタイプであり得る。処理ユニット１は、１つまたは複数のネームド障壁および／または１つまたは複数のサブグループ障壁で複数のサブグループを同期するように構成され得る。いくつかの例では、１つまたは複数のネームド障壁および／または１つまたは複数のサブグループ障壁は、ｗｏｒｋ＿ｇｒｏｕｐ＿ｎａｍｅｄ＿ｂａｒｒｉｅｒ  （ｕｉｎｔ  ｓｕｂ＿ｇｒｏｕｐ＿ｃｏｕｎｔ）を含み得る。  このような例では、ｓｕｂ＿ｇｒｏｕｐ＿ｃｏｕｎｔは、同期されるべき作業グループ中のサブグループの数を示し得る。別の例では、１つまたは複数のネームド障壁および／または１つまたは複数のサブグループ障壁は、ＯｐｅｎＣＬコンピューティングプラットフォーム仕様書（例えば、ＯｐｅｎＣＬ  Ｃ＋＋仕様書、バージョン１．０、文書改訂２２）によって定義されるようなｃｌ＿ｋｈｒ＿ｓｕｂ＿ｇｒｏｕｐ＿ｎａｍｅｄ＿ｂａｒｒｉｅｒを含み得る。
【００９０】
[0098]いくつかの例では、処理ユニット１は、インターサブグループデータ転送メカニズムを使用してインターサブグループデータ転送を実行するように構成され得る。いくつかの例では、インターサブグループデータ転送メカニズムは、処理ユニットによって実行可能なソフトウェア関数を含み得る。ソフトウェア関数は、ＡＰＩ関数であり得る。いくつかの例では、ソフトウェア関数は、１つまたは複数のアトミック動作（atomic operation）を含み得る。いくつかの例では、ソフトウェア関数は、１つのアトミック動作（例えば、単一アトミック動作）のみを含み得る。他の例では、ソフトウェア関数は、複数のアトミック動作のみを含み得る。
【００９１】
[0099]いくつかの例では、複数のサブグループのうちの２つ以上のサブグループの間のインターサブグループデータ転送は、同時に生じ得る。例えば、第１のサブグループから第２のサブグループにデータを転送することおよび第２のサブグループから第１のサブグループにデータを転送することは、同時に生じ得る。
【００９２】
[0100]いくつかの例では、インターサブグループデータ転送メカニズムに対応するソフトウェア関数（例えば、ＡＰＩ関数）は、ｇｅｎｔｙｐｅコピー（ｇｅｎｔｙｐｅ変数，ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）を含み得る。他の例では、ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｇｅｎｅｒａｌｉｚｅｄ＿ｓｈｕｆｆｌｅ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｆｉｂｅｒ＿ｉｄ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）を含み得る。他の例では、ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｓｕｂｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｒｃＳｕｂｇｒｏｕｐＩｄ）を含み得る。他の例では、ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｃｏｕｎｔ，  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＊ｂａｒｒｉｅｒ＿ａｒｒａｙ  ）を含み得る。他の例では、ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｓｈｕｆｆｌｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｈｕｆｆｌｅ＿ｃｎｔ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｃｎｔ）を含み得る。他の例では、ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｇｅｎｅｒａｌｉｚｅｄ＿ｓｈｕｆｆｌｅ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｗｏｒｋｉｔｅｍ＿ｉｄ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）を含み得る。
【００９３】
[0101]いくつかの例では、処理ユニット１は、処理ユニットの任意のメモリコントローラを使用せずに複数のサブグループのうちの２つ以上のサブグループの間のインターサブグループデータ転送を実行するように構成され得る。いくつかの例では、処理ユニット１は、処理ユニットの任意のメモリコントローラにメモリ要求を送らずに複数のサブグループのうちの２つ以上のサブグループの間のインターサブグループデータ転送を実行するように構成され得る。
【００９４】
[0102]いくつかの例では、処理ユニット１は、複数のサブグループのうちの単一サブグループ内の２つ以上の作業グループの間のイントラサブグループデータ転送を実行するように構成され得る。いくつかの例では、処理ユニット１は、複数のサブグループのうちの各サブグループないの２つ以上の作業項目の間のイントラサブグループデータ転送を実行するように構成され得、ここで、イントラサブグループデータ転送は、異なるサブグループに属する作業項目の間のデータを転送しない。
【００９５】
[0103]処理ユニット１は、イントラサブグループデータ転送メカニズムを使用してイントラサブグループデータ転送を実行するように構成され得る。イントラサブグループデータ転送メカニズムは、処理ユニットによって実行可能なソフトウェア関数を含み得る。ソフトウェア関数は、ＡＰＩ関数であり得る。いくつかの例では、ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｓｈｕｆｆｌｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｈｕｆｆｌｅ＿ｃｎｔ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｃｎｔ）を含み得る。
【００９６】
[0104]図９は、本開示の例となる方法を示すフローチャートである。図９の方法は、１つまたは複数の処理ユニット１（例えば、１つまたは複数のＣＰＵ、１つまたは複数のＧＰＵ，１つまたは複数の並列処理ユニット（例えば、並列処理を実行するように構成された任意の処理ユニット）、１つまたは複数のＳｏＣ、またはこれらの任意の組み合わせ）によって実行され得る。図９は、本開示の１つまたは複数の技法と一致する１つの例の方法を描写する。
【００９７】
[0105]処理ユニット１は、第１の作業項目を実行するように構成され得る（９０２）。第１の作業項目は、第１のサブグループに対応し得る。処理ユニット１は、第２の作業項目を実行するように構成され得る（９０４）。第２の作業項目は、第２のサブグループに対応し得る。処理ユニット１は、第１のサブグループの各作業項目および第２のサブグループの各作業項目を同期する第１の障壁を実行するように構成され得る。一旦、第１のサブグループの各作業項目および第２のサブグループの各作業項目が第１の障壁によって同期されると、処理ユニット１は、第１のサブグループと第２のサブグループとの間のインターサブグループデータ転送を実行するように構成され得る（９０８）。処理ユニット１は、第１のサブグループの各作業項目および第２のサブグループの各作業項目を同期する第２の障壁を実行するように構成され得る。例えば、処理ユニット１は、第１のサブグループの各作業項目および第２のサブグループの各作業項目が、第２の障壁の先に進行することを可能にする前に、インターサブグループデータ転送が完了するのを確実にするために、第１のサブグループの各作業項目および第２のサブグループの各作業項目を同期する第２の障壁を実行するように構成され得る。
【００９８】
[0106]いくつかの例では、処理ユニット１は、１つまたは複数の計算ユニットを含み得る。１つまたは複数の計算ユニットの各々は、作業項目を実行するための１つまたは複数の処理要素を含み得る。処理ユニット１は、１つまたは複数の計算ユニットの各々によってアクセス可能な（例えば、１つまたは複数の内部メモリ６の一部として）ローカルメモリを含み得る。処理ユニット１は、１つまたは複数の処理要素の各々によってアクセス可能な（例えば、１つまたは複数の内部メモリ６の一部として）プライベートメモリを含み得る。いくつかの例では、処理ユニット１は、ローカルメモリまたはグローバルメモリを使用せずに第１のサブグループと第２のサブグループとの間のインターサブグループデータ転送を実行するように構成される、および／または処理ユニット１は、プライベートメモリを使用して第１のサブグループと第２のサブグループとの間のインターサブグループデータ転送を実行するように構成され得る。
【００９９】
[0107]いくつかの例では、処理ユニット１は、第１のサブグループに関連付けられた第１のメモリロケーションから、第２のサブグループに関連付けられた第２のメモリロケーションにデータをコピーすること、または第２のサブグループに関連付けられた第２のメモリロケーションから、第１のサブグループに関連付けられた第１のメモリロケーションにデータをコピーすることのうちの少なくとも１つを実行するように構成されることによってインターサブグループデータ転送を実行するように構成され得る。第１のメモリロケーションは、第１のハードウェアレジスタであり、第２のメモリロケーションは、第２のハードウェアレジスタであり得る。第１のハードウェアレジスタは、第１の作業項目に関連付けられ、第２のハードウェアレジスタは、第２の作業項目に関連付けられ得る。
【０１００】
[0108]いくつかの例では、処理ユニット１は、第１のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のハードウェアレジスタから、第２のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のハードウェアレジスタにデータをコピーすること、または第２のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のハードウェアレジスタから第１のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のハードウェアレジスタにデータをコピーすることのうちの少なくとも１つを実行するように構成されることによってインターサブグループデータ転送を実行するように構成され得る。
【０１０１】
[0109]いくつかの例では、処理ユニット１は、インターサブグループデータ転送メカニズムを使用するように構成されることによってインターサブグループデータ転送を実行するように構成され得る。インターサブグループデータ転送メカニズムは、処理ユニットによって実行可能なソフトウェア関数を含み得る。ソフトウェア関数は、アプリケーションプログラミングインターフェース（ＡＰＩ）関数であり得る。アプリケーションプログラミングインターフェース（ＡＰＩ）関数は、ｇｅｎｔｙｐｅ  ｃｏｐｙ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）；  ｇｅｎｔｙｐｅ  ｇｅｎｅｒａｌｉｚｅｄ＿ｓｈｕｆｆｌｅ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｆｉｂｅｒ＿ｉｄ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）；  ｇｅｎｔｙｐｅ  ｓｕｂｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｒｃＳｕｂｇｒｏｕｐＩｄ）；  ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｃｏｕｎｔ，  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＊ｂａｒｒｉｅｒ＿ａｒｒａｙ  ）；  ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｓｈｕｆｆｌｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｈｕｆｆｌｅ＿ｃｎｔ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｃｎｔ）；  ｏｒ  ｇｅｎｔｙｐｅ  ｇｅｎｅｒａｌｉｚｅｄ＿ｓｈｕｆｆｌｅ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｗｏｒｋｉｔｅｍ＿ｉｄ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）のうちの少なくとも１つを含み得る。
【０１０２】
[0110]いくつかの例では、処理ユニット１は、処理ユニットによってアクセス可能である、または処理ユニットの任意のメモリコントローラを使用せずに第１のサブグループと第２のサブグループとの間のインターサブグループデータ転送を実行するように構成され得る。同様に、処理ユニット１は、処理ユニットによってアクセス可能である、または処理ユニットの任意のメモリコントローラにメモリ要求を送らずに第１のサブグループと第２のサブグループとの間のインターサブグループデータ転送を実行するように構成され得る。
【０１０３】
[0111]いくつかの例では、処理ユニット１は、第１のサブグループの第２の作業項目と第１のサブグループの第３の作業項目との間、または第２のサブグループの第２の作業項目と第２のサブグループの第３の作業項目との間のイントラサブグループデータ転送を実行するように構成され得る。
【０１０４】
[0112]処理ユニット１は、本開示で説明された１つまたは複数の技法を実行するように構成され得る。例えば、処理ユニット１は、本開示で説明された技法または任意技法を実行するように構成され得る。
【０１０５】
[0113]以下の番号が付けられた例は、本開示の１つまたは複数の態様を例示し得る。
【０１０６】
[0114]例１。  方法であって、処理ユニットが、障壁で、第１のサブグループに対応する作業項目と第２のサブグループに対応する作業項目を同期することと、処理ユニット１が、第１のサブグループと第２のサブグループとの間のインターサブグループデータ転送を実行することとを備える、方法。
【０１０７】
[0115]例２。  処理ユニットは、１つまたは複数の計算ユニットを含み、１つまたは複数の計算ユニットの各々は、１つまたは複数の処理要素を含み、処理ユニットは、１つまたは複数の計算ユニットによってアクセス可能なローカルメモリを含む、例２に記載の方法。
【０１０８】
[0116]例３。  ローカルメモリを使用せずに第１のサブグループと第２のサブグループとの間のインターサブグループデータ転送を実行することをさらに備える、例２に記載の方法。
【０１０９】
[0117]例４。  インターサブグループデータ転送は、第１のサブグループから第２のサブグループにデータをコピーすること、または第２のサブグループから第１のサブグループにデータをコピーすることを含む、例１に記載の方法。
【０１１０】
[0118]例５。  インターサブグループデータ転送は、第１のサブグループに関連付けられた第１のレジスタから、第２のサブグループに関連付けられた第２のレジスタにデータをコピーすること、または第２のサブグループに関連付けられた第２のレジスタから、第１のサブグループに関連付けられた第１のレジスタにデータをコピーすることを含む、例１に記載の方法。
【０１１１】
[0119]例６。  第１のレジスタは、汎用レジスタであり、第２のレジスタは、汎用レジスタである、例５に記載の方法。
【０１１２】
[0120]例７。  インターサブグループデータ転送は、第１のサブグループに対応する１つまたは複数の作業項目から第２のサブグループに対応する１つまたは複数の作業項目にデータをコピーすること、または第２のサブグループに対応する１つまたは複数の作業項目から第１のサブグループに対応する１つまたは複数の作業項目にデータをコピーすることを含む例１に記載の方法。
【０１１３】
[0121]例８。  インターサブグループデータ転送は、第１のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のレジスタから、第２のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のレジスタにデータをコピーすること、または第２のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のレジスタから第１のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のレジスタにデータをコピーすることを含む、例１に記載の方法。
【０１１４】
[0122]例９。  第１のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のレジスタおよび第２のサブグループに対応する１つまたは複数の作業項目に関連付けられた１つまたは複数のレジスタは、汎用レジスタである、例８に記載の方法。
【０１１５】
[0123]例１０。  第１のサブグループに対応する作業項目は、第１の作業グループに対応し、第２のサブグループに対応する作業項目は、第２の作業グループに対応する、例１、７、８、または９の任意の組み合わせに記載の方法。
【０１１６】
[0124]例１１。  第１のサブグループに対応する作業項目は、第１の作業グループに対応し、第２のサブグループに対応する作業項目は、第２の作業グループに対応する、例１、７、８、または９の任意の組み合わせに記載の方法。
【０１１７】
[0125]例１２。  障壁は、ネームド障壁である、例１に記載の方法。
【０１１８】
[0126]例１３。  ネームド障壁は、ｗｏｒｋ＿ｇｒｏｕｐ＿ｎａｍｅｄ＿ｂａｒｒｉｅｒ  （ｕｉｎｔ  ｓｕｂ＿ｇｒｏｕｐ＿ｃｏｕｎｔ）またはｃｌ＿ｋｈｒ＿ｓｕｂ＿ｇｒｏｕｐ＿ｎａｍｅｄ＿ｂａｒｒｉｅｒを含む、例１２に記載の方法。
【０１１９】
[0127]例１４。  ｓｕｂ＿ｇｒｏｕｐ＿ｃｏｕｎｔは、同期されるべき作業グループ中のサブグループの数を示し、第１のサブグループおよび第２のサブグループは、作業作業グループに属する、例１３に記載の方法。
【０１２０】
[0128]例１５。  障壁は、サブグループ障壁である、例１に記載の方法。
【０１２１】
[0129]例１６。  サブグループ障壁は、ｗｏｒｋ＿ｇｒｏｕｐ＿ｎａｍｅｄ＿ｂａｒｒｉｅｒ  （ｕｉｎｔ  ｓｕｂ＿ｇｒｏｕｐ＿ｃｏｕｎｔ）またはｃｌ＿ｋｈｒ＿ｓｕｂ＿ｇｒｏｕｐ＿ｎａｍｅｄ＿ｂａｒｒｉｅｒを含む、例１５に記載の方法。
【０１２２】
[0131]例１７。  ｓｕｂ＿ｇｒｏｕｐ＿ｃｏｕｎｔは、同期されるべき作業グループ中のサブグループの数を示し、第１のサブグループおよび第２のサブグループは、作業作業グループに属する、例１６に記載の方法。
【０１２３】
[0132]例１８。  インターサブグループデータ転送メカニズムを使用してインターサブグループデータ転送を実行することをさらに備える、例１−１７の任意の組み合わせに記載の方法。
【０１２４】
[0133]例１９。  インターサブグループデータ転送メカニズムは、処理ユニットによって実行可能なソフトウェア関数を含む、例１８に記載の方法。
【０１２５】
[0134]例２０。  ソフトウェア関数は、ＡＰＩ関数である、請求項１９に記載の方法。
【０１２６】
[0135]例２１。  ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｃｏｐｙ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）を含む、例２０に記載の方法。
【０１２７】
[0136]例２２。  ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｇｅｎｅｒａｌｉｚｅｄ＿ｓｈｕｆｆｌｅ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｆｉｂｅｒ＿ｉｄ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）を含む、例２０に記載の方法。
【０１２８】
[0137]例２３。  ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｓｕｂｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｒｃＳｕｂｇｒｏｕｐＩｄ）を含む、例２０に記載の方法。
【０１２９】
[0138]例２４。  ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｃｏｕｎｔ，  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＊ｂａｒｒｉｅｒ＿ａｒｒａｙ  ）を含む、例２０に記載の方法。
【０１３０】
[0139]例２５。  ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｓｈｕｆｆｌｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｈｕｆｆｌｅ＿ｃｎｔ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｃｎｔ）を含む、例２０に記載の方法。
【０１３１】
[0140]例２６。  ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｇｅｎｅｒａｌｉｚｅｄ＿ｓｈｕｆｆｌｅ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｗｏｒｋｉｔｅｍ＿ｉｄ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）を含む、例２０に記載の方法。
【０１３２】
[0141]例２７。  処理ユニットは、ＣＰＵまたはＧＰＵである、例１に記載の方法。
【０１３３】
[0142]例２８。  処理ユニットは、単一命令複数データ（ＳＩＭＤ）プロセッサ、複数命令複数データ（ＭＩＭＤ）プロセッサ、単一プログラム複数デイタ（ＳＰＭＤ）プロセッサ、または複数プログラム複数データ（ＭＰＭＤ）プロセッサである、例１に記載の方法。
【０１３４】
[0143]例２９。  処理ユニットの任意のメモリコントローラを使用せずに第１のサブグループと第２のサブグループとの間のインターサブグループデータ転送を実行することをさらに備える、例１に記載の方法。
【０１３５】
[0144]例３０。  処理ユニットの任意のメモリコントローラにメモリ要求を送らずに第１のサブグループと第２のサブグループとの間のインターサブグループデータ転送を実行することをさらに備える、例１に記載の方法。
【０１３６】
[0145]例３１。  処理ユニットが、第１のサブグループの第１の作業項目と第１のサブグループの第２の作業項目との間、または第２のサブグループの第１の作業項目と第２のサブグループの第２の作業項目との間のイントラサブグループデータ転送を実行することをさらに備える、例１に記載の方法。
【０１３７】
[0146]例３２。  イントラサブグループデータ転送メカニズムを使用してイントラサブグループデータ転送を実行することをさらに備える、例３１に記載の方法。
【０１３８】
[0147]例３３。  イントラサブグループデータ転送メカニズムは、処理ユニットによって実行可能なソフトウェア関数を含む、例３２に記載の方法。
【０１３９】
[0148]例３４。  ソフトウェア関数は、ＡＰＩ関数である、請求項３３に記載の方法。
【０１４０】
[0149]例３５。  ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｓｈｕｆｆｌｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｈｕｆｆｌｅ＿ｃｎｔ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｃｎｔ）を含む、例３４に記載の方法。
【０１４１】
[0150]例３６。  インターサブグループデータ転送メカニズムは、処理ユニットによって実行可能なソフトウェア関数を含み、ソフトウェア関数は、１つまたは複数のアトミック動作を含む、例１８に記載の方法。
【０１４２】
[0151]例３７。  インターサブグループデータ転送メカニズムは、処理ユニットによって実行可能なソフトウェア関数を含み、ソフトウェア関数は、１つのアトミック動作のみを含む、例１８に記載の方法。
【０１４３】
[0152]例３８。  インターサブグループデータ転送メカニズムは、処理ユニットによって実行可能なソフトウェア関数を含み、ソフトウェア関数は、複数のアトミック動作のみを含む、例１８に記載の方法。
【０１４４】
[0153]例３９。  第１のサブグループと第２のサブグループとの間のインターサブグループデータ転送は、同時に生じ得る、例１−３８の任意の組み合わせに記載の方法。
【０１４５】
[0154]例４０。  方法であって、処理ユニットが、１つまたは複数の障壁で複数のサブグループを同期することと、処理ユニットが、複数のサブグループのうちの２つ以上のサブグループの間のインターサブグループデータ転送を実行することとを備える、例４０に記載の方法。
【０１４６】
[0155]例４１。  複数のサブグループは、単一作業グループに属する、例４０に記載の方法。
【０１４７】
[0156]例４２。  処理ユニットは、１つまたは複数の計算ユニットを含み、１つまたは複数の計算ユニットの各々は、１つまたは複数の処理要素を含み、処理ユニットは、１つまたは複数の計算ユニットによってアクセス可能なローカルメモリを含む、例４０に記載の方法。
【０１４８】
[0157]例４３。  ローカルメモリを使用せずに複数のサブグループのうちの２つ以上のサブグループの間のインターサブグループデータ転送を実行することをさらに備える、例４２に記載の方法。
【０１４９】
[0158]例４４。  インターサブグループデータ転送は、複数のサブグループのうちの少なくとも１つのサブグループから複数のサブグループのうちの１つまたは複数の他のサブグループにデータをコピーすることを含む、例４０に記載の方法。
【０１５０】
[0159]例４５。  インターサブグループデータ転送は、ｘｏｒパターンに従って、少なくとも１つのサブグループから、複数のサブグループのうちの１つまたは複数の他のサブグループにデータをコピーすることを含む、例４０に記載の方法。
【０１５１】
[0160]例４６。  インターサブグループデータ転送は、第１のサブグループから第２のサブグループにデータをコピーすること、または第２のサブグループから第１のサブグループにデータをコピーすることのうちの少なくとも１つを含む、例４４または４５に記載の方法。
【０１５２】
[0161]例４７。  インターサブグループデータ転送は、第１のサブグループから第２のサブグループにデータをコピーすること、第１のサブグループから第３のサブグループにデータをコピーすること、第２のサブグループから第１のサブグループにデータをコピーすること、第２のサブグループから第３のサブグループにデータをコピーすること、第３のサブグループから第１のサブグループにデータをコピーすること、または第３のサブグループから第２のサブグループにデータをコピーすることのうちの少なくとも１つを含む、例４４または４５に記載の方法。
【０１５３】
[0162]例４８。  ｘｏｒパターンに従うインターサブグループデータ転送は、第１のサブグループから第２のサブグループにデータをコピーすること、第２のサブグループから第３のサブグループにデータをコピーすること、および第３のサブグループから第１のサブグループにデータをコピーすることを含む、例４５に記載の方法。
【０１５４】
[0163]例４９。  インターサブグループデータ転送は、第１のサブグループから第２のサブグループにデータをコピーすること、第１のサブグループから第３のサブグループにデータをコピーすること、第１のサブグループから第４のサブグループにデータをコピーすること、第２のサブグループから第１のサブグループにデータをコピーすること、第２のサブグループから第３のサブグループにデータをコピーすること、第２のサブグループから第４のサブグループにデータをコピーすること、第３のサブグループから第１のサブグループにデータをコピーすること、第３のサブグループから第２のサブグループにデータをコピーすること、第３のサブグループから第４のサブグループにデータをコピーすること、第４のサブグループから第１のサブグループにデータをコピーすること、第４のサブグループから第２のサブグループにデータをコピーすること、または第４のサブグループから第３のサブグループにデータをコピーすることのうちの少なくとも１つを含む、例４４または４５に記載の方法。
【０１５５】
[0164]例５０。  ｘｏｒパターンに従うインターサブグループデータ転送は、第１のサブグループから第２のサブグループにデータをコピーすること、第２のサブグループから第１のサブグループにデータをコピーすること、第３のサブグループから第４のサブグループにデータをコピーすること、第４のサブグループから第３のサブグループにデータをコピーすることを含む、例４５に記載の方法。
【０１５６】
[0165]例５１。  ｘｏｒパターンに従うインターサブグループデータ転送は、第１のサブグループから第２のサブグループにデータをコピーすること、第２のサブグループから第３のサブグループにデータをコピーすること、第３のサブグループから第４のサブグループにデータをコピーすること、第４のサブグループから第１のサブグループにデータをコピーすることを含、例４５に記載の方法。
【０１５７】
[0166]例５２。  複数のサブグループのうちの少なくとも１つのサブグループと複数のサブグループのうちの１つまたは複数の他のサブグループとの間のインターサブグループデータ転送は、同時に生じる、例４４または４５に記載の方法。
【０１５８】
[0167]例53。  複数のサブグループは、２、３、４、５、６、７、８、またはより多くのサブグループを含み、インターサブグループデータ転送は、第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第１のサブグループから、第２のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループのうちの少なくとも１つにデータをコピーすること、第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第２のサブグループから、第１のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループのうちの少なくとも１つにデータをコピーすること、第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第３のサブグループから、第１のサブグループ、第２のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループのうちの少なくとも１つにデータをコピーすること、第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第４のサブグループから、第１のサブグループ、第２のサブグループ、第３のサブグループ、第５のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループのうちの少なくとも１つにデータをコピーすること、第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第５のサブグループから、第１のサブグループ、第２のサブグループ、第３のサブグループ、第４のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループのうちの少なくとも１つにデータをコピーすること、第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々��みが利用可能であるとして、第６のサブグループから、第１のサブグループ、第２のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第７のサブグループ、または第８のサブグループのサブグループのうちの少なくとも１つにデータをコピーすること、第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第７のサブグループから、第１のサブグループ、第２のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、または第８のサブグループのサブグループのうちの少なくとも１つにデータをコピーすること、第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第８のサブグループから、第１のサブグループ、第２のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、または第７のサブグループのサブグループのうちの少なくとも１つにデータをコピーすることのうちの少なくとも１つを含む、例４０に記載の方法。
【０１５９】
[0168]例５４。  複数のサブグループは、２、３、４、５、６、７、８、またはより多くのサブグループを含み、インターサブグループデータ転送は、第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第１のサブグループに関連付けられた１つまたは複数のレジスタから、第２のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループに関連付けられた少なくとも１つのレジスタにデータをコピーすること、第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第２のサブグループに関連付けられた１つまたは複数のレジスタから、第１のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループに関連付けられた少なくとも１つのレジスタにデータをコピーすること、第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第３のサブグループからに関連付けられた１つまたは複数のレジスタ、第１のサブグループ、第２のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループに関連付けられた少なくとも１つのレジスタにデータをコピーすること、第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第４のサブグループに関連付けられた１つまたは複数のレジスタから、第１のサブグループ、第２のサブグループ、第３のサブグループ、第５のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブグループに関連付けられた少なくとも１つのレジスタにデータをコピーすること、第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第５のサブグループに関連付けられた１つまたは複数のレジスタから、第１のサブグループ、第２のサブグループ、第３のサブグループ、第４のサブグループ、第６のサブグループ、第７のサブグループ、または第８のサブグループのサブ���ループに関連付けられた少なくとも１つのレジスタにデータをコピーすること、第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第６のサブグループに関連付けられた１つまたは複数のレジスタから、第１のサブグループ、第２のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第７のサブグループ、または第８のサブグループのサブグループに関連付けられた少なくとも１つのレジスタにデータをコピーすること、第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第７のサブグループに関連付けられた１つまたは複数のレジスタから、第１のサブグループ、第２のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、または第８のサブグループのサブグループに関連付けられた少なくとも１つのレジスタにデータをコピーすること、第１、第２、第３、第４、第５、第６、第７、第８のサブグループが複数のサブグループ中に存在するような必要な数のサブグループを複数のサブグループが含む場合、第１、第２、第３、第４、第５、第６、第７、第８のサブグループの各々のみが利用可能であるとして、第８のサブグループに関連付けられた１つまたは複数のレジスタから、第１のサブグループ、第２のサブグループ、第３のサブグループ、第４のサブグループ、第５のサブグループ、第６のサブグループ、または第７のサブグループのサブグループに関連付けられた少なくとも１つのレジスタにデータをコピーすることのうちの少なくとも１つを含む、例４０に記載の方法。
【０１６０】
[0169]例５５。  １つまたは複数の障壁は、１つまたは複数のネームド障壁を含む、例４０に記載の方法。
【０１６１】
[0170]例５６。  １つまたは複数のネームド障壁は、ｗｏｒｋ＿ｇｒｏｕｐ＿ｎａｍｅｄ＿ｂａｒｒｉｅｒ  （ｕｉｎｔ  ｓｕｂ＿ｇｒｏｕｐ＿ｃｏｕｎｔ）またはｃｌ＿ｋｈｒ＿ｓｕｂ＿ｇｒｏｕｐ＿ｎａｍｅｄ＿ｂａｒｒｉｅｒを含む、例５５に記載の方法。
【０１６２】
[0172]例５７。  ｓｕｂ＿ｇｒｏｕｐ＿ｃｏｕｎｔは、同期されるべき作業グループ中のサブグループの数を示す、例５６に記載の方法。
【０１６３】
[0173]例５８。  １つまたは複数の障壁は、１つまたは複数のサブグループ障壁を含む、例４０に記載の方法。
【０１６４】
[0174]例５９。  １つまたは複数のサブグループ障壁は、ｗｏｒｋ＿ｇｒｏｕｐ＿ｎａｍｅｄ＿ｂａｒｒｉｅｒ  （ｕｉｎｔ  ｓｕｂ＿ｇｒｏｕｐ＿ｃｏｕｎｔ）またはｃｌ＿ｋｈｒ＿ｓｕｂ＿ｇｒｏｕｐ＿ｎａｍｅｄ＿ｂａｒｒｉｅｒを含む、例５９に記載の方法。
【０１６５】
[0176]例６０。  ｓｕｂ＿ｇｒｏｕｐ＿ｃｏｕｎｔは、同期されるべき作業グループ中のサブグループの数を示す、例６０に記載の方法。
【０１６６】
[0177]例６１。  インターサブグループデータ転送メカニズムを使用してインターサブグループデータ転送を実行することをさらに備える、例４０−６０の任意の組み合わせに記載の方法。
【０１６７】
[0178]例６２。  インターサブグループデータ転送メカニズムは、処理ユニットによって実行可能なソフトウェア関数を含む、例６１に記載の方法。
【０１６８】
[0179]例６３。  ソフトウェア関数は、ＡＰＩ関数である、請求項６２に記載の方法。
【０１６９】
[0180]例６４。  ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｃｏｐｙ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）を含む、例６３に記載の方法。
【０１７０】
[0181]例６５。  ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｇｅｎｅｒａｌｉｚｅｄ＿ｓｈｕｆｆｌｅ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｆｉｂｅｒ＿ｉｄ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）を含む、例６３に記載の方法。
【０１７１】
[0182]例６６。  ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｓｕｂｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｒｃＳｕｂｇｒｏｕｐＩｄ）を含む、例６３に記載の方法。
【０１７２】
[0183]例６７。  ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｃｏｕｎｔ，  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＊ｂａｒｒｉｅｒ＿ａｒｒａｙ）を含む、例６３に記載の方法。
【０１７３】
[0184]例６８。  ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｓｈｕｆｆｌｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｈｕｆｆｌｅ＿ｃｎｔ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｃｎｔ）を含む、例６３に記載の方法。
【０１７４】
[0185]例６９。  ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｇｅｎｅｒａｌｉｚｅｄ＿ｓｈｕｆｆｌｅ（ｇｅｎｔｙｐｅ  ｖａｒｉａｂｌｅ，  ｉｎｔ  ｗｏｒｋｉｔｅｍ＿ｉｄ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｉｄ，  ｉｎｔ  ｎａｍｅｄ＿ｂａｒｒｉｅｒ＿ｉｄ）を含む、例６３に記載の方法。
【０１７５】
[0186]例７０。  処理ユニットは、ＣＰＵまたはＧＰＵである、例４０に記載の方法。
【０１７６】
[0187]例７１。  処理ユニットは、単一命令複数データ（ＳＩＭＤ）プロセッサ、複数命令複数データ（ＭＩＭＤ）プロセッサ、単一プログラム複数デイタ（ＳＰＭＤ）プロセッサ、または複数プログラム複数データ（ＭＰＭＤ）プロセッサである、例４０に記載の方法。
【０１７７】
[0188]例７２。  処理ユニットの任意のメモリ制御コントローラを使用せずに、複数のサブグループのうちの２つ以上のサブグループの間のインターサブグループデータ転送を実行すること、または処理ユニットの任意のメモリコントローラにメモリ要求を送らずに、複数のサブグループの２つ以上のサブグループの間のインターサブグループデータ転送を実行することをさらに備える、例４０に記載の方法。
【０１７８】
[0189]例７３。  処理ユニットが、複数のサブグループのうちの単一サブグループ内の２つ以上の作業グループの間のイントラサブグループデータ転送を実行することをさらに備える、例４０に記載の方法。
【０１７９】
[0190]例７４。  処理ユニットが、複数のサブグループのうちの各サブグループないの２つ以上の作業項目の間のイントラサブグループデータ転送を実行することをさらに備え、イントラサブグループデータ転送は、異なるサブグループに属する作業項目の間のデータを転送しない、例４０に記載の方法。
【０１８０】
[0191]例７５。  イントラサブグループデータ転送メカニズムを使用してイントラサブグループデータ転送を実行することをさらに備える、例７３または７４に記載の方法。
【０１８１】
[0192]例７６。  イントラサブグループデータ転送メカニズムは、処理ユニットによって実行可能なソフトウェア関数を含む、例７５に記載の方法。
【０１８２】
[0193]例７７。  ソフトウェア関数は、ＡＰＩ関数である、請求項７６に記載の方法。
【０１８３】
[0194]例７８。  ＡＰＩ関数は、ｇｅｎｔｙｐｅ  ｓｕｂ＿ｇｒｏｕｐ＿ｓｈｕｆｆｌｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝＿ｅｘｃｈａｎｇｅ＿｛ｕｐ｜ｄｏｗｎ｜ｘｏｒ｝（ｇｅｎｔｙｐｅ  ｖａｒ，  ｉｎｔ  ｓｈｕｆｆｌｅ＿ｃｎｔ，  ｉｎｔ  ｓｕｂｇｒｏｕｐ＿ｃｎｔ）を含む、例７７に記載の方法。
【０１８４】
[0195]例７９。  インターサブグループデータ転送メカニズムは、処理ユニットによって実行可能なソフトウェア関数を含み、ソフトウェア関数は、１つまたは複数のアトミック動作を含む、例６１に記載の方法。
【０１８５】
[0196]例８０。  インターサブグループデータ転送メカニズムは、処理ユニットによって実行可能なソフトウェア関数を含み、ソフトウェア関数は、１つのアトミック動作のみを含む、例６１に記載の方法。
【０１８６】
[0197]例８１。  インターサブグループデータ転送メカニズムは、処理ユニットによって実行可能なソフトウェア関数を含み、ソフトウェア関数は、複数のアトミック動作のみを含む、例６１に記載の方法。
【０１８７】
[0198]例８２。  複数のサブグループは、２つのサブグループ、３つのサブグループ、４つのサブグループ、５つのサブグループ、６つのサブグループ、７つのサブグループ、または８つのサブグループを含む、例４０−８１の任意の組み合わせに記載の方法。
【０１８８】
[0199]例８３。  インターサブグループデータ転送は、複数のサブグループのうちの２つ以上のサブグループに関連付けられた１つまたは複数のレジスタから複数のサブグループのｋ２つ以上のサブグループに関連付けられた１つまたは複数のレジスタにデータをコピーすることを含む、例４０−８２の任意の組み合わせに記載の方法。
【０１８９】
[0200]例８４。  ２つ以上のサブグループに関連付けられた１つまたは複数のレジスタ、および２つ以上のサブグループに関連付けられた１つまたは複数の他のレジスタは、汎用レジスタを含む、例８３に記載の方法。
【０１９０】
[0201]例８５。  １つまたは複数の障壁で複数のサブグループを同期することは、複数のサブグループのうちの各サブグループに対応する１つまたは複数の作業項目を同期することを含む、例４０−８４の任意の組み合わせに記載の方法。
【０１９１】
[0202]例８６。  複数のサブグループのうちの２つ以上のサブグループの間のインターサブグループデータ転送を実行することは、２つ以上のサブグループのうちの２つ以上の作業項目の間のインターサブグループデータ転送を実行することを含み、２つ以上の作業項目のうちの少なくとも２つは、２つ以上のグループの異なるサブグループに属する。
【０１９２】
[0203]例８７。  インターサブグループデータ転送は、複数のサブグループのうちの少なくとも１つのサブグループの１つまたは複数の作業項目に関連付けられた１つまたは複数のレジスタから、複数のサブグループのうちの１つまたは複数の他のサブグループの１つまたは複数の他の作業項目に関連付けられた１つまたは複数のレジスタにデータをコピーすることを含む、例８５または８６に記載の方法。
【０１９３】
[0204]例８８。  複数のサブグループのうちの少なくとも１つのサブグループの１つまたは複数の作業項目に関連付けられた１つまたは複数のレジスタおよび複数のサブグループのうちの１つまたは複数の他のサブグループの１つまたは複数の他のサブグループの１つまたは複数の他の作業項目に関連付けられた１つまたは複数のレジスタは、汎用レジスタである、例８７に記載の方法。
【０１９４】
[0205]例８９。  複数のサブグループうちの１つまたは複数のサブグループの間のインターサブグループデータ転送は、同時に生じ得る、例４０−８８の任意の組み合わせに記載の方法。
【０１９５】
[0206]例９０。  ２つ以上の作業項目の間のインターサブグループデータ転送は、同時に生じ得る、例４０−８８の任意の組み合わせに記載の方法。
【０１９６】
[0207]例９１。  例１−３９の任意の組み合わせを備える、方法。
【０１９７】
[0208]例９２。  例４０−９０の任意の組み合わせを備える、方法。
【０１９８】
[0209]例９３。  例１−９０の任意の組み合わせを備える、方法。
例９４。  本開示の１つまたは複数の技法を備える、方法。
【０１９９】
[0210]例９５。  本開示に説明されたデバイス。
【０２００】
[0211]例９６。  デバイスであって、メモリと、本開示で説明された１つまたは複数の技法を実行するように構成された１つまたは複数の処理ユニットとを備える、デバイス。
【０２０１】
[0212]例９７。  メモリと、例１−３９および例９４の組み合わせの方法を実行するように構成された１つまたは複数の処理ユニットとを備える、デバイス。
【０２０２】
[0213]例９８。  メモリと、例４０−９０および例９４の組み合わせの方法を実行するように構成された１つまたは複数の処理ユニットとを備える、デバイス。
【０２０３】
[0214]例９９。  メモリと、例１−９４の組み合わせの方法を実行するように構成された１つまたは複数の処理ユニットとを備える、デバイス。
【０２０４】
[0215]例１００。  例１−３９および例９４の任意の組み合わせの方法を実行するための１つまたは複数の手段を備える、装置。
【０２０５】
[0216]例１０１。  例４０−９０および例９４の任意の組み合わせの方法を実行するための１つまたは複数の手段を備える、装置。
【０２０６】
[0217]例１０２。  例１−９４の任意の組み合わせの方法を実行するための１つまたは複数の手段を備える、装置。
【０２０７】
[0218]例１０３。  本開示で説明された１つまたは複数の技法を実行するための１つまたは複数の手段を備える、装置。
【０２０８】
[0219]例１０４。  １つまたは複数の手段は、１つまたは複数の処理ユニットを備える、例１００、１０１、１０２、または１０３に記載の装置。
【０２０９】
[0220]例１０５。  １つまたは複数の処理ユニットは、１つまたは複数のＣＰＵまたは１つまたは複数のＧＰＵのうちの少なくとも１つを含む、例１０４に記載の方法。
【０２１０】
[0221]例１０６。  １つまたは複数の処理ユニットは、単一命令複数データ（ＳＩＭＤ）プロセッサ、複数命令複数データ（ＭＩＭＤ）プロセッサ、単一プログラム複数デイタ（ＳＰＭＤ）プロセッサ、または複数プログラム複数データ（ＭＰＭＤ）プロセッサのうちの少なくとも１つを含む、例１０４に記載の方法。
【０２１１】
[0222]例１０７。  実行されると、１つまたは複数の処理ユニットに、例１−３９、および９４の任意の組み合わせに記載の方法を実行させる命令を記憶することを有する、コンピュータ可読記憶媒体。
【０２１２】
[0223]例１０８。  実行されると、１つまたは複数の処理ユニットに、例４０−９０、および９４の任意の組み合わせに記載の方法を実行させる命令を記憶することを有する、コンピュータ可読記憶媒体。
【０２１３】
[0224]例１０９。  実行されると、１つまたは複数の処理ユニットに、例１−９４の任意の組み合わせに記載の方法を実行させる命令を記憶することを有する、コンピュータ可読記憶媒体。
【０２１４】
[0225]例１１０。  実行されると、１つまたは複数の処理ユニットに、１つまたは複数の処理ユニットに、本開示に説明された１つまたは複数の技法を実行させる命令を記憶することを有する、コンピュータ可読記憶媒体。
【０２１５】
[0226]例１１１。  本開示に説明された処理ユニット。
【０２１６】
[0227]本開示に従って、「または」という用語は、「および／または」としてインタラプトされ、コンテキストは、さもなければ指示しない。追加として、「１つまたは複数の」または「少なくとも１つ」、あるいは同様なもののようなフレーズは、本開示に説明されるいくつかの特徴のために使用されるが、このような言葉が使用されないような特徴は、このような暗黙の意味を有するように解釈され得、ここで、コンテキストは、さもなければ指示しない。
【０２１７】
[0228]技法の様々な態様の特定の組み合わせは、上で説明されるが、これらの組み合わせは、本開示中に説明される技法の例を単に例示ために与えられ得る。従って、本開示の技法は、これらの例に限定さ入れるべきではなく、本開示中に説明される技法の様々な態様の任意の想像できる組み合わせを包含し得る。
【０２１８】
[0229]本開示で説明された技法は、ハードウェア、ソフトウェア、ファームウェア、又はこれらの組み合わせの少なくとも部分においてインプリメントされ得る。例えば、説明される技法の様々な態様は、１つ又は複数のマイクロプロセッサ、デジタルシグナルプロセッサ（ＤＳＰ）、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、または任意の他の等価な集積またはディスクリート論理回路、およびこのようなコンポーネントの任意の組み合わせを含む１つまたは複数のプロセッサ内でインプリメントされ得る。「プロセッサ」または「プロセッサ回路」という用語は、前述の論理回路、他の論理回路から離れてまたは組み合わされたもの、あるいは、処理を実行するディスクリートハードウェアのような任意の他の等価な回路のうちの任意の組み合わせを一般に参照し得る。
【０２１９】
[0230]このようなハードウェア、ソフトウェア、およびファームウェアは、本開示内で説明された様々な動作および関数をサポートするために同じデバイス内でまたは別個のデバイス内でインプリメントされ得る。加えて、説明されたユニットのうちの任意のものは、共にインプリメントされ得るまたは相互利用可能な論理デバイスであるが別個として個別にインプリメントされ得る。モジュールまたはユニットとして異なる特徴の描写は、異なる機能の態様を強調するように意図され、必ずしもこのようなモジュールまたはユニットが別個のハードウェアまたはソフトウェアコンポーネントによる実現を暗示するわけではない。むしろ、１つまたは複数のモジュールまたはユニットに関連付けられた機能性は、個別のハードウェア、ファームウェア、および／またはソフトウェアコンポーネントによって実行され得る、または共通または個別のハードウェアまたはハードウェアコンポーネント内に集積され得る。
【０２２０】
[0231]本開示中に説明された技法はまた、命令を記憶するコンピュータ可読記憶媒体のようなコンピュータ可読媒体内に記憶される、具体化される、または符号化され得る。コンピュータ可読媒体内に具体化されるまたは符号化される命令は、例えば、命令が１つまたは複数のプロセッサによって実行されるとき、１つまたは複数のプロセッサに、本明細書に説明される技法を実行させ得る。コンピュータ可読記憶媒体は、ランダムアクセスメモリ（ＲＡＭ）、読取専用メモリ（ＲＯＭ）、プログラマブル読取専用メモリ（ＰＲＯＭ）、消去可能でプログラマブル読取専用メモリ（ＥＰＲＯＭ）、電気的に消去可能なプログラマブル読取専用メモリ（ＥＥＰＲＯＭ（登録商標））、フラッシュメモリ、ハードディスク、ＣＤ−ＲＯＭ、フロッピー（登録商標）ディスク、カセット、磁気媒体、高額媒体、または有形である他のコンピュータ可読記憶媒体を含み得る。
【０２２１】
[0232]コンピュータ可読媒体は、上でリストされるような、有形記憶媒体に対応する、コンピュータ可読記憶媒体を含み得る。コンピュータ可読媒体はまた、例えば、通信プロトコルに従って、コンピュータプログラムの１つの場所から別の場所への転送を容易にする任意の媒体を含む通信媒体を含み得る。このように、「コンピュータ可読媒体」という用語は概して、（１）非一時的である有体のコンピュータ可読記憶媒体、または（２）信号または搬送波のような非有体コンピュータ可読通信媒体に対応し得る。
【０２２２】
[0233]様々な態様および例が説明されている。しかしながら、修正は、以下の特許請求の範囲の範囲から逸脱しない本開示の構造または技法に対して行うことができる。
【図１】
2019515384.tif 000003
【図２】
2019515384.tif 000004
【図３】
2019515384.tif 000005
【図４】
2019515384.tif 000006
【図５】
2019515384.tif 000007
【図６】
2019515384.tif 000008
【図７】
2019515384.tif 000009
【図８】
2019515384.tif 000010
【図９】
2019515384.tif 000011
【国際調査報告】
2019515384.tif 000012
2019515384.tif 000013