22
中中中中中中中中中中中中中中中中中中 中中 code cache 中中中中 中中中 中中 中中 中中中 中中2009.3

中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

  • Upload
    jenaya

  • View
    261

  • Download
    0

Embed Size (px)

DESCRIPTION

中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略. 报告人: 张盈 导师: 武成岗 时间: 2009.3. 目录. 研究意义 研究背景 多线程共享 Code Cache 分单元管理策略 本地码的链接和断链 永不替换的本地码 Code Cache 替换算法 更新当前执行指令地址 同步操作 无锁哈希表操作 项目及课程完成情况. 研究意义. 二进制翻译多线程程序 龙芯与 x86 的兼容 用 X86_64 平台提升 X86 32 位二进制程序的性能 多线程程序应用广泛 - PowerPoint PPT Presentation

Citation preview

Page 1: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

中期报告:

针对多线程程序的二进制翻译器中的 code cache 管理策略报告人: 张盈

导师: 武成岗时间: 2009.3

Page 2: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

目录 研究意义 研究背景 多线程共享 Code Cache 分单元管理策略

本地码的链接和断链 永不替换的本地码 Code Cache 替换算法 更新当前执行指令地址 同步操作 无锁哈希表操作

项目及课程完成情况

Page 3: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

研究意义 二进制翻译多线程程序

龙芯与 x86 的兼容 用 X86_64 平台提升 X86 32 位二进制程序的性能 多线程程序应用广泛

高效的 code cache 管理策略 许多应用属于大型应用 二进制翻译带来代码膨胀 大量的 IO 操作影响程序性能 操作系统虚存管理的劣势 嵌入式系统的应用

研究现状 Dynamo 已实现支持多线程的二进制翻译器,但不支持共

享 Code Cache 的替换

目标平台

i386 可执行码二进制翻译系统

Page 4: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

目录 研究意义 研究背景 多线程共享 Code Cache 分单元管理策略

本地码的链接和断链 永不替换的本地码 Code Cache 替换算法 更新当前执行指令地址 同步操作 无锁哈希表操作

项目及课程完成情况

Page 5: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

背景介绍

Digital Bridge 框架

优化器

BT控制器

本地码执行器

解释器

翻译器

装载器

X86二进制文件映像

中间表示

反汇编

Code Cache

X86二进制程序

Memory

Code Cache管理器

Page 6: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

背景介绍

库函数 pthread_create

库函数 clone()

系统调用 clone(...)

x86 的线程栈

线程函数入口 线程 flag 线程参数指针

父线程返回,子线程调用线程函数入口

do_clone()•申请 DBT 的线程栈•调用本地系统调用clone 创建 DBT 子线程来翻译执行 X86 子线程

二进制翻译下的 x86多线程程序执行流程

Page 7: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

背景介绍

线程独立与线程共享 大多数结构都可以选择线程独立或者共享 线程独立空间 - 由寄存器变量 env 来指向 线程独立与线程共享 code cache 比较

线程独立:实现较简单, cache 管理带来的竞争相对较小,较好的程序局部性,但是会增大翻译的开销,带来更大代码膨胀。

线程共享:翻译开销和代码膨胀都较小,但是竞争和同步的开销较大。

选择:根据程序共享代码特性。 由于线程独立的 cache 不适应 multi-threaded 结构的程

序,因此本文实现线程共享的 cache 。

Page 8: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

目录 研究意义 研究背景 多线程共享 Code Cache 分单元管理策略

本地码的链接和断链 永不替换的本地码 Code Cache 替换算法 更新当前执行指令地址 同步操作 无锁哈希表操作

项目及课程完成情况

Page 9: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

本地码的链接和断链

本地码链接 减小上下文切换开销

本地码断链 组织线程进入被替换的 Unit

本地码链接示意图

编号 指令序列 占用空间( Byte )

1 jmp L1 2

2 空占位指令 /*3 bytes*/ 3

3 L1: movq env->eip,nextPC 8

4 jmp return_address 5

编号 指令序列 占用空间( Byte )

1 jmp L1 2

2 空占位指令 /*3 bytes*/ 3

3 L1: movq env->eip,nextPC 8

4 jmp return_address 5

3 bytes of target_address

编号 指令序列 占用空间( Byte )

1 jmp L1 2

2 空占位指令 /*3 bytes*/ 3

3 L1: movq env->eip,nextPC 8

4 jmp return_address 5

5jmp target_address 56

本地码链接指令序列本地码断链指令序列

Page 10: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

永不替换的本地码

线程同步功能的基本块需要放入永不替换的单元中 同步功能:系统调用,同步指令

空间开销 在 SPEC2000INT 测试例子中约 1% Code Cache

Thread 1 sleeping

Thread 2 needs code cache

功能示意图

deadlock

Page 11: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

Code Cache 替换算法

分 Unit 的 FIFO 替换策略 多线程的 Unit 替换条件

没有线程在被替换 Unit 中执行 1 、外部线程不能进入

本地码地址在哈希表中失效 断开被替换 Unit 前驱的本地码链接

2 、内部线程立即离开 断开被替换 Unit 中循环的回边

Unit 1

不替换的 Unit

Unit 2

Unit N

分 Unit的 FIFO 策略

Page 12: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

更新当前执行指令地址

示意图

Unit 1

Unit 2

Unit 1

Unit 2

Code Cache Code Cache

1.更新当前本地码指令地址信息2.检查跳转的目标Unit的有效性

检查单元

线程

Page 13: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

更新当前执行指令地址 时间开销

用例: SPEC2000INT

2 个 Unit 时平均 5%

SPEC 中对间接跳转性能敏感的例子随着 Unit数增加,性能下降较多

- 5%

