使用AVX指令集优化自适应滤波器

标签 optimization filtering intel sse avx

我正在尝试使用 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;
  }
}

哪里

  1. filterindex 是一个输入缓冲区,其中保存每个像素的过滤器索引(0 到 991)[周围像素之间的这些索引没有模式]
  2. x 为输入,y 为输出
  3. 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/

相关文章:

mysql - 让我的 SQL 查询更有效率

gcc - 几年前构建的gcc版本的编译器如何仍能针对最近发布的处理器进行编译?

c# - 通过选定的标签过滤文档列表

cpu - 英特尔 E7 和 E5 至强型号之间的区别?

MYSQL查询优化,多查询还是一次大查询

matlab - 多项式的最大值

python - 是否有一个 Python 函数可以根据条件过滤并将二进制值分配给数据集中的列?

jquery - 使用jquery过滤同时列表时出现的问题

assembly - x86 处理器汇编语言 AND 和 OR 运算符优先级

英特尔 icc 编译器 -O 标志和 -qopt-report