免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

AVX圖像算法優(yōu)化系列二: 使用AVX2指令集加速查表算法。

查表算法,無疑也是一種非常常用、有效而且快捷的算法,我們在很多算法的加速過程中都能看到他的影子,在圖像處理中,尤其常用,比如我們常見的各種基于直方圖的增強,可以說,在photoshop中的調(diào)整菜單里80%的算法都是用的查表,因為他最終就是用的曲線調(diào)整 。
普通的查表就是提前建立一個表,然后在執(zhí)行過程中算法計算出一個索引值,從表中查詢索引對應(yīng)的表值,并賦值給目標(biāo)地址,比如我們常用的曲線算法如下所示:
int IM_Curve_PureC(unsigned char *Src, unsigned char *Dest, int Width, int Height, int Stride, unsigned char *TableB, unsigned char *TableG, unsigned char *TableR){int Channel = Stride / Width;if (Channel == 1){for (int Y = 0; Y < Height; Y++){unsigned char *LinePS = Src + Y * Stride;unsigned char *LinePD = Dest + Y * Stride;for (int X = 0; X < Width; X++){LinePD[X] = TableB[LinePS[X]];}}}else if (Channel == 3){for (int Y = 0; Y < Height; Y++){unsigned char *LinePS = Src + Y * Stride;unsigned char *LinePD = Dest + Y * Stride;for (int X = 0; X < Width; X++){LinePD[0] = TableB[LinePS[0]];LinePD[1] = TableG[LinePS[1]];LinePD[2] = TableR[LinePS[2]];LinePS += 3;LinePD += 3;}}}return IM_STATUS_OK;}通常我們認(rèn)為這樣的算法是很高效的,當(dāng)然,我們其實還可以做一定的優(yōu)化,比如使用下面的四路并行:
int IM_Curve_PureC(unsigned char *Src, unsigned char *Dest, int Width, int Height, int Stride, unsigned char *TableB, unsigned char *TableG, unsigned char *TableR){int Channel = Stride / Width;if ((Channel != 1) && (Channel != 3))return IM_STATUS_INVALIDPARAMETER;if ((Src =https://www.huyubaike.com/biancheng/= NULL) || (Dest == NULL))return IM_STATUS_NULLREFRENCE;if ((Width <= 0) || (Height <= 0))return IM_STATUS_INVALIDPARAMETER;int BlockSize = 4, Block = Width / BlockSize;if (Channel == 1){for (int Y = 0; Y < Height; Y++){unsigned char *LinePS = Src + Y * Stride;unsigned char *LinePD = Dest + Y * Stride;for (int X = 0; X < Block * BlockSize; X += BlockSize){LinePD[X + 0] = TableB[LinePS[X + 0]];LinePD[X + 1] = TableB[LinePS[X + 1]];LinePD[X + 2] = TableB[LinePS[X + 2]];LinePD[X + 3] = TableB[LinePS[X + 3]];}for (int X = Block * BlockSize; X < Width; X++){LinePD[X] = TableB[LinePS[X]];}}}else if (Channel == 3){for (int Y = 0; Y < Height; Y++){unsigned char *LinePS = Src + Y * Stride;unsigned char *LinePD = Dest + Y * Stride;for (int X = 0; X < Block * BlockSize; X += BlockSize){LinePD[0] = TableB[LinePS[0]];LinePD[1] = TableG[LinePS[1]];LinePD[2] = TableR[LinePS[2]];LinePD[3] = TableB[LinePS[3]];LinePD[4] = TableG[LinePS[4]];LinePD[5] = TableR[LinePS[5]];LinePD[6] = TableB[LinePS[6]];LinePD[7] = TableG[LinePS[7]];LinePD[8] = TableR[LinePS[8]];LinePD[9] = TableB[LinePS[9]];LinePD[10] = TableG[LinePS[10]];LinePD[11] = TableR[LinePS[11]];LinePS += 12;LinePD += 12;}for (int X = Block * BlockSize; X < Width; X++){LinePD[0] = TableB[LinePS[0]];LinePD[1] = TableG[LinePS[1]];LinePD[2] = TableR[LinePS[2]];LinePS += 3;LinePD += 3;}}}return IM_STATUS_OK;}這樣效率能進(jìn)一步的提高 。
在早期我們的關(guān)注中,我也一直想再次提高這個算法的效率,但是一直因為他太簡單了,而無法有進(jìn)一步的提高,在使用SSE指令集時,我們也沒有找到合適的指令,只有當(dāng)查找表為16字節(jié)的表時,可以使用_mm_shuffle_epi8快速實現(xiàn),詳見【算法隨記七】巧用SIMD指令實現(xiàn)急速的字節(jié)流按位反轉(zhuǎn)算法 。 一文的描述 。
在我們再次接觸AVX指令集,正如上一篇關(guān)于AVX指令的文章所述,他增加了非常具有特色的gather系列指令,具體有哪些如下圖所示:

AVX圖像算法優(yōu)化系列二: 使用AVX2指令集加速查表算法。

文章插圖
有一大堆啊,其實看明白了,就只有2大類,每大類里有2個小系列,每個系列里又有4中數(shù)據(jù)類型,
兩大類為 :針對128位的類型的gather和針對256位的gather 。
兩個系列為:帶mask和不帶mask系列 。

經(jīng)驗總結(jié)擴(kuò)展閱讀