[英]Using the blend instructions in intel intrinsics (AVX)
我有一個關於 AVX _mm256_blend_pd
function 的問題。
我想優化我大量使用_mm256_blendv_pd
function 的代碼。 不幸的是,這具有相當高的延遲和低吞吐量。 此 function 將三個__m256d
變量作為輸入,其中最后一個表示用於前 2 個變量中 select 的掩碼。
我發現了另一個 function ( _mm256_blend_pd
),它采用位掩碼而不是__m256d
變量作為掩碼。 當掩碼為 static 時,我可以簡單地傳遞0b0111
之類的內容來獲取第一個變量的第一個元素和第二個變量的最后 3 個元素。 但是在我的情況下,掩碼是使用_mm_cmp_pd
function 計算的,它返回一個__m256d
變量。 我發現我可以使用_mm256_movemask_pd
從掩碼返回一個 int ,但是當將它傳遞給 function _mm256_blend_pd
時,我收到一個錯誤error: the last argument must be a 4-bit immediate
。
有沒有辦法通過這個 integer 使用它的前 4 位? 或者是否還有另一個類似於 movemask 的 function 可以讓我使用_mm256_blend_pd
? 或者我可以使用另一種方法來避免使用對這個用例更有效的 cmp、movemask 和 blend 嗎?
_mm256_blend_pd
是vblendpd
的內在函數,它將其控制操作數作為立即常數,嵌入到指令的機器代碼中。 (這就是匯編/機器代碼術語中“立即”的含義。)
在 C++ 術語中,控制 arg 必須是constexpr
,以便編譯器可以在編譯時將其嵌入到指令中。 您不能將它用於運行時變量混合。
不幸的是,像vblendvpd
這樣的可變混合指令速度較慢,但它們在 Skylake 上“只有”2 個微指令,具有 1 或 2 個周期延遲(取決於您測量關鍵路徑所通過的輸入)。 ( uops.info )。 在 Skylake 上,這些微指令可以在 3 個矢量 ALU 端口中的任何一個上運行。 (不過,在 Haswell/Broadwell 上更糟糕,僅限於端口 5,通過隨機播放來爭奪它)。 Zen 甚至可以將它們作為單個 uop 運行。
在 AVX512 使屏蔽成為您可以作為其他指令的一部分執行的一流操作並為我們提供單微指令混合指令(如vblendmpd ymm0{k1}, ymm1, ymm2
(根據屏蔽寄存器混合)。
在某些特殊情況下,您可以有用地_mm256_and_pd
有條件地置零而不是混合,例如,在add
之前將輸入歸零而不是在之后混合。
TL:DR: _mm256_blend_pd
允許您在控件是編譯時常量的特殊情況下使用更快的指令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.