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

Preview:

DESCRIPTION

二进制翻译下的多线程 Replay 系统. 报告人:刘泽善 导师: 武成岗 时间: 2011 年 3 月. 论文贡献. 动态二进制翻译器平台下源输入程序的确定性 Replay 系统 记录 2.9/3.4/4.3X ,重放 1.9/3.8/7.9X 基于位标识的记录共享内存交互的算法 整数位标识读者集合 时间优势。无需合并向量。 空间优势 。 每个内存块一个向量。 8Thrd 512B 块: 120B/ 内存块,平均

Citation preview

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

报告人:刘泽善导师: 武成岗时间: 2011 年 3 月

论文贡献 动态二进制翻译器平台下源输入程序的确定性

Replay 系统 记录 2.9/3.4/4.3X ,重放 1.9/3.8/7.9X

基于位标识的记录共享内存交互的算法 整数位标识读者集合 时间优势。无需合并向量。 空间优势。每个内存块一个向量。 8Thrd 512B

块: 120B/ 内存块,平均 <2M ,最大 14.6M 基于访存指令插桩的纯软件的 Replay 系统的

优化

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

研究意义 Replay 系统的应用广泛

程序调试。多线程程序的调试 反向调试。 Time-Travel : reverse

step/breakpoints/watchpoints 并行化程序分析。在线 Replay 分离程序的执行

和分析过程降低开销

AB

cpu0 cpu1 cpu2

C

cpu3

D

cpu4

Speculate!

研究意义

入侵检测。重现入侵前、入侵时及之后整个系统的状态

错误容忍。 ExtraVirt 比较原执行和复制执行的输出来容忍处理器硬件的暂时性错误;发生灾难性错误而不能继续时由等价的重放执行重建最新的程序状态

计算机系统结构研究。 ReTrace 重放时生成Trace ,实现 Trace 的有效收集和存储

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

背景知识和相关研究工作

本文 Replay 系统应用需求:辅助二进制翻译器的多线程错误调试

多线程错误 Data race, atomicity violation, order violation

Thread 1S1: if(thd->proc_info){S2: fputs(thd->proc_info, …);}

MySQL hd_innodb.cc

Thread 2 …

S3: thd->proc_info = NULL; …

Buggy interleaving

8

多线程程序调试 % gcc hash.c % a.out Segmentation 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”%

背景知识和相关研究工作

二进制翻译的下多线程错误调试更加困难 源输入程序 二进制翻译系统

对源输入程序确定性记录和重放

多线程 Replay 系统关键问题

单线程程序 输入,中断(信号)

多线程程序 共享内存访问顺序 单核执行:记录线程之间的调度顺序 多核执行:?每一条访存指令都可能与其他线程竞

争 关键问题:如何高效的记录线程之间的共享内

存交互

具有代表性的 Replay 系统 - 硬件

FDR(ISCA’03) Cache 一致性协议的的一致性消息( coherence

message )上附加额外信息来检测多核之间的访存依赖

BugNet(ISCA’05) 重放单个线程:每条读指令的结果一致 Cache 的每个字上增加了一个 FLL (First Load

Log) 位 内存访问顺序:同 FDR

具有代表性的 Replay 系统 - 硬件

Lee 等 (MICRO’09) 不需要检测和记录共享内存依赖,离线重构 修改 BugNet 的记录读指令结果的方法, Cache

Miss 时记录 Cache Block 的数据和指令计数 Satisfiability Modulo Theory, SMT solver 离线求解

出每个内存事件的全局序及部分序

具有代表性的 Replay 系统 - 硬件

LReplay(ISCA’10) 多核处理器能够提供全局时钟 记录访存指令的 pending period 信息 pending period 不相交的两条指令存在物理时间序 pending period 相交的访存指令——直接记录下他

们执行序

ts(v)ts(u) te(u) te(v)

具有代表性的 Replay 系统 - 软件

InstantReplay(IEEE Tras.’87) 记录共享对象的访问顺序 假设没有数据竞争

PinPlay(CGO’10) 记录文件 self-contained ,记录重放跨操作系统 实现了 GDB 的调试接口 共享内存: FDR 的软件实现——记录 80~146X ,

重放 26~36X

具有代表性的 Replay 系统 - 软件

PRES 和 ODR(SOSP’09) 只要求错误重现,并不要求的数据竞争情况一致 正式运行中只记录部分信息 重放:启发式的搜索算法不断的尝试

SMP-ReVirt(VEE’08) 多处理器虚拟机的记录和重放系统 硬件页保护机制检测共享内存的读写

具有代表性的 Replay 系统 - 软件

Respec(ASPLOS’10) Online replay, 2 Thrd 18%,4 Thrd 55% external determinism: 系统输出和最终机器状态一

致 speculative execution: 只记录共享内存交互的少

量信息,重放不一致则回滚 修改内核和 glibc

具有代表性的 Replay 系统 - 软件

DoublePlay(ASPLOS’11)

CPU 0

REPLAY

Ep 4

Ep 1

Ep 3

Ep 2

CPU 0

CPU 1

CPU 2

CPU 3

Thread-parallel execution

Ep 1

Ep 2

Ep 3

Ep 4

CPU 6

CPU 4

CPU 7

CPU 5

Epoch-parallel execution

SyscallsSync opsSignals

RECORD (uniparallelism)

InitialProcessState

SyscallsSync opsSignals

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

研究内容与贡献

