最適なパフォーマンスを得るには、もっとも適切な -xarch オプションでコンパイルしてください。リンク時には、コンパイル時に使用されたものと同じ -xarch オプションを使用して、特定の命令セットアーキテクチャー用に最適化された Oracle Developer Studio パフォーマンスライブラリのバージョンを選択します。
さまざまな -xarch オプションの詳細については、Oracle Developer Studio 12.5: Fortran ユーザーズガイドまたはOracle Developer Studio 12.5: C ユーザーズガイドを参照してください。
SPARC および x86 命令セットアーキテクチャーの -xarch の値は、fbe、cc、CC、および f95 のマニュアルページにも示されています。
64 ビット対応のオペレーティング環境用のコードをコンパイルするには、-m64 を使用し、すべての整数引数を 64 ビット引数に変換します。64 ビットルーチンには 64 ビット整数を使用する必要があります。
Oracle Developer Studio パフォーマンスライブラリでは、32 ビットおよび 64 ビットのインタフェースが提供されています。64 ビットインタフェースを使用するには:
Oracle Developer Studio パフォーマンスライブラリのルーチン名を変更します。 C および Fortran 95 のコードの場合は、Oracle Developer Studio パフォーマンスライブラリのルーチンの名前に _64 を付加します (たとえば、rfftf_64 や CFFTB_64)。USE SUNPERF 文を含む Fortran 95 コードの場合、DGEMM などの固有インタフェースには接尾辞 _64 は厳密には必須ではありません。ただし、GEMM などの汎用インタフェースには接尾辞 _64 は必須です。
整数を 64 ビットに上位変換します。 倍精度変数、および倍精度複素数型変数の実数部と虚数部は、すでに 64 ビットです。整数のみが 64 ビットに上位変換されます。
これらの追加の 64 ビット整数インタフェースは、-m64 でリンクする場合にのみ使用できます。32 ビットオペレーティング環境用にコンパイルされたコード (-m32) で 64 ビット整数インタフェースを呼び出すことはできません。。
64 ビット整数インタフェースを直接呼び出すには、標準のライブラリ名に接尾辞 _64 を付加します。たとえば、daxpy() の代わりに daxpy_64() を使用します。
ただし、64 ビット整数インタフェースを間接的に呼び出す場合は、Oracle Developer Studio パフォーマンスライブラリのルーチンの名前に _64 を付加しないでください。パフォーマンスライブラリのルーチンを呼び出すと 32 ビットラッパーが呼び出され、このラッパーが 32 ビット整数を 64 ビット整数に上位変換し、64 ビットルーチンを呼び出したあと、64 ビット整数を 32 ビット整数に下位変換します。
最適なパフォーマンスを得るには、ルーチン名に _64 を付加してルーチンを直接呼び出してください。
C プログラムの場合は、int 引数の代わりに long を使用します。次のコード例では、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 ビット環境では使用できません。32 ビットライブラリ、v8plusa、v8plusb のルーチンを 64 ビット引数で呼び出すことはできません。ただし、64 ビットルーチンを 32 ビット引数で呼び出すことはできます。
-xtypemap でコンパイルされていない Fortran 95 コードに定数を渡す場合は、リテラル定数に _8 を付加して上位変換を発生させます。たとえば、Fortran 95 を使用している場合は、CALL DSCAL(20,5.26D0,X,1) を CALL DSCAL(20_8,5.26D0,X,1_8) に変更します。この例では、ルーチン名に _64 が付加されていないため、コードに USE SUNPERF が含まれていると見なします。
次のコード例では、Fortran 95 から CAXPY を 32 ビット引数で呼び出しています。
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)
次のコード例では、(USE SUNPERF 文を含まない) Fortran 95 から CAXPY を 64 ビット引数で呼び出しています。
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 のコード例では、CAXPY を 64 ビット引数で呼び出しています。
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 のルーチンでは、long のサイズは -m32 でコンパイルすると 32 ビット、-m64 でコンパイルすると 64 ビットになります。次のコード例では、dgbcon ルーチンを 32 ビット引数で呼び出しています。
void dgbcon(char norm, int n, int nsub, int nsuper, double *da, int lda, int *ipivot, double danorm, double drcond, int *info)
次のコード例では、dgbcon ルーチンを 64 ビット引数で呼び出しています。
void dgbcon_64 (char norm, long n, long nsub, long nsuper, double *da, long lda, long *ipivot, double danorm, double *drcond, long *info)