【问题标题】:Convert Java floats to C将 Java 浮点数转换为 C
【发布时间】:2012-10-10 06:49:01
【问题描述】:

我有一个 java 程序,它使用包含大量浮点数的对象。 事情是出于优化的原因,我需要将此代码的一部分转换为 C。

为了进行基准测试,我已经在 C 中转换了所需的方法。 事情不是将对象作为输入,而是采用那些浮点数组。

我将这些数组保存在 Java 文件中,以便从我的 C 代码中轻松访问它。 问题是,Java 浮点数和 C 浮点数显然完全不同,我在 C 代码中得到了虚拟值。

我在互联网上没有找到任何可以帮助我完成这项任务的资源。 I did find this,但它适用于 C++,我无权访问这些类。

您有什么建议吗? 我想我可以开发某种转换器,但这可能需要一些时间,而且网上可能有更好的解决方案。

谢谢,

编辑:

我正在使用 DataOutputStream 及其 writeFloat 方法保存浮点数组。

【问题讨论】:

  • 为什么不直接使用 JNI/JNA 来连接 Java 和 C?这样您就不必处理文件...
  • 你如何在文件中存储你的浮点数组?您是使用 ObjectOutputStream 还是将 java 对象直接写入文件?
  • @nneonneo :我简化了以避免提供无用的信息,但实际的 C 代码稍后将在 GPU 上运行,所以我不确定我能做到这一点:s。
  • 即使在 GPU 上运行,您仍然可以使用 JNI。您只需通过 JNI 将浮点数从 Java 传递到 C,然后通过例如从 C 传递到 GPU。 CUDA。
  • @Santosh 因为这里的目标是性能,所以这是一个非常糟糕的主意。

标签: java c floating-point


【解决方案1】:

我会使用 JavaCL 或 JavaCV 直接使用 GPU。

注意:这些库也适用于 Intel/AMD CPU,因此如果 GPU 速度不快,您就不需要使用它。

顺便说一句:Java 和 C 中的浮点数是相同的。但是,如果您使用 ObejctOutputStream 这只能由 Java 读取,并且如果您使用 DataOutputStream 数据将采用 Big Endian 格式。如果你有一个小端的 Intel/AMD CPU,你必须交换字节。

如果您使用 ByteBuffer 和 NIO 来写入数据,您可以将其设为 big endian 或 little endian。后者不需要翻译。

注意:您可以通过 JNI 访问 float[]FloatBuffer,这意味着它不需要写入文件。

我建议使用 FloatBuffer

FloatBuffer fb = ByteBuffer.allocateDirect(size*4)
                           .order(ByteOrder.nativeOrder())
                           .asFloatBuffer();

【讨论】:

  • 我知道我不应该提及 GPU ;)。我已经有了 JCuda 的功能性 Java/CUDA 代码。我们知道要优化我们的内核,并且需要 Visual Studio 的各种工具。我正在创建一个简单的 C 代码,以便我可以使用 NSight 工具
  • 在这种情况下,最简单的解决方案是从 JNI 访问 float[]。如果您必须将文件导出到不同的程序,您可以使用FloatBuffer.order(ByteOrder.LITTLE_ENDIAN); 来写入数据,这是C 在大多数系统上所期望的字节顺序。
  • 为了简单的单元测试和我的对象的嵌套,我决定使用 FloatBuffer。非常感谢,它让我同时意识到了 JNI!
  • @jlengrand 添加了关于如何构造浮点缓冲区的建议。注意:address() 是存储浮点数的本机内存的开始。
  • 没有单一的C float 类型,发问者也没有指定具体的实现。大多数实现使用 IEEE-754,但不是全部。答案不应该告诉读者 Java 和 C 使用相同的浮点类型而不注意这一点,以防有人在旧系统、特殊的嵌入式平台或其他不寻常的实现上工作。
【解决方案2】:

首先,您可以在 GPU 上运行 Java 程序而无需转换为 C:project RootBeer

其次,Java 浮点数与 C 浮点数相同。诀窍是正确书写和阅读它们。我建议使用FileChannelByteBuffer,它们具有读写浮点数的方法。注意字节顺序,ByteBuffer 有设置所需顺序的方法。

【讨论】:

    猜你喜欢
    • 2011-11-25
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多