2017-08-23 50 views
0

您能給出AVX2中的條件指令列表嗎? 到目前爲止,我已經找到了以下內容:AVX2中的條件指令

  • _mm256_blendv_ *從ab選擇基於面具c

是否有類似條件乘法和條件增加,等等?

此外,如果指令採取imm8計數(如_mm256_blend_ *),您可以解釋如何在矢量比較後獲得imm8

+0

[所有AVX2內部函數都在這裏](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#techs=AVX2)。這就是你在問題的第一部分所要求的嗎?我們並不真正在這裏做「列表」式的問題。 –

+0

@CodyGray,我正在積極使用這些頁面,但除了我列出的內容之外找不到更多內容。也許我錯過了一些東西。我預計這個列表很短,可能是5個項目,也許沒有更多的項目。所以我認爲這個問題不是太寬泛。而且沒有必要描述內在函數在做什麼(可以從文檔中讀取,一旦我知道如何搜索它們)。原則上如何使用它們就像使用'imm8'的版本一樣。 –

回答

1

AVX512爲幾乎所有指令引入了可選的零掩蔽和合並掩碼。

在此之前,做一個條件增加,之前掩蓋一個操作數(與vandpsvandnps的倒數)(對結果而不是vblendvps)的補充。這就是打包比較指令/內在函數生成全零或全部元素的原因。

0.0是添加劑標識元素,因此添加它是無操作。 (除了IEEE的-0.0和+0.0語義,我忘了它是如何工作的)。

掩蓋常量輸入而不是混合結果可以避免使關鍵路徑變長,例如有條件地添加1.0


條件乘法是更麻煩,因爲0.0不是乘法身份。您需要乘以1.0才能保持數值不變,並且使用AND或ANDN與比較結果無法輕鬆生成該數值。你可以混合輸入,或者你可以做乘法和混合輸出。

blendv的替代方案至少有3個布爾值,比如AND/ANDN/OR,但這通常不值得。雖然請注意Haswell運行vblendvpsvpblendvb作爲端口5的2個uops,因此與使用可在任何端口上運行的整數布爾值相比,這是一個潛在的瓶頸。 Skylake將它們作爲任何端口的2個uops運行。儘管如此,儘量避免在關鍵路徑上混合使用,這是有道理的。

掩蓋輸入操作數或混合結果通常是您如何執行無分支SIMD條件。

BLENDV通常至少有兩個uops,所以它比AND慢。

立即混合效率要高得多,但不能使用它們,因爲混合控制必須是編譯時常量嵌入到指令的機器代碼中。這就是立即意味着彙編語言的上下文。

3

Intel Intrinsics指南建議採用面罩進行收集,加載和存儲操作。 blend_epi16中的立即imm8不可編程,除非將自修改代碼或跳轉表視爲選項。仍然有可能從BMI2派生使用pext從movemask的結果中壓縮奇數定位位的一半 - 在AVX2中從movemask獲得32個獨立掩碼位,但blend_epi16使用每個位控制四個字節 - 或一個16位在每個銀行變量。