【发布时间】:2023-03-06 14:49:01
【问题描述】:
我有以下代码:
long a[1000];
long b[1000];
long c[1000];
long d[1000];
long e[10000000];
double start, end;
for(int i = 0; i < 1000; i++){
a[i] = i;
b[i] = i*2;
c[i] = i%13;
}
start = clock();
for(int k = 0; k < 10; k++){
for(int j = 0; j < 1000000; j++){
for(int i = 0; i < 1000; i++){
a[i] *= a[i];
b[i] *= b[i];
c[i] = a[i] + b[i];
d[i] = a[i] * c[i];
}
}
e[0] += a[k];
}
end = clock();
cout << end-start <<"\t"<< e[0];
测试配置:intel core i7-4702MQ CPU,Haswell(据我所知,我的处理器支持AVX-II),intel c++ compiler v.14,visual studio 2013,Windows 8.1。
当我运行显示的代码时,我得到了 3403 毫秒的时间,如果我添加#pragma novetor,那么时间是 6934 毫秒,即加速只有 2 倍。但是如果我将所有数组的类型更改为 double,那么时间分别为 2067 ms 和 7479 ms,即 SIMD-speedup 超过 3.5 倍。为什么会这样?为什么整数类型的加速比这么小?
【问题讨论】:
-
您使用什么编译器选项?您实际上需要告诉 ICC 使用 AVX2。 (或主机)
-
哦,这可能是因为整数版本矢量化为
vpmulld,这在 Haswell 上很慢。 Haswell 每两个周期只能运行 1 个vpmulld,但它可以每个周期运行 2 个vmulpd。
标签: c++ performance intel simd