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

退出打印视图

更新时间: 2016 年 6 月
 
 

关于编译

使用最合适的 -xarch 选项进行编译可获得最佳性能。 在链接时,使用编译时所用的同一 -xarch 选项,以选择针对特定指令集体系结构进行了优化的 Oracle Developer Studio 性能库版本。


注 -  使用特定于指令集的优化选项可提高所选指令集体系结构上的应用程序性能,但限制了代码可移植性。

有关不同 -xarch 选项的详细说明,请参阅Oracle Developer Studio 12.5:Fortran 用户指南Oracle Developer Studio 12.5:C 用户指南

fbeccCCf95 的手册页中也列出了用于 SPARC 和 x86 指令集体系结构的 -xarch 的值。

针对启用了 64 位的操作环境编译代码

要针对启用了 64 位的操作环境编译代码,可使用 -m64,并将所有整数参数转换为 64 位参数。64 位例程需要使用 64 位整数。

Oracle Developer Studio 性能库提供了 32 位和 64 位接口。要使用 64 位接口,请执行以下操作:

  • 修改 Oracle Developer Studio 性能库例程名称。对于 C 和 Fortran 95 代码,将 _64 附加到 Oracle Developer Studio 性能库例程的名称(例如,rfftf_64CFFTB_64)。对于具有 USE SUNPERF 语句的 Fortran 95 代码,特定接口并不严格需要 _64 后缀,如 DGEMM。对于通用接口,仍需要 _64 后缀,如 GEMM

  • 将整数提升至 64 位。双精度变量和双精度复数变量的实部和虚部已经是 64 位了。 只将整数提升至 64 位。

64 位整数参数

只有使用 -m64 进行链接时,才能使用这些附加的 64 位整数接口。针对 32 位操作环境编译的代码 (-m32) 无法调用 64 位整数接口。

要直接调用 64 位整数接口,请将后缀 _64 附加到标准库名称。例如,使用 daxpy_64() 而不是 daxpy()

但是,如果间接调用 64 位整数接口,则不要将 _64 附加到 Oracle Developer Studio 性能库例程的名称。调用性能库例程将访问一个 32 位包装程序,该包装程序将 32 位整数提升至 64 位整数,然后调用 64 位例程,之后再将 64 位整数降至 32 位整数。

为获得最佳性能,可通过将 _64 附加到例程名称来直接调用该例程。

对于 C 程序,请使用 long 而不是 int 参数。以下代码示例显示了直接调用 64 位整数接口。

#include <sunperf.h>
long n, incx, incy;
double alpha, *x, *y;
daxpy_64(n, alpha, x, incx, y, incy);

以下代码示例显示了间接调用 64 位整数接口。

#include <sunperf.h>
int  n, incx, incy;
double alpha, *x, *y;
daxpy   (n, alpha, x, incx, y, incy);

对于 Fortran 程序,请为所有整数参数使用 64 位整数。可使用以下方法将整数参数转换为 64 位:

  • 要将已声明但没有明确的字节大小和整型文字常数的所有整数从 32 位提升至 64 位,请使用 -xtypemap=integer:64 进行编译。

  • 要提升特定的整数声明,请将 INTEGERINTEGER*4 更改为 INTEGER*8

  • 要提升整型文字常数,可将 _8 附加到该常数。

请考虑以下代码示例。

INTEGER*8 N
REAL*8 ALPHA, X(N), Y(N)

! _64 SUFFIX: N AND 1_8 ARE 64-BIT INTEGERS
CALL DAXPY_64(N,ALPHA,X,1_8,Y,1_8)

INTEGER*8 参数不能在 32 位环境中使用。不能使用 64 位参数调用 32 位库中的例程 v8plusav8plusb。但是,可使用 32 位参数调用 64 位例程。

在传递 Fortran 95 代码中未使用 -xtypemap 编译的常数时,可将 _8 附加到文字常数以影响提升。例如,在使用 Fortran 95 时,将 CALL DSCAL(20,5.26D0,X,1) 更改为 CALL DSCAL(20_8,5.26D0,X,1_8)。此示例假定 USE SUNPERF 包括在代码中,因为未将 _64 附加到例程名称。

以下代码示例显示了使用 32 位参数从 Fortran 95 调用 CAXPY

       PROGRAM TEST
       COMPLEX ALPHA
       INTEGER,PARAMETER :: INCX=1, INCY=1, N=10
       COMPLEX X(N), Y(N)

       CALL CAXPY(N, ALPHA, X, INCX, Y, INCY) 

以下代码示例显示了使用 64 位参数从 Fortran 95 调用 CAXPY(没有 USE SUNPERF 语句)。

       PROGRAM TEST
       COMPLEX   ALPHA
       INTEGER*8, PARAMETER :: INCX=1, INCY=1, N=10
       COMPLEX   X(N), Y(N)

       CALL CAXPY_64(N, ALPHA, X, INCX, Y, INCY)

在使用 64 位参数时,如果未使用 USE SUNPERF 语句,则必须将 _64 附加到例程名称。

以下 Fortran 95 代码示例显示了使用 64 位参数调用 CAXPY

       PROGRAM TEST
       USE SUNPERF
       .
       .
       .
       COMPLEX   ALPHA
       INTEGER*8, PARAMETER :: INCX=1, INCY=1, N=10
       COMPLEX   X(N), Y(N)

       CALL CAXPY(N, ALPHA, X, INCX, Y, INCY)

在 C 例程中,在使用 -m32 编译时,long 的大小是 32 位;在使用 -m64 编译时,其大小是 64 位。以下代码示例显示了使用 32 位参数调用 dgbcon

void dgbcon(char norm, int n, int nsub, int nsuper, double *da,
            int lda, int *ipivot, double danorm, double drcond, 
            int *info)

以下代码示例显示了使用 64 位参数调用 dgbcon

void dgbcon_64 (char norm, long n, long nsub, long nsuper,
                  double *da, long lda, long *ipivot, double danorm,
                double *drcond, long *info)