如何使用Vulkan使用Nvidia的张量核心(在计算着色器中?!)?
Nvidia Programming Tensor Cores in CUDA 9撰写了这篇文章,但这显然是关注CUDA。我对CUDA不太熟悉,但看起来必须采取一些措施才能在Tensor核心上进行计算,比如算法必须设置为某种特殊类型,并且某些数学类型必须设置为值CUDNN_TENSOR_OP_MATH
。我想知道,如果Tensor核心加速也可以从其他API中使用,我对Vulkan特别感兴趣。
更具体地说,我想挖掘滤波器以进行更多去噪。根据我的理解,滤波器主要需要Tensor内核能够加速的那些数学运算,这些运算是矩阵乘法和累加运算。
Nvidia最近添加了一些新的扩展,其中一个是VK_NV_COOPERATIVE_MATRIX
,它允许在Vulkan中使用张量核心。
glslang处理这个新功能的能力我认为是昨天添加的,这就是为什么你直到现在才看到这个(see here):
这里有一些使用它的例子:
#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。
Tensor核心是一个利基特征,可能不会使它成为Vulkan扩展。您仍然可以使用CUDA来执行张量核心加速计算,并在CUDA和Vulkan上下文之间共享数据。
检查此示例:cuda vulkan interop
请注意,由于在启动CUDA内核和使用Vulkan端的结果之间需要进行同步,因此性能可能会受到影响。您必须评估应用程序中的成本。