2010-09-11 79 views
14

我正在研究一個CPU大型數值計算應用程序。沒有深入細節,它是一個計算數學研究項目,涉及計算大整數x的某個函數f(x)。最快的128位整型庫

現在,所有事情都是在C++中以x64模式實現的,使用本機64位整數。這限制了我的x^< 2^64〜1.8 * 10^19。我想更進一步,要做到這一點,我需要一個128位算術庫。它必須非常快速。特別是整數除法應該很快。否則,我會坐在這裏等待結果,直到感恩節。我寧願不重新發明輪子。

我在維基百科發現了一個約20個大整數庫的列表,但其中大多數似乎是針對任意精度的數字,這對我的任務來說是過度的,我不需要額外的成本。

有誰知道什麼庫可以在128位整數上運行最快?

+3

http://www.x86-64.org/pipermail/discuss/2005-August/006412.html – Anycorn 2010-09-11 20:54:54

+0

這很有趣,不知道。目前我在Windows上工作,但我會在Unix中使用gcc進行嘗試。我的代碼應該足夠便攜。 – user434507 2010-09-11 21:06:32

+0

你可以使用Cygwin/GCC或MinGW。 – alternative 2010-09-11 21:09:49

回答

16

你沒有提到你的平臺/可移植性要求。如果您願意在64位平臺上使用gccclang,則它們具有免費提供的內置128位類型,__uint128_t__int128_t。也許其他平臺有類似的擴展。

在任何情況下,應該可以找到在gcc來源組裝的寬度N兩個整數合成的寬度2N一個整數對應的通用代碼。這可能是爲此目的創建獨立庫的一個很好的起點。

1

這可能不適合每個人,但我要做的是選擇具有源代碼的最高性能的任意整數庫,否則它適合作業,並破解它爲固定整數大小。將一些變量「nbits」更改爲128硬編碼。它可能在運行時分配內存,直到那時才知道字節數。將其更改爲在就地使用帶有數據的結構,並在每次讀取數據時保存指針解引用。手動展開某些關鍵循環。硬編碼其他任何可能至關重要的代碼。然後編譯器將probaby比較容易優化。當然,其中的大部分都是彙編,使用花哨的SIMD以及本週使用的任何技術。

這將很有趣!但是,作爲程序員,我開始使用機器代碼和非常低級的東西。

但對於那些並不像我這樣瘋狂的人,也許可用的庫中有一個使用了模板或者有一些生成代碼的方法來定製一些尺寸。而且,一些編譯器有一個「long long」整數類型可能是合適的。