我正在尝试使用 AVX 优化自适应过滤代码,其过滤器内核对于每个像素可能是随机的(例如 0 到 991)。
其对应的C代码如下:
/* filter function */
void filter()
{
int size = width *height; // image size
float w[992][11]; // filter kernel array
float x[size + 10], y[size], filterindex[size]; // input , output , filter index
for (i = 0; i < size; i++)
{
int l;
/* pick filter: */
l = filterindex[i];
/* apply filter */
for (k = -5, a = 0.; k <= 5; k++)
a += x[i+k] * w[l][5+k];
y[i] = (float)a;
}
}
哪里
filterindex
是一个输入缓冲区,其中保存每个像素的过滤器索引(0 到 991)[周围像素之间的这些索引没有模式]x
为输入,y
为输出w
是大小为w[992][2*N_filt + 1]
的过滤器内核,其中每个索引都初始化为 992 组
有人可以帮我如何使用 AVX 优化上述代码吗?如果 AVX 不可能,请建议任何其他方法来优化目标为 3x。
最佳答案
对于每个输入像素,您可以将 11 个滤波器系数加载到两个 AVX 寄存器中(在第二个寄存器中用 5 个零填充),并以类似方式加载像素:_mm256_load_ps。
将这些值成对相乘并相加,得到 2 个乘积的 8 和:_mm256_mul_ps、_mm256_fmadd_ps。
接下来,您需要使用一系列水平加法来压缩为单个值,生成 4、8 和 16 乘积的总和:_mm_hadd_ps。
总计:每个输出像素 9 条指令。
关于使用AVX指令集优化自适应滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24910841/