我想优化自适应滤波代码使用AVX的滤波器内核可能是随机的每个像素(说0到991)。使用AVX指令集的自适应滤波器的优化
它相应的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的目标。
只是AVX,还是AVX2可用? –
我认为在这种情况下,使用SIMD可以获得3倍的提升。没有太多的并行性可以得到;滤波器内核本身太短而不能通过并行计算卷积碎片而获得很多好处,并且内核在每个像素基础上不同的事实使并行计算多个像素变得复杂。您可能会略微改进一些,我认为这是一个提升级别并搜索算法变更以提高速度的例子,这将是您最好的选择。 –
第二个for循环可能不会像你期望的那样工作,因为'y [i] =(float)a;'在循环之外 –