Opzioni gcc per la compilazione del Kernel 3.2.57

4 risposte [Ultimo contenuto]
Ritratto di frank67
frank67
(Monster)
Offline
Monster
Iscritto: 10/07/2013
Messaggi: 487

Sull'onda di Zievatron che sta ricompilando a tutto spiano ho voluto dare una occhiata ai comandi che make esegue per compilare il kernel, mi interessavano le opzioni di gcc siccome sono riuscito a modificare il Makefile dei sorgenti del Kernel per l'architettura della CPU AMD FX 8350 del mio PC, indicando come opzione di ottimizzazione -march=bdver2 al posto di -march=k8 seguendo le modifiche indicata da questa patch.
Dopo un googling ho trovato la sintassi per far mostrare da make i comandi gcc eseguiti (come faceva una volta...)

~/linux-source-3.2$ make SHELL='sh -vx'

L'opzione -march è stata modificata come desideravo, ma ci sono diverse opzioni che iniziano con -mno-xxx che mi lasciano perplesso, riporto un output di gcc
+ set -e
+ echo   CC      arch/x86/crypto/fpu.o
  CC      arch/x86/crypto/fpu.o
+ gcc -Wp,-MD,arch/x86/crypto/.fpu.o.d -nostdinc -isystem /usr/lib/gcc/x86_64-linux-gnu/4.7/include -I/home/frank/linux-source-3.2/arch/x86/include -Iarch/x86/include/generated -Iinclude -include /home/frank/linux-source-3.2/include/linux/kconfig.h -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -Os -m64 -march=bdver2 -mno-red-zone -mcmodel=kernel -funit-at-a-time -maccumulate-outgoing-args -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -DCONFIG_AS_CFI_SECTIONS=1 -DCONFIG_AS_FXSAVEQ=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=2048 -Wno-unused-but-set-variable -fomit-frame-pointer -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -DKBUILD_STR(s)=#s -DKBUILD_BASENAME=KBUILD_STR(fpu) -DKBUILD_MODNAME=KBUILD_STR(aesni_intel) -c -o arch/x86/crypto/.tmp_fpu.o arch/x86/crypto/fpu.c

I flag supportati della CPU sono tanti, riporto il core 0 in /proc/cpuinfo:
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 21
model           : 2
model name      : AMD FX(tm)-8350 Eight-Core Processor           
stepping        : 0
microcode       : 0x6000822
cpu MHz         : 1400.000
cache size      : 2048 KB
physical id     : 0
siblings        : 8
core id         : 0
cpu cores       : 4
apicid          : 16
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 popcnt aes xsave avx f16c lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs xop skinit wdt lwp fma4 nodeid_msr tbm topoext perfctr_core arat cpb hw_pstate npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold
bogomips        : 8026.45
TLB size        : 1536 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 48 bits physical, 48 bits virtual
power management: ts ttp tm 100mhzsteps hwpstate [9] [10]

Perciò è opportuno modificare quelle opzioni che iniziano con -mno-xxx che presumo disabilitino il supporto ai flags invece supportati dal processore e se si come fare? Ci sono altre ottimizzazioni che posso specificare per questa CPU e se si come fare?
Grazie per ogni risposta.

P.S.
Anche link a documentazione sono molto apprezzati Smile

Ciao, Franco

Ritratto di frank67
frank67
(Monster)
Offline
Monster
Iscritto: 10/07/2013
Messaggi: 487

Ritorno poi sull'argomento dopo verifiche fatte sull'output di dmesg vedo se converrà togliere i flag -mno-sse -mno-sse2; intanto mi interessava sapere se il PCI Latency Timer è giusto che sia settato a 64 con il Kernel 3.2.57 mentre il Kernel 3.13.x non lo setta (almeno non compare nel dmesg) come fare per il kernel 3.2? Leggendo qui pare sia un retaggio del passato, è stato forse eliminato nei Kernel recenti e il 3.13 non lo imposta più? Nella documentazione del Kernel nel file linux-source-3.2/Documentation/networking/cxgb.txt ho trovato questo:

