发明名称 编译器支持下的推测多线程内存数据同步执行方法及装置
摘要 本发明公开了一种编译器支持下的推测多线程内存数据同步执行方法及其装置,能在程序运行时对选定的读写内存指令进行同步,降低读后写数据依赖违规发生的次数,提高多线程同步操作的整体加速比。在获取候选读/写指令对之后,在读指令前添加一条stall指令,并将读指令替换为同步读指令synload,在写指令后添加一条或多条forward指令,在写指令所在线程的线程发起指令spawn后添加一条synset指令;最后经汇编链接生成可执行文件加载后在模拟器上运行;多线程程序以同步的方式推测执行,得到运行结果,并获得较高的加速比。
申请公布号 CN101833440B 申请公布日期 2013.01.02
申请号 CN201010160536.1 申请日期 2010.04.30
申请人 西安交通大学 发明人 赵银亮;王旭昊;韦远科;宋少龙
分类号 G06F9/38(2006.01)I 主分类号 G06F9/38(2006.01)I
代理机构 西安通大专利代理有限责任公司 61200 代理人 陆万寿
主权项 一种编译器支持下的推测多线程内存数据同步执行方法,其特征在于,多线程程序实现内存数据同步包括以下步骤:1)程序由硬件线程划分器划分生成多线程汇编程序后,作为硬件程序剖析器的输入,并在其上运行;2)硬件程序剖析器在运行程序时统计内存数据依赖违规情况,并将统计结果信息反馈给同步编译模块;3)同步编译模块读取统计结果信息,通过计算同步代价获取进行多线程同步操作的候选读/写指令对;然后通过数据流分析之后,在读指令前添加一条stall指令,并将读指令替换为同步读指令synload,在写指令后添加一条或多条forward指令;在写指令所在线程的线程发起指令spawn后添加一条synset指令;最后经汇编链接生成可执行文件加载后在模拟器上运行;当同步子线程执行到stall指令时,停止执行后续指令,等待一段时间;直至对应的同步父线程执行完相应的写指令和forward指令,收到同步父线程发送的含有内存地址和写入数据的同步消息,再根据接收到的同步信息和此前同步子线程对同一内存地址的写入情况,对Sbuffer中的use_flag进行置位或复位,根据该标志位决定是否使用同步父线程发送来的数据,而后停止等待,继续执行后续指令;同步子线程在接收同步消息后的操作由synload指令的执行完成,同步父线程在写入数据后发送同步消息的操作由forward指令完成;4)多线程程序以同步的方式推测执行,模拟器输出程序运行的结果;所述的同步父线程发送同步消息的操作步骤为:(1)在同步父线程发起同步子线程后,同步父线程执行synset指令,向同步子线程发送消息,将同步子线程Sbuffer的syn_flag位置位;(2)执行store*p操作,常规的写内存操作;(3)执行save_address(p)操作,将写入数据的内存地址p保存到发送地 址缓冲区;(4)执行receiver_id=get_immed_successor(),获取同步子线程的处理器编号;(5)执行mesg.value=*p操作,将写内存操作写入的数据写入同步消息mesg的value域;(6)执行mesg.addr=p操作,将写入数据的内存地址p写入同步消息的addr域;(7)执行send(mesg,receiver_id)操作,将构造好的同步消息发送给同步子线程;所述的同步子线程接收同步消息的操作步骤为:(1)执行stall()操作,同步子线程查询Sbuffer的ready_flag位是否被置位;如果否,则同步子线程继续处于阻塞状态;如果是,则同步子线程结束阻塞状态,进行后续操作;(2)执行receive(mesg)操作,收到同步消息后,Sbuffer的ready_flag位被置位;(3)执行message_addr=mesg.addr,获取同步消息的内存地址,存放于Sbuffer的message_addr域;(4)执行message_value=mesg.value,获取同步消息的内存数据值,存放于Sbuffer的message_value域;(5)执行verify(q,message_addr)操作,检查收到同步消息的内存地址是否与写指令操作所要读取的内存地址q是同一地址,如果是则将Sbuffer的use_flag标志位置位;(6)执行loaded_value=load*q操作,进行常规的读内存操作,将读到的写入数据放入memory_value中;在进行读操作的同时,检查当前线程是否已经向内存地址q处写入数据,如果是,则将Sbuffer的use_flag标志位复位;(7)执行result=choose(loaded_value,message_value)操作,如果Sbuffer的use_flag标志位被置位,则同步子线程采用同步消息中的内存数据值作为线程同步读操作最后读取数据的结果;如果use_flag标志位被复位,则使用loaded_value的值作为线程同步读操作最后读取数据的结果;(8)执行quit()操作,将Sbuffer的ready_flag位复位,将Sbuffer的use_flag位复位;所述的Sbuffer是用于接收同步消息和控制同步操作的寄存器文件;Sbuffer由五个域组成:三个控制标志位sync_flag,ready_flag和use_flag,两个消息域message_addr和message_value;线程处理单元在初始化时会将Sbuffer的所有标志位复位;sync_flag位表示是否按同步方法执行,当该标志位被置位,表示按照同步方法执行;当该标志位被复位,表示按常规的方法执行,此时stall指令被跳过,synload指令完成的操作等同于常规的load指令,消息域中的数据无效;ready_flag位表示同步消息是否已经准备好,当该标志位被置位表示同步消息已经准备好;use_flag位表示同步子线程是否使用消息中的数据,当该标志位被置位表示同步子线程将使用消息中的数据,当该标志位被复位表示同步子线程将使用常规读操作获得内存数据;message_addr用来存储同步消息的addr域;message_value用来存储同步消息的value域。
地址 710049 陕西省西安市咸宁路28号