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:
#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_productdiye yazılır —GL_EXT_shader_integer_dot_productdeğil (o Vulkan extension adı; karıştırmak kolay, ben karıştırdım). - Integer vektörlerde düz
dot()çalışmaz — builtin’lerdotEXT,dotPacked4x8EXT,dotPacked4x8AccSatEXTvb. - SSBO başına birden çok unsized array hâlâ illegal —
a[]veb[]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.