繁体   English   中英

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

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

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

代码:

#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;
        }

    }
}

正如您所看到的,我正在测量每秒的计算次数或bufferWriteIndex的增量。

问题:

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

12625671
12285846
12819392
11179072
12272587
11722863
12648955

与使用modeDampingTermsExp2

1593620
1668170
1614495
1785965
1814576
1851797
1808568
1801945

它大约快 10 倍。 似乎那些 2 arrays 中的数字对计算时间有影响。 为什么?

我正在使用带有以下标志的 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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM