rose入门2-Loop Transformation

一周多没更新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)里面的知识继续 ?

 下期继续~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值