2011-06-10 99 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位代碼代碼。