Jon*_*nes 7 c++ optimization sse simd vectorization
我正在尝试将我的代码设置为自动向量化,但它无法正常工作.
int _tmain(int argc, _TCHAR* argv[])
{
const int N = 4096;
float x[N];
float y[N];
float sum = 0;
//create random values for x and y
for (int i = 0; i < N; i++)
{
x[i] = rand() >> 1;
y[i] = rand() >> 1;
}
for (int i = 0; i < N; i++){
sum += x[i] * y[i];
}
}
Run Code Online (Sandbox Code Playgroud)
这里没有循环矢量化,但我真的只对第二个循环感兴趣.
我正在使用visual studio express 2013并且正在编译/O2和/Qvec-report:2(报告循环是否被矢量化)选项.编译时,我收到以下消息:
--- Analyzing function: main
c:\users\...\documents\visual studio 2013\projects\intrin3\intrin3\intrin3.cpp(28) : info C5002: loop not vectorized due to reason '1200'
c:\users\...\documents\visual studio 2013\projects\intrin3\intrin3\intrin3.cpp(41) : info C5002: loop not vectorized due to reason '1305'
Run Code Online (Sandbox Code Playgroud)
在这里可以看到,原因'1305' 表示"编译器无法识别此循环的正确可矢量化类型信息." 我不确定这意味着什么.有任何想法吗?
将第二个循环拆分为两个循环后:
for (int i = 0; i < N; i++){
sumarray[i] = x[i] * y[i];
}
for (int i = 0; i < N; i++){
sum += sumarray[i];
}
Run Code Online (Sandbox Code Playgroud)
现在上面的第一个循环矢量化,但第二个循环没有,同样错误代码1305.
发生错误1305是因为优化器没有对循环进行矢量化,因为sum未使用该值.只需添加printf("%d\n", sum)修复程序即可.但是你得到一个新的错误代码1105"循环包括一个未识别的减少操作".要解决此问题,您需要设置/ fp:fast
原因是浮点运算不是关联的,使用SIMD或MIMD(即使用多个线程)的减少需要是关联的.通过使用更宽松的浮点模型,您可以进行缩减.
我只是使用以下代码测试它,默认情况下fp:precise没有矢量化,当我使用fp:fast它时.
#include <stdio.h>
int main() {
const int N = 4096;
float x[N];
float y[N];
float sum = 0;
for (int i = 0; i < N; i++){
sum += x[i] * y[i];
}
printf("sum %f\n", sum);
}
Run Code Online (Sandbox Code Playgroud)
关于关于rand()函数循环的问题,该函数rand()不是SIMD函数.它不能被矢量化.您需要找到SIMD rand()函数.我不知道一个.另一种方法是预先计算随机数组,然后使用数组.无论如何rand()是一个可怕的随机数生成,只对某些玩具案例有用.考虑使用Mersenne twister PRNG.
| 归档时间: |
|
| 查看次数: |
2439 次 |
| 最近记录: |