Optymalizacja pakietów dla danej architektury procesora

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

Smigielpl
Użytkownik
Posty: 12
Rejestracja: 2009-01-23, 12:26

Optymalizacja pakietów dla danej architektury procesora

Post autor: Smigielpl »

Mam problem z optymalizowaniem pakietów pod daną architekturę procesora.
Chciałem utworzyć pakiet np. z pidgina tak, żeby był zoptymalizowany pod procesory i686 (typ mojego procesora).
Próbowałem w ten sposób:

Kod: Zaznacz cały

$ CFLAGS="-march=i686"
$ CPPFLAGS=$CFLAGS
$ ./configure
$ make > log.txt
Wynik polecenia make przekierowałem do pliku, żeby sprawdzić, czy do opcji kompilacji rzeczywiście dodało się -march=i686.
Niestety po przejrzeniu pliku log.txt okazało się, że zamiast -march=i686 wszędzie jest -march=i486.
Co robie nie tak?

Awatar użytkownika
marco70
Moderator
Posty: 1105
Rejestracja: 2006-10-26, 19:03
Lokalizacja: K...l

Re: Optymalizacja pakietów dla danej architektury procesora

Post autor: marco70 »

Walnij to SlackBuildem tylko mała zmiana w np. pliku z

Kod: Zaznacz cały

ARCH=${ARCH:-i486}
na

Kod: Zaznacz cały

ARCH=${ARCH:-i686}
no i tu

Kod: Zaznacz cały

if [ "$ARCH" = "i486" ]; then
  SLKCFLAGS="-O2 -march=i486 -mtune=i686"
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=i686 -mtune=i686"
elif [ "$ARCH" = "s390" ]; then
  SLKCFLAGS="-O2"
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
fi
Ostatnio zmieniony 2009-08-27, 18:45 przez marco70, łącznie zmieniany 3 razy.
Slackware 14.2 kde 4.14.38
i5-9600 CPU @ 3.70GHz

Awatar użytkownika
mina86
Moderator
Posty: 3314
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 4.x x86_64
Kontakt:

Re: Optymalizacja pakietów dla danej architektury procesora

Post autor: mina86 »

Zapomniałeś wyeksportować zmienne środowiskowe:

Kod: Zaznacz cały

$ CFLAGS="-march=i686" 
$ CPPFLAGS=$CFLAGS 
$ export CFLAGS CPPFLAGS
$ ./configure 
$ make > log.txt
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną. :: Post generated automatically by A.I. system called “mina86” in response to the previous one. :: Tiny Applications

Smigielpl
Użytkownik
Posty: 12
Rejestracja: 2009-01-23, 12:26

Re: Optymalizacja pakietów dla danej architektury procesora

Post autor: Smigielpl »

Dzięki, rzeczywiście użycie export pomogło.
Szczerze mówiąc to nie zapomniałem o export tylko myślałem, że skoro kompiluje program w tym samym terminalu w którym ustawiam zmienne CFLAGS i CPPFLAGS to export nie jest potrzebne.

Ale np. ten Slackbuild co podał marco70 nigdzie nie eksportuje tych zmiennych i jakoś działa (chyba, że jest błędnie napisany bo nie sprawdzałem).
Ostatnio zmieniony 2009-08-27, 20:07 przez Smigielpl, łącznie zmieniany 1 raz.

Awatar użytkownika
mina86
Moderator
Posty: 3314
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 4.x x86_64
Kontakt:

Re: Optymalizacja pakietów dla danej architektury procesora

Post autor: mina86 »

Smigielpl pisze:Szczerze mówiąc to nie zapomniałem o export tylko myślałem, że skoro kompiluje program w tym samym terminalu w którym ustawiam zmienne CFLAGS i CPPFLAGS to export nie jest potrzebne.
A jak sobie wyobrażasz ustawianie zmiennych pomiędzy terminalami? Eksportowanie jest potrzebne zawsze wtedy, gdy zmienne mają być widoczne w uruchamianych programach -- inaczej nie stają się zmiennymi środowiskowymi, a tylko wewnętrznymi zmiennymi powłoki (rzecz jasna, jeżeli zmienna jest zmienna środowiskową to nie musi być ponownie eksportowana).
Smigielpl pisze:Ale np. ten Slackbuild co podał marco70 nigdzie nie eksportuje tych zmiennych
Skrypt ten uruchamia configure jako:

