有没有办法在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位操作,而不仅仅是存储。
答案 0 :(得分:1)
VK_KHR_16bit_storage扩展添加了对此的支持,该扩展在Vulkan 1.1中被提升为核心。您需要检查/启用VkPhysicalDevice16BitStorageFeaturesKHR::storageBuffer16BitAccess
功能。
然后,您可以在GLSL中的缓冲区声明中使用float16_t
,f16vec2
等类型。这些来自前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;
};