簡體   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