如何在我的 LLVM pass 中检测程序中的线程同步?

How to detect a thread synchronization in a program in my LLVM pass?

我正在尝试测量一个程序在其同步部分花费的时间,例如受锁(或任何其他形式的并发控制)保护的关键部分。

我很困惑如何做到这一点以及如何在我通过我的 llvm pass 运行 的程序中检测并发控制方法。

我写了一个 tool, Contech, to instrument LLVM IR to collect synchronization information (as well as other data). There is also the tool, Harmony,它使用 LLVM IR 来测量类似的信息。

我将概述编写自己的 LLVM Pass 所需的三个组件。

首先,虽然大多数同步控制都依赖于原子操作,但这些操作在汇编中并且通常位于其他库中。由于您没有跟踪每条汇编指令的执行情况,因此您需要求助于函数名称,例如 pthread_mutex_locksem_wait.

其次,在确定了同步控制操作后,LLVM pass 将需要插入必要的检测来记录有关此同步操作的重要信息,例如其标识符(即地址)和时间戳。

第三,系统将需要额外的代码来处理同步记录,因为来自第二个组件的检测在临界区内。没有这个组件,结果将被仪器扭曲。仪器仍然会有影响。