簡體   English   中英

為什么在 AVX512 中復制 function 置零?

[英]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 ,只有vpxordvpxorq ,因為基本上所有 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.

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