2013-05-07 505 views
1

如果我只需要一個整數除的商,我可以使用__aeabi_uidiv。但ARMCC編譯器使用__aeabi_uidivmod下面的代碼:比較__aeabi_uidiv和__aeabi_uidivmod

unsigned int a, b, c; 
//... 
//... 
c = a/b; 
/* use c for some operations */ 

我不需要在這種情況下,剩餘部分,所以將它提高速度,如果我直接調用__aeabi_uidiv?像這樣:

c = _aeabi_uidiv(a,b); 

我大約需要1哪裏這段代碼被稱爲數百萬次的功能。

回答

3

除法算法自然需要商和餘數。該過程如同long division。通過不返還餘額的節省是最小的,只涉及註冊mov操作。此外,擁有division的多個變種將會消除緩存效應,並且實際上可能會使系統整體變慢。

以下是一些libgcc的來源。

如果你已經成型,並確定你的時間大部分花費在分割程序,它可能是有意義的,從返回取出剩餘部分,但它仍然必須計算。檢查你的要求可能會更好。

如果您確實需要更快地進行分工,您可以基於數據分析進行特殊情況分析。犧牲精確度,不嚴格符合'C'規則,並使用倒數和倒數表。這些將會得到比更好的結果,而不會返回其餘的

+0

維基百科上的[Integer division](http://en.wikipedia.org/wiki/Division_algorithm#Integer_division_.28unsigned.29_with_remainder)給出* udivmodsi4.c *和* libgcc2.c *中使用的算法。 – 2013-05-08 03:51:39

+0

感謝您的鏈接。基於LUT的方法也是我正在考慮的,分析數據集。 – Karthik 2013-05-09 08:58:37