JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.2:OpenMP API 用户指南
search filter icon
search icon

文档信息

前言

1.  OpenMP API 简介

2.  编译并运行 OpenMP 程序

3.  实现定义的行为

4.  嵌套并行操作

5.  任务处理

6.  自动确定变量的作用域

6.1 自动作用域数据范围子句

6.1.1 __auto 子句

6.1.2 default(__auto) 子句

6.2 并行构造的作用域规则

6.2.1 标量变量的作用域规则

6.2.2 数组的作用域规则

6.3 任务构造的作用域规则

6.3.1 标量变量的作用域规则

6.3.2 数组的作用域规则

6.4 关于自动作用域的通用注释

6.5 限制

6.6 检查自动作用域的结果

6.7 自动作用域示例

7.  作用域检查

8.  性能注意事项

A.  子句在指令中的放置

B.  转换为 OpenMP

索引

6.6 检查自动作用域的结果

使用编译器注释可检查自动作用域结果,并确定是否因自动作用域失败而对并行区域进行了序列化。

使用 -g 调试选项编译时,编译器将生成行内注释。可以使用 er_src 命令查看这个生成的注释,如下所示。(er_src 命令作为 Solaris Studio 软件的一部分提供;有关更多信息,请参见 er_src(1) 手册页或《Solaris Studio 性能分析器》手册)。

使用 -xvpara 选项进行编译是一个良好的开端。使用 -xvpara 进行编译可大体确定针对特定构造的自动作用域是否成功。以下是一个示例:

示例 6-1 使用 -vpara 自动确定作用域

%cat source1.f
      INTEGER X(100), Y(100), I, T
C$OMP PARALLEL DO DEFAULT(__AUTO)
      DO I=1, 100
         T = Y(I)
         X(I) = T*T
      END DO
C$OMP END PARALLEL DO
      END
%f95 -xopenmp -xO3 -vpara -c -g source1.f
"source1.f", line 2: Autoscoping for OpenMP construct succeeded. 
Check er_src for details

如果针对特定构造的自动作用域失败,将发出本示例中所示的警告消息(使用 -xvpara):

示例 6-2 使用 -vpara 自动确定作用域失败

%cat source2.f
      INTEGER X(100), Y(100), I, T
C$OMP PARALLEL DO DEFAULT(__AUTO)
      DO I=1, 100
         T = Y(I)
         CALL FOO(X)
         X(I) = T*T
      END DO
C$OMP END PARALLEL DO
      END
%f95 -xopenmp -xO3 -vpara -c -g source2.f
"source2.f", line 2: Warning: Autoscoping for OpenMP construct failed. 
 Check er-src for details. Parallel region will be executed by
 a single thread.

er_src 所显示的编译器注释中显示了更详细的信息:

% er_src source2.o
Source file: source2.f
Object file: source2.o
Load Object: source2.o




     1.         INTEGER X(100), Y(100), I, T
        
   Source OpenMP region below has tag R1
   Variables autoscoped as SHARED in R1: y
   Variables autoscoped as PRIVATE in R1: t, i
   Variables treated as shared because they cannot be autoscoped in R1: x
   R1 will be executed by a single thread because autoscoping for some variable s was not successful
   Private variables in R1: i, t
   Shared variables in R1: y, x
     2. C$OMP PARALLEL DO DEFAULT(__AUTO)

   Source loop below has tag L1
   L1 parallelized by explicit user directive
   L1 autoparallelized
   L1 parallel loop-body code placed in function _$d1A2.MAIN_ along with 0 inne r loops
   L1 could not be pipelined because it contains calls
     3.         DO I=1, 100
     4.                 T = Y(I)
     5.                 CALL FOO(X)
     6.                 X(I) = T*T
     7.         END DO
     8. C$OMP END PARALLEL DO
     9.         END
    10.