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

退出打印视图

更新时间: 2016 年 6 月
 
 

C 接口

可从 FORTRAN 77、Fortran 95 或 C 程序内调用 Oracle Developer Studio 性能库例程。但是,C 程序必须仍然使用 FORTRAN 77 调用序列。

Oracle Developer Studio 性能库针对 LAPACK、BLAS、FFTPACK、VFFTPACK、SPARSE BLAS 和 SPSOLVE 中包含的每个例程都提供了原生 C 接口。Oracle Developer Studio 性能库 C 接口有以下特性:

  • 函数名称有 C 名称

  • 函数接口遵循 C 约定

  • C 接口不包含 C 函数的冗余参数或不需要的参数

以下示例将 DGBCON 例程的标准 LAPACK Fortran 接口与 Oracle Developer Studio 性能库 C 接口进行了比较。

CALL DGBCON (NORM, N, NSUB, NSUPER, DA, LDA, IPIVOT, DANORM,
	DRCOND, DWORK, IWORK2, INFO)
void dgbcon(char norm, int n, int nsub, int nsuper, double *da,
	int lda, int *ipivot, double danorm, double drcond, 
	int *info)

请注意,参数名称是相同的,并且同名参数具有相同的基本类型。在 C 版本中,仅用作输入值的标量参数(例如 NORMN)是通过值传递的。将用来返回值的数组和标量是通过引用传递的。

Oracle Developer Studio 性能库 C 接口针对 CLAPACK 进行了改进,可从 Netlib 获取该接口,它是标准库的 f2c 转换。例如,所有 CLAPACK 例程名称后面都有一个结尾下划线,这是为了保持与 Fortran 编译器的兼容性,该编译器通常在对象 (.o) 文件中的例程名称后加一个下划线后缀。Oracle Developer Studio 性能库 C 接口不需要结尾下划线。

Oracle Developer Studio 性能库 C 接口使用以下约定:

  • 纯输入标量是通过值而非通过引用传递的。复数和双精度复数参数不被视为标量,因为 C 不将它们实施为标量。

  • 复数标量可作为长度 2 的结构或数组传递。

  • 即使在 C 执行了类型转换后,参数类型也必须匹配。例如,在传递单精度实数值时要注意,因为 C 编译器可能会自动将该参数提升为双精度。

  • 数组是逐列存储的。对于 Fortran 程序员而言,这是数组的自然存储顺序。对于 C 程序员而言,这是他们通常使用的顺序的转置。在文档和手册页中,对行的引用是指列,对列的引用是指行。

  • 数组索引从 1 开始,这与 Fortran 约定一致,与 C 中的从 0 开始不同。

    例如,IDAMAX 的 Fortran 接口对于 C 程序而言是 idamax_,它返回 1 来表示向量中的第一个元素。idamax 的 C 接口对于 C 程序而言是 idamax,它返回 1 来表示向量的第一个元素。在函数返回值、排列向量以及使用向量或数组索引的其他任何地方都遵循此约定。


    注 - 某些 Oracle Developer Studio 性能库例程在内部使用 malloc,因此对 Oracle Developer Studio 性能库和 sbrk 进行调用的用户代码可能无法正常工作。

SPARC 版的 Oracle Developer Studio 性能库使用 32 位模式的全局整数寄存器 %g2%g3%g4 以及 64 位模式的 %g2%g5 作为临时寄存器。用户代码不应当使用这些寄存器进行临时存储,然后调用 Oracle Developer Studio 性能库例程。当 Oracle Developer Studio 性能库例程使用这些寄存器时,数据会被覆盖。