I have this function taken from [here][1]:
bool interpolate(const Mat &im, float ofsx, float ofsy, float a11, float a12, float a21, float a22, Mat &res) { bool ret = false; // input size (-1 for the safe bilinear interpolation) const int width = im.cols-1; const int height = im.rows-1; // output size const int halfWidth = res.cols >> 1; const int halfHeight = res.rows >> 1; float *out = res.ptr<float>(0); for (int j=-halfHeight; j<=halfHeight; ++j) { const float rx = ofsx + j * a12; const float ry = ofsy + j * a22; for(int i=-halfWidth; i<=halfWidth; ++i) { 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; ret = true; // touching boundary of the input } } } return ret; }
As suggested by [Intel Advisor][2], I added:
#pragma omp simd
for(int i=-halfWidth; i<=halfWidth; ++i)
However, while compiling I got:
warning #15552: loop was not vectorized with "simd"
Googling it, I found [this][3], but it's still not clear to me how I could solve this and vectorize this loop.
[1]: https://github.com/perdoch/hesaff/blob/master/helpers.cpp
[2]: https://www.google.it/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&u...
[3]: https://software.intel.com/en-us/articles/fdiag13379