如何通过 Vulkan 使用 Nvidia 的 Tensor Core
How to use Nvidia's Tensor Cores via Vulkan
如何使用 Vulkan 使用 Nvidia 的张量核心(在计算着色器中?!)?
Nvidia 有这篇文章 Programming Tensor Cores in CUDA 9,但这显然是针对 CUDA 的。我对 CUDA 不太熟悉,但看起来必须采取一些措施才能在 Tensor 核心上启用计算,比如必须将算法设置为某种特殊类型,并且必须将某些数学类型设置为值 CUDNN_TENSOR_OP_MATH
.我想知道是否也可以从其他 API 使用 Tensor 核心加速,我对 Vulkan 特别感兴趣。
更具体地说,我想深入研究用于去噪的过滤器。据我了解,过滤器主要需要 Tensor 核心能够加速的那些数学运算,即矩阵乘法和累加运算。
Tensor 核心是一个小众功能,可能无法将其作为 Vulkan 扩展。
您仍然可以使用 CUDA 进行张量核心加速计算,并在 CUDA 和 Vulkan 上下文之间共享数据。
检查此示例:cuda vulkan interop
请注意,由于在启动 CUDA 内核和处理来自 Vulkan 端的结果之间需要同步,因此性能可能会受到影响。您必须在申请中评估费用。
Nvidia 最近添加了一些新的扩展,其中之一是 VK_NV_COOPERATIVE_MATRIX
,它将允许在 Vulkan 中使用张量核心。
glslang to handle this new feature I believe was added yesterday which is why you haven't seen this until now (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。
如何使用 Vulkan 使用 Nvidia 的张量核心(在计算着色器中?!)?
Nvidia 有这篇文章 Programming Tensor Cores in CUDA 9,但这显然是针对 CUDA 的。我对 CUDA 不太熟悉,但看起来必须采取一些措施才能在 Tensor 核心上启用计算,比如必须将算法设置为某种特殊类型,并且必须将某些数学类型设置为值 CUDNN_TENSOR_OP_MATH
.我想知道是否也可以从其他 API 使用 Tensor 核心加速,我对 Vulkan 特别感兴趣。
更具体地说,我想深入研究用于去噪的过滤器。据我了解,过滤器主要需要 Tensor 核心能够加速的那些数学运算,即矩阵乘法和累加运算。
Tensor 核心是一个小众功能,可能无法将其作为 Vulkan 扩展。 您仍然可以使用 CUDA 进行张量核心加速计算,并在 CUDA 和 Vulkan 上下文之间共享数据。
检查此示例:cuda vulkan interop
请注意,由于在启动 CUDA 内核和处理来自 Vulkan 端的结果之间需要同步,因此性能可能会受到影响。您必须在申请中评估费用。
Nvidia 最近添加了一些新的扩展,其中之一是 VK_NV_COOPERATIVE_MATRIX
,它将允许在 Vulkan 中使用张量核心。
glslang to handle this new feature I believe was added yesterday which is why you haven't seen this until now (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。