Floating point Android设备上具有16位浮点操作的Vulkan计算着色器

Floating point Android设备上具有16位浮点操作的Vulkan计算着色器,floating-point,glsl,vulkan,Floating Point,Glsl,Vulkan,有没有办法在Vulkan计算着色器中使用16位浮点 我有一个矩阵乘法计算着色器,为矩阵a、B和C提供一个缓冲区。在主机端,我使用它将float32转换为float16 half* matrixTmp; vkMapMemory(device, bufferMemory, 0, matrixSize, 0, (void **) &matrixTmp)); int offset = 0; for(int i = 0; i < M*K; i++) { matrixTmp[offse

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

我有一个矩阵乘法计算着色器,为矩阵a、B和C提供一个缓冲区。在主机端,我使用它将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]); 
}
如果计算着色器中包含16位浮点,如何使用缓冲区

编辑:
我在Android设备上使用Vulkan,我还需要我的着色器能够执行16位操作,而不仅仅是存储

VK_KHR_16bit_存储扩展增加了对此的支持,该扩展在Vulkan 1.1中升级为core。您需要检查/启用
VkPhysicalDevice16BitStorageFeaturesKHR::storageBuffer16BitAccess
功能


然后可以在GLSL中的缓冲区声明中使用
float16\t
f16vec2
等类型。这些来自于前Vulkan延伸。您可以查看glslang编译器的示例。

VK_KHR_16bit_存储扩展增加了对此的支持,该扩展在Vulkan 1.1中升级为core。您需要检查/启用
VkPhysicalDevice16BitStorageFeaturesKHR::storageBuffer16BitAccess
功能


然后可以在GLSL中的缓冲区声明中使用
float16\t
f16vec2
等类型。这些来自于前Vulkan延伸。您可以查看glslang编译器的示例。

了解缓冲区存储方面的内容)。这增加了对16位浮点的支持,例如SSBO

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

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

#extension GL_AMD_gpu_shader_half_float : enable

struct Particle
{
    f16vec2 pos;
    f16vec2 vel;
    f16vec4 gradientPos;
    float16_t age;
};

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

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

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

#extension GL_AMD_gpu_shader_half_float : enable

struct Particle
{
    f16vec2 pos;
    f16vec2 vel;
    f16vec4 gradientPos;
    float16_t age;
};

我忘了提到我在android上运行Vulkan。android有什么选择吗?没有像AMD扩展那样的显式类型,但是glsl有打包和解包功能,这可能是您想要的:
packHalf2x16
unpachalf2x16
。因此,如果在主机端打包两个16位浮点,则可以使用着色器中的unpack函数来提取这些浮点,尽管这不会降低计算精度。使用
vec4[length/2]
packHalf2x16
unpachalf2x16
或使用
vec4[length]可以获得更好的性能
?我忘了提到我正在android上运行Vulkan。android有什么选择吗?没有像AMD扩展那样的显式类型,但是glsl有打包和解包功能,这可能是您想要的:
packHalf2x16
unpachalf2x16
。因此,如果您在主机端打包两个16位浮点,您可以使用着色器中的unpack函数来提取它们,尽管这不会降低计算精度。使用
vec4[length/2]
packHalf2x16
unpachalf2x16
或使用
vec4[length]
可以获得更好的性能,该扩展仅适用于AMD?有没有办法在android上使用它?我忘了提到我在android上使用Vulkan。@Tsearrizzi:Vulkan使用SPIR-V,而不是GLSL,记得吗?因此,重要的是SPIR-V规范(以及构建它的编译器),而不是扩展名。SPIR-V已经支持可变精度浮点和整数。如果Glslang编译器支持“AMD\u gpu\u shader\u half\u float”扩展,那么您可以使用该编译器访问它。@Nicolas我会试试。那么,该扩展仅适用于AMD?有没有办法在android上使用它?我忘了提到我在android上使用Vulkan。@Tsearrizzi:Vulkan使用SPIR-V,而不是GLSL,记得吗?因此,重要的是SPIR-V规范(以及构建它的编译器),而不是扩展名。SPIR-V已经支持可变精度浮点和整数。如果Glslang编译器支持“AMD\u gpu\u shader\u half\u float”扩展,那么您可以使用该编译器访问它。@Nicolas我会试试。