「数独の高速化」の見にくい表を直す
(1)
環境
Windows7 Professional 64bit版
Core i7-2600 @ 3.40GHz
単位は秒 それぞれ sudoku* q_kawai.txt -1 の実行時間を表しています
gcc 3.4.5 gcc 4.7.2 VC++2010
sudoku0 1960.5 1190.5 1247.8 C++でできるだけ簡潔に書いたもの
sudoku1 1628.8 1052.2 1249.7 常識的な範囲で最適化したもの
sudoku2 855.7 710.3 682.5 さらにループ展開したもの
sudoku3 728.3 674.1 536.3 switch-caseの乱用
sudoku4 327.2 count()等をアセンブラ化
最適化オプションは次の通りです
gcc 3.4.5 : -O2 のみ(-O3だとかえって遅くなったので) 32bitコードを生成させています
gcc 4.7.2 : -O3 -mtune=corei7 -march=corei7 これも32bitコードを生成させています(ミスです)
VC++2010 : /Ox /Oi /Ot /Oy /favor:INTEL64 /GA (正確なバージョン: 16.00.40219.01 for x64)
gcc 4.6.3(linux), VC2012(win7), icl 12.0(win7)
オプション:
g++ -Ofast -DNDEBUG -fomit-frame-pointer -march=native -msse4
cl /Ox /Oi /Ot /Oy /favor:INTEL64 /GA
icl /fast /EHs /DNDEBUG sudoku2.cpp /Qunroll-aggressive
環境:
sandy-bridge i7-2600 3.4GHz
g++のみWin7上のVMware上のlinuxで実行
VC, iclはnative実行
icc vc gcc
sudoku2 q_kawai.txt 20000000 10.048 10.982 10.710
sudoku3 q_kawai.txt 20000000 9.144 8.69 9.68
→ profile optimization 8.364 8.3 7.580
(↓これはビルドしなおすことなく実行・比較用)
sudoku4 q_kawai.txt 20000000 5.119