我注意到在C程序中向量化循环时,使用浮点数操作数比双精度操作数获得的加速更大。
例如:
for (int i = 0; i < N; i++) {
a[i] += b[i] * c[i];
}
当a、b和c的数组大小为20,000时,如果我重复执行这个循环1,000,000次:
- 没有使用矢量化,浮点数和双精度运行时间约为24秒。 - 使用自动矢量化(编译选项:-O1 -ftree-vectorize),浮点数运行时间约为7秒,双精度运行时间约为21秒。 - 使用OpenMP(# pragma omp simd)与上述情况类似。
可能的原因是什么?
编辑: 进一步信息:
- 处理器: Intel Core i7-2677M CPU @ 1.80GHz - 周围的代码除了分配数组(使用calloc)和一个循环,用于将数组b和c填充为常量值之外,没有其他任何代码。
float
数组总共占用234 KiB,适合单核L2数据缓存。而三个double
数组占用469 KiB,无法适应L2数据缓存。此外,使用float
时,可以在一个向量寄存器中容纳8个元素,而使用double
则减半,因此你只能获得一半的FLOPS。 - Hristo Iliev