中文第一计算机图形学社区OpenGPU 版权所有2007-2018

 找回密码
 注册

扫一扫,访问微社区

搜索
查看: 364|回复: 5

Directx12 计算着色器 异常慢的原因?

[复制链接]
发表于 2018-2-2 21:47:21 | 显示全部楼层 |阅读模式
事情是这样的  我在尝试开发小引擎
现在在搞后期效果 用计算着色器实现
但是遇到了非常蛋疼的性能问题,渲染图形是正常的,但是用计算着色器非常慢,
是绝对不正常的慢,我反复测试无果,用计算着色器将贴图复制到另外一个贴图  这最简单的操作 都会降低25%的帧率


我的渲染过程是这样的

我封装了一个资源类 把一个资源同时作为UAV SRV RTV使用

我只用一个TYPE_DIRECT的COMMAND LIST来完成所有渲染
先把模型按一般流程渲染到一个贴图(一堆DrawIndexedInstanced)
这些操作是正常的,性能也正常


把贴图转换成SRV作为计算着色器的资源
事先准备好的相同资源转换为UAV作为计算着色器的输出
然后重新设置状态为计算状态  然后开始Dispatch
再把资源状态转换回来
这个时候 很玄学 他是成功运行的 输出也是正确的   但是性能非常非常低  帧率损失非常大
直接复制SRV到UAV都会降低25%的帧率 。复杂点的操作 直接个位帧率。


开性能探查器的探查结果是 Dispatch后面的ResourceBarrier过分耗时了
我的理解其实ResourceBarrier的耗时也就是计算的耗时  我也测试了 耗时和分辨率几乎成正比

我看微软的miniengine也是这样干的 但是miniengine工作得很好 我的就不正常
我折腾了好久 始终没有找到原因 特来求教 先谢谢各位!

发表于 2018-2-11 13:38:59 | 显示全部楼层
以前有帖子讨论过,PixelShader与ComputeShader的性能。我觉得CS的线程管理更需要经验(可能需要了解CUDA方面的知识)。我有过设置不同的线程,可能性能差100倍的例子。
 楼主| 发表于 2018-2-12 11:43:32 | 显示全部楼层
ljb 发表于 2018-2-11 13:38
以前有帖子讨论过,PixelShader与ComputeShader的性能。我觉得CS的线程管理更需要经验(可能需要了解CUDA方 ...

有CS线程管理相关文章资料链接吗?
 楼主| 发表于 2018-2-13 15:54:05 | 显示全部楼层
问题终于解决  我的渲染方式并没有错
问题在于Dispatch数量,我之前直接Dispatch全分辨率数量,直到我看到了这个古老的CS评测文章
http://www.opengpu.org/forum.php ... E8%83%BD&page=1
使用计算着色器 应该尽可能降低Dispatch数量,此贴终结!
 楼主| 发表于 2018-2-13 16:24:14 | 显示全部楼层
总结一下  

要使计算着色器发挥性能,Dispatch数量(组数量)要与组线程数量 平衡。
组数量过多会大幅度降低性能,通常全屏计算的情况下,XY组线程数量设为16,组数量除以16。
在以前可以是32,但是现在着色器编译器限制每组线程量最高为768。

这个问题耗费了我半个月时间,在各种书和教程上我都没有看到有 组数量对性能影响 的内容
真是个大坑,希望遇到像我这样的问题的人能看到这个帖子,少走弯路
发表于 2018-2-13 16:31:37 | 显示全部楼层
估计微软挖了个坑没有填,只有用户自己来摸索。觉得性能上比不过CUDA(国外有帖子比较过)。几乎没有对微软的CS进行深入讨论的。市面上只有介绍AMP的。也没有见有多少使用AMP的(我自己倒是用AMP做了些小东西)。大概只能这样了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|小黑屋|Archiver|手机版|中文第一计算机图形学社区OpenGPU

GMT+8, 2018-5-23 07:21 , Processed in 0.040206 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表