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