最近一段时间用计算着色器完成一些图像处理的任务,遇到了不少bug,因为用CS做图像处理的资料较少,很多问题都是通过自己不断定位,尝试解决的。有些问题可能对别人有些参考,所以记录一下,随时更新。
1. 造成几十ms延时的问题
计算着色器的计算是很快的,但是我的程序在测试的时候,会有几十ms的延时。并且奇怪的是,同样的电脑,vs2017版本,两个程序,一个重复计算几百次有一次延时,一个每次都有延时。最开始我认为是GPU返回太快,导致CPU挂起不成立导致延时。
后面通过不断的注释程序,发现是有一个着色器程序导致了延时问题,仔细查看。原因是我在着色器中用了线程组同步函数
GroupMemoryBarrierWithGroupSync();
并且,我在程序开始声明的线程组为1024,但是我实际要处理的数据小于1024,为768。我猜测是因为处理不存在的数据(大于768)时,这时的线程使用线程组同步函数时,无法跳出,导致一直等待同步,从而造成了延时。我修改了声明的线程组数后,延时已经消除。此外,上面提到两个程序情况不一样,程序不同在于使用的windows kit版本不一,每次都有延时使用了8.1的SDK,而另外一个时10.xxxx的SDK,猜测后者可能存在某些机制,避免这种同步的bug。