0%

5%

10%

15%

20%

25%

30%

35%

40%

vp

r

pa

rse

r

gz

ip

vo

rte

x

gc

c

two

lf

eo

n

pe

rlb

mk

cra

fty

mc

f

ga

p

bz

ip2

SPEC整点程序性能下降百分比

1 Uni t

2 Uni t s

3 Uni t s

Hiser, Jason D. Williams, Daniel Hu, Wei Davidson, Jack W. Mars, Jason Childers, Bruce R. Evaluating Indirect Branch Handling Mechanisms in Software Dynamic Translation Systems,CGO '07

Page 14: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

更新当前执行指令地址

- 15%

- 10%

- 5%

0%

5%

10%

15%

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

MYSQL多线程程序的线程数

性能下降百分比

1 Uni t

2 Uni t s

3 Uni t s

时间开销 用例: MYSQL 2 个 Unit 时平

均 2.5% , 4 个Unit 时平均 7%

Page 15: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

更新当前执行指令地址

空间开销 方法 1 :用公共的检查单元没有空间开销 方法 2 :每个基本块数据结构中增加 2~4 条指令作

为检查单元,相对 Code Cache 有 25~50% 的空间增加

Page 16: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

同步操作

保证原程序同步语义 原程序中信号机制,由本地的信号处理程序来调用 x86 的信

号处理程序 原程序中的原子锁

识别含有 lock 前缀和 xchg,cmpxchg 指令,保证锁的原子性 DBT 中的同步保证正确性

为全局共享的变量加锁

Page 17: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

同步操作 -细粒度的锁

目标 减少启动时间 增加 Code Cache 替换

时的并发度

名称 使用范围

基本块链接锁 用于建立基本块的前驱后继链接

code cache 管理锁

为一个基本块分配本地码当 code cache 满时进行本地码替换为目标本地码分配空间

本地码替换锁 访问或修改本地码或引用本地码指令地址( 不包括本地码执行 )当本地码满时进行本地码替换将目标本地码写入 code cache本地码链接

其他锁 每个全局变量都有各自的锁

二进制翻译系统中的锁

本地码替换锁

Code Cache管理锁

锁的相互作用

Page 18: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

无锁哈希表

哈希表基本操作 查找本地码 添加基本块 删除基本块

先将基本块结点设上无效标志并在一个延迟的时间点统一删除(未实现)

计算哈希函数:x86_pc_t tb_phys_hash_func(x86_pc){ return x86_pc & (CODE_GEN_PHYS_HASH_SIZE - 1);}查找哈希表:TranslationBlock* Lookup ( x86_pc){ h = tb_phys_hash_func(x86_pc); head_addr = &hashtable[h]; thread_local_storage->hash_tmp_ptr = *head_addr; tb = thread_local_storage ->hash_tmp_ptr; while (true) { if (!tb) return NULL; if (tb->pc == pc) return tb; head_addr = &tb->phys_hash_next; tb = *head_addr; }}更新哈希表:void Insert( tb ){ h = tb_phys_hash_func(x86_pc); head_addr = &tb_phys_hash[h]; while (true) { hash_tmp_ptr = thread_local_storage ->hash_tmp_ptr; tb->phys_hash_next = thread_local_storage -

>hash_tmp_ptr; if(CAS(head_addr, &thread_local_storage -

>hash_tmp_ptr, tb )){ return; } else{ tmptb = *head_addr; while(tmptb != hash_tmp_ptr){ if(tmptb->pc == tb->pc) return; tmptb = tmptb->phys_hash_next; } } }}

查找并更新哈希表TranslationBlock* Lookup_And_Insert ( x86_pc){ TranslationBlock* tb =Lookup ( x86_pc ); if (!tb){ tb = tb_alloc(pc); Insert( tb ); } else return; }

Page 19: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

待完成的内容

实验 测量在发生 Code Cache 替换时的等待时间 测量其余为了提高多线程并发度而做的改进,包括无锁哈希表以及细粒度的锁。

进一步研究 减少更新当前执行指令地址的时空开销 软件 Code Cache 替换对硬件 Cache 局部性的

影响

Page 20: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

目录 研究意义 研究背景 多线程共享 Code Cache 分单元管理策略

本地码的链接和断链 永不替换的本地码 Code Cache 替换算法 更新当前执行指令地址 同步操作 无锁哈希表操作

项目及课程完成情况

Page 21: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

项目及课程完成情况课程 分数 学分 是否学位

自然辨证法与科技革命 ( 中 ) 83 3 是

硕士学位英语(免修) 68 3 是

高性能计算机系统 87 3 是

编译程序高级教程 86 3 是

可计算性和计算复杂性 92 3 否

形式语义学引论 77 3 否

营销经典案例 87 1 否

体育类公共选修课 通过 0.5 否

科学社会主义理论与实践 78 1 是

并行处理 96 3 是

计算机系统性能评价 92 3 是

处理器体系结构前沿 85 2 否

上市公司会计信息透视 73 1 否

中外公司治理经典案例分析 60 1 否

生物信息学进展专题系列讲座 通过 1 否

时间 科研项目2006/03-2007/7

参与开发 MIPS64/LINUX 及 ALPHA/LINUX 上针对 X86 32 位和 64 位体系结构的动态和静态的二进制翻译器,负责指令翻译模块、反汇编模块

2007/7-2008/03

独立开发 X86_64/LINUX上针对 i386体系结构的动态二进制翻译器

已受理专利 2008ICT76(BJ406-08P106420)二进制翻译器中线程共享code cache的替换方法及系统

参加项目

课程学习

Page 22: 中期报告: 针对多线程程序的二进制翻译器 中的 code cache 管理策略

谢谢