【问题标题】:Vulkan compute shader with 16-bit floating point operation on Android device在 Android 设备上具有 16 位浮点运算的 Vulkan 计算着色器
【发布时间】:2018-04-07 19:03:37
【问题描述】:

有没有办法在 Vulkan 计算着色器中使用 16 位浮点?

我有一个矩阵乘法计算着色器,它带有一个用于矩阵 A、B 和 C 的缓冲区。在主机端,我使用 http://half.sourceforge.net/ 将 float32 转换为 float16。

half* matrixTmp;
vkMapMemory(device, bufferMemory, 0, matrixSize, 0, (void **) &matrixTmp));
int offset = 0;
for(int i = 0; i < M*K; i++) {
    matrixTmp[offset+i] = half_cast<half>(matrixA[i]); 
}
offset = (M*K);
for(int i = 0; i < K*N; i++) {
    matrixTmp[offset+i] = half_cast<half>(matrixB[i]); 
}

对于 float32,我使用以下计算着色器布局。

layout(binding = 0) buffer matrixBuffer {
    vec4 matrixABC[];
};

如果缓冲区包含 16 位浮点,如何在计算着色器中使用缓冲区?

编辑: 我将 Vulkan 用于 Android 设备,我还需要我的着色器能够进行 16 位操作,而不仅仅是存储。

【问题讨论】:

    标签: floating-point glsl vulkan


    【解决方案1】:

    VK_KHR_16bit_storage 扩展添加了对此的支持,该扩展在 Vulkan 1.1 中被提升为核心。您需要检查/启用VkPhysicalDevice16BitStorageFeaturesKHR::storageBuffer16BitAccess 功能。

    然后您可以在 GLSL 中的缓冲区声明中使用 float16_tf16vec2 等类型。这些来自 Vulkan 之前的 GL_AMD_gpu_shader_half_float 扩展。您可以查看 glslang 编译器的 float16 test 示例。

    【讨论】:

    • 那么,该扩展仅适用于 AMD 吗?有什么办法可以在安卓上使用吗?我忘了提到我在 android 上使用 Vulkan。
    • @TsesarRizqi:Vulkan 使用 SPIR-V,而不是 GLSL,记得吗?因此,重要的是 SPIR-V 规范(以及构建它的编译器),而不是扩展名上的名称。 SPIR-V 已经支持可变精度浮点数和整数。如果 Glslang 编译器支持“AMD_gpu_shader_half_float”扩展,那么您可以使用该编译器访问它。
    • @NicolBolas 我会试试的。
    【解决方案2】:

    对于事物的缓冲存储方面,有VK_KHR_16bit_storage(SPV_KHR_16bit_storage)。这增加了对 16 位浮点数的支持,例如ssbos。

    如果您想在着色器中显式使用半浮点数(计算),这些可通过VK_AMD_gpu_shader_half_float 获得,因此现在仅适用于 AMD。

    启用后,您可以使用 16 位数据类型:

    #extension GL_AMD_gpu_shader_half_float : enable
    
    struct Particle
    {
        f16vec2 pos;
        f16vec2 vel;
        f16vec4 gradientPos;
        float16_t age;
    };
    

    【讨论】:

    • 我忘了提到我在安卓上运行 Vulkan。安卓有什么选择吗?
    • 没有像 AMD 扩展那样的显式类型,但是 glsl 有打包和解包功能,这可能是您正在寻找的:packHalf2x16unpackHalf2x16。因此,如果您在主机端打包两个 16 位浮点数,您可以使用着色器中的解包函数来提取它们,尽管这不会给您提供较低精度的计算。
    • 哪个提供更好的性能,使用vec4[length/2]packHalf2x16unpackHalf2x16 或使用vec4[length]
    猜你喜欢
    • 2022-06-10
    • 2022-11-18
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    相关资源
    最近更新 更多