首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以用SSE来矢量化这个嵌套的?

是否可以用SSE来矢量化这个嵌套的?
EN

Stack Overflow用户
提问于 2017-03-31 12:49:35
回答 1查看 328关注 0票数 2

我从来没有编写过用于SSE优化的程序集代码,如果这是一个菜鸟问题,我很抱歉。在中,将解释如何使用条件语句将for矢量化。但是,我的代码(摘自这里 )的形式如下:

代码语言:javascript
复制
   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:我一直在向量化中看到一个级别的for,从来没有见过嵌套循环
  2. if条件基于标量值(x和y),而不是数组:如何使链接的示例适应这一点?
  3. out索引不是基于ij (所以它不是out[i]out[j]):我如何以这种方式填充out

特别是我感到困惑,因为for索引总是用作数组索引,而这里则用于计算变量,而向量却是循环递增的。

我将icpc-O3 -xCORE-AVX2 -qopt-report=5和其他一些优化标志一起使用。据英特尔顾问称,这不是矢量化的,使用#pragma omp simd生成warning #15552: loop was not vectorized with "simd"

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-31 13:33:36

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

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

然而,在这种情况下,它看起来像仿射变换。即,分数源像素通过2x3矩阵乘法与源像素相关。这是偏移量和a11/a12/a21/a22变量。OpenCV有这样一个转变。在这里阅读:affine.html

你要做的就是把你的输入变量映射成矩阵形式,然后调用仿射变换。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43141124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档