使用gcc、icc和icx編譯器編譯SuperPI的性能對比測試_風聞
密集雨-反器材并非不可战胜,用暴风机甲血战到底2022-05-11 14:10
SuperPI是著名的圓周率計算軟件,通常用於CPU的單線程性能對比測試。目前這款軟件的源代碼已經開放,可以在gitHub下載。
SuperPI的編譯安裝非常簡單,只要本機安裝了make工具和編譯器,就可以使用make all命令對源碼進行編譯安裝。如有需要,還可以通過修改makefile的方式更換編譯器,以便更好地適應硬件平台特性。
測試環境:
CPU:Intel Core i9 12900KF
內存:2×32GB DDR4 3000
操作系統:Ubuntu20.04.4LTS
編譯器版本:
$ gcc -v
…..
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
$ icc -v
icc version 2021.5.0 (gcc version 9.4.0 compatibility)
$ icx -v
Intel(R) oneAPI DPC++/C++ Compiler 2022.0.0 (2022.0.0.20211123)
……
SuperPI解壓三份,目錄分別重命名為:SuperPI-gcc、SuperPI-icc和SuperPI-icx,並將其中makefile中的編譯器分別設置為gcc、icc和icx,隨後使用make all命令進行編譯。編譯後生成的主程序對比:
$ ll ./SuperPI-*/pi_css5
-rwxrwxr-x 1 uxr uxr 1093360 May 11 11:57 ./SuperPI-gcc/pi_css5*
-rwxrwxr-x 1 uxr uxr 1301584 May 11 12:06 ./SuperPI-icc/pi_css5*
-rwxrwxr-x 1 uxr uxr 1099448 May 11 12:04 ./SuperPI-icx/pi_css5*
可以看到gcc編譯生成的主程序是最小的;icx生成的程序略大於gcc;icc生成的程序是最大的,比gcc生成的程序大了將近20%。
測試命令:
$ ./pi_css5 $((1<<26))
這一命令的預計將計算圓周率小數點後2的26次方位的數值,即64M(6700萬)位。
測試結果:
gcc:
Calculation of PI using FFT and AGM, ver. LG1.1.2-MP1.5.2a.memsave
initializing…
nfft= 16777216
radix= 10000
error_margin= 0.365078
calculating 67108864 digits of PI…
AGM iteration
precision= 48: 3.80 sec
precision= 80: 3.77 sec
precision= 176: 3.77 sec
precision= 352: 3.78 sec
precision= 688: 3.78 sec
precision= 1392: 3.78 sec
precision= 2784: 3.77 sec
precision= 5584: 3.78 sec
precision= 11168: 3.78 sec
precision= 22336: 3.78 sec
precision= 44688: 3.77 sec
precision= 89408: 3.80 sec
precision= 178816: 3.77 sec
precision= 357648: 3.77 sec
precision= 715312: 3.78 sec
precision= 1430640: 3.78 sec
precision= 2861280: 3.77 sec
precision= 5722592: 3.77 sec
precision= 11445200: 3.77 sec
precision= 22890416: 3.77 sec
precision= 45780848: 3.77 sec
precision= 91561728: 3.78 sec
writing pi67108864.txt…
93.72 sec. (real time)
icc:
Calculation of PI using FFT and AGM, ver. LG1.1.2-MP1.5.2a.memsave
initializing…
nfft= 16777216
radix= 10000
error_margin= 0.365078
calculating 67108864 digits of PI…
AGM iteration
precision= 48: 3.84 sec
precision= 80: 3.81 sec
precision= 176: 3.82 sec
precision= 352: 3.86 sec
precision= 688: 3.86 sec
precision= 1392: 3.86 sec
precision= 2784: 3.86 sec
precision= 5584: 3.82 sec
precision= 11168: 3.82 sec
precision= 22336: 3.82 sec
precision= 44688: 3.82 sec
precision= 89408: 3.82 sec
precision= 178816: 3.81 sec
precision= 357648: 3.81 sec
precision= 715312: 3.82 sec
precision= 1430640: 3.82 sec
precision= 2861280: 3.81 sec
precision= 5722592: 3.82 sec
precision= 11445200: 3.82 sec
precision= 22890416: 3.82 sec
precision= 45780848: 3.81 sec
precision= 91561728: 3.82 sec
writing pi67108864.txt…
94.92 sec. (real time)
icx:
Calculation of PI using FFT and AGM, ver. LG1.1.2-MP1.5.2a.memsave
initializing…
nfft= 16777216
radix= 10000
error_margin= 0.365078
calculating 67108864 digits of PI…
AGM iteration
precision= 48: 3.78 sec
precision= 80: 3.75 sec
precision= 176: 3.75 sec
precision= 352: 3.75 sec
precision= 688: 3.78 sec
precision= 1392: 3.75 sec
precision= 2784: 3.76 sec
precision= 5584: 3.75 sec
precision= 11168: 3.75 sec
precision= 22336: 3.75 sec
precision= 44688: 3.76 sec
precision= 89408: 3.76 sec
precision= 178816: 3.75 sec
precision= 357648: 3.75 sec
precision= 715312: 3.76 sec
precision= 1430640: 3.76 sec
precision= 2861280: 3.75 sec
precision= 5722592: 3.75 sec
precision= 11445200: 3.75 sec
precision= 22890416: 3.75 sec
precision= 45780848: 3.75 sec
precision= 91561728: 3.76 sec
writing pi67108864.txt…
93.29 sec. (real time)
結論
在本次測試的三種編譯器中,作為測試基準的gcc9.4.0編譯器,性能優於icc而遜於icx。icx性能最強,但性能僅比gcc強不到1%;icc性能最差,但也僅比gcc差1%左右。考慮到測試過程中可能存在誤差,因此結論是:在運行單線程程序時,三種編譯器編譯而成的程序性能基本一致。
後記:
在運行2^26位測試後,又分別進行了2^27和2^28測試,但由於程序限制,實際生成的位數為0.75×2^27位和0.75×2^28位,近似於1億位和2億位。測試結果分別為:
gcc:
1億位203.22s
2億位467.73s
icc:
1億位200.50s
2億位465.03s
icx:
1億位201.77s
2億位460.28s
因此不難看出結論仍然成立,即在運行單線程程序時,三種編譯器編譯而成的程序性能基本一致。