[发明专利]基于CMP的推测多线程机制下的独立栈函数调用方法有效
申请号: | 201010186162.0 | 申请日: | 2010-05-28 |
公开(公告)号: | CN101833476A | 公开(公告)日: | 2010-09-15 |
发明(设计)人: | 赵银亮;韦远科;宋少龙;王旭昊 | 申请(专利权)人: | 西安交通大学 |
主分类号: | G06F9/46 | 分类号: | G06F9/46 |
代理公司: | 西安通大专利代理有限责任公司 61200 | 代理人: | 陆万寿 |
地址: | 710049*** | 国省代码: | 陕西;61 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 基于 cmp 推测 多线程 机制 独立 函数 调用 方法 | ||
技术领域
本发明属于计算机领域,涉及基于CMP的推测多线程技术,特别涉及基于CMP的推测多线程机制下的独立栈函数调用方法。
背景技术
CMP又称为单芯片多处理机,在CMP中每一个处理器芯片上集成了多个处理器核。为了充分利用CMP的多核计算资源,人们提出了推测多线程技术。推测多线程技术是程序自动并行化的一种有效方法,它在允许线程间存在数据依赖和控制依赖的前提下,通过将串行程序划分为多个可并行执行的线程来提高程序的运行效率,而程序串行语义的正确性则交由底层的硬件根据相应的执行模型来进行保证。正是由于推测多线程技术在线程划分自由度上的放开,那些原本因数据依赖,控制依赖无法被划分为多线程执行的程序现在也可以并行执行。由于线程之间潜在的数据依赖和控制依赖,推测多线程系统中线程的执行就隐含了数据推测和控制推测的思想,这也正是推测多线程技术这一概念的由来。
栈空间是程序运行时不可缺少的一部分内存空间,它主要用于保存程序中函数的局部变量以及函数调用过程中需要保存的各种寄存器内容。推测多线程机制下,函数调用栈的运行机制不同于传统方式的栈运行。
传统方式下,程序在某一时刻只有一个函数处在运行状态,因此函数之间的调用返回关系可以很容易地通过一个先进先出的栈结构进行维护。函数调用前,程序在栈空间上分配一段内存空间——压栈,存放被调函数中用到的临时变量以及相关需要保存的寄存器的当前值。函数调用结束的时候,根据相关的寄存器进行栈空间的释放——退栈,从而返回到调用者中。但是,在推测多线程机制下,系统中同时运行着多个线程,而每个线程中都有可能出现函数调用,同一时刻就会有多个函数的活动记录存在。传统的栈模型无法同时存放多个函数的活动记录并且也无法维护函数之间的调用返回关系。
目前的推测多线程机制下的函数调用方法采用了一种称为共享栈的函数调用方法。在这种调用方法中,所有的处理器单元共享同一个栈空间,不同的处理器单元在执行函数调用时,被调函数的活动记录被分配在这一共享的栈空间上。由于栈空间是共享的,而多个处理器单元不能同时对同一栈空间进行空间分配操作,因此这种函数调用方法就会存在栈操作同步开销问题。当一个处理器单元需要分配活动记录所需的空间时,它首先需要对共享的栈空间进行加锁,如果加锁成功,则进行正常的空间分配操作,空间分配完成后处理器单元再对栈空间进行解锁操作。如果加锁失败,则该处理器单元就等待,直到加锁成功。这种函数调用方法引入的同步限制了推测多线程中线程发起的数目,并最终影响了程序执行的加速比。另外从程序执行效率的角度来看,栈空间的调用操作也是一个很重要的问题,如果设计不当,就会产生不必要的线程间依赖或者影响线程的发起,并最终影响程序并行执行的加速比。
发明内容
本发明解决的技术问题在于克服共享栈函数调用方法存在的并发性问题,提供一种基于CMP的推测多线程机制下的独立栈函数调用方法,以保证推测多线程下程序中的函数调用能够正确、高效的进行。
本发明是通过以下技术方案来实现:
一种基于CMP的推测多线程机制下的独立栈函数调用方法,处理器在初始化的时候,从共享的内存空间上为每个处理器单元划分出一段私有的内存空间作为栈空间,每个处理器单元记录其对应栈空间的起始地址和结束地址;
每个处理器单元内部设置一个记录其对应栈空间栈顶的内部栈顶寄存器,处理器单元通过update(reg,immed)指令用reg寄存器的值更新内部栈顶寄存器INTERNAL_SP的值,处理器单元通过get(reg,immed)指令用内部栈顶寄存器INTERNAL_SP的值更新reg寄存器的值;其中立即数immed用于区分活动记录的分配和释放这两种情况;
当发生函数调用时,处理器首先执行get($sp,immed)指令以获取保存函数活动记录的栈桢的开始位置,然后通过移动当前处理器栈指针以分配保存函数活动记录所需的内存空间,再调用update$sp,0更新当前处理器单元的内部栈顶寄存器INTERNAL_SP,从而完成当前函数调用的活动记录空间的分配;
当函数调用返回时,编译器首先进行栈指针SP寄存器的恢复,然后调用update$sp,1更新当前处理器单元的内部栈顶寄存器INTERNAL_SP,完成当前函数调用活动记录空间的释放。
所述的处理器单元中设置两个寄存器:起始地址寄存器(stack_start)和结束地址寄存器(stack_end),分别用来记录栈空间的起始地址和结束地址。
所述的update(reg,immed)指令的语义包括如下三种情况:
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于西安交通大学,未经西安交通大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201010186162.0/2.html,转载请声明来源钻瓜专利网。