이 장의 목적은 사용자가 Vulkan이 아토믹 조작을 위해 제공하고 있는 다양한 기능을 사용자가 이해할 수 있도록 하는 것입니다.
다양한 확장 기능을 이해하기 위해서는 먼저 다양한 유형의 아토믹 구조를 파악하는 것이 중요합니다.
-
타입
-
float
-
int
-
-
비트 수
-
16 bit
-
32 bit
-
64 bit
-
-
연산
-
loads
-
stores
-
exchange
-
add
-
min
-
max
-
etc.
-
-
스토리지 클래스(Stroage Class, 저장 영역)
-
StorageBuffer
orUniform
(buffer) -
Workgroup
(shared memory) -
Image
(image or sparse image)
-
Vulkan 1.0에서 확장 기능이 없는 경우, 애플리케이션이 아토믹에 32비트 int
유형을 사용할 수 있습니다. 이는 지원되는 모든 SPIR-V 연산(호출, 저장, 교환 등)에 사용할 수 있습니다. SPIR-V에는 커널(Kernel)
기능으로 보호되는 일부 아토믹 연산이 포함되어 있으며 현재 Vulkan에서는 허용되지 않습니다.
GLSL과 SPIR-V 모두 아토믹 카운터 사용을 지원하지만, Vulkan은 AtomicCounter
스토리지 클래스를 사용하는 데 필요한 AtomicStorage
SPIR-V 기능을 공개하지 않습니다. 앱에서 OpAtomiclAdd
및 OpAtomiclSub
를 1
로 사용하는 것으로 동일한 결과를 얻을 수 있습니다.
현재 아토믹의 추가 지원을 공개하고 있는 확장 기능은 다음과 같습니다.
아래에서 각각에 대해 자세히 설명합니다.
Note
|
Vulkan 1.2에서 코어로 승격되었습니다. |
이 확장 기능을 통해 버퍼(buffers)와 공유 메모리(shared memory)에 대한 64비트 int
아토믹 연산을 허용합니다. Int64Atomics
SPIR-V 기능을 선언하면, 지원되는 모든 SPIR-V 연산을 64비트 int
와 함께 사용할 수 있습니다.
두 개의 기능 비트인 shaderBufferInt64Atomics
와 shaderSharedInt64Atomics
는 64비트 int
아토믹에 어떤 스토리지 클래스가 지원되는지 쿼리하는 데 사용됩니다.
-
shaderBufferInt64Atomics
- buffers -
shaderSharedInt64Atomics
- shared memory
shaderBufferInt64Atomics
는 Vulkan 1.2 이상을 사용하거나 확장 기능이 공개되어 있는 경우에는 항상 지원되도록 보장됩니다.
이 확장 기능은 이미지(images)와 희소 이미지(sparse images)에 대한 64비트 int
아토믹 연산을 허용합니다. Int64Atomics
및 Int64ImageEXT
SPIR-V 기능을 선언하면 지원되는 모든 SPIR-V 연산을 이미지에서 64-bit int
와 함께 사용할 수 있습니다.
이 확장 기능에서는 shaderImageInt64Atomics
및 sparseImageInt64Atomics
기능 비트를 모두 공개합니다. sparseImage*
기능은 추가 기능 비트이며 shaderImage*
비트도 활성화된 경우에만 사용할 수 있습니다. 일부 하드웨어는 sparse resources가 있는 이미지에서 아토믹 연산을 수행하는 데 어려움을 겪기 때문에 아토믹 기능을 분할하여 구현 내용을 공개할 수 있는 추가 기능으로 희소 이미지(sparse images)를 허용하고 있습니다.
이 확장을 사용하면 버퍼(buffers), 공유 메모리(shared memory), 이미지(images) 및 희소 이미지(sparse images)에 대한 float
아토믹 연산을 사용할 수 있습니다. 이 확장 기능에서는 float
유형에 대해 일부 연산만 지원됩니다.
이 확장에는 많은 기능 비트가 나열되어 있습니다. 이들을 그룹화하는 한 가지 방법은 *Float*Atomics
와 *Float*AtomicAdd
를 사용하는 것입니다:
-
*Float*Atomics
기능을 사용하면float
형에 대해서OpAtomicStore
,OpAtomicLoad
,OpAtomicExchange
를 사용할 수 있습니다.-
SPIR-V 사양에서는
int
유형만 허용하므로OpAtomicCompareExchange
“exchange” 연산은 포함되지 않습니다.
-
-
*Float*AtomicAdd
기능을 사용하면 두 가지 확장 SPIR-V 연산인AtomicFloat32AddEXT
와AtomicFloat64AddEXT
를 사용할 수 있습니다.
여기서부터 나머지 기능의 조합은 32-bit float
지원 그룹으로 분류됩니다:
-
shaderBufferFloat32*
- buffers -
shaderSharedFloat32*
- shared memory -
shaderImageFloat32*
- images -
sparseImageFloat32*
- sparse images
64-bit float
지원은 다음과 같습니다:
-
shaderBufferFloat64*
- buffers -
shaderSharedFloat64*
- shared memory
Note
|
OpenGLES OES_shader_image_atomic 은 |
Note
|
이 확장 기능에는 VK_EXT_shader_atomic_float
에 없는 기능 세트 2개를 추가합니다.
먼저, 위에서 VK_EXT_shader_atomic_float
에 대해 살펴본 것과 같은 방식으로 버퍼(buffers) 와 공유 메모리(shared memory) 모두에 16-bit floats
를 추가합니다.
-
shaderBufferFloat16*
- buffers -
shaderSharedFloat16*
- shared memory
둘째, min
과 max
아토믹 연산에 대한 float
지원을 추가합니다(OpAtomicFMinEXT
and OpAtomicFMaxEXT
)
16-bit float
지원(AtomicFloat16MinMaxEXT
기능 포함):
-
shaderBufferFloat16AtomicMinMax
- buffers -
shaderSharedFloat16AtomicMinMax
- shared memory
32-bit float
지원(AtomicFloat32MinMaxEXT
기능 포함):
-
shaderBufferFloat32AtomicMinMax
- buffers -
shaderSharedFloat32AtomicMinMax
- shared memory -
shaderImageFloat32AtomicMinMax
- images -
sparseImageFloat32AtomicMinMax
- sparse images
64-bit float
지원 (AtomicFloat64MinMaxEXT
기능 포함):
-
shaderBufferFloat64AtomicMinMax
- buffers -
shaderSharedFloat64AtomicMinMax
- shared memory