6

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

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

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

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

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

谢谢,

编辑 :

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

4

2 回答 2

5

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

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

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

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

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

我建议使用 FloatBuffer

FloatBuffer fb = ByteBuffer.allocateDirect(size*4)
                           .order(ByteOrder.nativeOrder())
                           .asFloatBuffer();
于 2012-10-10T07:18:54.053 回答
3

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

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

于 2012-10-10T07:18:16.927 回答