首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自动矢量化:使编译器相信别名检查是不必要的

自动矢量化:使编译器相信别名检查是不必要的
EN

Stack Overflow用户
提问于 2014-09-19 20:43:21
回答 3查看 3K关注 0票数 20

我正在做一些图像处理,为此我受益于矢量化。我有一个向量化ok的函数,但我无法让编译器相信输入和输出缓冲区没有重叠,因此不需要别名检查。我应该能够使用__restrict__来做到这一点,但是如果缓冲区在作为函数参数到达时没有被定义为__restrict__,那么就没有办法让编译器相信我绝对肯定两个缓冲区永远不会重叠。

这是函数:

代码语言:javascript
运行
复制
__attribute__((optimize("tree-vectorize","tree-vectorizer-verbose=6")))
void threshold(const cv::Mat& inputRoi, cv::Mat& outputRoi, const unsigned char th) {

    const int height = inputRoi.rows;
    const int width = inputRoi.cols;

    for (int j = 0; j < height; j++) {
        const uint8_t* __restrict in = (const uint8_t* __restrict) inputRoi.ptr(j);
        uint8_t* __restrict out = (uint8_t* __restrict) outputRoi.ptr(j);
        for (int i = 0; i < width; i++) {
           out[i] = (in[i] < valueTh) ? 255 : 0;
        }
    }
}

说服编译器不执行别名检查的唯一方法是将内部循环放在一个单独的函数中,在这个函数中,指针被定义为__restrict__参数。如果我声明这个内部函数是内联的,别名检查也会被激活。

你也可以通过这个例子看到效果,我认为这是一致的:http://goo.gl/7HK5p7

(注意:我知道可能有更好的方法来编写相同的函数,但在这种情况下,我只是想了解如何避免别名检查)

编辑:

问题解决了!!(参见answer below)

使用gcc 4.9.2,here is the complete example。请注意,使用编译器标志-fopt-info-vec-optimized代替被取代的-ftree-vectorizer-verbose=N

所以,对于gcc来说,使用#pragma GCC ivdep并享受吧!:)

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

https://stackoverflow.com/questions/25934239

复制
相关文章

相似问题

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