2

私は現在、32/64 ビットのすべての主要な OS の BLAS/LAPACK (Fortran ライブラリ) のネイティブ バインディングを Java ライブラリnetlib-javaとして改良しています。

しかし、UNIX と Windows の世界、および Fortran と C の間のデータ型の違いに関係するいくつかの問題にぶつかり始めました。

C 言語ではサイズが明示的に定義されていないため、 FortranCのデータ型のテーブルはあまり重要ではありません。

Fortran と C の両方の主要な OS のプリミティブ データ型のすべてのビット サイズの標準的なソース (または信頼できるソースを参照して作成できますか?) はありますか?

または、少なくとも、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

コメントで @cup が指摘したように、ISO_C_BINDING標準があります。これにより、(少なくとも GCC では) CBLAS/LAPACKE C API (基本的な C 型を使用する) に記載されているマッピングが、そのコンパイラを使用するアーキテクチャ間で移植可能であるという安心感が得られます。質問で述べたように、これは実際のビットサイズに関するものであり、言語が保証するものの抽象的な概念ではありません。すなわち

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

そして、プリミティブ型のバイト サイズを定義するのは C まででありjni_md.h、Java プリミティブ型を定義するのは までです。

実際には、これは、64 ビット Windows ではlong32 ビット (64 ビット Linux では 64 ビット)jintであり、long. したがって、コンパイラは、安全に無視できる Windows ビルド中の/型変換について不平を言います。jint*int

于 2013-08-19T09:15:55.300 に答える
0

あなたのアプローチにはいくつかの問題があります。

  1. これらの長さを定義するのは必ずしもオペレーティング システムではありません。場合によっては、コンパイラも同様に実行できます。

  2. 状況によっては、ユーザーはデフォルトの長さを変更することもできます。たとえば、多くの Fortran コンパイラには、実数のデフォルト サイズを 8 バイトにする "r8" オプションがあります (gfortran の場合は "-fdefault-real-8")。

  3. BLAS/LAPACK は、特定のシステムのデータ型のデフォルト サイズに関係なく、単精度および倍精度の IEEE で動作するはずです。したがって、Fortran インターフェースは、作業しているシステムに関係なく、常に 4 バイトの実数と 8 バイトの倍精度数を使用する必要があります。ドキュメントで整数型が指定されているとは思いませんが、IEEE 型を使用するほぼすべての Fortran 実装がデフォルトとして 32 ビット整数を使用していたため、エラー コードは常に 4 バイトになるのではないかと強く思っています。一部の C ラッパーでは、技術的にビルド時にリターン コードのサイズを変更できる (またはシステム/コンパイラのデフォルトを使用する) ことができると思います。Java バインディングに同様のオプションを提供したい場合があります。

于 2013-08-18T17:39:40.363 に答える