二进制翻译下多线程程序不确定性 基于位标识的记录共享内存交互的

算法 基于访存指令插桩的纯软件的

Replay 系统的优化方法

不确定性的记录 PinPlay(CGO’10)详尽的分析了影响多线程的

不确定性因素 1. 起始栈位置的改变 2. 代码和数据位置的改变 3. 程序二进制码以及共享库代码的改变 4. 处理器特定指令行为的改变 5. 信号 6. 未初始化内存的读 7. 系统调用行为的改变 8. 共享内存访问顺序

DBT 下不存在

静态编译避免

SPLASH2 不存在

21

访存依赖

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 消除了 ld A st A

22

访存依赖关系的检测

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 方法的不足

原因:减少硬件复杂性

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 的设计者徐旻的博士论文中提到的Transitive Reduction 算法可以消除上述冗余

不足:每个内存块需要最多 P+1 个 P维向量, P为线程数,内存开销大

VIC

TR 算法的不足 依赖关系无论是否需要记录都有对两个向量的

合并操作,时间开销大

基于位标识的方法

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. 无需合并向量

基于位标识的方法

基于访存指令插桩的方法,原因 硬件方法:还没有在实际的处理器采用 需要内核支持以及修改 glibc 的方法:工作量太大 页保护的方法:假共享( false sharing )及页竞争

的影响,线程数量多时性能不好 只记录少量信息,离线重构:重构算法复杂,可以做为将来的工作

基于访存指令插桩的 Replay 系统的优化方法 栈内存访问无需插桩

平均 37% 最高 84%

基于访存指令插桩的 Replay 系统的优化方法 充分利用目标平台的寄存器资源

龙芯的寄存器资源相对于 X86-32 要充足得多 caller-saved : 18 个,上下文切换开销大 翻译时利用富余寄存器手工编写插桩函数 专用的访存指令计数的寄存器

访存指令计数

DoublePlay采用记录指令 PC以及分支计数的方法记录线程调度序,分支计数硬件 PMU提供

PMU 的计数并不区分线程 二进制翻译的影响很难做到精确的计数 龙芯寄存器资源充裕——专用寄存器计数

基于访存指令插桩的 Replay 系统的优化方法 访存地址关联数据结构优化查找

只需要 ~10 指令 选择合适大小的内存块,空间开销不大

16bits (16-x)bits addr xbits

映射表

关联数据结构

基于访存指令插桩的 Replay 系统的优化方法 访存依赖关系记录的优化

保存在线程私有缓存中,满时输出 减少文件竞争及 I/O 输出的开销

内存访问局部性优化 当前使用的关联数据结构很可能被下次内存访问使

用 每个线程缓存当前指令访问的关联数据结构地址

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

系统评测与分析

优化器

BT控制器

本地码执行器

解释器

翻译器

装载器

X86二进制文件映像

中间表示

Code Cache

X86二进制程序

Memory

Code Cache管理器

反汇编器

二进制翻译系统 DigitalBridge

系统评测与分析 机器环境

参数项 配置CPU型号 龙芯 2F (福珑盒子)CPU 核数 1

指令集 兼容 64 位 MIPS III

工作频率 800M Hz

内存 1G

L1 Cache 64KB 指令 Cache , 64KB 数据 Cache ,四路组相连

L2 Cache 片上 Cache , 512KB ,四路组相连

操作系统 华镭 Linux

内核 2.6.34

系统评测与分析 测试集 SPLASH-2

程序名 特点barnes 三维 N-body模拟(如星系或粒子)采用 Barnes-

Hut 分层算法)fmm 二维 N-body模拟,采用自适应快速 Multipole 算

法ocean 基于海洋环流和表层流的大范围的海洋运动模拟,

有两个版本,一个为优化了数据存储,另一个数据块不连续存放

raytrace 射线投影的三维场景重建water-nsquared 水分子系统作用力和势能变化模拟,采用 O(n2) 的

算法water-spatial 同上,但采用了更高效的 O(n) 的算法

cholesky 稀疏矩阵分解的 Cholesky 算法fft 快速傅立叶变换lu 稠密矩阵分解的 LU 算法,有两个版本,,一个为

优化了数据存储,另一个数据块不连续存放radix 整数基数排序算法核心

系统评测与分析

Baseline: 无 Replay 系统功能 记录运行

2.9/3.4/4.3 最大 10.4 <<PinPlay

(80~146),但比较的意义不大

系统评测与分析

重放 1.9/3.8/7.9

系统评测与分析

空间开销 映射表项数

66/77/95 最大 1047 512B

内存块时0.39/0.68/1.39M

最大 14.6M

系统评测与分析

内存块的影响 记录数据量 内存 竞争开销

3. 记录数据大小增多2. 记录数据大小减少1. 记录数据大小无变化

Thread i Thread j1: ld A2: ld B 1:st B 2:st A

Thread i Thread j1: ld A2: ld B 1:st A 2:st B

Thread i Thread j2: ld A 1:st B

A B

A B

i:2j:1

Thread i

Thread j

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

总结 动态二进制翻译器平台下源输入程序的确定性

Replay 系统 记录 2.9/3.4/4.3X ,重放 1.9/3.8/7.9X

基于位标识的记录共享内存交互的算法 时间优势。无需合并向量。 空间优势。每个内存块一个向量。

基于访存指令插桩的纯软件的 Replay 系统的优化

谢谢各位老师和同学

Recommended