一周多没更新rose入门篇了啊。这段时间学了个科目三,又有些其他瓜葛。。
先回答之前的入门1中的三个问题:
1,关于Makefile。
一直感觉,那个libtool太犀利了,七八千行,肯定太臃肿了。我感觉这个和mpiifort一样,就是个脚本,一个巨复杂的脚本,最后实际就是ifort -I ... -L... -l...。
立博师兄对我这个猜想给予了肯定的答复。但没给我他们的makefile。但是突然有一天,我发现rose的wiki太牛了,上面啥都有,包括对makefile的全面解释。
关于makefile的子栏在这里:http://en.wikibooks.org/wiki/ROSE_Compiler_Framework/How_to_set_up_the_makefile_for_a_translator
我安装的是edg3版本的,所以makefile按照页面下部分的写法。java openjdk安装的路径比较奇葩,需要在ld_library_path中添加libjvm.so的路径。
2,关于function过多的问题。
首先,built_in function是编译器自带的,无论分析什么文件都有420个built_in function。可以拿一个空白的文本文件做输入,发现还是有420个built_in function.
fopen, fseek之类的glib函数是因为我的输入文件中include<stdio.h>,这个头文件去掉后这些就没了。
看了wiki里面,才知道人家早都提醒了,不要加include,反正就是分析程序,干嘛弄得那么正式,还把分析过程变复杂了。
但是发现是main函数等全局函数永远是最后几个节点。
3,generateDot, dotWholeGraph区别。
大致的看了源码,generateDot是继承于simpleProcessing,而DotWholeGraph是继承于一个memoryPool的类。
simpleProcessing只对源程序中的AST进行分析,memoryPool对包括build_in在内的所有IR进行分析(这一行是我的理解,没有确认)
2、3问题的发现过程还要感谢贵组小师弟余洪坤和我一起,他现在大四,杨老师安排他暂时跟我做毕设,用ROSE。
===============================================================================
科目四都学完了,才开始更新这篇。。最近很混乱啊,
关于Loop Tranformation,我想做的是2.5D/3.5D cache blocking,目前只在CPU平台下,只针对C语言。
在tutorial里面,第38章,有关于ROSE里面一个比较完整的Loop Optimization机制的说明。这相当于一个内嵌的LoopOptimization实现,调用相应接口,并给出相应的参数,就能实现一大堆的优化。
因为我想做的是针对3.5D stencil cache blocking的操作,将来又要迁移到GPU等异构平台上,所以自己实现是必须的。
由于刚学ROSE,虽然通过generateDotGraph看清了程序结构,但落实到写程序上,还是很难,不知道各种数据结构是什么意思,一开始又不知道怎么查文档。
后来看到偶然39章有介绍三个函数,loopUnrolling, loopInterchange, loopTiling。
先说他们的局限性,文档中说要求perfect nested loop, 目前我还不理解这句话,隐隐感觉有坑。。。
这三个function是SageInterface namespace下面的,可以说是基本满足了我的需求。接口很简单,给出一个SgForStatement*指针,给出是第几重循环,最后给出tilesize或者是向上移动几次,完成了操作。
其实,使用这个接口最关键的是如何给出SgForStatement指针,在
tests/roseTests/astInterfaceTests/loopTiling.C中,样例程序以abstract_handle来解决这个问题。
在online reference中,找不到关于这个类的资料,但是在src/midend或者在http://fossies.org/dox/rose-0.9.5a-without-EDG-20584/index.html 中,可以看到,它大概是这么一个关系:
SgNode<->abstract_node<->abstract_handle。abstract_handle就是通过语法construct表示来得到相应的SgNode。
举例来说:
通过sourceFile这个sgNode得到sourcefile域的abstract_node,通过这个abstract_node,构造sourcefile域的abstract_handle。
现在要找第一个for循环的abstract_handle,它相当于在sourcefile域里面找第一个for循环,这里面有多种方法,常见的有numbering(第几个for循环),function(哪个函数里的for循环),position(第几行到第几行)。给出了这个string信息,就可以构造找到某个for循环的abstract_handle。
构造这个字符串的信息可以去Tutorial里面的46章或者
src/midend/abstractHandle/abstract_handle.h(cpp)里面
具体numbering或者position里面写哪个数,不知道的可以先用visitor遍历打印:
tutorial/abstractHandle1.cpp
根据打印的信息就能确定在构建for循环的abstract_handle该写什么了。
目前为止,2.5Dblocking所需要的interchange和tiling两个功能就OK了,所需要的是如何搭配使用。
这里出现了两个问题,
1,先interchange再tiling,那么tiling时的handle是按照源程序的还是interchange之后的?
2,这两个函数能完成3.5D cache blocking么?是否还需要ast construct(tutorial chapter32)里面的知识继续 ?
下期继续~