线程分析器沿用与 Oracle Developer Studio 性能分析器相同的“收集-分析”模型。
使用线程分析器的过程涉及三个步骤:
为了在程序中检测数据争用,必须首先对代码进行检测以监视运行时的内存访问。检测可以在应用程序源代码或应用程序二进制文件上执行。本教程将介绍如何使用这两种检测程序的方法。
要检测源代码,必须使用特殊的编译器选项 -xinstrument=datarace 对应用程序进行编译。此选项会指示编译器对生成的代码进行检测,以便检测数据争用。
将 -xinstrument=datarace 编译器选项添加到用于编译程序的现有选项集中。
可以使用以下命令检测本教程的源代码:
% cc -xinstrument=datarace -g -xopenmp=noopt -o prime_omp_inst prime_omp.c -lm
% cc -xinstrument=datarace -g -o prime_pthr_inst prime_pthr.c -lm
请注意,本示例在结尾处使用了 _inst 指定输出文件,因此可以知道该二进制代码是检测后的二进制代码。不过,这不是必需的。
要检测程序的二进制代码而非源代码,需要使用 Oracle Developer Studio 中包含的 discover 工具,discover(1) 手册页和Oracle Developer Studio 12.5:Discover 和 Uncover 用户指南中对该工具进行了说明。
对于本教程示例,请键入以下命令编译代码:
% cc -xopenmp=noopt -g -o prime_omp prime_omp.c -lm
% cc -g -O2 -o prime_pthr prime_pthr.c -lm
然后,对所创建的 prime_omp 和 prime_pthr 优化二进制代码运行 discover:
% discover -i datarace -o prime_omp_disc prime_omp
% discover -i datarace -o prime_pthr_disc prime_pthr
这些命令将创建检测后的二进制代码 prime_omp_disc 和 prime_pthr_disc,可以将这些二进制代码与 collect 一起使用,以创建可使用线程分析器进行检查的实验。
使用带有 -r race 标志的 collect 命令来运行程序并在进程执行期间创建数据争用检测实验。对于 OpenMP 程序,确保使用的线程数多于一个。在本教程的样例中,使用了四个线程。
基于通过检测源代码创建的二进制代码创建实验:
% collect -r race -o prime_omp_inst.er prime_omp_inst
% collect -r race -o prime_pthr_inst.er prime_pthr_inst
基于通过使用 discover 工具创建的二进制代码创建实验:
% collect -r race -o prime_omp_disc.er prime_omp_disc
% collect -r race -o prime_pthr_disc.er prime_pthr_disc
为增大检测到数据争用的可能性,建议使用带有 -r race 标志的 collect 创建多个数据争用检测实验。对于每个实验,应使用不同的线程数和不同的输入数据。
例如,在 prime_omp.c 中,由以下行设置线程数:
#define THREADS 4
可通过将上面的 4 更改为大于 1 的其他某个整数(例如 8)来更改线程数。
prime_omp.c 中的以下行会将程序限制为查找 2 和 3000 之间的质数:
#define N 3000
可通过更改 N 的值提供不同的输入数据,从而使程序执行更多或更少的工作。
可以使用线程分析器、性能分析器或 er_print 实用程序检查数据争用检测实验。线程分析器和性能分析器都提供 GUI 界面;线程分析器显示的是一组简化的缺省视图,但在其他方面与性能分析器完全相同。
要启动线程分析器,请键入以下命令:
% tha
第一次启动线程分析器时,将显示 "Welcome"(欢迎)屏幕。
线程分析器在左侧具有菜单栏、工具栏和垂直导航栏,因而您可以选择数据视图。
缺省情况下显示以下数据视图:
"Overview"(概述)屏幕显示已装入实验的度量概述。
"Races"(争用)视图显示程序中检测到的数据争用列表以及关联的调用堆栈跟踪。选择 "Races"(争用)视图中的项时,"Race Details"(争用详细信息)窗口会显示有关数据争用或所选调用堆栈跟踪的详细信息。
"Dual Source"(双源)视图,显示与所选数据争用的两次访问相对应的两个源代码位置。发生数据争用访问的源代码行会突出显示。
"Experiments"(实验)视图显示实验中的装入对象并列出错误和警告消息。
可以选择使用 "More Views"(更多视图)选项菜单查看其他视图。
er_print 实用程序提供命令行界面。可以在交互式会话中使用 er_print 实用程序并在该会话期间指定子命令。也可以使用命令行选项以非交互方式指定子命令。
使用 er_print 实用程序检查争用时,以下子命令非常有用:
–races
该选项会报告在实验中发现的所有数据争用。在 (er_print) 提示符下指定 –races,或者在 er_print 命令行上指定 races。
–rdetail race_id
该选项会显示具有指定 race_id 的数据争用的详细信息。在 (er_print) 提示符下指定 –rdetail,或者在 er_print 命令行上指定 rdetail。如果指定的 race_id 为 all,将显示所有数据争用的详细信息。否则,请指定单个争用编号,例如为第一个数据争用指定 1。
–header
该选项会显示有关实验的描述性信息并报告所有错误或警告。在 (er_print) 提示符下指定 header,或者在命令行上指定 –header。
有关更多信息,请参阅 collect(1)、tha(1)、analyzer(1) 和 er_print(1) 手册页。