想着开通博客已经有几年了,大概从大学快要毕业的时候吧。但是一次次举棋未定,最终铩羽而归,直到今天才正式算开通。
为什么总是开通未成功呢?开始的原因大概是因为不知道选择哪个平台,是CSDN呢,还是新浪呢,还是网易呢。强迫症总归伤不起。于是就把这个事情延期了。强迫症加上拖延症,真的是病。后来的原因呢,想着自己开一个网站,当作博客的平台。心思是大了点,于是也就不了了之了。
今天终于想着开通了,又是什么原因呢?这也就是我开博的动机所在了。接下来徐徐讲来。
我最近两个多月都在忙一个任务。其实是一个不算复杂的任务,只是把一个使用QT编写的基于遗传算法的程序用CUDA进行改造,加快速度。但是由于没人催,任务进行得极其缓慢。前半个月主要忙着配置环境,由于CUDA7.5需要64位环境的支持,而QT一般只有32位的。因此我需要根据网上资料自己编译64位QT。具体的方法可以参考我的另一篇文章。
接下来就开始使用CUDA进行改造。我曾经使用过一段时间的CUDA,但是也过了两年了,忘得差不多了。经过一段时间的回顾,我开始动手改造程序,为了简单起见,我按着原来程序的架构进行改造。这个时候我的第一个毛病犯了:我拿到初始的CPU版本的程序后,并没有仔细思考与分析程序,而是随意看了看就开始动手改造,这里给我自己挖了一个大坑X。这个坑X也是今天促使我立即开博的最大因素。
这个坑是什么呢?我并没有仔细分析整个原始的程序,只是粗略的看了一下结构,便匆忙地分析出计算量最大的模块A。于是接下来的改造都是针对A的。最近几天改造并调试完成后,结果还不错,比之前的版本有着很大效率的提升。但是出现了一个不能算大但是也必须解决的问题b:程序中有个地方用到了互斥锁,这个地方明明操作很简单,但是却耗费了很大的时间,而且特点是,迭代次数越多,每次耗费的时间越长。(这里就是第二个坑Y了!)因此我对这一个互斥锁进行分析,并查阅了很多资料。但是最终竟然发现,耗费时间长这个问题并不是因为互斥锁的缘故,而是由于绘制模块的原因!——初始程序作者(坑!)把清除缓存函数中的一段代码注释了,因此每次绘制完成后,缓存并未清除,导致下一次绘制时间增加。我为什么没有去仔细阅读代码呢?这是我需要改进的。同时也是自己经验不够吧,每次迭代耗费时间不断增加,不就意味着数据的规模在不断增长吗?
解决问题b之后,突然发现,当我完善了清除缓存的代码后,CPU版本的程序快得飞起——直接从数十分钟的数量级提升到数秒钟,甚至超越了GPU的速度!(这就是我之前说的大坑X。)那我修改了两个月有什么意义呢?原来程序之前的瓶颈在于绘制部分,以及没有清除缓存这个BUG。——(结论下的太早了,经过调整参数,GPU版本的效率还是要高上不少的。11.3 改)
最终的结果是,CPU和GPU的速度是差不多的,GPU的大部分时间用于内存的交换了。当然,随着数据规模的不断增大,GPU计算的优势会进一步凸显。
总之,根据这个事情,我需要改善的地方是:
1、遇到一个问题,不要一上手就干,而是先思考怎么干,并阅读代码,了解代码结构与内容;
2、不要钻牛角尖,学会退一步看问题,能够进退自如;
3、接到任务时,不能想当然,必须要搞清楚任务的具体需求与条件,要尽量问清楚(这次没发生这个问题,但是这也是我需要注意的)。