2

我目前正在将 32/64 位上所有主要操作系统的 BLAS/LAPACK(Fortran 库)的本机绑定修改为 Java 库:netlib-java

但是,我开始遇到一些与 UNIX/Windows 世界之间以及 Fortran/C 之间的数据类型差异有关的问题。

FortranC数据类型的表是非常不确定的,因为C 语言没有明确定义大小。

在 Fortran 和 C 的主要操作系统上的原始数据类型的实践中,是否有规范的来源(或者我们可以通过引用权威来源来创建一个?)?

或者,至少,就 C 类型而言,是 Fortran 类型。

即用以下列填充一个表(有几个开始):

OS      ARCH    Language Type             Bits
Linux   x86_64  C        int              32
Linux   x86_64  C        long             64
Linux   x86_64  C        float            32
Linux   x86_64  C        double           64
Linux   x86_64  Fortran  LOGICAL          32
Linux   x86_64  Fortran  INTEGER          32
Linux   x86_64  Fortran  REAL             32
Linux   x86_64  Fortran  DOUBLE PRECISION 64
Linux   x86_64  Java JNI jint             32
Windows x86_64  Fortran  INTEGER          32
Windows x86_64  Java JNI jint             64
...

(我不确定这是否正确)

jni_md.h可以根据每个 JDK 附带的 C 原语来查找 Java 类型。

4

2 回答 2

1

As noted by @cup in the comments, there is an ISO_C_BINDING standard. That gives us a level of comfort (at least with GCC) that the mappings as noted in the CBLAS/LAPACKE C API (which uses basic C types) are portable across architectures with that compiler. As noted in the question, this is about bit sizes in practice, not some abstract concept of what the languages guarantee. i.e.

  • REAL -> float
  • DOUBLE PRECISION -> double
  • INTEGER -> int
  • LOGICAL -> int

and then it's up to C to define the byte sizes of the primitive types and up to the jni_md.h to define the Java primitive types.

In practice, this means that the only disconnect is that on 64 bit Windows long is 32 bit (64 bit on 64 bit Linux) and jint is defined in terms of long. Therefore the compiler complains about jint*/int type conversions during Windows builds that can be safely ignored.

于 2013-08-19T09:15:55.300 回答
0

你的方法有几个问题。

  1. 定义这些长度的不一定是操作系统;在某些情况下,编译器也可以这样做。

  2. 在某些情况下,用户还可以更改默认长度。例如,许多 Fortran 编译器都有一个“r8”选项,它导致 real 的默认大小为 8 个字节(对于 gfortran,“-fdefault-real-8”)。

  3. 无论给定系统上数据类型的默认大小如何,BLAS/LAPACK 都应该适用于单精度和双精度 IEEE。所以 Fortran 接口应该始终使用 4 字节实数和 8 字节双精度数,无论您使用的是什么系统。我认为文档没有指定整数类型,但我强烈怀疑错误代码总是 4 个字节,因为一段时间以来,几乎所有使用 IEEE 类型的 Fortran 实现都默认使用 32 位整数。我认为一些 C 包装器可能在技术上允许您在构建时更改返回代码大小(或使用系统/编译器默认值);您可能希望为 Java 绑定提供类似的选项。

于 2013-08-18T17:39:40.363 回答