Nvidia 最近添加了一些新的扩展,其中之一是 VK_NV_COOPERATIVE_MATRIX,这将允许在 Vulkan 中使用张量核心。
glslang 处理这个新功能的能力我相信是昨天添加的,这就是为什么你直到现在才看到这个(see here):
这里有一些使用它的例子:
https://github.com/KhronosGroup/glslang/blob/4605e2ed2b2b1acbe157d365c3c528367b8b168f/Test/spv.coopmat.comp
https://github.com/KhronosGroup/glslang/blob/4605e2ed2b2b1acbe157d365c3c528367b8b168f/Test/spv.1.3.coopmat.comp
#version 450 core
#extension GL_KHR_memory_scope_semantics : enable
#extension GL_NV_cooperative_matrix : enable
#extension GL_EXT_shader_explicit_arithmetic_types_float16 : enable
#pragma use_variable_pointers
layout (local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
layout(set = 0, binding = 0) coherent buffer Block {
float y[1024*1024];
float x[];
} block;
void main()
{
fcoopmatNV<32, gl_ScopeSubgroup, 16, 8> m = fcoopmatNV<32, gl_ScopeSubgroup, 16, 8>(0.0);
m = m + m;
m = m - m;
m = -m;
m = 2.0*m;
m = m*2.0;
coopMatLoadNV(m, block.x, 16, 128, false);
coopMatStoreNV(m, block.x, 16, 128, false);
}
这似乎与它在 CUDA 中的完成方式非常相似,需要将显式内存传输到张量核心可以运行的内存。
所以要使用它们,你需要 vulkan 中的 VK_NV_COOPERATIVE_MATRIX 和 glsl 中的 GL_NV_COOPERATIVE_MATRIX。
编辑:
j00hi 提到现在有一个nvidia blog post 来介绍如何使用这些张量核心。