2013-02-05 128 views
0

我想用long long而不是double數據類型加速我的算法。我的算法是在定向acyclic graph (DAG)中找到最短路徑。簡單地說,它增加了邊緣的權重"E: a->b" to b,並且如果b的新權重低於前一權重,則將其與其父母設置爲a一起更新。轉換爲long long,利弊C

我的意思是,我的算法只是一些添加和比較操作。邊緣的重量原來是"double",我可以將它們乘以大數並將它們投射到"long long"。如果這個調整使我的程序更快,值得考慮。由於四捨五入big doublelong long,我如何處理不穩定性問題。

感謝

+2

嘗試兩種方法,並比較你想測量的任何標準的結果。 –

回答

1

在i5 64 甚至 IMUL似乎約40%的速度[一倍以上乘法。整數加法也應該以更少的週期/更好的吞吐量發生。關於「不精確」的問題,你應該意識到雙打可能比整數更不精確。

Calculate which numbers cause problems when converting decimal to floating point?

如果您有訪問原始數據(例如權重的十進制表示,具有功率大十應該產生準確整數,沒有任何四捨五入文物乘以他們。隨着長期多頭唯一的問題將是

如何解決可能的舍入不穩定性取決於您的權重的動態範圍和最大迭代次數,例如,如果您的權重均小於1.0且大於2^-52,則乘以用2^52給出的確切整數沒有舍入誤差,那麼「不穩定性」是由溢出的可能性決定的(2^12 * 2^52)> = 2^64。

+0

我有雙打,但我想要長或長得到更快的代碼。它很可能非常依賴算法本身。 – remo

+0

只要繼續 - 並按照J.P.的評論做一次性能比較。 (我應該提到,在未公開的測試環境中_even_ imul比雙倍乘法要快 - 你可能會使用大部分的加法運算。關鍵字「weight」是比較乘法運算的可能原因。) –

+0

任何想法在GPU上實現DAG的最短路徑問題? – remo