是否有类似于C++的restrict关键字,表明_iterators_没有别名

sre*_*ean 9 c++ iterator pointer-aliasing

g ++确实__restrict__为指针实现,但我找不到任何关于迭代器的东西.我的总体意图是鼓励编译器对stl循环进行矢量化.

编辑:

即使编译器无法进行向量化,__restrict__关键字也应该能够告诉编译器在循环内不需要不必要的重新加载.

Oli*_*rth 6

我不知道你直接问题的答案.但是,编译器只能为一个循环进行矢量化std::vector,因为它是唯一具有连续存储的容器(我认为),并且在连续存储位置之间没有依赖关系(例如std::list).不过,我不知道怎么做.

更新

一些实验(这可能是也可能不是相关的总体目标)后,我发现,在ICC,下面确实没有 vectorise:

typedef std::vector<float> V;

V vec(4096);

for (V::iterator it = vec.begin(); it != vec.end(); ++it)
{
    *it *= *it;
}
Run Code Online (Sandbox Code Playgroud)

而以下是:

V vec(4096);

V::iterator it2 = vec.end();
for (V::iterator it = vec.begin(); it != it2; ++it)
{
    *it *= *it;
}
Run Code Online (Sandbox Code Playgroud)

显然,问题不是迭代器,而是对vec.end()循环结构内部的调用,这显然不能被排除,尽管很明显循环体不会影响向量边界.

在海湾合作委员会,我无法得到任何矢量化.这并不奇怪,因为海湾合作委员会在发现上证所机会方面比国际商会糟糕.

  • @Konrad:经过一​​些实验,我发现这个循环结构不会向量化:`for(vec_t :: iterator it = vec.begin(); it!= vec.end(); ++ it)`,而这一个将:`vec_t :: iterator itEnd = vec.end(); for(vec_t :: iterator it = vec.begin(); it!= itEnd; ++ it)`.所以问题似乎不是迭代器,而是简单地调用`vector <T> :: end()`无论出于什么原因它都无法优化掉. (3认同)
  • 当你说GCC糟透了矢量化循环时,你是否尝试过启用`gcc -O2 -ftree-vectorize -msse [2]`选项? (3认同)