4

次の C++ プログラムを検討しています。

#include <iostream>
#include <limits>


int main(int argc, char **argv) {
   unsigned int sum = 0;
   for (unsigned int i = 1; i < std::numeric_limits<unsigned int>::max(); ++i) {
      double f = static_cast<double>(i);
      unsigned int t = static_cast<unsigned int>(f); 
      sum += (t % 2);
   }
   std::cout << sum << std::endl;
   return 0; 
}

私は gcc / g++ コンパイラを使用しています。私は openSUSE 12.3 (x86_64) を実行しており、Intel(R) Core(TM) i7-3520M CPU を使用しています。

ランニング

g++ -O3 test.C -o test_64_opt
g++ -O0 test.C -o test_64_no_opt
g++ -m32 -O3 test.C -o test_32_opt
g++ -m32 -O0 test.C -o test_32_no_opt

time ./test_64_opt
time ./test_64_no_opt
time ./test_32_opt
time ./test_32_no_opt

収量

2147483647

real    0m4.920s
user    0m4.904s
sys     0m0.001s

2147483647

real    0m16.918s
user    0m16.851s
sys     0m0.019s

2147483647

real    0m37.422s
user    0m37.308s
sys     0m0.000s

2147483647

real    0m57.973s
user    0m57.790s
sys     0m0.011s

double の代わりに float を使用すると、最適化された 64 ビット バリアントは 2.4 秒で終了しますが、他の実行時間はほぼ同じままです。ただし、 float を使用すると、おそらくプロセッサ内部の精度が高いため、最適化に応じて異なる出力が得られます。

64ビットの方が計算が速いかもしれないことは知っていますが、ここでは7倍(浮動小数点数ではほぼ15倍)です。

これらの実行時間の不一致について説明をいただければ幸いです。

4

1 に答える 1

5

問題は 32 ビット対 64 ビットではなく、SSE と SSE2 がないことです。64 ビット用にコンパイルする場合、利用可能なすべての x86_64 プロセッサには SSE と SSE2 があるため、gcc は SSE と SSE2 を使用できると想定します。

で 32 ビット バージョンをコンパイルする-msse -msse2と、実行時の違いはほとんどなくなります。

完全性の私のベンチマーク結果:

-O3 -m32 -msse -msse2     4.678s
-O3 (64bit)               4.524s
于 2013-10-05T20:40:46.603 に答える