C fordítók ubench/scimark2 szemszögből

Címkék

A régi-új pcc megjelenésével kapcsolatban talán a két legfontosabb kérdés a "Mennyire gyors az általa generált kód?" és a "A jelenleg elérhető (nyílt) forráskódok hány százalékát képes lefordítani (működőképes binárissá természetesen)?"

Egyik kérdésre sem fogok választ adni...

... de az ubench és a scimark2c programok eredményét a különféle fordítókkal az alábbi táblázatban megtaláljátok:

ubench -s gcc gcc -O2 gcc -O2 -march=pentium4 gcc42 -O2 -march=pentium4 pcc pcc -O2 icc icc -O2 icc -O2 -march=pentium4
Ubench Single CPU 82944 87744 133896 134579 84613 86836 126521 126708 136132
Ubench Single MEM 84092 153943 177588 181453 83627 129809 156780 156398 219659
Ubench Single AVG 83518 120843 155742 158016 84120 108322 141650 141553 177895

 

scimark2c gcc -O2 gcc -O2 -march=pentium4 gcc42 -O2 gcc42 -O2 -march=pentium4 pcc -O2 icc -O2 icc -O2 -march=pentium4 tcc -O2
Composite Score 549.19 579.64 584.84 599.17 nan 657.54 665.31 314.96
FFT 555.38 589.08 686.96 699.88 161.32 643.41 598.56 327.36
SOR 612.04 590.07 622.85 612.04 613.56 824.92 841.81 612.04
MonteCarlo 113.03 165.99 120.98 177.57 nan 118.89 128.21 95.98
Sparse matmult 525.93 592.83 568.72 566.80 185.59 601.33 655.36 191.96
LU 939.58 960.23 924.67 939.58 506.56 1099.14 1102.60 347.44

 

A használt fordítók verziói:


gcc -v
Using built-in specs.
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 3.4.6 [FreeBSD] 20060305

gcc42 -v
Using built-in specs.
Target: i386-portbld-freebsd6.2
Configured with: ./..//gcc-4.2-20061014/configure --disable-nls
--with-system-zlib --with-libiconv-prefix=/usr/local --program-suffix=42
--libdir=/usr/local/lib/gcc-4.2.0
--with-gxx-include-dir=/usr/local/lib/gcc-4.2.0/include/c++/
--infodir=/usr/local/info/gcc42 --disable-rpath --prefix=/usr/local
i386-portbld-freebsd6.2
Thread model: posix
gcc version 4.2.0 20061014 (experimental)

pcc -v
pcc 0.9.8 for i386-portbld-freebsd6.2, root@maszoka.private Tue Sep 18 20:25:19 CEST 2007
no input files

tcc -V
tcc: Version: 4.0, Machine: freebsd-*-80x86, Release: TenDRA-5.0.0-dev

icc -V
Intel(R) C Compiler for 32-bit applications, Version 8.1    Build 20060606Z Package ID: l_cc_pc_8.1.038
Copyright (C) 1985-2006 Intel Corporation.  All rights reserved.
FOR NON-COMMERCIAL USE ONLY

A használt operációs rendszer a FreeBSD 6.2-es kiadása i386-os platformon, alaptelepítéssel. A számítógép egy HP DL145, egy darab 2,6 GHz-es Opteron processzorral, 2 GB memóriával.

A fordítókkal kapcsolatban egy fontos megjegyzés:
az Intel icc fordítója két szempontból is hátrányosnak mondható FreeBSD-n. Egyrészt a jelenleg elérhető legfrissebb verzió már a 10-es, de ezt még (tudommal) senki sem portolta erre a platformra, másrészt pedig a binárisokat a linuxos (mivel natív FreeBSD-s nincs) icc-vel fordítottam, ami elképzelhető, hogy nem olyan optimális, mint ha ugyanezt teljesen linuxos környezetben, vagy natív, platformra optimalizált fordítóval tettem volna.

A fordítók weblapjai:
gcc, pcc, icc, tcc

Hozzászólások

Esetleg ha hozzáfűznéd azt az egyszerű tényt, hogy konkrétan a kisebb a jbb, avagy a nagyobb az egyes esetekben (lévén nem néztem eddig ezeket a teszteket, utána kéne járni.) Azaz a piros jó és a zöld a rossz, vagy fordítva?
Ja és miért nincs a TenDRA az első tesztben?

Egy kis e-penis lengetes:

ubench (-O2 -march=prescott):
- CPU: 166875
- MEM: 151009
- AVG: 158942

ubench (-03 -march=prescott):
- CPU: 169226
- MEM: 151009
- AVG: 160117

scimark (-O2 -march=prescott):
- Composite Score: 387.59
- FFT: 349.78
- SOR: 557.47
- MonteCarlo: 87.79
- Sparse matmult: 392.65
- LU: 550.26

