Vulkan计算着色器,在Android设备上具有16位浮点运算

时间:2018-04-06 09:30:12

标签: floating-point glsl vulkan

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

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

|-- cgi-bin
|-- css
|   |-- account.css
|   |-- admin_custom.css
|   |-- app.css
|   |-- home.css
|   `-- nav.css
|-- favicon.ico
|-- images
|   |-- venray-bloeit-logo-black.png
|   |-- venray-bloeit-logo-white.png
|   `-- wave_footer.png
|-- index.php
|-- js
|   |-- account.js
|   |-- admin
|   |   |-- accounts.js
|   |   |-- admin.js
|   |   `-- dashboard.js
|   |-- app.js
|   |-- nav.js
|   `-- plugins
|       |-- backstretch.min.js
|       |-- jquery-3.2.1.min.js
|       `-- tinymce
|           |-- jquery.tinymce.min.js
|           
|-- robots.txt
|-- vendor
|   |-- adminlte
|   |   |-- css
|   |   |   `-- auth.css
|   |   |-- dist
|   |   |   |-- css
|   |   |   |   |-- AdminLTE.css
|   |   |   |   |-- AdminLTE.min.css
|   |   |   |   `-- skins
|   |   |   |       |-- skin-black-light.css
|   |   |   `-- js
|   |   |       |-- adminlte.js
|   |   |       `-- adminlte.min.js
|   |   |-- plugins
|   |   |   `-- iCheck
|   |   |       |-- icheck.js
|   |   |       `-- icheck.min.js
|   |   `-- vendor
|   |               `-- jquery.min.map
|   `-- notify
|       |-- danger.mp3
|       |-- info.mp3
|       |-- notify.css
|       `-- notify.js
`-- web.config

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

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]); 
}

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

修改 我使用Vulkan for Android设备,我也需要我的着色器才能进行16位操作,而不仅仅是存储。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

对于缓冲存储方面,有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;
};