簡體   English   中英

SSE指令在實踐中優化了什么,編譯器如何啟用和使用它們?

[英]What does SSE instructions optimize in practice, and how does the compiler enables and use them?

現在SSE和/或3D! 有矢量指令,但他們在實踐中優化了什么? 例如,8位字符是4乘4還是1乘1? 某些算術運算是否有優化? 字大小是否有任何影響(16位,32位,64位)?

所有編譯器在可用時是否使用它們?

是否真的必須了解匯編才能使用SSE指令? 了解電子和門邏輯有助於理解這一點嗎?

背景:SSE有向量和標量指令。 支持3DNow! 死了

如果沒有程序員的幫助,任何編譯器都無法從向量化中獲取有意義的好處,這種情況並不常見。 通過編程工作和實驗,人們通常可以接近純裝配的速度,而無需實際提及任何特定的矢量指令。 有關詳細信息,請參閱編譯器的向量編程指南。

涉及幾個可移植性權衡。 如果您編寫GCC的矢量化器代碼,您可以使用非英特爾架構,如PowerPC和ARM,但不能使用其他編譯器。 如果您使用英特爾內在函數來使您的C代碼更像匯編,那么您可以使用其他編譯器,但不能使用其他架構。

電子知識對你沒有幫助。 學習可用的說明將。

在一般情況下,你不能依賴於編譯器使用矢量指令。 有些人(英特爾的C ++編譯器在許多簡單的情況下做了合理的工作,GCC也嘗試這樣做,並取得了成功)

但這個想法只是將相同的操作應用於4個32位字(在某些情況下為2個64位值)。

因此,除了傳統的“add”指令(將2個不同的32位寬寄存器的值加在一起)之外,您可以使用矢量化的add,它使用包含4個32位值的特殊128位寬寄存器,並將它們相加作為一個單一的操作。

其他問題重復: 使用SSE說明

簡而言之,SSE是Streaming SIMD Extensions的縮寫,其中SIMD =單指令,多數據。 這對於一次對許多值執行單個數學或邏輯運算非常有用,這通常用於矩陣或矢量數學運算。

編譯器可以將此指令集作為其優化的一部分(研究您的/ O選項),但是您通常必須重新構建代碼並手動編寫SSE代碼,或使用像Intel Performance Primitives這樣的庫來真正利用它。

如果你知道自己在做什么,那么你可能會獲得巨大的性能提升。 例如,在這里看到這個人改進了他的算法的性能6次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM