JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:线程分析器用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  什么是线程分析器?它有什么作用?

2.  数据争用教程

2.1 数据争用教程源文件

2.1.1 获取数据争用教程源文件

2.1.2 prime_omp.c 的源代码

2.1.3 prime_pthr.c 的源代码

2.1.3.1 数据争用在 prime_omp.cprime_pthr.c 中的效果

2.2 如何使用线程分析器查找数据争用

2.2.1 检测代码

2.2.1.1 检测源代码

2.2.1.2 检测二进制代码

2.2.2 创建数据争用检测实验

2.2.3 检查数据争用检测实验

2.2.3.1 使用线程分析器查看数据争用实验

2.2.3.2 使用 er_print 查看数据争用实验

2.3 了解实验结果

2.3.1 prime_omp.c 中的数据争用

2.3.2 prime_pthr.c 中的数据争用

2.3.3 数据争用的调用堆栈跟踪

2.4 诊断数据争用的原因

2.4.1 检查数据争用是否为误报

2.4.2 检查数据争用是否为良性

2.4.3 修复错误而不是修复数据争用

2.4.3.1 修复 prime_omp.c 中的错误

2.4.3.2 修复 prime_pthr.c 中的错误

2.5 误报

2.5.1 用户定义的同步

2.5.2 由不同线程回收的内存

2.6 良性数据争用

2.6.1 用于查找质数的程序

2.6.2 用于检验数组值类型的程序

2.6.3 使用双检锁的程序

3.  死锁教程

A.  线程分析器可识别的 API

B.  有用提示

2.2 如何使用线程分析器查找数据争用

线程分析器沿用与 Oracle Solaris Studio 性能分析器相同的“收集-分析”模型。

使用线程分析器的过程涉及三个步骤:

  1. 2.2.1 检测代码

  2. 2.2.2 创建数据争用检测实验

  3. 2.2.3 检查数据争用检测实验

2.2.1 检测代码

为了在程序中检测数据争用,必须首先对代码进行检测以监视运行时的内存访问。该检测可以在应用程序源代码上完成,也可以在已使用某些 Oracle 编译器优化标志进行编译的应用程序二进制代码上完成。本教程将介绍如何使用这两种检测程序的方法。

2.2.1.1 检测源代码

要检测源代码,必须使用特殊的编译器选项 -xinstrument=datarace 对应用程序进行编译。此选项会指示编译器对生成的代码进行检测,以便检测数据争用。

-xinstrument=datarace 编译器选项添加到用于编译程序的现有选项集中。


注 - 使用 -xinstrument=datarace 对程序进行编译时,务必还要指定 -g 选项,目的是生成其他信息以启用分析器的全部功能。对程序进行编译以检测数据争用时,不要指定高优化级别。请使用 -xopenmp=noopt 编译 OpenMP 程序。使用高优化级别时,报告的信息(如行号和调用堆栈)可能是错误的。


可以使用以下命令检测本教程的源代码:

% 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 指定输出文件,因此可以知道该二进制代码是检测后的二进制代码。不过,这不是必需的。

2.2.1.2 检测二进制代码

要检测程序的二进制代码而非源代码,需要使用 Oracle Solaris Studio 中包含的 discover 工具,discover(1) 手册页和《Oracle Solaris Studio 12.3:Discover 和 Uncover 用户指南》中对该工具进行了说明。

有关二进制代码检测要求的更多信息,请参见二进制代码级别检测

对于本教程中的示例,请键入以下命令以使用优化级别 3 进行代码编译,进而创建可由 discover 使用的二进制代码。

% cc -xopenmp=noopt -g -o prime_omp_opt prime_omp.c -lm
% cc -g -O3 -o prime_pthr_opt prime_pthr.c -lm

然后,对所创建的 prime_omp_optprime_pthr_opt 优化二进制代码运行 discover

% discover -i datarace -o prime_omp_disc prime_omp_opt
% discover -i datarace -o prime_pthr_disc prime_pthr_opt

这些命令将创建检测后的二进制代码 prime_omp_discprime_pthr_disc,可以将这些二进制代码与 collect 一起使用,以创建可使用线程分析器进行检查的实验。

2.2.2 创建数据争用检测实验

使用带有 -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 的值提供不同的输入数据,从而使程序执行更多或更少的工作。

2.2.3 检查数据争用检测实验

可以使用线程分析器、性能分析器或 er_print 实用程序检查数据争用检测实验。线程分析器和性能分析器都提供 GUI 界面;线程分析器显示的是一组简化的缺省标签,但在其他方面与性能分析器完全相同。

2.2.3.1 使用线程分析器查看数据争用实验

要启动线程分析器,请键入以下命令:

% tha

线程分析器 GUI 具有菜单栏、工具栏以及包含多个标签的拆分窗格(不同标签对应不同的显示)。

缺省情况下,左侧窗格中会显示以下三个标签:

线程分析器显示屏的右侧窗格中显示以下两个标签:

2.2.3.2 使用 er_print 查看数据争用实验

er_print 实用程序提供命令行界面。可以在交互式会话中使用 er_print 实用程序并在该会话期间指定子命令。也可以使用命令行选项以非交互方式指定子命令。

使用 er_print 实用程序检查争用时,以下子命令非常有用:

有关更多信息,请参阅 collect(1)、tha(1)、analyzer(1) 和 er_print(1) 手册页。