optimierte make.conf

Kamikaze

Warrior of Sunlight
Teammitglied
---- UPDATE ----
Dieses Thread ist in einem Wiki Eintrag aufgegangen.
http://wiki.bsdforen.de/index.php/FreeBSD_-_make.conf_optimieren
-------------------

Da ich eine experimentelle Natur bin, ist in meine /etc/make.conf ist viel Arbeit geflossen. Ich weiß, viele hier halten nicht viel von Optimierungsorgien, aber vielleicht interessiert es doch den einen oder anderen. Angestoßen wurde das ganze übrigens über den make.conf Artikel der BSD-Crew Dresden.

Standardmäßig verwende ich bei den Ports den gcc41. Da einige ports damit nicht bauen, muss ich sie mit dem gcc aus dem Base System bauen. Schwieriger wird es bei Ports die zwar ohne Probleme kompiliert werden können aber dann Probleme bereiten, wie z.B. x11/xorg-libraries. In diesem Fall haben Ports beim Bauen die Version von sdl11-config nicht mehr erkannt.
Andere Ports wie archivers/unzip machen unabhängig vom verwendeten Compiler Probleme mit -O2 oder sogar -O. Unzip mit -O2 erzeugt bei mir aus Archiven nur Dateien der Länge 0.

Code:
# ---< compiler settings >-----------------------------------------------------
CPUTYPE?=		pentium-m
CFLAGS=			-O2 -pipe
# -----------------------------------------------------------------------------

# ---< updating >--------------------------------------------------------------
SUP_UPDATE=		yes
DOC_LANG=		en_US.ISO8859-1
SUP=			/usr/local/bin/cvsup
SUPFLAGS=		-g -L 2
SUPHOST=		cvsup7.de.freebsd.org
SUPFILE=		/usr/local/etc/cvsup/sources
PORTSSUPFILE=		/usr/local/etc/cvsup/ports
DOCSUPFILE=		/usr/local/etc/cvsup/doc

# Fetching from de sites preferred
MASTER_SORT_REGEX?=://[^/]*\.de[/.]

# For buildkernel
KERNCONF=		TPR40

