【问题标题】:128 bit MVBITS in gfortrangfortran 中的 128 位 MBITS
【发布时间】:2015-10-30 02:59:35
【问题描述】:

编辑 :: 我向 GCC bugzilla 报告了 bug。现在已经修复了。

以下示例无法使用 gfortran 4.8.4 编译:

PROGRAM test
  USE ISO_C_BINDING
  INTEGER(C_INT128_T) :: CINT128T
  INTEGER, PARAMETER :: I16B  = KIND(CINT128T)
  INTEGER(I16B) :: a, b
  a = 127
  b = 0
  b = IBSET(b,0)
  a = IBCLR(a,0)
  CALL MVBITS(a,0,3,b,0)
END PROGRAM test

这是我得到的:

$ gfortran test.f90
/tmp/cc2CEkwu.o: In function `MAIN__':
test.f90:(.text+0x89): undefined reference to `_gfortran_mvbits_i16'
collect2: error: ld returned 1 exit status

这是 gfortran 的编译方式(即,它是 Ubuntu 14.04 附带的版本):

$ gfortran -v
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04)

我一直在对 128 位整数(IBSET、IBCLR、BTEST、IBITS)进行其他位操作,它们都工作正常。有什么想法吗?

【问题讨论】:

  • use, intrinsic :: iso_c_binding, only : I16B => c_int128_t 会更干净(假设编译器具有该值)。
  • 或者只是I16B = C_INT128_T。但这不会改变主要问题。

标签: fortran gfortran fortran-iso-c-binding


【解决方案1】:

运行时库没有该内在函数的 16 字节版本。你运气不好,换个编译器,可以做到(我不知道),或者使用更小的整数。

如果你想做这样的事情,你也可以自己用 C 编写函数。

【讨论】:

  • 您是否知道任何允许对长整数进行位操作的 FORTRAN 库?
  • @delete000 我看到你向 GCC bugzilla 报告了这个错误。除了这样做,我没有其他直接建议。
  • 如果您知道 C,您可以使用那里提供的补丁来修补您的编译器或从那里提取函数并将其与您的代码链接。请注意那里的答案“不知道是否实际工作是因为您的测试程序没有输出,也没有预期结果的指示。”
  • 我目前正在用补丁编译 GCC。这种方法的问题在于它依赖于编译器。
  • @delete000 您可以提取函数_gfortran_mvbits_i16的代码并自行编译。这样你就可以在所有 gfortran 损坏的计算机上使用它,而无需重新编译它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 2010-12-31
  • 2011-11-04
  • 1970-01-01
相关资源
最近更新 更多