数组中的不同浮点值会影响性能 10 倍 - 为什么?

Different float values in array impact performance by 10x - why?

本文关键字:性能 影响 为什么 数组      更新时间:2023-10-16

请查看我的代码和下面的问题 - 谢谢

法典:

#include <iostream>
#include <chrono>
using namespace std;
int bufferWriteIndex = 0;
float curSample = 0;
float damping[5] = { 1, 1, 1, 1, 1 };
float modeDampingTermsExp[5] = { 0.447604, 0.0497871, 0.00247875, 0.00012341, 1.37263e-05 };
float modeDampingTermsExp2[5] = { -0.803847, -3, -6, -9, -11.1962 };

int main(int argc, char** argv) {
float subt = 0;
int subWriteIndex = 0;
auto now = std::chrono::high_resolution_clock::now();

while (true) {
curSample = 0;
for (int i = 0; i < 5; i++) {
//Slow version
damping[i] = damping[i] * modeDampingTermsExp2[i];
//Fast version
//damping[i] = damping[i] * modeDampingTermsExp[i];
float cosT = 2 * damping[i];
for (int m = 0; m < 5; m++) {
curSample += cosT;
}
}
//t += tIncr;
bufferWriteIndex++;

//measure calculations per second
auto elapsed = std::chrono::high_resolution_clock::now() - now;
if ((elapsed / std::chrono::milliseconds(1)) > 1000) {
now = std::chrono::high_resolution_clock::now();
int idx = bufferWriteIndex;
cout << idx - subWriteIndex << endl;
subWriteIndex = idx;
}
}
}

如您所见,im正在测量每秒bufferWriteIndex的计算次数或增量。

问题:

为什么使用modeDampingTermsExp时性能更快 - 程序输出:

12625671
12285846
12819392
11179072
12272587
11722863
12648955

与使用modeDampingTermsExp2

1593620
1668170
1614495
1785965
1814576
1851797
1808568
1801945

它的速度大约快了 10 倍。似乎这两个数组中的数字对计算时间有影响。为什么?

我正在使用带有以下标志的Visual Studio 2019:/O2/Oi/Ot/fp:fast

这是因为您正在击中非正常数字(另请参阅此问题(。

你可以像这样摆脱异常:

#include <cmath>
// [...]
for (int i = 0; i < 5; i++) {
damping[i] = damping[i] * modeDampingTermsExp2[i];
if (std::fpclassify(damping[i]) == FP_SUBNORMAL) {
damping[i] = 0; // Treat denormals as 0.
}
float cosT = 2 * damping[i];
for (int m = 0; m < 5; m++) {
curSample += cosT;
}
}