g ++确实为指针实现了__restrict__
,但我找不到任何关于迭代器的东西。我的总体意图是鼓励编译器对stl循环进行矢量化。
修改
即使编译器无法进行向量化,__restrict__
关键字也应该告诉编译器在循环中不需要不必要的重新加载。
答案 0 :(得分:6)
我不知道你直接问题的答案。但是,编译器只能为std::vector
矢量化循环,因为它是唯一具有连续存储的容器(我认为),并且在连续存储位置之间没有依赖关系(与std::list
不同) 。不过,我不知道怎么做。
<强>更新强>
经过一些实验(可能与整体目标相关或不相关),我发现在ICC中,以下不矢量化:
typedef std::vector<float> V;
V vec(4096);
for (V::iterator it = vec.begin(); it != vec.end(); ++it)
{
*it *= *it;
}
而以下是:
V vec(4096);
V::iterator it2 = vec.end();
for (V::iterator it = vec.begin(); it != it2; ++it)
{
*it *= *it;
}
显然,问题不在于迭代器,而在循环结构中对vec.end()
的调用,显然无法将其考虑在内,即使很明显循环体不会影响向量边界
在海湾合作委员会,我无法得到任何矢量化。这并不奇怪,因为GCC在发现SSE机会方面比ICC差得多。