使用最合适的 -xarch 选项进行编译可获得最佳性能。 在链接时,使用编译时所用的同一 -xarch 选项,以选择针对特定指令集体系结构进行了优化的 Oracle Developer Studio 性能库版本。
有关不同 -xarch 选项的详细说明,请参阅Oracle Developer Studio 12.5:Fortran 用户指南或Oracle Developer Studio 12.5:C 用户指南。
fbe、cc、CC 和 f95 的手册页中也列出了用于 SPARC 和 x86 指令集体系结构的 -xarch 的值。
要针对启用了 64 位的操作环境编译代码,可使用 -m64,并将所有整数参数转换为 64 位参数。64 位例程需要使用 64 位整数。
Oracle Developer Studio 性能库提供了 32 位和 64 位接口。要使用 64 位接口,请执行以下操作:
修改 Oracle Developer Studio 性能库例程名称。对于 C 和 Fortran 95 代码,将 _64 附加到 Oracle Developer Studio 性能库例程的名称(例如,rfftf_64 或 CFFTB_64)。对于具有 USE SUNPERF 语句的 Fortran 95 代码,特定接口并不严格需要 _64 后缀,如 DGEMM。对于通用接口,仍需要 _64 后缀,如 GEMM。
只有使用 -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 进行编译。
要提升特定的整数声明,请将 INTEGER 或 INTEGER*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 位库中的例程 v8plusa、v8plusb。但是,可使用 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)