scimark (-O3 -march=prescott):
- Composite Score: 393.22
- FFT: 359.42
- SOR: 558.94
- MonteCarlo: 85.68
- Sparse matmult: 413.96
- LU: 548.11

Core Duo @ 1.83GHz, MacOSX, gcc (4.0.1).

---
pontscho / fresh!mindworkz

Using 2.00 seconds min time per kenel.
make CFLAGS="-O2 -march=athlon64"
Composite Score: 424.99
FFT Mflops: 419.29 (N=1024)
SOR Mflops: 393.26 (100 x 100)
MonteCarlo: Mflops: 206.49
Sparse matmult Mflops: 490.91 (N=1000, nz=5000)
LU Mflops: 615.02 (M=100, N=100)

make CFLAGS="-O2 -march=athlon64 -ffast-math"
Composite Score: 427.61
FFT Mflops: 431.74 (N=1024)
SOR Mflops: 391.66 (100 x 100)
MonteCarlo: Mflops: 200.32
Sparse matmult Mflops: 490.91 (N=1000, nz=5000)
LU Mflops: 623.44 (M=100, N=100)

make CFLAGS="-O2 -march=athlon64 -mfpmath=sse,387"
Composite Score: 437.96
FFT Mflops: 369.54 (N=1024)
SOR Mflops: 408.25 (100 x 100)
MonteCarlo: Mflops: 201.08
Sparse matmult Mflops: 474.90 (N=1000, nz=5000)
LU Mflops: 736.03 (M=100, N=100)

make CFLAGS="-O2 -march=athlon64 -mfpmath=387"
Using 2.00 seconds min time per kenel.
Composite Score: 432.41
FFT Mflops: 427.51 (N=1024)
SOR Mflops: 398.13 (100 x 100)
MonteCarlo: Mflops: 118.25
Sparse matmult Mflops: 480.12 (N=1000, nz=5000)
LU Mflops: 738.02 (M=100, N=100)

make CFLAGS="-O2 -march=athlon64 -funroll-all-loops"
Composite Score: 491.28
FFT Mflops: 461.44 (N=1024)
SOR Mflops: 398.13 (100 x 100)
MonteCarlo: Mflops: 198.11
Sparse matmult Mflops: 485.45 (N=1000, nz=5000)
LU Mflops: 913.27 (M=100, N=100)

make CFLAGS="-O2 -march=athlon64 -funroll-loops"
Composite Score: 482.89
FFT Mflops: 455.42 (N=1024)
SOR Mflops: 398.13 (100 x 100)
MonteCarlo: Mflops: 177.19
Sparse matmult Mflops: 485.45 (N=1000, nz=5000)
LU Mflops: 898.25 (M=100, N=100)

make CFLAGS="-O2 -march=athlon64 -funroll-all-loops -mfpmath=sse,387"
Composite Score: 478.51
FFT Mflops: 385.89 (N=1024)
SOR Mflops: 403.13 (100 x 100)
MonteCarlo: Mflops: 191.06
Sparse matmult Mflops: 483.66 (N=1000, nz=5000)
LU Mflops: 928.80 (M=100, N=100)

make CFLAGS="-O2 -march=athlon64 -funroll-all-loops -mfpmath=sse,387 -ffast-math"
Composite Score: 462.64
FFT Mflops: 429.62 (N=1024)
SOR Mflops: 306.84 (100 x 100)
MonteCarlo: Mflops: 157.90
Sparse matmult Mflops: 483.66 (N=1000, nz=5000)
LU Mflops: 935.16 (M=100, N=100)

make CFLAGS="-O3 -march=athlon64 -funroll-all-loops -mfpmath=sse,387 -ffast-math"
Composite Score: 468.29
FFT Mflops: 431.74 (N=1024)
SOR Mflops: 308.81 (100 x 100)
MonteCarlo: Mflops: 183.86
Sparse matmult Mflops: 481.88 (N=1000, nz=5000)
LU Mflops: 935.16 (M=100, N=100)

Meglep, hogy icc -t veri gcc FFT -ben ,pedig ott lehetne SIMD -vel játszani.
-funroll-all-loops csak a kódba nézés után jutott eszembe, nem véletlenül :)
Ilyen rövid idejű mérésnél, úgy, hogy közben más is fut a gépen ~3% kisebb elterés gyakran nem megbízható.
Mindent csak egyszer teszteltem.
szerk:
Ha nem válaszoltok átszerkeszten táblázattá..

make CFLAGS="-O3 -march=athlon64 -funroll-all-loops -mfpmath=sse,387 -ffast-math -fprefetch-loop-arrays"
Using 2.00 seconds min time per kenel.
Composite Score: 363.74
FFT Mflops: 429.62 (N=1024)
SOR Mflops: 309.80 (100 x 100)
MonteCarlo: Mflops: 180.76
Sparse matmult Mflops: 398.40 (N=1000, nz=5000)
LU Mflops: 500.12 (M=100, N=100)

