簡體   English   中英

如何在將高位設置為零的同時將 __m128i 轉換為 __m256i?

[英]How to cast __m128i to __m256i while setting upper bits to zero?

我希望 VC++ 發出這樣的代碼:

vpxor     ymm0, ymm0, ymm0
vmovdqa   xmm0, xmm7

在人類語言中,我想要一個 32 字節的__m256i值,其中最低 16 字節來自另一個變量,最高 16 字節為零。 相當於_mm256_castsi128_si256內在的,只有我需要高 128 位為零,而不是未定義。

這是我嘗試過的:

_mm256_setr_m128i( low, _mm_setzero_si128() )
_mm256_insertf128_si256( _mm256_setzero_si256(), low, 0 )

上面兩行都編譯成vinsertf128 ,相對較慢,3-4 個周期的延遲,比vmovdqa慢得多。 VC++ 2017 的任何解決方法?

首先,您不需要vpxor ymm0, ymm0, ymm0因為vmovdqa xmm0, xmm7已經將目標ymm / zmm寄存器的ymm zmm 這與傳統的movdqa指令不同,您無論如何都不應該在 AVX 代碼中使用它。

其次,特定指令的選擇是編譯器的責任。 如果您的編譯器生成低效代碼,請考慮向編譯器供應商報告錯誤。 例如,gcc 識別這種內在函數模式並生成最佳代碼

對於 MSVC,鑒於 x86-64 模式下不支持內聯匯編程序,因此除了使用單獨編譯的匯編程序源之外,沒有可靠的方法來確保特定指令。 您可能會發現一些生成所需代碼的內在函數組合,但這將是不可靠的(並且可能會調用未定義的行為),並且可能會從一個編譯器版本更改為另一個版本。

暫無
暫無

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

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