关于在收集实验之前校验应用程序以检测数据争用的提示:
如果从编译器收到一条错误消息,指出编译器选项 -xinstrument=datarace 非法,则表明您使用的是不支持线程分析器的旧版 Sun Studio 编译器。可以通过键入命令 cc -Version 检查所使用的编译器的版本。最早支持线程分析器的版本日期为 2006 年 6 月。
如果没有校验二进制代码以进行数据争用检测,collect -r race 命令会发出一条如下所示的警告:
% collect -r races a.out WARNING: Target `a.out' is not instrumented for datarace detection; reported datarace data may be misleading |
通过使用 nm 命令以及查找对 tha 例程的调用,可以确定是否校验了二进制代码以进行数据争用检测。如果显示名称以 __tha_ 开头的例程,则表明已校验二进制代码。示例输出如下所示。
源代码级别校验:
% cc -xopenmp -g -xinstrument=datarace source.c % nm a.out | grep __tha_ [71] | 135408| 0|FUNC |GLOB |0 |UNDEF |__tha_get_stack_id [53] | 135468| 0|FUNC |GLOB |0 |UNDEF |__tha_src_read_w_frame [61] | 135444| 0|FUNC |GLOB |0 |UNDEF |__tha_src_write_w_frame |
二进制代码级别校验:
% cc -xopenmp -g source.c % discover -i datarace -o a.out.i a.out % nm a.out.i | grep __tha_ [88] | 0| 0|NOTY |GLOB |0 |UNDEF |__tha_read_w_pc_frame [49] | 0| 0|NOTY |GLOB |0 |UNDEF |__tha_write_w_pc_frame |
要使用 discover,必须使用编译器优化标志 (-xO1, -xO2, -xO3, -xO4, -xO5) 之一编译输入的二进制代码。编译器必须是不低于 Oracle Solaris Studio 12 Update 1 的发行版。操作系统至少必须为 Oracle Solaris 10 Update 5 或 OpenSolaris 版本 snv_70。否则,可能会收到一条如下所示的警告。
% discover -i datarace -o a.out.i a.out discover (warning): a.out has no annotations. Results may be incomplete. See discover documentation for compiler flag/OS recommendation |
如果使用编译器选项 -xbinopt=prepare 编译了二进制代码,可能也可以在基于 SPARC 的系统中运行的早期 Solaris 版本上使用 discover 工具。有关该编译器选项的信息,请参见 cc(1)、CC(1) 或 f95(1) 手册页。