遭遇破窗理论

昨天学姐运行我的程序,结果总是不对,原本以为注释掉几条语句就可以,结果直接崩了。

因为是GPU程序,而我没办法使用EmuDebug,所以只能一点点注释来查错。刚开始学CUDA,真的不知道如何是好。这个错误隐约见过,我觉得是内存访问越界,可是又不明白,为什么在计算了那么多次之后才越界。

昨晚百思不得其解,今天早上爬起来继续看代码的时候发现,从一维索引转二维索引有错误,改过来之后,终于没有再崩溃了。以前没有发现,是因为网格刚好比较标准。

虽然能运行了,但结果还是不对。我猜测会不会主机端一个函数有问题,之前是一维访问判断边界,有些复杂。我改成二维数组的访问方式,于是对了。

这个BUG所造成的效果之前也有看到,布料略微扭曲。只是当时完全不知道为什么会这样,所以也就没管。没想到直接崩了,正好把元凶揪了出来。

 

之前写GPU端碰撞检测的时候也有遇到问题,我发现有几组数据,每个线程都会对其进行运算,这样很浪费时间,所以就改成了先由几个线程计算出来,放入共享内存中,如此就都可以访问了。

结果程序不但没快,反而算出来错误的结果。我一直不明所以,找了很久也没找出错误来,就将代码都改回去了。

直到后来布料网格数增加,程序直接崩溃了。我上网搜错误,发现是共享内存申请超过了GPU允许的上限。这才发现,共享内存由每个block内的线程共用,而我之前,把它当做全局的内存来申请了。

这样一想,之前的错误也就找出原因了。我只有第一个block内的线程计算了这几组数据,而其他block的线程是无法访问的。只是由于共享内存大小还没超出限制,所以没有提示出错。

  

想起看程序员修炼之道时的一段话,这正是所谓的破窗理论。一栋大楼破了一扇窗,没有去修理。大家看到了,会纷纷掷石子打破窗户来玩。最终大楼会变得破败不堪。当程序有一些小问题的时候,我并没有去管他,直到后来系统崩溃了,回过头来才发现,这些看似不起眼的小问题背后隐藏着的是很深的隐患。我总以为这些是莫名其妙的错误,其实都有根据可循。

  

现在程序依然有些问题,只是达到了注释掉几条语句就可以的效果,想要少注释一些却又不行了。这次调了很久,还是想破了脑袋也想不明白。原本想这次不要再被破窗理论控制,可心有余而力不足。想来还是我经验不足,查错误只能靠猜,猜来猜去浪费了很多时间。

如今该猜的都猜过了,我只能想要不要把所有的一维索引都换成二维,或者干脆把代码移到CPU上来调试,只是现在手头的活要干不完了,所以不能再管这段旧代码。还是先记下来,等以后闲暇的时间再看吧。

posted @ 2010-09-03 15:25  筱夏  阅读(410)  评论(0编辑  收藏  举报