类似的问题发布在SO上,因为g ++相当模糊,所以我想我会发布一个VC ++ 12 / VS2013的具体示例,我们希望能够得到答案。
MSDN给出以下作为可以进行矢量化的循环的示例:
for (int i=0; i<1000; ++i)
{
A[i] = A[i] + 1;
}
(http://msdn.microsoft.com/en-us/library/vstudio/jj658585.aspx)
这是我对上面的基于范围的模拟的版本,c风格的怪物,以及使用std::for_each
的类似循环。我使用 / Qvec-report:2 标志进行编译,并将编译器消息添加为注释:
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> vec(1000, 1);
// simple range-based for loop
{
for (int& elem : vec)
{
elem = elem + 1;
}
} // info C5002 : loop not vectorized due to reason '1304'
// c-style iteration
{
int * begin = vec.data();
int * end = begin + vec.size();
for (int* it = begin; it != end; ++it)
{
*it = *it + 1;
}
} // info C5001: loop vectorized
// for_each iteration
{
std::for_each(vec.begin(), vec.end(), [](int& elem)
{
elem = elem + 1;
});
} // (no compiler message provided)
return 0;
}
只有c风格的循环才会被矢量化。根据{{3}}:
,原因1304如下1304:循环包括不同大小的作业。
它给出了以下作为触发1304消息的代码示例:
void code_1304(int *A, short *B)
{
// Code 1304 is emitted when the compiler detects
// different sized statements in the loop body.
// In this case, there is an 32-bit statement and a
// 16-bit statement.
// In cases like this consider splitting the loop into loops to
// maximize vector register utilization.
for (int i=0; i<1000; ++i)
{
A[i] = A[i] + 1;
B[i] = B[i] + 1;
}
}
我不是专家,但我看不到这种关系。这只是错误的报道吗?我注意到我的基于范围的循环都没有在我的实际程序中进行矢量化。是什么给了什么?
(如果这是错误的行为我正在运行VS2013专业版12.0.21005.1 REL)
编辑:发布错误报告:the MSDN docs
答案 0 :(得分:7)
在此发布错误报告:
响应:
嗨,谢谢你的报道。
向量化基于范围的循环代码是我们积极的 做得更好。我们将解决这个问题,以及启用 其他C ++语言的自动矢量化&amp;图书馆的特色在未来 发行版的编译器。
发出原因代码1304(在x64上)和原因代码1301(在 x86)是编译器内部的工件。详情,为 这个特殊的代码并不重要。
感谢您的举报!我正在关闭此MSConnect项目。随意地 如果您还有其他需要,请回复。
Eric Brumer Microsoft Visual C ++团队