CPU 和 GPU, 还有生活

许久没有写技术方面的日志了。这段时间本想出去好好的散心,过年在老家转了一圈,去了一趟大足。本想去大足石刻看看,到佛湾走走,结果行程都在车上浪费了,到大足的时候,已经是下午4点多。本想回家的,第二天朋友还得去成都找他朋友,结果没车了,只能就地找了一家酒店。一家邮政酒店,说是酒店,或许就是以前的办公大楼改造的,一台电视,两张床,其他的没了……晚上在大足转了一圈,或许是我们太不熟悉,没找到什么好玩的,也就回到酒店,聊聊天,睡了。晚上很冷,半夜冻醒了,起床加了一床毛毯。旁边床的兄弟第二天早上起来的时候,直大喷嚏……一大早,回到家……走亲戚,串门……没有能见到几个同学,见到的,有的已经带着孩子打酱油了。家里面聚餐的时候,都追问个人问题,哎!本想回家可以清净一些,还是逃不过吧。或许这就是生活……琐碎而繁杂。

几个月没什么心情写论文,没心情看技术方面的文章,看了不少其他的书,道家,儒家的书,看了一些,不过感觉自己还没入门,只是先看看吧,心烦意乱的时候,可以让自己安静下来。或许在写代码的时候,怎么规划内存,怎么布局,这些逻辑思维也可以从看的非技术书里面来吧。修心比修脑更重要吧。心通了,心静了,脑子或许才能清醒吧。熬了几个星期的通宵,5点多总算把论文赶完了。一篇大数处理的文章,GPU单线程比CPU快乐几十倍,当然,这个需要大量数据的时候,要是数据小了,GPU一点不占优势。

有的时候写代码或许就跟生活差不多,开始设计算法,解决问题的时候,总是觉得千丝万缕,琐碎而繁杂,不知道从哪里入手,不知道从哪个地方找到适合自己生活的方式。知道GPU上面优化的东西就这么多,知道遇到的问题有一些什么特点,但是就是不知道从那一部分直接入手最容易,最能直接到核心问题。找到一个逻辑,很难。生活中找到真正适合自己的,也很难。想不明白的时候,或许选择逃避,或许选择尝试,不停地尝试吧。一个kernel函数从最开始的验证版本,到最后的相对自己认为的最优的版本,可能中间过程经历了10次的修改。过一段时间还会发现有新的想法,新的思路可以尝试。当我找不到规律的时候,就一条一条路的走一下,或许我知道没有别人聪明,也不是像别人那么运气好,也没有偷懒的资本。那就先用广度优先,找出所有的解决办法吧,或许有一天找到一些规律的时候,再来简化自己的步骤,再来尝试退火算法的方式找最优解,或许采用A*算法的思路来找最优解。或许吧,人生的经历或许也差不多吧,不清楚地时候,不明白的时候,现在按照已有的方式走下来吧。要是能有高人指点一下,那就最好了,要是么有,那还是都尝试一下吧。当然,要是想糊糊涂涂的过一辈子,那也就糊糊涂涂的解决就行了。记得理工大学南门有一个酒吧,叫做七又二分之一,当时不知道为什么叫这个名字,就问朋友。他说,在佛语里面有偷得浮生半日闲。或许7天纷繁复杂的生活之后,给自己半天的时间,思考和总结吧。或许算法优化的过程也不过如此吧。尝试了很多种途径之后,就是总结和归纳,找到一些相似的地方,找到一些不会发现的情况,找到一些通往最终目标的捷径。生活需要积累,学习,也需要积累吧。

闲下来,道家,儒家的书也看不进去的时候,就打打星际2.星际我最爱玩虫族,不为别的,就为可以疯狂的造小狗,一窝蜂的小狗过去,一轮一轮的24只小狗过去,我看现在还没那个AI能扛得住的。或许这个也像现在的GPU跟CPU吧。每一个小狗就是GPU里面的一个计算核心,每一个人族或者神族的尖锐部队,就像CPU里面的核心,确实人族的坦克很厉害,小狗可以挂一片,但是一群几十只小狗围着的时候,坦克挂得相当的快。GPU就占着人多吧。但是要是小狗串行的过去靠近坦克,小狗只有来一个挂一个了。所以,要并行的效果,才能搞定坦克,,o(╯□╰)o,囧……一窝蜂的围攻才行,所以在考虑GPU算法的时候,或者并行算法的时候,一定要考虑,你的算法是并行的,最大并行化的,什么叫最大并行化。大家都做差不多的事情,做事情的时候,干扰很小,或者各自之间都没干扰,然后大家都可以同时围绕着坦克,同时攻击坦克四周,就好比GPU里面取内存的时候,16线程,half-warp一起访问内存,就可以合并访问一样,一群小狗都同时能靠近坦克,同时攻击的时候,打起来超帅。。。一会就磕掉一个。。

