JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:OpenMP API 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
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.  子句在指令中的放置

索引

6.6 检查自动确定作用域的结果

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

使用 -g 调试选项进行编译时,编译器将生成行内注释,可以使用 er_src 命令查看这个生成的注释,如以下示例所示。er_src 命令作为 Oracle Solaris Studio 软件的一部分提供。有关更多信息,请参见 er_src(1) 手册页或 Oracle 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 所显示的编译器注释中显示了更详细的信息:

示例 6-3 使用 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.