g++ 确实实现__restrict__
了指针,但我找不到任何关于迭代器的信息。我的总体意图是鼓励编译器矢量化 stl 循环。
编辑:
即使编译器无法向量化,__restrict__
关键字也应该能够告诉编译器循环内不需要不必要的重新加载。
g++ 确实实现__restrict__
了指针,但我找不到任何关于迭代器的信息。我的总体意图是鼓励编译器矢量化 stl 循环。
编辑:
即使编译器无法向量化,__restrict__
关键字也应该能够告诉编译器循环内不需要不必要的重新加载。
我不知道你直接问题的答案。但是,编译器只能对循环进行矢量化 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 差得多。