要启用自动确定作用域功能,必须使用 -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 同步指令(如 barrier 和 master)指定的同步。不识别用户实现的同步,如忙等待。