# ---< configure ports >-------------------------------------------------------
.if${.CURDIR:M/usr/ports/*}

# Set gcc version for ports.
CC=			gcc41
CXX=			g++41
CPP=			cpp41

# Build these ports with the compiler provided by the base system.
BASE_BUILD=		java/jdk15 \
			net/liveMedia \
			net/samba-libsmbclient \
			net/linc \
			x11-toolkits/gtkmm24 \
			x11/libgnome \
			graphics/gimp \
			graphics/inkscape \
			games/scummvm \
			x11/xorg-libraries \
			sysutils/k3b \
			devel/sdl12 \
			x11-fm/krusader \
			print/ghostscript-gnu-nox11 \
			x11-toolkits/libbonoboui \
			devel/libtool15 \
			x11-toolkits/libgnomeui \
			security/gnomekeyring

# Build these ports with -O instead of -O2.
WEAK_OPT_BUILD=		archivers/unzip

# Build these ports without optimizations.
NO_OPT_BUILD=		graphics/png \
			graphics/png/work/libpng-1.2.8 \
			x11-toolkits/pango

# Common settings that are applied to all ports in hope to do some good.
WITHOUT_ARTS=		yes
WITH_IPV6=		yes
WITH_MOZILLA=		firefox
WITHOUT_DEBUG=		yes
WITH_GTK2=		yes

# editors/openoffice.org*
.if${.CURDIR:M/usr/ports/editors/openoffice.org*}
LOCALIZED_LANG=		en-GB
WITH_TTF_BYTECODE_ENABLED=yes
WITHOUT_JAVA=		yes
WITHOUT_MOZILLA=	yes
.endif

# x11-toolkits/gtk20
.if${.CURDIR:M/usr/ports/x11-toolkits/gtk20}
WITH_DROPSHADOW=	yes
WITH_DEBUG=		no
.endif

# x11-wm/fluxbox-devel
.if${.CURDIR:M/usr/ports/x11-wm/fluxbox-devel}
WITHOUT_SLIT=		yes
WITH_IMLIB2=		yes
.endif

# Check weather building with the base compiler is required.
.for BUILDPATH in ${BASE_BUILD}
.if ${.CURDIR} == /usr/ports/${BUILDPATH}
CC=			cc
CXX=			c++
CPP=			cpp
.endif
.endfor

# Check weather building with weak optimization is required.
.for BUILDPATH in ${WEAK_OPT_BUILD}
.if ${.CURDIR} == /usr/ports/${BUILDPATH}
CFLAGS=			-O -pipe
.endif
.endfor

# Check weather building without optimization is required.
.for BUILDPATH in ${NO_OPT_BUILD}
.if ${.CURDIR} == /usr/ports/${BUILDPATH}
CFLAGS=			-pipe
.endif
.endfor

.endif
# -----------------------------------------------------------------------------

# added by use.perl 2005-10-19 00:14:47
PERL_VER=5.8.7
PERL_VERSION=5.8.7
 
Zuletzt bearbeitet:
Nett. Aber das wichtigste hast du IMHO vergessen. Die ganzen multimedia/* Ports wuerde von SSE profitieren (und das sollte recht unkritisch sein). Also noch
Code:
-mmmx -msse -msse2 -mfpmath=sse,387
zu den CFLAGS hinzu.
 
schon mal pkgtools.conf angeschaut? ich mein man kann das rad auch neu erfinden wenn man will... ;)
 
MrFixit schrieb:
Nett. Aber das wichtigste hast du IMHO vergessen. Die ganzen multimedia/* Ports wuerde von SSE profitieren (und das sollte recht unkritisch sein). Also noch
Code:
-mmmx -msse -msse2 -mfpmath=sse,387
zu den CFLAGS hinzu.
Das sollte eigentlich der compiler am -march=pentium-m selbst merken, oder?
ouTi schrieb:
schon mal pkgtools.conf angeschaut? ich mein man kann das rad auch neu erfinden wenn man will... ;)
Nein, noch nie gesehen. Sieht mir auf den ersten Blick aber etwas zu kompliziert aus.
 
Habe ich auch schon gedacht, aber andererseits ist vieles schon im Wiki der bsdcrew in Dresden. Ich weiß nicht ob wir hier Artikel Klone haben wollen. Vielleicht kann ich mich auf das beschränken, was ich nicht aus dem Artikel habe.
 
Werde ich machen, es müssen aber noch ein paar details geklärt werden. Erst einmal will ich wissen ob die CFLAGS:
Code:
-mmmx -msse -msse2
nicht von CPUTYPE=pentium-m automatisch impliziert werden.

Die Flag:
Code:
-mfpmath=sse,387
ist in der gcc Dokumentation als experimentell und unzuverlässig beschrieben.
 
Ok, dann eben nur mfpmath=sse.
Impliziert wird das aber weder von FreeBSD, noch vom Compiler. Erst im amd64-mode verwendet er immer SSE.
Code:
$ egrep 'sse|mmx' /usr/share/mk*
$

zu pkgtools.conf: Kann nur funktionieren, wenn man immer portupgrade verwendet. Und selbst dann gibt es Faelle in denen es versagt. Die einzig korrekte Loesung ist sowas in make.conf oder in Makefile.local der einzelnen Ports zu speichern.
 
Ich weiß, double post, aber es hat sich einiges getan.

Es wäre nett wenn jemand anderes noch folgende Kapitel bearbeitet:
2 Verwandte Artikel
5 Optimierungen für Kernel und Welt

Morgen werde ich noch das Kapitel
7 Beispiele, Anwendungsfälle und Problemlösungen
schreiben.

Ich werde dort Beispielhaft meine Probleme mit x11/xorg-libraries und devel/sdl12 sowie mein Problem mit archivers/zip beschreiben.

--- update ---
Der Artikel ist jetzt im Rahmen meiner Kompetenzen fertig. Je nachdem was ich noch über zusätzliche CFLAGS herausfinde stehen wahrscheinlich noch im laufe der Zeit die ein oder andere kleine Erweiterung an.
 
Zuletzt bearbeitet:
hallo Kamikaze,

Hab gesehen, dass du cc=gcc41 in der make.conf stehen hast. Wie benimmts sichs denn so (läuft das System merkbar schneller)? Gabs damit beim make von Ports schon mal Probleme?
 
Es gibt einige Ports die einwandfrei damit laufen. Einige andere muss man eben mit dem gcc aus der Welt (3.4) bauen. Wenn ein Programm mit 4.1 kompiliert werden kann läuft es bei mir auch ohne Probleme. Es gibt natürlich auch sehr viele Ports die mit dem gcc41 einfach gar nicht gebaut werden können.
 
Ich wollte das Thema nochmal anschubsen, da mir nach lesen des Wiki-Artikels Make.conf optimieren immer noch nicht ganz klar ist wo die Make-Optionen für die Ports besser aufgehoben sind. In der make.conf oder in der pkgtools.conf?

MrFixit schrieb:
zu pkgtools.conf: Kann nur funktionieren, wenn man immer portupgrade verwendet. Und selbst dann gibt es Faelle in denen es versagt. Die einzig korrekte Loesung ist sowas in make.conf oder in Makefile.local der einzelnen Ports zu speichern.

Im Mailinglistenarchiv habe ich folgenden Text von Christain Weißgerber gefunden, was dem geschriebenen von MrFixit teilweise widerspricht.

Diese »Optionen« sind einfach make-Makros, man kann sie also in
/etc/make.conf setzen. Allerdings taucht dann das Thema »namespace
pollution« auf. Es ist nirgendwo garantiert, dass gleichnamige
Makros im Basisystem oder in den Ports nicht schon mit anderer
Bedeutung verwendet werden, was unvorhersehbare Auswirkungen haben
kann. Gerade mit Allerweltsoptionen wie WITH_X11, die in zig Ports
verwendet werden, wäre ich an so zentraler Stelle vorsichtig.
 
In dem Artikel werden keine Makros erzeugt und durch die Abfrage von Pfaden wird sichergestellt, das die Variablen nur dort gesetzt werden wo man sie haben will. Diese bedenken sind also zumindest wenn man dem Artikel folgt nicht von belang. Zur pkgtools.conf kann ich nur sagen, dass ich einmal hineingesehen habe, und es sah mir zu kompliziert aus. Außerdem wollte ich, das die Einstellungen auch funktionieren, wenn ich nicht portupgrade/portinstall verwende.
 
[LoN]Kamikaze schrieb:
Es gibt einige Ports die einwandfrei damit laufen. Einige andere muss man eben mit dem gcc aus der Welt (3.4) bauen. Wenn ein Programm mit 4.1 kompiliert werden kann läuft es bei mir auch ohne Probleme. Es gibt natürlich auch sehr viele Ports die mit dem gcc41 einfach gar nicht gebaut werden können.
meiner erfahrung nach lassen sich über 70% problemlos mit gcc41 bauen, was ihm als "standard ports compiler" zumindest bei mir eine berechtigung einräumt ;)
 
Was habt ihr eigentlich davon wenn ihr gcc41 verwendet. Das Ding erzeugt eine größere Binary und kompiliert langsamer. GCC4 hat absolut null Vorteile im Moment.

MFG

Dennis
 
Ich habe nochmal im gcc Handbuch nachgeschaut. -march=pentium-m impliziert -mmmx -msse -msse2 und -mfpmath=sse. Also habe ich diese Optionen wieder aus meiner make.conf entfernt.

Meine Messungen haben ergeben, das -mfpmath=sse langsamer ist als -mfpmath=387. Ich werde noch einige benchmarks durchführen, die zeigen sollen ob diese Regel auch gilt, wenn die CPU mit mehreren dingen gleichzeitig beschäftigt ist.

Hier ist die Liste der CPUs und den implizierten Instruction Sets aus dem gcc Handbuch:
Code:
i386
    Original Intel's i386 CPU.
i486
    Intel's i486 CPU. (No scheduling is implemented for this chip.)
i586, pentium
    Intel Pentium CPU with no MMX support.
pentium-mmx
    Intel PentiumMMX CPU based on Pentium core with MMX instruction set support.
i686, pentiumpro
    Intel PentiumPro CPU.
pentium2
    Intel Pentium2 CPU based on PentiumPro core with MMX instruction set support.
pentium3, pentium3m
    Intel Pentium3 CPU based on PentiumPro core with MMX and SSE instruction set support.
pentium-m
    Low power version of Intel Pentium3 CPU with MMX, SSE and SSE2 instruction set support. Used by Centrino notebooks.
pentium4, pentium4m
    Intel Pentium4 CPU with MMX, SSE and SSE2 instruction set support.
prescott
    Improved version of Intel Pentium4 CPU with MMX, SSE, SSE2 and SSE3 instruction set support.
nocona
    Improved version of Intel Pentium4 CPU with 64-bit extensions, MMX, SSE, SSE2 and SSE3 instruction set support.
k6
    AMD K6 CPU with MMX instruction set support.
k6-2, k6-3
    Improved versions of AMD K6 CPU with MMX and 3dNOW! instruction set support.
athlon, athlon-tbird
    AMD Athlon CPU with MMX, 3dNOW!, enhanced 3dNOW! and SSE prefetch instructions support.
athlon-4, athlon-xp, athlon-mp
    Improved AMD Athlon CPU with MMX, 3dNOW!, enhanced 3dNOW! and full SSE instruction set support.
k8, opteron, athlon64, athlon-fx
    AMD K8 core based CPUs with x86-64 instruction set support. (This supersets MMX, SSE, SSE2, 3dNOW!, enhanced 3dNOW! and 64-bit instruction set extensions.)
winchip-c6
    IDT Winchip C6 CPU, dealt in same way as i486 with additional MMX instruction set support.
winchip2
    IDT Winchip2 CPU, dealt in same way as i486 with additional MMX and 3dNOW! instruction set support.
c3
    Via C3 CPU with MMX and 3dNOW! instruction set support. (No scheduling is implemented for this chip.)
c3-2
    Via C3-2 CPU with MMX and SSE instruction set support. (No scheduling is implemented for this chip.)

Ich werde demnächst den wiki Artikel in dieser Hinsicht ein wenig überarbeiten.
 
Wozu gehört denn der AMD Duron? Läuft der unter Athlon? Ist ja an sich nur eine "abgespeckte" Version des Athlon, oder?
 
Zurück
Oben