How slow (how many cycles) is calculating a square root?

后端 未结 3 1627
礼貌的吻别
礼貌的吻别 2020-11-30 08:40

How slow (how many cycles) is calculating a square root? This came up in a molecular dynamics course where efficiency is important and taking unnecessary square roots had a

3条回答
  •  有刺的猬
    2020-11-30 09:11

    Square root is about 4 times slower than addition using -O2, or about 13 times slower without using -O2. Elsewhere on the net I found estimates of 50-100 cycles which may be true, but it's not a relative measure of cost that is very useful, so I threw together the code below to make a relative measurement. Let me know if you see any problems with the test code.

    The code below was run on an Intel Core i3 under Windows 7 operating system and was compiled in DevC++ (which uses GCC). Your mileage may vary.

    #include 
    #include 
    #include 
    
    /*
    Output using -O2:
    
    1 billion square roots running time: 14738ms
    
    1 billion additions running time   : 3719ms
    
    Press any key to continue . . .
    
    Output without -O2:
    
    10 million square roots running time: 870ms
    
    10 million additions running time   : 66ms
    
    Press any key to continue . . .
    
    Results:
    
    Square root is about 4 times slower than addition using -O2,
                or about 13 times slower without using -O2
    */
    
    int main(int argc, char *argv[]) {
    
        const int cycles = 100000;
        const int subcycles = 10000;
    
        double squares[cycles];
    
        for ( int i = 0; i < cycles; ++i ) {
            squares[i] = rand();
        }
    
        std::clock_t start = std::clock();
    
        for ( int i = 0; i < cycles; ++i ) {
            for ( int j = 0; j < subcycles; ++j ) {
                squares[i] = sqrt(squares[i]);
            }
        }
    
        double time_ms = ( ( std::clock() - start ) / (double) CLOCKS_PER_SEC ) * 1000;
    
        std::cout << "1 billion square roots running time: " << time_ms << "ms" << std::endl;
    
        start = std::clock();
    
        for ( int i = 0; i < cycles; ++i ) {
            for ( int j = 0; j < subcycles; ++j ) {
                squares[i] = squares[i] + squares[i];
            }
        }
    
        time_ms = ( ( std::clock() - start ) / (double) CLOCKS_PER_SEC ) * 1000;
    
        std::cout << "1 billion additions running time   : " << time_ms << "ms" << std::endl;
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

提交回复
热议问题