10

g++ 确实实现__restrict__了指针,但我找不到任何关于迭代器的信息。我的总体意图是鼓励编译器矢量化 stl 循环。

编辑:

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

4

1 回答 1

6

我不知道你直接问题的答案。但是,编译器只能对循环进行矢量化 for std::vector,因为它是唯一具有连续存储的容器(我认为),并且连续存储位置之间没有依赖关系(与 eg 不同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 中,我无法得到任何向量化的东西。这并不奇怪,因为 GCC在发现 SSE 机会方面比 ICC 差得多

于 2011-02-13T10:55:02.013 回答