make CFLAGS="-O2 -march=athlon64 -fprefetch-loop-arrays"
Composite Score: 376.23
FFT Mflops: 453.05 (N=1024)
SOR Mflops: 403.13 (100 x 100)
MonteCarlo: Mflops: 205.70
Sparse matmult Mflops: 426.94 (N=1000, nz=5000)
LU Mflops: 392.34 (M=100, N=100)

make CFLAGS="-O2 -march=athlon64 -fprefetch-loop-arrays -funroll-all-loops"
Composite Score: 391.81
FFT Mflops: 461.44 (N=1024)
SOR Mflops: 406.53 (100 x 100)
MonteCarlo: Mflops: 187.06
Sparse matmult Mflops: 402.06 (N=1000, nz=5000)
LU Mflops: 501.96 (M=100, N=100)

Az én procim nagyon utalja prefetcheket :)

scimark2c 1 2 3 4 5 6 7 8 9 10
Composite Score 424.99 427.61 437.96 432.41 491.28 482.89 478.51 462.64 468.29 435.82
FFT 419.29 431.74 369.54 427.51 461.44 455.42 385.89 429.62 431.74 457.81
SOR 393.26 391.66 408.25 398.13 398.13 398.13 403.13 306.84 308.81 394.87
MonteCarlo 206.49 200.32 201.08 118.25 198.11 177.19 191.06 157.90 183.86 213.04
Sparse matmult 490.91 490.91 474.90 480.12 485.45 485.45 483.66 483.66 481.88 492.75
LU 615.02 623.44 736.03 738.02 913.27 898.25 928.80 935.16 935.16 620.61

1: CFLAGS="-O2 -march=athlon64"
2: CFLAGS="-O2 -march=athlon64 -ffast-math"
3: CFLAGS="-O2 -march=athlon64 -mfpmath=sse,387"
4: CFLAGS="-O2 -march=athlon64 -mfpmath=387"
5: CFLAGS="-O2 -march=athlon64 -funroll-all-loops"
6: CFLAGS="-O2 -march=athlon64 -funroll-loops"
7: CFLAGS="-O2 -march=athlon64 -funroll-all-loops -mfpmath=sse,387"
8: CFLAGS="-O2 -march=athlon64 -funroll-all-loops -mfpmath=sse,387 -ffast-math"
9: CFLAGS="-O3 -march=athlon64 -funroll-all-loops -mfpmath=sse,387 -ffast-math"
10: CFLAGS="-O3 -march=athlon64"
gcc version 4.2.0 (Gentoo 4.2.0)

OS elvileg nem számít ebben a tesztben.

-march=opteron

Ne csapjuk be gcc -t !

make clean;make LDFLAGS="-m32" CFLAGS="-m32 -O2 -march=athlon64"
Using 2.00 seconds min time per kenel.
Composite Score: 418.38
FFT Mflops: 446.10 (N=1024)
SOR Mflops: 398.13 (100 x 100)
MonteCarlo: Mflops: 130.94
Sparse matmult Mflops: 392.43 (N=1000, nz=5000)
LU Mflops: 724.31 (M=100, N=100)

make LDFLAGS="-m32" CFLAGS="-m32 -O2 -march=pentium4"
Composite Score: 415.20
FFT Mflops: 437.15 (N=1024)
SOR Mflops: 415.29 (100 x 100)
MonteCarlo: Mflops: 123.70
Sparse matmult Mflops: 392.43 (N=1000, nz=5000)
LU Mflops: 707.43 (M=100, N=100)

The ultimate weapon of war!
make clean ;make CFLAGS="-O2 -march=athlon64 -fprofile-generate" ; ./scimark2 #+ néhány régebbi etetés
make clean ;make CFLAGS="-O2 -march=athlon64 -fprofile-use" ; ./scimark2

Composite Score: 505.01
FFT Mflops: 479.19 (N=1024)
SOR Mflops: 406.53 (100 x 100)
MonteCarlo: Mflops: 197.38
Sparse matmult Mflops: 510.01 (N=1000, nz=5000)
LU Mflops: 931.97 (M=100, N=100)

Tud ilyet az icc ?

Mezei -O2 -vel jobbat ér el az icc kb. 470 pont. Bármilyen opcio nem sokat változtat ezen.
icc is tud profilingozni , de úgy csak 480 pontot ér el.

A mérések gyakran nem voltak repdukálhatók. pl. gcc -O2 nél volt már 417 -em 440 em is. Nem vágom mitől függ, mivel 500 pötyit vitte profilos gcc -ha kettőt futtattam párhuzamosan akkor is, de talán a böngésző futása huzta le ugyan azt a kódot 470 pötyire (talán több megszakitás lenne ? ).

507 pötyit hozott most a gcc profilos cuccom ezek mérésekor.

Majd dobok néhány kimenetet is ide.
(Most más csinál gépem , és nem mentettem a kimeneteket)
(scimark2.o nem törli clean, de ez nem sokat számít,de azért szoktam törölni)