已使用 OpenMP Fortran 应用程序接口中的编译器指令、库例程和环境变量将 Oracle Developer Studio 性能库中的一些选定例程并行化。这些例程并行使用的线程数量由环境变量 OMP_NUM_THREADS 进行控制,您可以在运行时设置这些变量。也可以设置环境变量 PARALLEL,但如果两者都设置,它们的值必须相同,否则在执行时会发生致命错误。在用户代码中调用 Oracle Developer Studio 性能库例程 USE_THREADS 或 OpenMP 例程 OMP_SET_NUM_THREADS 可以覆盖这两个环境变量。
通过执行以下操作,可以将用户代码并行化:
将环境变量 OMP_NUM_THREADS 设置为大于 1 的值
使用编译器并行指令,如 OpenMP API 中的指令
使用适当的编译器标志:-xopenmp=parallel 或 -xautopar
如果满足以下条件,Oracle Developer Studio 性能库例程将并行执行:
OMP_NUM_THREADS 已设置为大于 1 的值
例程不是从并行区域调用的
Oracle Developer Studio 性能库在其并行化处理中使用 OpenMP 指令,并且不支持嵌套并行操作。如果按照上面的说明将用户代码并行化,并调用 Oracle Developer Studio 性能库例程,如果该例程检测到它是从并行区域调用的,则该例程将以串行方式执行。否则,例程将以并行方式执行。
还可以将 POSIX 或 Oracle Solaris 线程创建为在用户代码的选定区域中并行执行。如果在这种并行模式下调用性能库例程,该例程将无法检测到它是从并行区域调用的。因此,必须将环境变量 OMP_NUM_THREADS 设置为 1 或取消设置它,或者在用户代码的适当位置调用 USE_THREADS(3P)。否则,会使嵌套并行操作产生无法预料的结果。
例如,如果使用 -xopenmp=parallel 链接包含以下代码段的程序,并将 OMP_NUM_THREADS 设置为 4,那么循环将以并行方式执行,并有四个并行运行的 DGEMM 实例。但是,每个 DGEMM 实例将以串行方式运行,因为仅支持一层并行化处理。
!$OMP PARALLEL DO I = 1, N CALL DGEMM(...) END DO !$OMP END PARALLEL
在下面的代码示例中,如果程序未使用 -xautopar 进行链接,则循环将不会并行化,但每个 DGEMM 实例将由四个线程执行。
DO I = 1, N CALL DGEMM(...) END DO
如果使用 -xopenmp=parallel 链接包含以下代码段的程序,并将 OMP_NUM_THREADS 设置为大于 1 的值,则所示区域将由单个线程执行。但是,每个 DGEMM 调用将由 OMP_NUM_THREADS 个线程执行。
!$OMP SINGLE DO I = 1, N CALL DGEMM(...) END DO !$OMP END SINGLE
在下面的代码示例中,最多是双向并行操作,不管可执行的 OpenMP 线程的数量是多少。只存在一层并行操作,这是两个部分。DGEMM 调用中的其他并行操作将被抑制。
!$OMP PARALLEL SECTIONS !$OMP SECTION DO I = 1, N / 2 CALL DGEMM(...) END DO !$OMP SECTION DO I = N / 2 + 1, N CALL DGEMM(...) END DO !$OMP END PARALLEL SECTIONS