二进制翻译下的多线程 Replay 系统
description
Transcript of 二进制翻译下的多线程 Replay 系统
二进制翻译下的多线程Replay 系统
报告人:刘泽善导师: 武成岗时间: 2011 年 5 月
目录 研究意义 背景知识和相关研究工作 研究内容与贡献 系统评测与分析
研究意义 Replay 系统的应用广泛
程序调试。多线程程序的调试[CGO’10,ISCA’05]
并行化程序分析。在线 Replay 分离程序的执行和分析过程降低开销 [ASPLOS’08, USENIX’08]
入侵检测 [OSDI’02] 错误容忍 [SOSP’05] 计算机系统结构研究
[MoBS’07,SIGMETRICS’06]
研究意义
Replay 系统对二进制翻译系统( DBT )的意义 DBT 支持多线程程序,难以调试 重现错误的有效方法,调试多线程程序的有效工具 对提高 DBT 的健壮性具有重要意义
目录 研究意义 背景知识和相关研究工作 研究内容与贡献 系统评测与分析
背景知识和相关研究工作
本文 Replay 系统应用需求:辅助二进制翻译器的多线程错误调试
多线程错误 数据竞争 , 原子性违反 , 顺序性违反
Thread 1S1: if(thd->proc_info){S2: fputs(thd->proc_info, …);}
MySQL hd_innodb.cc
Thread 2 …
S3: thd->proc_info = NULL; …
Buggy interleaving
7
多线程程序调试% gcc hash.c% a.outSegmentation fault%
% gdb a.outgdb> runProgram received SIGSEGV.In get() at hash.c:4545 a = bucket->d;
% gdb a.outgdb> runProgram exited normally.gdb>
% gcc para-hash.c% a.outSegmentation fault%
% gdb a.out loggdb> runProgram received SIGSEGV.In get() at para-hash.c:6767 a = bucket->d;
% gcc para-hash.c% a.outSegmentation faultRace recorded in “log”%
背景知识和相关研究工作
二进制翻译的下多线程错误调试更加困难 源输入程序 二进制翻译系统
对源输入程序记录和重放 翻译器的错误 => 翻译后程序的随机错误 本地码的错误 => 相应翻译器模块的错误
Buggy Translation
S0: g_data -1
Parent
Child
S1: g_data 1
S3: if (0 == g_data ) error(…);
S1’: g_data 0
S1’: g_data 0
多线程 Replay 系统关键问题 PinPlay(CGO’10) 详尽的分析了影响多线程的
不确定性因素 1. 起始栈位置的改变 2. 代码和数据位置的改变 3. 程序二进制码以及共享库代码的改变 4. 处理器特定指令行为的改变 5. 信号 6. 未初始化内存的读 7. 系统调用行为的改变 8. 共享内存访问顺序(关键问题)
DBT 下不存在
具有代表性的 Replay 系统 - 硬件
FDR(ISCA’03) , BugNet(ISCA’05) 缓存一致性协议的的一致性消息( coherence
message )上附加额外信息来检测多核之间的访存依赖
具有代表性的 Replay 系统 - 软件 InstantReplay(IEEE Tras.’87)
记录共享对象的访问顺序 假设没有数据竞争
PinPlay(CGO’10) 共享内存: FDR 的软件实现——记录 80~146X ,
重放 26~36X PRES 和 ODR(SOSP’09)
只要求错误重现,并不要求的数据竞争情况一致 正式运行中只记录部分信息 重放:启发式的搜索算法不断的尝试
具有代表性的 Replay 系统 - 软件
SMP-ReVirt(VEE’08) 多处理器虚拟机的记录和重放系统 硬件页保护机制检测共享内存的读写
DoublePlay(ASPLOS’11) 记录每个区间中线程的调度,不需要记录共享内存
的访问 需要修改内核及源代码
相关工作总结
基于访存指令插桩的方法,原因 硬件方法:还没有在实际的处理器采用 只记录少量信息,离线重构:重构算法复杂 页保护的方法:假共享( false sharing )及页竞争
的影响,线程数量多时性能不好 需要内核支持以及修改源码的方法:需要源码
目录 研究意义 背景知识和相关研究工作 研究内容与贡献 系统评测与分析
16
访存依赖
ld A
Thread I Thread J
Recording
st B
st C
sub
ld B
add
st C
ld B
st A
st C
Thread I Thread J
Replay
Log
ld D
st D
ld A
st B
st C
sub
ld B
add
st C
ld B
st A
st C
ld D
st D
访存依赖 遵循依赖关系
应用了传递简约优化 (Transitive Reduction)[PADD’93,ISCA’03]
17
访存依赖关系的检测
1
2
3
1
2
3
4
ld A
Thread I Thread J
Recording
st B
st C
add
st C
ld B
st A
A.readers.add(I, 1)
if (C.writer != I) log(WAW)foreach C.readers if (reader != I) log(WAR)C.readers.clear( )C.writer = (I, 3)
B.writer = (I, 2) C.writer =(J, 2)
if (B.writer != J) log(RAW)B.readers.add(J,3)
…
A.readers
A.writer
VIC 0 0 0 0VIC 1 0 0 1VIC 2 0 0 2
FDR 的方法
1
2
3
1
2
3
4
ld A
Thread I Thread J
Recording
st B
st C
add
st C
ld B
st A
A.readers.add(I, 1)
if (C.writer != I) log(WAW)foreach C.readers if (reader != I) log(WAR)C.readers.clear( )C.writer = (I, 3)
B.writer = (I, 2) C.writer =(J, 2)
if (B.writer != J) log(RAW)B.readers.add(J,3)
…
A.readers
A.writer
VIC 3 2 0 2VIC 3 2 2 3VIC 4 2 2 4
FDR 方法的不足
原因: 1. 基于一致性协议 2. 减少硬件复杂性
Thread i Thread j Thread k1: st A2: ld B 1: st B 2: ld A 1: st B 2: st A
FDR方法不能消除的访存依赖
TR 算法的不足 FDR 的设计者徐旻的博士论文中提到的 TR 算
法可以消除上述冗余 不足:每个内存块需要最多 P+1 个 P维向
量, P 为线程数,内存开销大Data Structures:timestamp_t := array {int t1, int t2, …, int tn}; //n是线程数readers_t := map {<int thread_i, timestamp_t read_ts>, …}// 读者集合block_history_t := structure {int writer, timestamp_t w_ts, readers_t readers}Variables:线程 i私有的:timestamp_t VIC;// j != i 时 VIC[j] 为线程 i 传递依赖于线程 j 的最大IC , VIC[i] 为访存指令计数。初始化成 {0, 0, …, 0}每个内存块关联的数据结构 :block_history_t block;
TR 算法的不足 依赖关系无论是否需要记录都有对两个向量的合并操作,时间开销大
ANALYSE(t, addr)// 访存类型 t: r, w, rw, 访存地址 addr2 if t & w……3 then foreach <j, ts> in block.readers……6 VIC merge_vector_timestamp(VIC, ts)// 更新 VIC……9 VIC merge_vector_timestamp(VIC, block.w_ts)13 else …………15 VIC merge_vector_timestamp(VIC, block.w_ts)
基于位标识的方法
Data Structures:timestamp_t : array {int t1, int t2, ..., int tP};//P是线程数block_history_t : structure {int wtid, int wic, int rmask, timestamp_t rics}// 内存块最近的写者 wtid 及其访存计数 wic ,最近的读者访存计数 rics ,有效读者标识 rmaskVariables:线程 i私有的 :int IC;// 访存指令计数timestamp_t VIC;//VIC[j] 线程传递依赖的线程 j 的最大IC , j != i每个内存块关联的数据结构 :block_history_t block;
每个内存块只需一个向量
基于位标识的方法ANALYSE(t, addr)// 访存类型 t: r, w, rw; 访存地址 addr1 IC IC + 12 找到 addr 的关联数据结构 block3 if t & w 4 then if 0 == rmask//查看写者,记录 WAW 依赖5 then if (block.wtid != i) && (block.wic > VIC[block.wtid])6 then VIC[block.wtid] block.wic7 record dependence block.wtid:block.wic i:IC8 else tid 09 while block.rmask != 0//遍历所有的读者,记录 WAR 依赖10 do if (block.rmask & 1) && (tid != i)11 then if block.rics[tid] > VIC[tid]12 then VIC[tid] block.rics[tid]13 record dependence tid:block.rics[tid] i:IC14 block.rmask block.rmask >> 115 tid tid + 116 block.wtid i17 block.wic IC18 block.rmask 019 else // 记录 RAW 依赖20 if (block.wtid != i) && (block.wic > VIC[block.wtid])21 then VIC[block.wtid] block.wic22 record dependence block.wtid:block.wic i:IC23 rmask |= (1 << i)24 block.rics[i] IC
Thread i Thread j Thread k1: st A2: ld B 1: st B 2: ld A 1: st B 2: st A
FDR方法不能消除的访存依赖
1. 检测位标识整数的值,消除FDR 不能消除的访存依赖
2. 无需合并向量
Thread i Thread j Thread k 1: ld B 2: ld A 1: st A 1: st A 2: st B
本文及 FDR均不能消除的访存依赖
平均 3.5 依赖 /1万访存操作
Replay 系统降低开销的方法 -1
栈内存访问无需插桩 平均 37% 最高 84%
Replay 系统降低开销的方法 -2
充分利用目标平台的寄存器资源 龙芯的寄存器资源相对于 X86-32 要充足得多 调用者保存: 18 个,上下文切换开销大 翻译时利用富余寄存器手工编写插桩函数 专用的访存指令计数的寄存器
访存指令计数
DoublePlay 采用记录指令 PC 以及分支计数的方法记录线程调度序,分支计数硬件 PMU提供
PMU 的计数并不区分线程 二进制翻译的影响很难做到精确的计数 龙芯寄存器资源充裕——专用寄存器计数
Replay 系统降低开销的方法 -3
访存地址关联数据结构优化查找 只需要 ~10 指令 选择合适大小的内存块,空间开销不大
16bits (16-x)bits addr xbits
映射表
关联数据结构
Replay 系统降低开销的方法 -其他
访存依赖关系记录的优化 保存在线程私有缓存中,满时输出 减少文件竞争及 I/O 输出的开销
内存访问局部性优化 当前使用的关联数据结构很可能被下次内存访问使
用 每个线程缓存当前指令访问的关联数据结构地址
目录 研究意义 背景知识和相关研究工作 研究内容与贡献 系统评测与分析
系统评测与分析
优化器
BT控制器
本地码执行器
解释器
翻译器
装载器
X86二进制文件映像
中间表示
Code Cache
X86二进制程序
Memory
Code Cache管理器
反汇编器
二进制翻译系统 DigitalBridge
系统评测与分析 机器环境
龙芯 2F 单核 @800MHz 1G 内存
Benchmark : Stanford 的多线程测试包 SPLASH-2 :
复杂应用: barnes、 fmm、 ocean、 raytrace、 water-nsquared、 water-spatial、
核心程序: cholesky、 fft、 lu、 radix
系统评测与分析
相对 FDR 记录性能提高 :平均: 1.49%最高: 9.92%
相对 TR 记录性能提高 :平均: 18.4%大多数: 30+%
系统评测与分析Baseline:无 Replay功能
记录运行 2.9/3.4/4.3 X最大 10.4X
重放 1.9/3.8/7.9X
系统评测与分析
空间开销 映射表项数
66/77/95 最大 1047 512B
内存块时0.39/0.68/1.39M
最大 14.6M
系统评测与分析 不同内存块大小对记录运行的影响 (8Thrd) 512B 块大小性能较好
总结 动态二进制翻译器平台下源输入程序的确定性
Replay 系统 辅助调试二进制翻译器的并发错误 记录 2.9/3.4/4.3X ,重放 1.9/3.8/7.9X
基于位标识的记录共享内存交互的算法 相对于 FDR 方法,存在读者时不再检测写者 相对于 TR 算法
时间优势。无需合并向量。 空间优势。每个内存块一个向量。
基于指令插桩的纯软件的 Replay 系统的优化
谢谢各位老师和同学