本节包括常见问题及其解答的列表。有关对此常见问题的最新更新,请参见Sun Developer Network。
为什么行号信息不正确?
答案:尝试关闭优化,或指定级别 -x03 或更低。编译器的优化变换可能会使行号信息失真,并使实验结果变得难以阅读。
问题:我是否真的需要安装 collect 命令缺少的修补程序?
答案:是。确保实验系统安装了所有必需修补程序。如果缺少任何必需的修补程序,则实验结果可能会不正确。
问题:是否可以使用我的代码链接 malloc() 库的归档版本?
答案:否。线程分析器放在 malloc() 例程上,因此链接 malloc() 库的归档版本可能会导致误报数据争用。
问题:线程分析器是否可以检测 OpenMP 应用程序中的数据争用?对于 POSIX 或 Solaris 线程应用程序又怎么样呢?
答案:线程分析器可以检测在使用 POSIX 线程 API、Solaris 操作系统(R) 线程 API、OpenMP 指令、Sun 并行指令、Cray(R) 并行指令或这些项的混合编写的代码中发生的数据争用。
问题:线程分析器是否可以检测不同进程之间的数据争用?
答案:还不可以。当前,它仅检测从一个进程产生的不同线程之间的数据争用。
问题:线程分析器是否能够找出所有数据争用?
答案:否。线程分析器在运行时检测数据争用,应用程序的确切运行时行为取决于输入数据集。特定的输入数据集可能并不导致数据争用。线程分析器按高级别模拟线程之间的并发性,以便最大限度地减少操作系统调度的影响。但是,操作系统调度仍可以影响内存分配和存储重用,而这会使潜在的数据争用发生变化。
将线程分析器与不同数目的线程和不同的输入数据集一起使用,并对单个数据集重复实验,以最大限度地增加该工具检测数据争用的可能性。
问题:为什么在不同的运行中线程分析器提供的数据争用结果是不同的?
答案:之所以出现此现象,是因为运行之间存在计时差异。在不同运行中线程按不同的顺序访问内存时,将会报告不同的数据争用结果。
问题:为什么线程分析器报告在我的应用程序中不存在的数据争用?如何删除它们?
答案:在一些情况下,线程分析器可能会报告在程序中从未实际发生过的数据争用。这种情况称为误报,它们通常在使用用户实现的同步或在线程之间再循环内存时发生。例如,如果代码包括实现旋转锁的手动编码程序集,则线程分析器将无法识别这些同步点。有关误报的详细说明以及如何通过 API 调用删除它们的示例,请参见教程。
问题:什么是 librdthooks.so?它有何作用?
答案:librdthooks.so 是满足数据争用检测校验调用和用户 API 调用的入口点的库。编译程序并将其与 -xinstrument=datarace 链接时,将自动链接它。有关更多信息,请参见 librdthooks(3) 手册页。
问题:我如何知道可执行文件或库是否已经过校验?
答案:使用 nm。有关更多详细信息,请参见 nm(1) 手册页。如果找到全局未定义符号 __rdt_src_read 或 __rdt_src_write,则可执行文件或库已经过校验。
问题:是否可以使用分析器读取数据争用实验?
答案:可以,分析器显示所有的传统性能分析选项卡,以及新增的 Races(争用)、Races Source(争用源)和 Race Details(争用详细信息)选项卡。线程分析器界面经过了简化,不显示传统的分析器选项卡。
问题:为什么将它与 C、C++ 或 F90 一起使用时,出现一条错误消息,指出编译器选项 -xinstrument=datarace 是错误的?
答案:您使用的是不支持线程分析器的旧版本 Sun Studio。通过输入以下内容,检查您所使用的 Sun Studio 版本:cc -Version。必须使用 2006 年 6 月以后的版本。
问题:为什么使用 er_print 实用程序时出现一条错误消息,指出争用命令无效?
答案:您使用的是不支持线程分析器的旧版本 Sun Studio。通过输入以下内容,检查您所使用的 Sun Studio 版本:er_print -V。必须使用不早于 2006 年 6 月的版本。
问题:为什么在运行 collect -r 时出现一条错误消息,指出无法识别 -r?
答案:您使用的是不支持线程分析器的旧版本 Sun Studio。通过输入 collect -V 检查您所使用的 Sun Studio 版本。必须使用不早于 2006 年 6 月的版本。
问题:如何报告错误或与他人共享我的线程分析器体验?
答案:将您的反馈与线程分析器工程师和用户共享的最佳方法是,读取并张贴到 Sun Studio 工具论坛。您可能会发现已经解答了您的问题。