この章の目的は、Vulkan がアトミック操作のために公開しているさまざまな機能をユーザーが理解できるようにすることです。
さまざまな拡張機能を理解するためには、さまざまな種類のアトミックを知っておくことが重要です。
-
型
-
float
-
int
-
-
ビット数
-
16 bit
-
32 bit
-
64 bit
-
-
操作
-
loads
-
stores
-
exchange
-
add
-
min
-
max
-
等
-
-
ストレージクラス
-
StorageBuffer
またはUniform
(バッファ) -
Workgroup
(共有メモリ) -
Image
(イメージまたはスパースイメージ)
-
Vulkan 1.0で拡張機能がない場合、アプリケーションはアトミックに 32-bit int
型を使用することができます。これは、サポートされているすべての SPIR-V 操作(load、store、exchangeなど)に使用できます。SPIR-V には、Kernel
機能でガードされ、現在 Vulkan では許可されていないアトミック操作があります。
GLSL と SPIR-V の両方がアトミックカウンタをサポートしていますが、Vulkan は AtomicCounter
ストレージクラスを使用するために必要な SPIR-V の AtomicStorage
機能を公開していません。アプリは OpAtomicIAdd
と OpAtomicISub
を値 1
で使用することで、同じ結果を得ることができます。
アトミックの追加サポートを公開している現在の拡張機能は以下の通りです。
それぞれの詳細は以下の通りです。
Note
|
Vulkan 1.2でコアに昇格 |
この拡張機能により、バッファと共有メモリに対して、64-bit int
のアトミック操作が可能になります。INT64Atomics
SPIR-V 機能が宣言されている場合、サポートされているすべての SPIR-V 操作を 64-bit int
で使用することができます。
shaderBufferInt64Atomics
と shaderSharedInt64Atomics
の2つの機能ビットは、64-bit int
アトミックにどのストレージクラスがサポートされているかをクエリするために使用されます。
-
shaderBufferInt64Atomics
- バッファ -
shaderSharedInt64Atomics
- 共有メモリ
shaderBufferInt64Atomics
は、Vulkan 1.2以上を使用しているか、拡張機能が公開されている場合には、常に対応が保証されています。
この拡張機能により、イメージとスパースイメージに対して、64-bit int
のアトミック操作が可能になります。Int64Atomics
および Int64ImageEXT
SPIR-V 機能が宣言されている場合、サポートされているすべての SPIR-V 操作を 64-bit int
でイメージに対して使用することができます。
この拡張機能では、shaderImageInt64Atomics
と sparseImageInt64Atomics
の両方の機能ビットを公開しています。sparseImage*
機能は追加の機能ビットであり、shaderImage*
ビットも有効になっている場合にのみ使用が許可されます。ハードウェアの中には、スパースリソースを持つイメージに対してアトミック操作を行うのが難しいものもあります。そのため、アトミック機能を分割して、実装が公開できる追加機能としてスパースイメージを許可しています。
この拡張機能では、バッファ、共有メモリ、イメージ、スパースイメージに対して、float
型のアトミック操作を行うことができます。この拡張機能では、float
型に対してサポートされている操作のサブセットのみがサポートされています。
この拡張機能では、多くの機能ビットがリストアップされています。それらをグループ化する一つの方法は、 *Float*Atomics
と *Float*AtomicAdd
です。
-
*Float*Atomics
機能では、float
型に対してOpAtomicStore
、OpAtomicLoad
、OpAtomicExchange
を使用することができます。-
OpAtomicCompareExchange
操作は、SPIR-V 仕様ではint
型しか認められていないため、含まれていないことに注意してください。
-
-
*Float*AtomicAdd
機能では、SPIR-V の 2 つの拡張操作AtomicFloat32AddEXT
およびAtomicFloat64AddEXT
を使用することができます。
ここから、残りの機能の組み合わせは、32-bit float
のサポートというグループに分類されます。
-
shaderBufferFloat32*
- バッファ -
shaderSharedFloat32*
- 共有メモリ -
shaderImageFloat32*
- イメージ -
sparseImageFloat32*
- スパースイメージ
64-bit float
のサポートは以下になります。
-
shaderBufferFloat64*
- バッファ -
shaderSharedFloat64*
- 共有メモリ
Note
|
OpenGL の OES_shader_image_atomic では、 |
Note
|
この拡張機能は、VK_EXT_shader_atomic_float
にはない2つの機能を追加します。
まず、上述の VK_EXT_shader_atomic_float
と同じ方法で、バッファと共有メモリの両方に 16-bit float
を追加します。
-
shaderBufferFloat16*
- バッファ -
shaderSharedFloat16*
- 共有メモリ
次に、min
と max
のアトミック操作(OpAtomicFMinEXT
と OpAtomicFMaxEXT
)に float
のサポートを追加しました。
16-bit float
をサポートします(AtomicFloat16MinMaxEXT
機能)。
-
shaderBufferFloat16AtomicMinMax
- バッファ -
shaderSharedFloat16AtomicMinMax
- 共有メモリ
32-bit float
をサポートします(AtomicFloat32MinMaxEXT
機能)。
-
shaderBufferFloat32AtomicMinMax
- バッファ -
shaderSharedFloat32AtomicMinMax
- 共有メモリ -
shaderImageFloat32AtomicMinMax
- イメージ -
sparseImageFloat32AtomicMinMax
- スパースイメージ
64-bit float
をサポートします(AtomicFloat64MinMaxEXT
機能)。
-
shaderBufferFloat64AtomicMinMax
- バッファ -
shaderSharedFloat64AtomicMinMax
- 共有メモリ