【发布时间】:2018-10-28 23:53:30
【问题描述】:
有一个 3x3 的卷积核和一个由整数值像素数组表示的图像。
一个卷积核表示如下:
//compound convolutional kernels
// | 1, 0, 1|
// convolutional kernel H = src x | 0, 0, 0|
// |-1, 0, -1|
// | 1, 0, -1|
// convolutional kernel V = src x | 0, 0, 0|
// | 1, 0, -1|
卷积核 = 核 H + 核 V
for(int inc=0; inc<height-2; inc++)
{
//loaded 3 lines into memory
str1_16pxs = _mm_loadu_si128((__m128i*)(src_all_str));
str2_16pxs = _mm_loadu_si128((__m128i*)(src2_all_str));
str3_16pxs = _mm_loadu_si128((__m128i*)(src3_all_str));
//packing 16bit
str1_16pxs_pack1st_8to16 = _mm_cvtepu8_epi16(str1_16pxs);
str2_16pxs_pack1st_8to16 = _mm_cvtepu8_epi16(str2_16pxs);
str3_16pxs_pack1st_8to16 = _mm_cvtepu8_epi16(str3_16pxs);
//---!
//there is we make the first convolution for 8px's
//... How ???
//---
//summ 1st 8to16 vertical registers
sum1_str12_vert_16pxs_pack1st_8to16 = _mm_add_epi16(str1_16pxs_pack1st_8to16, str2_16pxs_pack1st_8to16);
sum1_str123_vert_16pxs_pack1st_8to16 = _mm_add_epi16(sum1_str12_vert_16pxs_pack1st_8to16,str3_16pxs_pack1st_8to16);
for(int jnc=0; jnc<(width >> 4); jnc++)
{
str1_16pxs_plus_8pxs = _mm_srli_si128(str1_16pxs, 8);
str2_16pxs_plus_8pxs = _mm_srli_si128(str2_16pxs, 8);
str3_16pxs_plus_8pxs = _mm_srli_si128(str3_16pxs, 8);
//pack 2nd 8to16 registers (+8px's)
str1_16pxs_pack2nd_8to16 = _mm_cvtepu8_epi16(str1_16pxs_plus_8pxs);
str2_16pxs_pack2nd_8to16 = _mm_cvtepu8_epi16(str2_16pxs_plus_8pxs);
str3_16pxs_pack2nd_8to16 = _mm_cvtepu8_epi16(str3_16pxs_plus_8pxs);
//---!
//do convolution for the remaining 8px's and so on until the end of the read line
//... How ???
//---
//summ vertic 8to16 registers
sum1_str12_vert_16pxs_pack2nd_8to16 = _mm_add_epi16(str1_16pxs_pack2nd_8to16, str2_16pxs_pack2nd_8to16);
sum1_str123_vert_16pxs_pack2nd_8to16 = _mm_add_epi16(sum1_str12_vert_16pxs_pack2nd_8to16,str3_16pxs_pack2nd_8to16);
//---!4 loading next 16 px's
src_all_str += 16;
src2_all_str += 16;
src3_all_str += 16;
//...
_mm_store_si128((__m128i*)(dst_all_str), res);
dst_all_str += 8;
}//for(jnc)
}//for(inc)
【问题讨论】:
-
问题是什么?奇怪的中间部分是什么?
-
查看代码://---! //这里是我们为 8px 的第一个卷积 //... 怎么样 ??? //---
-
代码是为了代码。问题和描述你有什么/你想要什么应该放在文本中。
-
请阅读How to Ask,尤其是关于作业问题的链接。
-
你怎么解释?有一个由整数值表示的像素数组。有一个卷积3x3的核心。在我从数组中读取三行来处理卷积核之后,这是必要的。如何处理整数值的卷积数组的核心我不知道。在“如何?”我指明了要进行此操作的地点。
标签: c c++11 sse simd intrinsics