是否有類似于xtn2但實際上清除下半部分而不是保持原樣的操作?我有一個128位向量v0,其視圖4s是{a,x,b,y}x和y不相關的。我想獲得{0,0,a,b}. 如果我做
xtn2 v0.4s, v0.2d
mov v0.d[0], xzr
我得到了我想要的結果。有沒有辦法用一條指令或更有效的方式來做到這一點?
uj5u.com熱心網友回復:
(歸功于原始建議的fuz)
如果你可以騰出另一個暫存器來保存零,比如v1,那么你可以做
uzp1 v0.4s, v1.4s, v0.4s
通常uzp1 vd.t, vn.t, vm.t將 的偶數元素(從零開始)打包vn到 的低半部分vd,將 的偶數元素打包vm到高半部分。(uzp2對于奇數元素v1也是如此。)因此,如果為零,則結果的低半部分為零,而高半部分的第 0 個和第 2 個元素v0即您的a和b。
請注意,如果您多次執行此操作,則v1可以將其初始化為零一次并在整個代碼中使用,因為它不是由該指令撰寫的。(如果 ARM 提供零 SIMD 暫存器會更容易vzr。)如果我們忽略它的開銷,那么這是非常有效的。例如,查看 Cortex A-72 時序(因為我碰巧手邊有它的優化指南),這uzp1是最便宜的 SIMD 指令型別,3 個周期延遲和每個周期 2 個吞吐量(它可以在兩個 SIMD 算術流水線中的任何一個中執行) )。
關于原始版本的一個性能說明是,在 SIMD 和通用暫存器之間移動非常昂貴,應盡可能避免。在 Cortex A-72 上,mov v*, x*(特殊情況別名ins)是 8 個周期的延遲和每個周期 1 的吞吐量,它需要加載管道(其中只有一個)以及兩個 SIMD 算術管道之一。可以想象, 可能有一個特殊情況xzr,但沒有提到 Cortex A-72 的情況。
不幸的是,據我所知,沒有直接的替代方法可以將 SIMD 暫存器中的一個元素歸零;movi立即寫入所有元素,而不僅僅是其中一些元素。因此,即使您堅持使用xtn2,您也可能希望在另一個暫存器中保持零,因為它ins v0.d[0], v1.d[0]很便宜。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/384832.html
