Oracle® Developer Studio 12.5:OpenMP API 用户指南

退出打印视图

更新时间: 2016 年 7 月
 
 

6.6 使用自动确定作用域的限制

  • 要启用自动确定作用域功能,必须使用 -xopenmp 选项在优化级别 -xO3 或更高级别上编译程序。如果仅使用 -xopenmp=noopt 编译程序,将不会启用自动确定作用域功能。

  • C 和 C++ 中的并行和任务自动确定作用域功能只能处理基本数据类型:整型、浮点和指针。

  • 任务自动确定作用域功能不能处理数组。

  • C 和 C++ 中的任务自动确定作用域不能处理全局变量。

  • 任务自动确定作用域不能处理非绑定任务。

  • 任务自动确定作用域不能处理在语法上包含在其他任务中的任务。例如:

         #pragma omp task /* task 1 */
         {
           ...
           #pragma omp task /* task 2 */
           {
             ...
           }
          ...
         }

    在此示例中,由于 task 2 在语法上嵌套在 task 1 中,因此编译器不会尝试对其启用自动确定作用域功能。编译器会将 task 2 中引用的所有变量的作用域确定为 shared,并将 task 2 视为如同对任务指定了 if(0)(在 Fortran 中为 if(.false.))子句一样。

  • 只识别 OpenMP 指令,并且只能在分析中使用。无法识别对 OpenMP 运行时例程的调用。例如,如果程序使用 omp_set_lock()omp_unset_lock() 来实现临界段,编译器将无法检测是否存在临界段。请在可能的情况下使用 critical 指令。

  • 在数据争用分析中,只能识别和使用通过 OpenMP 同步指令(如 barriermaster)指定的同步。不识别用户实现的同步,如忙等待。