要检查 prime_pthr.c 中的数据争用,可以使用在2.2.2 创建数据争用检测实验中创建的实验之一。
要使用 er_print 显示 prime_pthr_instr.er 实验中的数据争用信息,请键入以下命令:
% er_print prime_pthr_inst.er |
在 (er_print) 提示符下,键入 races 可看到类似如下的输出:
(er_print) races Total Races: 4 Experiment: prime_pthr_inst.er Race #1, Vaddr: (Multiple Addresses) Access 1: Write, is_prime + 0x00000270, line 27 in "prime_pthr.c" Access 2: Write, is_prime + 0x00000270, line 27 in "prime_pthr.c" Total Callstack Traces: 2 Race #2, Vaddr: 0xffbfe714 Access 1: Write, main + 0x0000025C, line 60 in "prime_pthr.c" Access 2: Read, work + 0x00000070, line 40 in "prime_pthr.c" Total Callstack Traces: 1 Race #3, Vaddr: (Multiple Addresses) Access 1: Write, work + 0x00000150, line 44 in "prime_pthr.c" Access 2: Write, work + 0x00000150, line 44 in "prime_pthr.c" Total Callstack Traces: 2 Race #4, Vaddr: 0x21a90 Access 1: Write, work + 0x00000198, line 45 in "prime_pthr.c" Access 2: Write, work + 0x00000198, line 45 in "prime_pthr.c" Total Callstack Traces: 2 (er_print) |
该程序的此次特定运行期间发生了四次数据争用。
要在线程分析器中打开 prime_pthr_inst.er 实验,请键入以下命令:
% tha prime_pthr_inst.er |
以下屏幕抓图显示了在 prime_pthr.c 中检测到的争用,如线程分析器所显示。请注意,这些争用与 er_print 所显示的争用相同。
prime_pthr.c 中显示了四个数据争用:
Race #1(争用 1)是第 27 行函数 is_prime 中对 pflag[ ] 数组的一次写入与同一行中对 pflag[ ] 的另一次写入之间的数据争用。
Race #2(争用 2)是第 60 行中对 main() 中内存位置 i 的一次写入与第 40 行中对同一内存位置(在 work() 中为 *arg)的一次读取之间的数据争用。
Race #3(争用 3)是第 44 行中对 primes[total]
的一次写入与同一行中对 primes[total]
的另一次写入之间的数据争用。
Race #4(争用 4)是第 45 行中对 total 的一次写入与同一行中对 total 的另一次写入之间的数据争用。
如果选择 Race #2(争用 2),然后单击 "Dual Source"(双源)标签,则会看到两个源代码位置,类似于以下屏幕抓图。
Race #2(争用 2)的第一次访问位于第 60 行,显示在顶部面板中。第二次访问位于第 40 行,显示在底部面板中。源代码的左侧会突出显示 "Race Accesses"(争用访问)度量。此度量显示了该行上报告的数据争用访问总次数。