我从来没有编写过用于SSE优化的程序集代码,如果这是一个菜鸟问题,我很抱歉。在这中,将解释如何使用条件语句将for矢量化。但是,我的代码(摘自这里 )的形式如下:
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;
}
}
}因此,根据我的理解,这篇链接文章有几个不同之处:
for:我一直在向量化中看到一个级别的for,从来没有见过嵌套循环out索引不是基于i或j (所以它不是out[i]或out[j]):我如何以这种方式填充out?特别是我感到困惑,因为for索引总是用作数组索引,而这里则用于计算变量,而向量却是循环递增的。
我将icpc与-O3 -xCORE-AVX2 -qopt-report=5和其他一些优化标志一起使用。据英特尔顾问称,这不是矢量化的,使用#pragma omp simd生成warning #15552: loop was not vectorized with "simd"
发布于 2017-03-31 13:33:36
双线性插值是一个相当棘手的操作矢量化,我不会尝试它为您的第一个SSE技巧。问题是,您需要获取的值没有很好的排序。它们有时被重复,有时被跳过。好消息是,插值图像是一种常见的操作,您可能会找到一个预先编写好的库来实现这一点,比如OpenCV。
remap()总是一个不错的选择。只需构建两个wx和wy数组,它们代表每个像素的分数源位置,并让remap()进行插值。
然而,在这种情况下,它看起来像仿射变换。即,分数源像素通过2x3矩阵乘法与源像素相关。这是偏移量和a11/a12/a21/a22变量。OpenCV有这样一个转变。在这里阅读:affine.html
你要做的就是把你的输入变量映射成矩阵形式,然后调用仿射变换。
https://stackoverflow.com/questions/43141124
复制相似问题