阅读论文和实践小结

第六次和山口老师会面,主要说了一下我对最近工作的进展情况的感受,和我了解和学习到的IBM CELL处理器相关编程知识。感觉后续的任务还是很艰巨的,有很多文档要阅读,很多论文要看。因为这些东西都是自己以前从来没有接触过的,基本算是要从最 底层原理,到接口文档,到实现,都要自己来干,除了仅有的C++还是有LIB扩从的。周围有没什么人好讨论的,好在老师英语还不错,所以这个毕业设计还是 很锻炼人的。不管是从英语水平,阅读论文,独立解决问题,从理解完全不知道的东西,到读文档,看SDK,看实例代码,配置环境,跑代码,写代码。相信会很 有收获的。

首先从数据驱动机器说起,数据驱动的机器,和以往的机器是不同的。首先是他没有分指令存储和数据存储,整个就是一个存储段,然后通过数据的驱动和流向,来 完成一步步的运算。具体我就不在这里说了,之前写过一个日志详细分析了一下。然后就是老师给我的几篇论文了,分别论述了这种体系结构下,各种模块之间的相 互工作的协调和组织,以及怎样可以加快这种合作。从这里就引出了我要做的一个主要工作,设计一种协调等待的技术,来加速数据驱动中流向问题和等待问题的时 间性。因为在一个数据流中,很多情况下,都会出现一个等式等待某个算子的运算过程,比如c=a+f(c);这个f(c)就成了我们加速运算中的瓶颈。山口 老师之前的研究中,引入了一个叫做伪结果的东西,这样让函数运算使用伪结果,这样来并行运算,边运算我们需要的等式,边运算函数,最后在我们需要这个c的 确切的值的时候,再把二者结合起来,达到加速的目的。
我所要做的,就是在这个的基础上,再做一个改进,加入一种等待技术,让曾经出现过的函数结果,缓存起来,等到以后要用的时候,可以直接取出来用,不用再次 进行运算。类似于软件工程中的代码重用,我们这里涉及到的是运算结果的重用。基本上就是这个意思了,以后的小结中再展开说明。
然后就接触到了LISP,这个算是一个新式的编程方式。之前以为要用这个编程,所以学习了一些,他基本上是类似汇编码的,一个表达式,运算符是前置的,然 后一个括号里面的就是一个运算单元。基本上学习了一下,但是后来发现并不能现在作为体系结构设计的编程语言来使用,就先告一段落。
接下来就介绍了IBM的这个CELL编程了,从山口老师介绍给我的第一天起,我就对这个开始很感兴趣,主要是他代表了一种全新的理念和编程方式,所以我连 续好几天都在实验室奋战到好晚。从IBM网站上阅读各种文档,介绍,可惜中文的东西太少了,基本上都要看英文,也算是练习英文吧。然后就开始了痛苦的环境 配置阶段,不过还好,几天下来,基本上都弄好了,这几天都可以完完整整地跑实例代码,自己也在试着写一些代码了。最近又找了一个IBM自己出的红皮 书,666页的英文详细介绍,从环境到体系结构到编程实例,然后加上各种API文档,感觉又要加班啦。不过这种感觉还是蛮爽的,一堆事情要做,从来不会觉 得无聊了,而且还发现了时间其实还挺紧的。想想1月份就快完了,2月才28天,然后3月放假,得出去逛逛吧,最后的机会了。然后4月5月就剩2个月了,争 取5月31号左右回北京,真的想家了。
跑题了,继续说CELL的东西,看得越多之后呢,就越明白CELL,但是感觉CELL和之前看的那个数据驱动的计算机,还是有一些区别的,数据驱动的计算 机是一种完全不一样的体系结构,但是CELL呢,还算是基本保持有常见计算机的特征,由一个PPU控制8个SPU进行高速运算,协调统一,同时呢进行高速 的数据交换,和数据驱动,虽然能扯上一点关系,但是好像也不是那么回事了。不过仔细想想呢,我要设计的东西,倒是能够基本对应上,这个问题需要下周一和老 师开会的时候再说说。
最后就是最近的SOFTWARE CACHE了,我一直在想这个到底是不是我想要找的那个WAITING MECHANISM的一个实现的版本呢?找了一些资料,和我要做的这个相关的,其实也就是数据缓存,就像体系结构里面学到的虚拟存储器的替换算法和CACHE的替换算法一样,就是将一个不能直接得到的数据,进行缓存和并行运算,从而能够加速。这里需要展开来说一下:
1.CELL的存储结构是在PPU控制下有一个主存储空间,很大,而8个SPU呢,又有各自独立的LS空间,但是很小。虽然说LS和主存相互之间都是可以 进行数据交换的,但是显然SPU直接从LS中取得的CACHE是速度最快的,其次是从主存中,再次是从别的SPU的LS中,这就需要我们设计一种存取的策 略,让平均速度达到最快。从最合适的地方选取,同时,这应该是一种算法,或者是一种分析思路,适合所有我们想要做的运算。
2.是应该从编译的层面出发来考虑这个问题呢,还是从一个lib的角度出发考虑,有些人做的工作是在编译的时候,将代码进行一个转换,加上CACHE需要 的代码,然后再进行代码的转换。这样的做的话,很好,可以让以前的代码直接重用。但是这样做的难度也就加大了,同时也不具有普遍的应用性。另外的想法,是 根据现有的LIB进行新的封装和改造,成为新的LIB,这样以后的代码在进行书写的时候,只要INCLUDE进去,然后在需要进行CACHE的时候,书写 相应的函数就行。
3.是不是所有的函数运算结果都可以用来缓存呢? 如果是没有返回值的函数呢?比如用指针来替代的,是不是要将指针用到的空间数据进行缓存。另外一个方面是,比如数组,也是一个不能直接取到的值,比如 A[f(c)],这些怎样和函数的缓存区分开来或者是有更好的方法。另外,如果我最后想做的主要是对图形处理方面相关的优化,到底是数组多,还是函数出现 的情况更多?
4.初步想法是在LS中划分相应的CACHE空间,这个是在SDK里面就有的,同时在LS之间和主存之间,利用DMA,设计自己的读取方法,来达到最快速 的转换。另外通过封装,来形成自己的一套SOFTWARE CACHE的模式和流程。那么最后需要考虑的就是,怎样将一个原始的代码,转换成我们能够在CELL上面使用的并行程序,以及怎样分解和运算,存取,能够 让等待时间达到最小,速度达到最快了。这个好像就涉及到了很多数学上面的东西,是不是有一个完全通用的方法呢?还是只选择图像处理的一些常用算法比较可 能?
还有很多问题需要自己一一解答,不过从现在的进度来看,还是学到了很多很多东西,接下来的工作主要是继续熟悉CELL的编程模式,阅读那个JPEG的并行化,以及FFT的并行化在CELL上的实现,然后阅读论文,思考这种比较通用的分支算法,还是等待算法,还是缓存算法。
继续努力吧。。。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注