Citazione:

Making any of the following system changes will only last until you reboot
your system. You may want to write a script that runs at boot-up which
includes the optimal settings for your system.

Setting PCI Latency Timer:
setpci -d 1425:* 0x0c.l=0x0000F800


ma anche leggendo la pagina di manuale di setpci non sono riuscito a capire come fare, qualche aiuto?

Ciao, Franco

Ritratto di frank67
frank67
(Monster)
Offline
Monster
Iscritto: 10/07/2013
Messaggi: 487

Circa l'eliminare le opzioni -mno-sse -mno-sse2 dal file linux-source-3.2/arch/x86/Makefile non registro miglioramenti mentre modificando il file includendo l'ottimizzazione per il processore in dmesg compaiono risultati migliori. Smile
Ho modificato il file dove dice:

        cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8

in:
        cflags-$(CONFIG_MK8) += $(call cc-option,-march=bdver2) \
                $(call cc-option,-mtune=bdver2,$(call cc-option,-mtune=generic))

come scritto nella patch e in dmesg il valore:
raid6: sse2x4   13484 MB/s
raid6: using algorithm sse2x4 (13484 MB/s)

passa a:
raid6: sse2x4   13726 MB/s
raid6: using algorithm sse2x4 (13726 MB/s)

un incremento di circa 1.8% e il tempo di compilazione del kernel diminuisce di circa 1 secondo su 73 totali. Ci sono ottimizzazioni per altri processori indicate nella patch forse possono essere utili ad altri.
Per il PCI Latency Timer proprio nessuno ha qualche idea di come eliminarlo?

Ciao, Franco

Ritratto di frank67
frank67
(Monster)
Offline
Monster
Iscritto: 10/07/2013
Messaggi: 487

Dopo aver guardato questa guida che penso si riferisca alla compilazione dei pacchetti Gentoo ho trovato il link alla pagina di manuale di GCC che mi ha permesso di modificare la linea che esclude le ottimizzazioni per le istruzioni floating-point altrimenti abilitate con lopzione bdver2 specificata in -march. Dando poi una sbirciatina al Makefile del Kernel 3.13.10 ho trovato che è specificato, sempre in questo contesto, l'opzione -mno-avx così la riga in linux-source-3.2/arch/x86/Makefile da:

# prevent gcc from generating any FP code by mistake
KBUILD_CFLAGS += $(call cc-option,-mno-sse -mno-mmx -mno-sse2 -mno-3dnow,)

diventa:
# prevent gcc from generating any FP code by mistake
KBUILD_CFLAGS += $(call cc-option,-mno-sse -mno-mmx -mno-sse2 -mno-sse3 -mno-sse4.1 -mno-sse4.2 -mno-sse4 -mno-sse4a -mno-ssse3 -mno-avx -mno-3dnow,)

Consultando il link a GCC si può trovare l'opzione di ottimizzazione per il proprio processore ed in conseguenza di ciò che viene abilitato da quest'ultima disabilitare quelle relative alle istruzioni FP. La riga sopra riportata vale per la CPU AMD FX-8350.

Ciao, Franco

Ritratto di lollix01
lollix01
(Monster)
Offline
Monster
Iscritto: 22/02/2014
Messaggi: 411

Domanda:
Ma e' necessaria qualche patch per il kernel per utilizzare le varie cflags come -march -mfpmath e i livelli di ottimizzazione come -O1 -O2 e -O3 ???
Perche' ormai Zievatron non ha piu' scampo, con le ottimizzazioni orma la mia gentoo e' leggerissima! Se ottimizzassi il Kernel potrei dinuirne la dimensione e forse aumentarne la velocita'.
Hello! Smile

We are MicroSoft. You will be assimilated. Resistance is futile.
-- Attributed to B.G., Gill Bates