c++ - 是否可以使用 SSE 对此嵌套进行矢量化?

标签 c++ x86 vectorization sse simd

我从来没有为 SSE 优化编写过汇编代码,如果这是一个菜鸟问题,我很抱歉。在 this aritcle 解释了如何使用条件语句对 for 进行向量化。但是,我的代码(取自 here )的形式为:

   for (int j=-halfHeight; j<=halfHeight; ++j)
   {
      for(int i=-halfWidth; i<=halfWidth; ++i)
      {
         const float rx = ofsx + j * a12;
         const float ry = ofsy + j * a22;
         float wx = rx + i * a11;
         float wy = ry + i * a21;
         const int x = (int) floor(wx);
         const int y = (int) floor(wy);
         if (x >= 0 && y >= 0 && x < width && y < height)
         {
            // compute weights
            wx -= x; wy -= y;
            // bilinear interpolation
            *out++ =
               (1.0f - wy) * ((1.0f - wx) * im.at<float>(y,x)   + wx * im.at<float>(y,x+1)) +
               (       wy) * ((1.0f - wx) * im.at<float>(y+1,x) + wx * im.at<float>(y+1,x+1));
         } else {
            *out++ = 0;
         }
      }
   }

因此,根据我的理解,与链接的文章存在一些差异:

  1. 这里有一个嵌套的 for:我总是在 vectroization 中看到一级 for,从未见过嵌套循环
  2. if 条件基于标量值(x 和 y)而不是数组:如何使链接的示例适应于此?
  3. out 索引不基于 ij(因此它不是 out[i]out[j]):如何以这种方式填写 out

特别是我很困惑,因为 for 索引始终用作数组索引,而此处用于计算变量,而 vector 逐周期递增

我将 icpc-O3 -xCORE-AVX2 -qopt-report=5 和一堆其他优化标志一起使用。根据英特尔顾问的说法,这不是矢量化的,使用#pragma omp simd会生成警告#15552:循环未使用“simd”进行矢量化

最佳答案

双线性插值是一个相当棘手的矢量化操作,我不会在您的第一个 SSE 技巧中尝试它。问题是您需要获取的值没有很好地排序。它们有时会重复,有时会被跳过。好消息是,插值图像是一种常见操作,您可能会找到一个预先编写的库来执行此操作,例如 OpenCV

remap() 始终是一个不错的选择。只需构建两个 wx 和 wy 数组,它们代表每个像素的分数源位置,然后让 remap() 进行插值。

但是,在这种情况下,它看起来像仿射变换。也就是说,分数源像素通过 2x3 矩阵乘法与源像素相关。这是偏移量和 a11/a12/a21/a22 变量。 OpenCV有这样的变换。在这里阅读:http://docs.opencv.org/3.1.0/d4/d61/tutorial_warp_affine.html

您所要做的就是将输入变量映射为矩阵形式并调用仿射变换。

关于c++ - 是否可以使用 SSE 对此嵌套进行矢量化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43141124/

相关文章:

c++ - 如何使用_mm_extract_epi8函数?

c++ - 表示十六进制格式的 fp16 最小数字

c++ - 如何检测隐藏进程

arrays - 如何索引汇编中的字符串

c - C 编译器输出中的冗余移动

python - 在 Numpy 中执行 `A[tuple(B.T)]` 的更快方法

c++ - 在构造函数之后用零初始化 vector 的有效方法

c++ - bool 之前的预期声明说明符或 '...'

c - exit() 的系统调用实现

matlab - 如何在matlab中向量化双重求和