Oracle® Developer Studio 12.5:性能库用户指南

退出打印视图

更新时间: 2016 年 6 月
 
 

并行度

已使用 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