圖像分析中常見的使用Conditional Remove的優化類型(1):Array Clip

就是把某個區間的灰度值映射到一高一低兩個極值(經驗證,除了賦值之外亦可做一些簡單計算),剩下來中間的做某種處理,比如加、減、乘、除或者絕對值、移位什麼的。典型的代碼如下:

Intel C++ Compiler通過Conditional Remove(利用比較生成掩碼,再加上一下邏輯操作)對此種類型進行自動向量化。

不過經過試驗發現,ICC目前(Windows 版 11.1)只支持源數據爲signed的自動向量化。究其原因,是因爲simd指令中只有支持signed型數據的比較,即pcmpgtb/pcmpgtw/pcmpgtd,沒有支持unsigned類型比較的指令。關於這一點,當初隱約覺得有可能是缺指令,但是一直不敢肯定。
主要是覺得,ICC可以智能地把unsigned的數據提升到更寬類型的signed類型數據進行向量化操作(當然安全性不能保證)。
或者使用Igor M. Levicki介紹的方法:pcmpeqw + paddusw + psubusw + paddw
http://software.intel.com/en-us/articles/array-clipping/


今天上網查了一下,觀點得到Aart J.C. Bik大牛的確認。
http://software.intel.com/en-us/forums/showthread.php?t=46566

"Dear user,
The reason the first loop is vectorized with 8-way SIMD parallelism on packed words but not the second is due to the lack of support for a packed unsigned ">"comparison (viz. instruction pcmpgtw supports ">"comparisons on packed signed words, but not for packed unsigned words). In contrast, a "=="or "!=" comparison will vectorize for both cases, because the instruction pcmpeqw (possibly negated) works for both packed signed and unsigned words (provided that both operands are consistently either sign extended or zero extended, as in your example, so that the comparison can be done in the narrower 16-bit precision to allow for maximum parallelism).”
第一個循環能夠以打包字的方式八路SIMD並行進行向量化,而第二個循環不能的原因在於:缺乏沒有指令支持打包無符號字的“>”比較(指令pcmpgtw只支持打包有符號字的“>”比較,並不支持打包無符號字的“>”比較)。與此相對應的是, "=="or "!="操作均能順利向量化。因爲指令pcmpeqw不僅支持打包的有符號字,還支持打包的無符號字(符號兩邊的操作數類型需要一致)。所以求maximun值的並行化能夠以窄16位的精度進行。(Lychee注:對於等號、不等號的已經驗證過,確實有符號和無符號都能自動向量化)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章