-
Notifications
You must be signed in to change notification settings - Fork 502
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
FX 支持使用 FP16 #1049
base: dev
Are you sure you want to change the base?
FX 支持使用 FP16 #1049
Conversation
我分别使用 N 卡(RTX 4070 Laptop)和 I 卡(Intel UHD)在同样的条件下测试结果如下:
N 卡只有 ACNet 有较大的性能提升,其他效果反而下降;I 卡 ACNet 和 FSRCNNX 提升,其他则下降,而且性能变化幅度非常大。看来不同显卡的 FP16 性能差别很大,正确配置时可以大幅提高性能,反之则会大幅降低。这与我预想的不同,看来不能简单的全局启用或禁用。 |
This comment was marked as outdated.
This comment was marked as outdated.
因为这几个效果还没做适配,现在都适配了。 |
鉴于不同显卡 fp16 能力不同,我们应该支持针对单个效果启用或禁用 fp16。我想到两个方案:
我更喜欢第二个方案,虽然它很复杂,但优势很大
|
我略作搜索好像确实只能算一点误差和显卡工作时频率影响的区别
|
计算速度上 fp16 和 fp32 是一样的,fp16 的主要优势是驱动可以将 2 个 fp16 打包到一个 32 位 VGPR 寄存器。
|
我研究了一下 ACNet 为什么会有性能提升,发现它主要使用 mad 指令(乘然后加),Anime4K 和 Cunny 主要使用 dp4(向量点积)。于是将 ACNet 移植成了 dp4 版本性能对比如下
CuNNy-16x16C-NVL 的测试结果
|
dp4(a) 这个好像是这两代i卡加大宣传的东西?谁有新i卡可以测一测 |
@hooke007 试试 CuNNy-16x16C-NVL,我这里性能有极大提升 |
是的终于感觉到合理的差别了 |
当时 mad 实现没有完全优化,现在的测试结果如下:
在我测试的所有设备上 dp4 都比 mad 慢,只有 A 卡没测试过。 |
效果可以使用 //!USE FP16 声明对半精度浮点数的支持,条件满足时会有以下变化:
Texture2D<min16float4>
,输出定义变为RWTexture2D<min16float4>
;R16G16_UNORM 格式的输入定义变为Texture2D<min16float2>
,输出定义变为RWTexture2D<unorm min16float2>
。包含 32 位浮点数的格式仍使用 float 类型。即使效果声明支持 FP16,也不意味着一定使用,有两种例外情况:GPU 不支持 FP16 或通过开发者选项禁用了 FP16。
添加了新的内置函数 MulAdd,等效于矩阵乘然后加上向量,让我们可以在 dp4 或 mad 之间灵活切换。目前大部分基于机器学习的效果大量使用 dp4,根据我的测试,切换为 mad 后性能提升相当可观。如果使用 FP16,mad 的性能可以进一步提升,而 dp4 的性能不升反降。
所有合适的效果都会适配 FP16 和 MulAdd,性能对比如下:
其他更改:
//!MAGPIE EFFECT
块包含 StubDefs.hlsli 以减少 IDE 中的错误,不影响编译结果。