Skip to content

Latest commit

 

History

History
162 lines (110 loc) · 8.48 KB

atomics.adoc

File metadata and controls

162 lines (110 loc) · 8.48 KB

아토믹(Atomics, 원자)

이 장의 목적은 사용자가 Vulkan이 아토믹 조작을 위해 제공하고 있는 다양한 기능을 사용자가 이해할 수 있도록 하는 것입니다.

아토믹의 변형

다양한 확장 기능을 이해하기 위해서는 먼저 다양한 유형의 아토믹 구조를 파악하는 것이 중요합니다.

  • 타입

    • float

    • int

  • 비트 수

    • 16 bit

    • 32 bit

    • 64 bit

  • 연산

    • loads

    • stores

    • exchange

    • add

    • min

    • max

    • etc.

  • 스토리지 클래스(Stroage Class, 저장 영역)

    • StorageBuffer or Uniform (buffer)

    • Workgroup (shared memory)

    • Image (image or sparse image)

기본 지원(Baseline Support)

Vulkan 1.0에서 확장 기능이 없는 경우, 애플리케이션이 아토믹에 32비트 int 유형을 사용할 수 있습니다. 이는 지원되는 모든 SPIR-V 연산(호출, 저장, 교환 등)에 사용할 수 있습니다. SPIR-V에는 커널(Kernel) 기능으로 보호되는 일부 아토믹 연산이 포함되어 있으며 현재 Vulkan에서는 허용되지 않습니다.

아토믹 카운터(Atomic Counters)

GLSL과 SPIR-V 모두 아토믹 카운터 사용을 지원하지만, Vulkan은 AtomicCounter 스토리지 클래스를 사용하는 데 필요한 AtomicStorage SPIR-V 기능을 공개하지 않습니다. 앱에서 OpAtomiclAddOpAtomiclSub1 로 사용하는 것으로 동일한 결과를 얻을 수 있습니다.

확장 기능의 아토믹 지원(Expanding Atomic Support)

현재 아토믹의 추가 지원을 공개하고 있는 확장 기능은 다음과 같습니다.

아래에서 각각에 대해 자세히 설명합니다.

VK_KHR_shader_atomic_int64

Note

Vulkan 1.2에서 코어로 승격되었습니다.

이 확장 기능을 통해 버퍼(buffers)공유 메모리(shared memory)에 대한 64비트 int 아토믹 연산을 허용합니다. Int64Atomics SPIR-V 기능을 선언하면, 지원되는 모든 SPIR-V 연산을 64비트 int 와 함께 사용할 수 있습니다.

두 개의 기능 비트인 shaderBufferInt64AtomicsshaderSharedInt64Atomics64비트 int 아토믹에 어떤 스토리지 클래스가 지원되는지 쿼리하는 데 사용됩니다.

  • shaderBufferInt64Atomics - buffers

  • shaderSharedInt64Atomics - shared memory

shaderBufferInt64Atomics 는 Vulkan 1.2 이상을 사용하거나 확장 기능이 공개되어 있는 경우에는 항상 지원되도록 보장됩니다.

VK_EXT_shader_image_atomic_int64

이 확장 기능은 이미지(images)희소 이미지(sparse images)에 대한 64비트 int 아토믹 연산을 허용합니다. Int64AtomicsInt64ImageEXT SPIR-V 기능을 선언하면 지원되는 모든 SPIR-V 연산을 이미지에서 64-bit int 와 함께 사용할 수 있습니다.

이미지(Image) vs 희소 이미지(Sparse Image) 지원

이 확장 기능에서는 shaderImageInt64AtomicssparseImageInt64Atomics 기능 비트를 모두 공개합니다. sparseImage* 기능은 추가 기능 비트이며 shaderImage* 비트도 활성화된 경우에만 사용할 수 있습니다. 일부 하드웨어는 sparse resources가 있는 이미지에서 아토믹 연산을 수행하는 데 어려움을 겪기 때문에 아토믹 기능을 분할하여 구현 내용을 공개할 수 있는 추가 기능으로 희소 이미지(sparse images)를 허용하고 있습니다.

VK_EXT_shader_atomic_float

이 확장을 사용하면 버퍼(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 연산인 AtomicFloat32AddEXTAtomicFloat64AddEXT 를 사용할 수 있습니다.

여기서부터 나머지 기능의 조합은 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_atomicr32f 에서 imageAtomicExchange 에 대한 아토믹 사용을 허용합니다. 포팅을 위해, 애플리케이션은 shaderImageFloat32Atomics 지원을 확인하여 Vulkan에서 동일한 작업을 수행할 수 있는지 확인해야 합니다.

VK_EXT_shader_atomic_float2

이 확장 기능에는 VK_EXT_shader_atomic_float 에 없는 기능 세트 2개를 추가합니다.

먼저, 위에서 VK_EXT_shader_atomic_float 에 대해 살펴본 것과 같은 방식으로 버퍼(buffers)공유 메모리(shared memory) 모두에 16-bit floats 를 추가합니다.

  • shaderBufferFloat16* - buffers

  • shaderSharedFloat16* - shared memory

둘째, minmax 아토믹 연산에 대한 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