Kod: Zaznacz cały

CFLAGS="..." ./configure ...
co jest równoważne:

Kod: Zaznacz cały

( CFLAGS="..."; export CFLAGS; ./configure ... )
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną. :: Post generated automatically by A.I. system called “mina86” in response to the previous one. :: Tiny Applications

vitos
Użytkownik
Posty: 104
Rejestracja: 2005-10-30, 09:13
Lokalizacja: Pszów
Kontakt:

Re: Optymalizacja pakietów dla danej architektury procesora

Post autor: vitos »

Ja mam zrobione tak:

Jest katalog ze źródłami np. z repozytorium .a/, a w nim wszystkie katalogi ze źródłami z wszystkich paczek tego repozytorium. W każdym z poszczególnych katalogów ze źródłami jest *.SlackBuild. Modyfikuję go w taki sposób, że w treści wycinam linijkę, gdzie występuje zmienna $ARCH (być może nie trzeba jej wycinać, tylko nie mam pewności, czy export ARCH=nasza_nowa_architektura ją zastąpi - nie próbowałem tego) i dodaję odpowiednie wpisy (elif) dla architektury, dla której kompiluję paczkę, czyli poniżej będzie to i686:

Kod: Zaznacz cały

if [ "$ARCH" = "i386" ]; then
  SLKCFLAGS="-O2 -march=i386 -mcpu=i686"
elif [ "$ARCH" = "i486" ]; then
  SLKCFLAGS="-O2 -march=i486 -mtune=i686"
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=$CPU $FLAGS"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "s390" ]; then
  SLKCFLAGS="-O2"
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2"
fi
I teraz najważniejsze. W katalogu głównym a/ mam skrypcik o nazwie a.build, który rekursywnie kompiluje mi wszystkie znajdujące się wewnątrz katalogu *.SlackBuild'y zgodnie z ustawionymi zmiennymi dla danej architektury. Będzie to:
1. architektura $ARCH - tutaj i686
2. optymalizacja dla konkretnego procesora $CPU - tutaj Intel Dual Core lub Core2 , czyli nazwa flagi core2
3. pozostałe flagi optymalizacyjne - $FLAGS

Opis ważniejszych flag kompilatora gcc masz tutaj oraz tutaj

Kod: Zaznacz cały

#!/bin/sh

unset CPU ARCH FLAGS

export CPU="core2" ARCH="i686" FLAGS="-pipe -fomit-frame-pointer -mfpmath=sse"

for i in ./*/*.SlackBuild
do
  cd $(dirname $i)
  sh $(basename $i)
  cd ..
  sleep 2
done

unset CPU ARCH FLAGS 
Z pozostałymi repozytoriami robisz analogicznie. Niestety metoda ta wymaga edycji każdego SlackBuilda, jest trochę zabawy, ale za to potem paczki masz skompilowane dla swojej architektury.

Może się to komuś przyda :-)
Pozdrawiam
Witek
Ostatnio zmieniony 2009-12-19, 08:44 przez vitos, łącznie zmieniany 1 raz.

Awatar użytkownika
mina86
Moderator
Posty: 3314
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 4.x x86_64
Kontakt:

Re: Optymalizacja pakietów dla danej architektury procesora

Post autor: mina86 »

vitos pisze:wycinam linijkę, gdzie występuje zmienna $ARCH
Nie musisz tego robić. Zmienna ta jest ustawiana poprzez:

Kod: Zaznacz cały

ARCH=${ARCH:-i486}
zatem przypisywana jest jej wartość zmiennej ARCH lub i486 jeżeli ta pierwsza jest pusta.
vitos pisze:dodaję odpowiednie wpisy (elif) dla architektury, dla której kompiluję paczkę
O wiele prościej będzie dodać do a.build:

Kod: Zaznacz cały

SLKCFLAGS="-O2 -march=$CPU $FLAGS" 
LIBDIRSUFFIX=""
export SLKCFLAGS LIBDIRSUFFIX
Stosują się do tych rad nie będziesz musiał ruszać SlackBuildów.

BTW. Gcc od jednej z wersji 4.x obsługuje argument -match=native -- polecam, jeżeli nie corss-kompilujemy.
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną. :: Post generated automatically by A.I. system called “mina86” in response to the previous one. :: Tiny Applications

ODPOWIEDZ