但是要是人族的坦克也成对了,提升了坦克的装甲,提升了坦克的攻击能力,每个坦克+上都是3防,3攻,只要门口附近摆上4门坦克,那一群随即的小狗跑过去,还不行的,也只会挂在门口。这就好比要是在CPU里面优化的时候,用SSE优化,提高攻击力+3。再打开多线程,就好比在门口加上几门坦克。这些功能都是需要慢慢调试出来的。就像我们写CPU优化的代码的时候,SSE的代码接近汇编,调试起来很麻烦,相对而言,GPU造小狗就来得快,只要大家排好队,路线设定好了,几个人分拨的围绕着指定的坦克,打下来,那就是数量问题了。但是CPU要是加防,加攻,只是打下来就比较麻烦一点。

现在的很多GPU程序一上来就说提升了几百倍的,这个得看看是否打开了CPU的SSE或者多线程了没。当然打开CPU的SSE和多线程,也需要花很多功夫的,这些功夫,比调试优化GPU的代码更难。时间可能更长一些。但是打开了,可能GPU只能提升到10倍到几十倍的能力。

GPU现在比CPU有的几个优势是,

1.GPU有众多的核心,完全可以使用胖节点式的并行算法,CPU里面的多线程,更多的或许谈不上真正意义上的“大量”并行这个词来形容,CPU的大型的并行,都是在集群层面的,而不是在单机上的,集群层面接触到的朋友,也就少了,集群优化本身就比骄傲麻烦;
2.CUDA这一类的GPU并行编程语言,并行层面在线程级别,编程起来,比较方便,相对而言,要打开CPU的SSE,那就相当于汇编级别,比较麻烦;
3.GPU能提升的性能是在10倍左右,或者以上到50-倍左右这个量级,不只是提升一两倍,这样就给CPU很大的压力;

当然要是CPU能改变其中的某一两项,或许GPU也就难了。

例如intel的TBB多线程库,比openmp灵活好用,这一类的线程库出来了再加上intel将来出来的多核心,势必给GPU造成很大的压力。还有他们很接近TBB的Ct的开发语言,从这个层面上,开发语言,或者环境,GPU可能赶不上的。软件强也没有,现在硬件没出来。

当然还有AMD的芯片,APU一类的芯片出来,也会造成一些混乱的局面。

不过都说到这里,我们可以看看这三家比较好玩的现象:

1.Intel的软件我们有目共睹的,TBB,IPP,MKL这样的库都是顶呱呱的,当然还有intel的CPU,还有他的编译器,优化工具都是很牛掰的,但是他的GPU出不来,也就是有软件没硬件,麻烦;

2.AMD,(ATI)他的硬件其实也挺牛的,Fire系列的显卡出来老早了,但是他的软件一直跟不上,一直超级麻烦,困难户;也麻烦;

3.反过来看Nvidia,他的Fermi现在都还没出来,靠着GT200的架构还在撑着,但是他的驱动也做得挺到位,phiyX这样的软件也挺到位;在市场上仿佛看到Nvidia在GPU方面的声音比上面的两家都好。但是可以看看,GPU硬件,Fermi才能跟ATI的58xx系列比的,也就是GF100才能跟ATI700,或者ATI800系列比的。但是现在市面上看不到。还是GT200的身影。软件方面,Nv肯定没法跟intel比。

从这几个方面我们发现一个现象,不管是做硬件还是做软件,单独某一项强都不行的,只有total solution才是王道。

做硬件的厂商都需要做软件的,做软件的厂商都想紧跟最新的硬件,当然也是在最新的硬件真正有实力的时候。这些,或许就是跟技术本身无关了,或许这也是生活吧。

七天的纷繁忙碌的生活,给自己半天的喘息。都说自己累,到底问问自己为什么累啦?付出就一定要有回报吗?或许是在用爱的名义在索取吧。经历一次感情,或许会清醒很多,明白很多,不管是经历什么,都要给自己去思考,去想想,内心的强大,才是真正的强大,内心的成长才是真正的成长吧。甚至有时候想想,是否找连续的一段时间,去寺庙精修一段时间。反过来又问问自己,人生何处不是思考和静思啦?需要的只是一个过程,而不是立刻的响应。或许是因为自己性格更偏向于温和吧。不习惯与激烈的针锋相对,或许那么鲜明。中庸和谐之道,哈哈……观点没那么鲜明,只是为了思考,为了一段感情过后的沉淀,第一次花了三年时间,这次,不知道需要多久。不过能坦然了……或许就真正释怀了。淡然了吗?我已经在思考这个问题了。从每天星际打累了以后,看书以后,读文章以后,赶论文以后,发现,只有睡觉是最好的时候,其他的任何事情,任何情感,其实都无关痛痒。让自己累一点,让自己忙一点。有空的时候想想更多美好的事情,或许找个时间再出去走走吧。。。。。复活节,或许可以出去走走。。。。

你可能感兴趣的:(多线程,算法,优化,生活,汇编,集群)