[我注意到,当对C程序中的循环进行矢量化处理时,与使用double操作数相比,使用float类型的操作数所实现的加速要大得多。
示例:
for (int i = 0; i < N; i++) {
a[i] += b[i] * c[i];
}
[当a,b和c数组的大小分别为20,000,我重复此循环1,000,000:
对于OpenMP(#pramga omp simd),它与上述要点类似。
这可能是什么原因?
编辑:更多信息:
通过许多这些操作,SIMD(单指令,多个数据)指令开始起作用。浮点数是双精度浮点数的一半,因此在单个指令中可以处理两倍的浮点数。但是,令我惊讶的是使用浮点数的速度是三倍,而不是简单的两倍。我怀疑,但不确定,这是因为浮子更容易操作-实际的尾数提取等。
您是否尝试过使用-ffast-math
选项?这可能会影响您需要考虑的其他副作用(例如,潜在的精度损失)。