2013-05-01 52 views
-1

請我試着對一些int64算術做一些優化。我需要做右側和左側移位,除法,餘數等所有的運算,我搜索了所有SSE內在函數,並且什麼也沒找到。左移不適用於負值。請問你能指導我嗎?SSE int64內在函數

代碼的一部分顯示(英特爾酷睿i7):

u_a2b2=(MatrixAiB1[0]>>2*z_bits); 
res_ri=(MatrixAiB1[0] % (__int64(1)<<2*z_bits)); 
if (MatrixAiB1[0] >= 0)       
    { 
    if (abs(res_ri) > (__int64(1)<<41))  
    {   
     u_a2b2=u_a2b2+1; 
    } 
    } 
else 
{ 
    if (abs(res_ri) < (__int64(1)<<41))  
    { 
     if (u_a2b2>=0) 
     { 
     u_a2b2=u_a2b2-1; 
     } 
     else 
     { 
     u_a2b2=u_a2b2+1; 
     } 
     } 

} 

一切INT64

感謝

+1

歡迎來到SO。你寫的問題有點漫無邊際。如果你可以發佈一個完整的,但最小的程序,試圖做一件你想要的事情,並指出它到底是什麼錯誤,這將有所幫助。 – 2013-05-01 08:11:25

+1

你想要達到的目標以及你想要改進的東西還遠遠不清楚。代碼本身似乎不適用於數組或類似的東西,因此對於64位版本的代碼,SSE指令絕對沒有幫助(最有可能的是,它會使速度變慢)。對於一個32位版本,SSE指令可能會稍微快一些(換句話說,除法或模數是相同的速度,因爲困難的部分是實際的除法,它發生在相同的除法單元中,無論它是作爲SSE或「常規」指令)。 – 2013-05-01 08:23:00

+0

無論如何,SSE中沒有整數餘數(甚至整數除法)。 – harold 2013-05-01 08:26:16

回答

4

說實話,有一個在嘗試優化這種毫無意義碼。只需聲明一個64位大小的變量,讓編譯器完成剩下的工作。在64位版本中,生成的指令都將是CPU固有的(即只有一個CPU指令),在32位版本上,編譯器編寫者已經完成了尋找在32位實現64位操作的最佳方式的艱辛工作位系統。

+1

+1:只是爲了重新說明最重要的一點:用'g ++ -m64'(或編譯器的等價物)進行編譯,以便生成64位代碼。 – 2013-05-01 08:20:16

0

該位:

res_ri=(MatrixAiB1[0] % (__int64(1)<<2*z_bits)); 

很可能被替換爲:

res_ri=(MatrixAiB1[0] & (__int64(1)<<2*z_bits)-1); 

(如果結果應該是陰性或陽性,您將需要一個東西來解決這個問題了,但如果%的一邊是負數,那麼它就是「imlementation defined」,所以我猜你應該不會依賴於MatrixAiB1[0]小於零時會發生什麼情況)。

&的操作比%快20倍左右,所以應該對5000個元件的大約100000個時鐘週期進行很好的改進。

+0

是的,可以這樣做。儘管編譯器知道這個技巧(並且可以證明操作數在這種情況下是2的冪,但這並不總是可行),但它很可能不會做任何改進運行時的操作。所以應該沒有理由通過做一些編譯器應該可以做的事情來使代碼不易讀。即使不這樣做,它也不會取決於if條件的可預測性(當然假設序列沒有完全重新排序並且跳轉被條件移動所取代)而有很大的改進。 – Grizzly 2013-05-01 10:53:47