[英]Why duplicated function in AVX512 to set zero?
我來到了這兩個功能:
_mm512_setzero_epi32()
_mm512_setzero_si512()
從邏輯上講,他們在做同樣的事情。 然后查看生成的Assembly ,在不同的優化級別下也發現一樣。
這是一個簡單的問題:為什么 AVX512 有這樣的重復設計,將 int 設置為 0?
_mm512_setzero_epi32()
是 100% 冗余的,沒有理由使用出於編碼風格的原因,我建議不要這樣做。 它不遵循_mm_setzero_si128()
/ _mm256_setzero_si256()
的相同模式返回_mm512_setzero_si512()
遵循的全零的 SIMD 整數向量。
這種情況與無用且冗余的_mm512_loadu_epi32
非常相似(它會混淆地加載整個 64 字節向量,而不是 4 字節標量)。 並非所有編譯器都支持_mm512_loadu_epi32
或_mm512_loadu_epi64
, _mm512_setzero_epi32
也可能是這種情況; 避免使用它以支持更標准和明顯的另一個原因。
對於_mm512_loadu_epi32
和_mm512_and_epi32
等冗余內在函數,它們是_mm512_maskz_loadu_epi32
和_mm512_mask_loadu_epi32
等模式的一部分; 屏蔽需要一個元素大小,並且具有至少 forms 的未屏蔽內在模式,如_mm512_add_epi32
必須存在相同操作的不同元素大小版本,並且沒有_si512
版本。
但是當前版本的內在函數指南中沒有合並屏蔽或零屏蔽setzero
內在函數。 因此, setzero_epi32
不屬於任何模式。
在 asm 中,沒有vpxor zmm
,只有vpxord
和vpxorq
,因為基本上所有 AVX-512 指令都支持屏蔽,這意味着必須有一個元素大小。 (對於像vmovdqa64
/ 32
這樣的動作也是如此。)
那么_mm512_setzero_epi32()
是否意味着使用vpxord
? 不,英特爾的內在函數指南實際上將其記錄為使用vpxorq
,就像所有其他 512 位歸零內在函數一樣(包括_mm512_setzero_ps()
- 有趣的事實; EVEX vxorps
需要 AVX512DQ 擴展,KNL Xeon Phi 不支持,僅在主流中支持(Skylake-avx512及更高版本)CPU)。
至於編譯器實際選擇使用什么歸零指令,可以是兩者之一,這沒有區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.