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

退出打印视图

更新时间: 2016 年 6 月
 
 

Fortran 示例

要提高单处理器应用程序的性能,请找出应用程序中可由 Oracle Developer Studio 性能库例程调用替换的代码结构。通过找出可以并行化的代码并将其并行化,可以提高多处理器应用程序的性能。

要通过修改代码以使用 Oracle Developer Studio 性能库例程来提高应用程序性能,请找出其功能与某个 Oracle Developer Studio 性能库例程的功能完全相同的代码块。以下代码示例是“矩阵-向量”积 y ← Ax + y,可使用 DGEMV 子例程来替换它。

      DO I = 1, N
          DO J = 1, N
              Y(I) = Y(I) + A(I,J) * X(J)
          END DO
      END DO

另外一些情况下,某个代码块可能相当于多个 Oracle Developer Studio 性能库调用,或包含可由 Oracle Developer Studio 性能库例程调用替换的部分代码。请考虑以下代码示例。

      DO I = 1, N
          IF (V2(I,K) .LT. 0.0) THEN
              V2(I,K) = 0.0
          ELSE
              DO J = 1, M
                  X(J,I) = X(J,I) + Vl(J,K) * V2(I,K)
              END DO
          END IF 
      END DO

代码示例可以重新编写,以使用 Oracle Developer Studio 性能库例程 DGER,如下所示。

      DO I = 1, N
          IF (V2(I,K) .LT. 0.0) THEN
             V2(I,K) = 0.0
          END IF 
      END DO
      CALL DGER (M, N, 1.0D0, X, LDX, Vl(l,K), 1, V2(1,K), 1)

也可以使用 Fortran 95 特定语句重新编写同一代码示例,如下所示。

WHERE (V(1:N,K) .LT. 0.0) THEN
       V(1:N,K) = 0.0
END WHERE 
CALL DGER (M, N, 1.0D0, X, LDX, Vl(l,K), 1, V2(1,K), 1)

由于要使用零替换 V2 中的负数的代码在 Oracle Developer Studio 性能库中没有自然的类似代码,因此该代码不再放在外层循环中。该代码移到自身的循环中后,循环的其余部分是一般矩阵 x 的 1 阶更新,可使用 BLAS 中的 DGER 例程进行替换。

性能的提高程度还取决于 Oracle Developer Studio 性能库例程使用的数据。例如,如果 V2 包含许多负值或零值,大部分时间可能不会花在 1 阶更新上。在这种情况下,将代码替换为对 DGER 的调用可能不会提高性能。

对其他循环索引求值会影响所使用的 Oracle Developer Studio 性能库例程。例如,如果对 K 的引用是一个循环索引,则上面所示的代码示例中的循环可能是一个较大代码结构的一部分,其中在 DGEMVDGER 之间的循环可以转换为某种形式的矩阵乘法。如果是这样,对矩阵乘法例程的单次调用比通过调用 DGER 来使用循环更能提高性能。

由于所有 Oracle Developer Studio 性能库例程都是 MT 安全的(multithread safe,多线程安全),因此,使用自动并行化编译器将包含 Oracle Developer Studio 性能库例程调用的循环并行化可提高在多处理器平台上的性能。

以下代码示例显示了将 Oracle Developer Studio 性能库例程与自动并行化编译器并行化指令结合使用的示例。

      C$PAR DOALL
      DO I = 1, N
             CALL DGBMV ('No transpose', N, N, ALPHA, A, LDA,
     $     B(l,I), 1, BETA, C(l,I), 1)
      END DO

Oracle Developer Studio 性能库包含一个名为 DGBMV 的例程来将带状矩阵与向量相乘。通过将此例程放到正确构建的循环中,可使用 Oracle Developer Studio 性能库例程来将带状矩阵与矩阵相乘。默认情况下,编译器不会将此循环并行化,因为循环中存在的子例程调用会阻止并行化。不过,Oracle Developer Studio 性能库例程是 MT 安全的,因此,可以使用并行化指令来指示编译器将此循环并行化。

还可以使用编译器指令通过子例程调用来将通常不可并行的循环并行化。例如,通常无法将其中调用了某些线性方程组求解器的循环并行化,因为某些供应商在实施这些例程时使用的是非 MT 安全的代码。其中调用了线性方程组求解器的专业驱动程序(名称以 SVXSVXX 结尾的例程)的循环通常不能通过其他 LAPACK 实施进行并行化。因为 Oracle Developer Studio 性能库中的 LAPACK 实施支持将包含此类调用的循环并行化,所以,多处理器平台的用户可以通过将这些循环并行化来提高性能。