Vulkan'da VK_KHR_shader_integer_dot_product kullanımı

Example: VulkanExamples/p73_intdot

VK_KHR_shader_integer_dot_product integer dot-product donanımını (bazı ISA’larda dp4a, RDNA’da V_DOT) GLSL’e açar. shaderIntegerDotProduct‘i etkinleştir, sonra:

example.txt
#extension GL_EXT_integer_dot_product : require
// tek uint32'de paketlenmiş 4x int8:
dot_[i] = dotPacked4x8EXT(a[i], b[i]);

dotPacked4x8EXT/dotPacked4x8AccSatEXT paketlenmiş 32-bit word alır — 8-bit storage gerekmez. Vektör varyantları (i8vec4 vb. üzerinde dotEXT) VK_KHR_8bit_storage + shaderInt8 ister. Karışık-işaret formları da var (signedness’a göre dotPacked4x8EXT overload’ları).

Demo 4M paket int8x4 dot’u bit-bit CPU referansıyla çalıştırır (int matematik — tolerans gerekmez), bad=0. RADV’da VkPhysicalDeviceShaderIntegerDotProductProperties ile yetenek matrisini de raporlar: integerDotProduct8BitUnsignedAccelerated=1, signedAccelerated=1 — yani instruction emüle edilmek yerine gerçekten donanımda var.

Yazarken öğrenilen tuzaklar

  • GLSL extension’ı GL_EXT_integer_dot_product diye yazılır — GL_EXT_shader_integer_dot_product değil (o Vulkan extension adı; karıştırmak kolay, ben karıştırdım).
  • Integer vektörlerde düz dot() çalışmaz — builtin’ler dotEXT, dotPacked4x8EXT, dotPacked4x8AccSatEXT vb.
  • SSBO başına birden çok unsized array hâlâ illegal — a[] ve b[] ayrı binding’ler gerektirir.

Bu, int8-quantized inference kernel’lerinin üzerine kurulduğu primitive.

Bu serideki tüm kaynak kod CC0 1.0 Universal (CC0-1.0) altında yayınlanmıştır.


Check out similar posts by category: C++ Vulkan