1 / 38

二进制翻译下的多线程 Replay 系统

二进制翻译下的多线程 Replay 系统. 报告人:刘泽善 导师: 武成岗 时间: 2011 年 5 月. 目录. 研究意义 背景知识和相关研究工作 研究内容与贡献 系统评测与分析. 研究意义. Replay 系统的应用广泛 程序调试。多线程程序的调试 [CGO’10,ISCA’05] 并行化程序分析。在线 Replay 分离程序的执行和分析过程降低开销 [ASPLOS’08, USENIX’08] 入侵检测 [OSDI’02] 错误容忍 [SOSP’05] 计算机系统结构研究 [MoBS’07,SIGMETRICS’06]. 研究意义.

hye
Download Presentation

二进制翻译下的多线程 Replay 系统

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 二进制翻译下的多线程Replay系统 报告人:刘泽善 导师: 武成岗 时间: 2011年5月

  2. 目录 • 研究意义 • 背景知识和相关研究工作 • 研究内容与贡献 • 系统评测与分析

  3. 研究意义 • Replay系统的应用广泛 • 程序调试。多线程程序的调试[CGO’10,ISCA’05] • 并行化程序分析。在线Replay分离程序的执行和分析过程降低开销[ASPLOS’08, USENIX’08] • 入侵检测[OSDI’02] • 错误容忍[SOSP’05] • 计算机系统结构研究[MoBS’07,SIGMETRICS’06]

  4. 研究意义 • Replay系统对二进制翻译系统(DBT)的意义 • DBT支持多线程程序,难以调试 • 重现错误的有效方法,调试多线程程序的有效工具 • 对提高DBT的健壮性具有重要意义

  5. 目录 • 研究意义 • 背景知识和相关研究工作 • 研究内容与贡献 • 系统评测与分析

  6. Thread 1 S1: if(thd->proc_info){ S2: fputs(thd->proc_info, …); } MySQL hd_innodb.cc Thread 2 … S3: thd->proc_info = NULL; … Buggy interleaving 背景知识和相关研究工作 • 本文Replay系统应用需求:辅助二进制翻译器的多线程错误调试 • 多线程错误 • 数据竞争, 原子性违反, 顺序性违反

  7. 多线程程序调试 % gdba.out gdb> run Program received SIGSEGV. In get() at hash.c:45 45 a = bucket->d; % gcchash.c % a.out Segmentation fault % % gccpara-hash.c % a.out Segmentation fault % % gdba.out gdb> run Program exited normally. gdb> % gccpara-hash.c % a.out Segmentation fault Race recorded in “log” % % gdba.out log gdb> run Program received SIGSEGV. In get() at para-hash.c:67 67 a = bucket->d;

  8. 背景知识和相关研究工作 • 二进制翻译的下多线程错误调试更加困难 • 源输入程序 • 二进制翻译系统 • 对源输入程序记录和重放 • 翻译器的错误 => 翻译后程序的随机错误 • 本地码的错误 => 相应翻译器模块的错误

  9. Parent S0: g_data  -1 S1’: g_data 0 Buggy Translation Child S1: g_data 1 S1’: g_data0 S3: if (0 == g_data ) error(…);

  10. 多线程Replay系统关键问题 • PinPlay(CGO’10)详尽的分析了影响多线程的不确定性因素 • 1. 起始栈位置的改变 • 2. 代码和数据位置的改变 • 3. 程序二进制码以及共享库代码的改变 • 4. 处理器特定指令行为的改变 • 5. 信号 • 6. 未初始化内存的读 • 7. 系统调用行为的改变 • 8. 共享内存访问顺序(关键问题) DBT下不存在

  11. 具有代表性的Replay系统-硬件 • FDR(ISCA’03),BugNet(ISCA’05) • 缓存一致性协议的的一致性消息(coherence message)上附加额外信息来检测多核之间的访存依赖

  12. 具有代表性的Replay系统-软件 • InstantReplay(IEEE Tras.’87) • 记录共享对象的访问顺序 • 假设没有数据竞争 • PinPlay(CGO’10) • 共享内存:FDR的软件实现——记录80~146X,重放26~36X • PRES和ODR(SOSP’09) • 只要求错误重现,并不要求的数据竞争情况一致 • 正式运行中只记录部分信息 • 重放:启发式的搜索算法不断的尝试

  13. 具有代表性的Replay系统-软件 • SMP-ReVirt(VEE’08) • 多处理器虚拟机的记录和重放系统 • 硬件页保护机制检测共享内存的读写 • DoublePlay(ASPLOS’11) • 记录每个区间中线程的调度,不需要记录共享内存的访问 • 需要修改内核及源代码

  14. 相关工作总结 • 基于访存指令插桩的方法,原因 • 硬件方法:还没有在实际的处理器采用 • 只记录少量信息,离线重构:重构算法复杂 • 页保护的方法:假共享(false sharing)及页竞争的影响,线程数量多时性能不好 • 需要内核支持以及修改源码的方法:需要源码

  15. 目录 • 研究意义 • 背景知识和相关研究工作 • 研究内容与贡献 • 系统评测与分析

  16. 访存依赖 遵循依赖关系 访存依赖 Thread I Thread J Thread I Thread J ld A add ld A add st B st B st C st C st C Log st C ld B ld B ld D ld D st A st A sub sub st C st C ld B ld B st D st D Recording Replay 应用了传递简约优化(Transitive Reduction) [PADD’93,ISCA’03]

  17. B.writer = (I, 2) C.writer =(J, 2) if (C.writer != I) log(WAW) foreachC.readers if (reader != I) log(WAR) C.readers.clear( ) C.writer = (I, 3) if (B.writer != J) log(RAW) B.readers.add(J,3) … 访存依赖关系的检测 A.readers A.writer Thread I Thread J A.readers.add(I, 1) 1 ld A add 1 st B st C 2 2 st C ld B 3 3 st A 4 Recording

  18. B.writer = (I, 2) C.writer =(J, 2) if (C.writer != I) log(WAW) foreachC.readers if (reader != I) log(WAR) C.readers.clear( ) C.writer = (I, 3) if (B.writer != J) log(RAW) B.readers.add(J,3) … FDR的方法 A.readers A.writer Thread I Thread J A.readers.add(I, 1) 1 ld A add 1 st B st C 2 2 st C ld B 3 3 st A 4 Recording VIC VIC VIC VIC VIC VIC 3 0 4 1 3 2 0 2 0 2 0 2 0 2 0 0 0 2 3 2 2 0 1 4

  19. FDR方法的不足 • 原因:1.基于一致性协议 2.减少硬件复杂性 Thread i Thread j Thread k 1: st A 2: ld B 1: st B 2: ld A 1: st B 2: st A FDR方法不能消除的访存依赖

  20. 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;

  21. TR算法的不足 • 依赖关系无论是否需要记录都有对两个向量的合并操作,时间开销大 ANALYSE(t, addr)//访存类型t: r, w, rw, 访存地址addr 2 if t & w …… • then foreach <j, ts> in block.readers • …… • 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)

  22. 基于位标识的方法 Data Structures: timestamp_t : array {int t1, int t2, ..., inttP};//P是线程数 block_history_t : structure {intwtid, intwic, intrmask, timestamp_trics} //内存块最近的写者wtid及其访存计数wic,最近的读者访存计数rics,有效读者标识rmask Variables: 线程i私有的: int IC;//访存指令计数 timestamp_t VIC;//VIC[j]线程传递依赖的线程j的最大IC, j != i 每个内存块关联的数据结构: block_history_t block; • 每个内存块只需一个向量

  23. 基于位标识的方法 ANALYSE(t, addr)//访存类型t: r, w, rw;访存地址addr 1 IC  IC + 1 2 找到addr的关联数据结构block 3 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.wic 7 record dependence block.wtid:block.wic i:IC 8 elsetid 0 9 whileblock.rmask != 0//遍历所有的读者,记录WAR依赖 10 do if (block.rmask & 1) && (tid != i) 11 then ifblock.rics[tid] > VIC[tid] 12 then VIC[tid] block.rics[tid] 13 record dependence tid:block.rics[tid]  i:IC 14 block.rmaskblock.rmask >> 1 15 tidtid + 1 16 block.wtidi 17 block.wic  IC 18 block.rmask 0 19 else //记录RAW依赖 20 if (block.wtid != i) && (block.wic > VIC[block.wtid]) 21 then VIC[block.wtid]  block.wic 22 record dependence block.wtid:block.wic i:IC 23 rmask |= (1 << i) 24 block.rics[i]  IC 检测位标识整数的值,消除FDR不能消除的访存依赖 无需合并向量 Thread i Thread j Thread k 1: st A 2: ld B 1: st B 2: ld A 1: st B 2: st A FDR方法不能消除的访存依赖

  24. 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万访存操作

  25. Replay系统降低开销的方法-1 • 栈内存访问无需插桩 • 平均37% • 最高84%

  26. Replay系统降低开销的方法-2 • 充分利用目标平台的寄存器资源 • 龙芯的寄存器资源相对于X86-32要充足得多 • 调用者保存:18个,上下文切换开销大 • 翻译时利用富余寄存器手工编写插桩函数 • 专用的访存指令计数的寄存器

  27. 访存指令计数 • DoublePlay采用记录指令PC以及分支计数的方法记录线程调度序,分支计数硬件PMU提供 • PMU的计数并不区分线程 • 二进制翻译的影响很难做到精确的计数 • 龙芯寄存器资源充裕——专用寄存器计数

  28. Replay系统降低开销的方法-3 • 访存地址关联数据结构优化查找 • 只需要~10指令 • 选择合适大小的内存块,空间开销不大

  29. Replay系统降低开销的方法-其他 • 访存依赖关系记录的优化 • 保存在线程私有缓存中,满时输出 • 减少文件竞争及I/O输出的开销 • 内存访问局部性优化 • 当前使用的关联数据结构很可能被下次内存访问使用 • 每个线程缓存当前指令访问的关联数据结构地址

  30. 目录 • 研究意义 • 背景知识和相关研究工作 • 研究内容与贡献 • 系统评测与分析

  31. 系统评测与分析 二进制翻译系统DigitalBridge

  32. 系统评测与分析 • 机器环境 • 龙芯2F 单核 @800MHz • 1G内存 • Benchmark:Stanford的多线程测试包 • SPLASH-2: • 复杂应用:barnes、fmm、ocean、raytrace、water-nsquared、water-spatial、 • 核心程序:cholesky、fft、lu、radix

  33. 系统评测与分析 相对FDR记录性能提高: 平均:1.49% 最高:9.92% 相对TR记录性能提高: 平均:18.4% 大多数:30+%

  34. 系统评测与分析 • Baseline:无Replay功能 • 记录运行2.9/3.4/4.3 X • 最大10.4X • 重放1.9/3.8/7.9X

  35. 系统评测与分析 • 空间开销 • 映射表项数 • 66/77/95 • 最大1047 • 512B内存块时0.39/0.68/1.39M • 最大14.6M

  36. 系统评测与分析 • 不同内存块大小对记录运行的影响(8Thrd) • 512B块大小性能较好

  37. 总结 • 动态二进制翻译器平台下源输入程序的确定性Replay系统 • 辅助调试二进制翻译器的并发错误 • 记录2.9/3.4/4.3X,重放1.9/3.8/7.9X • 基于位标识的记录共享内存交互的算法 • 相对于FDR方法,存在读者时不再检测写者 • 相对于TR算法 • 时间优势。无需合并向量。 • 空间优势。每个内存块一个向量。 • 基于指令插桩的纯软件的Replay系统的优化

  38. 谢谢各位老师和同学

More Related