Skip to content

Latest commit

 

History

History
161 lines (109 loc) · 8.95 KB

atomics.adoc

File metadata and controls

161 lines (109 loc) · 8.95 KB

アトミック

この章の目的は、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 機能を公開していません。アプリは OpAtomicIAddOpAtomicISub を値 1 で使用することで、同じ結果を得ることができます。

拡張機能のアトミック対応

アトミックの追加サポートを公開している現在の拡張機能は以下の通りです。

それぞれの詳細は以下の通りです。

VK_KHR_shader_atomic_int64

Note

Vulkan 1.2でコアに昇格

この拡張機能により、バッファ共有メモリに対して、64-bit int のアトミック操作が可能になります。INT64Atomics SPIR-V 機能が宣言されている場合、サポートされているすべての SPIR-V 操作を 64-bit int で使用することができます。

shaderBufferInt64AtomicsshaderSharedInt64Atomics の2つの機能ビットは、64-bit int アトミックにどのストレージクラスがサポートされているかをクエリするために使用されます。

  • shaderBufferInt64Atomics - バッファ

  • shaderSharedInt64Atomics - 共有メモリ

shaderBufferInt64Atomics は、Vulkan 1.2以上を使用しているか、拡張機能が公開されている場合には、常に対応が保証されています。

VK_EXT_shader_image_atomic_int64

この拡張機能により、イメージスパースイメージに対して、64-bit int のアトミック操作が可能になります。Int64Atomics および Int64ImageEXT SPIR-V 機能が宣言されている場合、サポートされているすべての SPIR-V 操作を 64-bit int でイメージに対して使用することができます。

イメージとスパースイメージの対応の比較

この拡張機能では、shaderImageInt64AtomicssparseImageInt64Atomics の両方の機能ビットを公開しています。sparseImage* 機能は追加の機能ビットであり、shaderImage* ビットも有効になっている場合にのみ使用が許可されます。ハードウェアの中には、スパースリソースを持つイメージに対してアトミック操作を行うのが難しいものもあります。そのため、アトミック機能を分割して、実装が公開できる追加機能としてスパースイメージを許可しています。

VK_EXT_shader_atomic_float

この拡張機能では、バッファ共有メモリイメージスパースイメージに対して、float 型のアトミック操作を行うことができます。この拡張機能では、float 型に対してサポートされている操作のサブセットのみがサポートされています。

この拡張機能では、多くの機能ビットがリストアップされています。それらをグループ化する一つの方法は、 *Float*Atomics*Float*AtomicAdd です。

  • *Float*Atomics 機能では、float 型に対して OpAtomicStoreOpAtomicLoadOpAtomicExchange を使用することができます。

    • 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 では、imageAtomicExchange のために r32f 上のアトミックの使用が可能でした。移植の際には、アプリケーションは Vulkan でも同じことができるように shaderImageFloat32Atomics の対応をチェックする必要があります。

VK_EXT_shader_atomic_float2

この拡張機能は、VK_EXT_shader_atomic_float にはない2つの機能を追加します。

まず、上述の VK_EXT_shader_atomic_float と同じ方法で、バッファ共有メモリの両方に 16-bit float を追加します。

  • shaderBufferFloat16* - バッファ

  • shaderSharedFloat16* - 共有メモリ

次に、minmax のアトミック操作(OpAtomicFMinEXTOpAtomicFMaxEXT)に float のサポートを追加しました。

16-bit float をサポートします(AtomicFloat16MinMaxEXT 機能)。

  • shaderBufferFloat16AtomicMinMax - バッファ

  • shaderSharedFloat16AtomicMinMax - 共有メモリ

32-bit float をサポートします(AtomicFloat32MinMaxEXT 機能)。

  • shaderBufferFloat32AtomicMinMax - バッファ

  • shaderSharedFloat32AtomicMinMax - 共有メモリ

  • shaderImageFloat32AtomicMinMax - イメージ

  • sparseImageFloat32AtomicMinMax - スパースイメージ

64-bit float をサポートします(AtomicFloat64MinMaxEXT 機能)。

  • shaderBufferFloat64AtomicMinMax - バッファ

  • shaderSharedFloat64AtomicMinMax - 共有メモリ