2011-06-10 95 views
5

我正在写一个非常计算密集的过程用于在移动设备和我限制为32位CPU。实质上,我正在执行大量数据集(> 12k有符号16位整数)的点积。浮点运算速度太慢,所以我一直在寻找一种方法来执行与整数类型相同的计算。我偶然发现了一种叫做Block Floating Point算术的算法(链接论文第17页)。它做得相当不错,但是现在我面临着32位的问题,仅仅不足以存储足够精确的计算结果。“模拟” 64位整数有两个32位整数

只是为了澄清,这还不够精确的原因是,我将不得不大大减少我的每一个阵列元素的精确度得到了一些嵌入到最终的32位整数。这是总共约16000个事情使我的结果如此之大。

有没有一种方法(我喜欢的文章或教程的引用)使用两个32位整数作为最显著字和至少显著字他们(定义算术+, - ,* ,/)有效地处理数据?另外,有没有更好的方法来做这些事情?这种方法有问题吗?我对使用的编程语言非常灵活。我更喜欢C/C++,但Java也适用。我确信有人以前做过这个。

+8

我有一个愚蠢的问题 - 为什么你不能使用长,这是64位甚至32位的CPU? – MJB 2011-06-10 14:47:36

+0

愚蠢的答案是,你可以。我被一份文件误导了。谢谢=) – Phonon 2011-06-10 14:54:13

+0

考虑切换到本机代码。 – 2011-06-10 14:55:39

回答

7

我很确定JVM必须支持64位算术long类型,如果平台不支持它,那么VM必须模拟它。但是,如果您无法使用float来解决性能问题,那么JVM可能会破坏您。

大多数C和C++编译器将提供模拟在32位targets-我知道MSVC和GCC做的64位运算。但是,您应该意识到您可以在许多整数指令中保存单个浮点指令。你应该考虑这个程序的规格是不合理的,或者你可以从其他地方释放性能。

+0

*“如果你不能使用float来处理性能问题,那么JVM可能会破坏你。”* - 不正确。许多手机运行JVM都很好,但没有FPU,导致浮点操作昂贵。其中一些甚至不支持本地应用程序,因为操作系统本身是用Java编写的。 – 2011-06-10 14:58:18

+0

@BlueRaja:当然,但JVM的运行成本要比模拟浮点的成本高很多。 – Puppy 2011-06-10 15:05:19

+2

不一定。有一些通用处理器(例如ARM926)没有FPU,但它们具有硬件加速功能,可以将Java字节码快速转换为本地指令,使Java几乎与本机代码一样快。 – 2011-06-10 16:09:58

2

有关于高精度计算的维基百科页面上list of libraries。也许在那里的东西会为你工作?

4

是,只使用64个整数:

long val; // Java 

#include <stdint.h> 
int64_t val; // C 
2

如果你可以使用Java,简单的答案是:使用Java的长期的。 Java标准定义长达64位。任何JVM都应该实现这一点,否则它不符合标准。没有什么要求CPU支持64位算术。如果它不是本机支持的,JVM应该用软件来实现它。

如果你真的有一些残缺的Java不支持长的,使用的BigInteger。这处理任何大尺寸的整数。

2

谈论C/C++。
任何正常的编译器都支持“long long”类型作为所有正常算术的64位整合器。
与-O3相结合,它可以在您的平台上输出最佳可能的64位代码代码。