Kirjoittaja Aihe: Makefile Raspberry Pi 3b+  (Luettu 6135 kertaa)

juffe

  • Käyttäjä
  • Viestejä: 47
    • Profiili
Makefile Raspberry Pi 3b+
« : 01.12.19 - klo:15.49 »
Moi,
Osaisiko joku hieman helpata, miten saisi optimoitua Makefilen tuota Raspberryä varten optimaaliseksi. Nyt ohjelma kuormittaa yhtä corea 100%.
Eli ohjelma on rtklibin rtkrcv https://github.com/rtklibexplorer/RTKLIB ja sen makefile alimpana

Koodia: [Valitse]
top - 13:45:34 up  1:39,  1 user,  load average: 1.73, 1.54, 1.34
Tasks: 104 total,   1 running, 102 sleeping,   1 stopped,   0 zombie
%Cpu(s): 25.3 us,  3.0 sy,  0.0 ni, 71.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :    926.1 total,    751.1 free,     63.4 used,    111.5 buff/cache
MiB Swap:    100.0 total,    100.0 free,      0.0 used.    806.5 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 8041 pi        20   0   40208  17332   2180 S 103.3   1.8  37:09.03 rtkrcv


Koodia: [Valitse]
# makefile for rtkrcv

BINDIR = /usr/local/bin
SRC    = ../../../src

# for beagleboard
#CTARGET= -mfpu=neon -mfloat-abi=softfp -ffast-math
CTARGET= -DENAGLO -DENAQZS -DENACMP -DENAGAL -DENAIRN -DNFREQ=4 -DNEXOBS=3 -DSVR_REUSEADDR

CFLAGS = -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I$(SRC) -I.. -DTRACE $(CTARGET) -g

UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S), Darwin)
LDLIBS  = -lm -lpthread
else
LDLIBS  = -lm -lrt -lpthread
endif

all        : rtkrcv
rtkrcv     : rtkrcv.o vt.o rtkcmn.o rtksvr.o rtkpos.o geoid.o solution.o lambda.o
rtkrcv     : sbas.o stream.o rcvraw.o rtcm.o preceph.o options.o pntpos.o ppp.o ppp_ar.o
rtkrcv     : novatel.o ublox.o swiftnav.o crescent.o skytraq.o gw10.o javad.o nvs.o binex.o
rtkrcv     : rt17.o ephemeris.o rinex.o ionex.o rtcm2.o rtcm3.o rtcm3e.o qzslex.o
rtkrcv     : ppp_corr.o tides.o septentrio.o cmr.o tersus.o comnav.o

rtkrcv.o   : ../rtkrcv.c
$(CC) -c $(CFLAGS) ../rtkrcv.c
vt.o       : ../vt.c
$(CC) -c $(CFLAGS) ../vt.c
rtkcmn.o   : $(SRC)/rtkcmn.c
$(CC) -c $(CFLAGS) $(SRC)/rtkcmn.c
rtksvr.o   : $(SRC)/rtksvr.c
$(CC) -c $(CFLAGS) $(SRC)/rtksvr.c
rtkpos.o   : $(SRC)/rtkpos.c
$(CC) -c $(CFLAGS) $(SRC)/rtkpos.c
geoid.o    : $(SRC)/geoid.c
$(CC) -c $(CFLAGS) $(SRC)/geoid.c
solution.o : $(SRC)/solution.c
$(CC) -c $(CFLAGS) $(SRC)/solution.c
lambda.o   : $(SRC)/lambda.c
$(CC) -c $(CFLAGS) $(SRC)/lambda.c
sbas.o     : $(SRC)/sbas.c
$(CC) -c $(CFLAGS) $(SRC)/sbas.c
stream.o   : $(SRC)/stream.c
$(CC) -c $(CFLAGS) $(SRC)/stream.c
rcvraw.o : $(SRC)/rcvraw.c
$(CC) -c $(CFLAGS) $(SRC)/rcvraw.c
rtcm.o     : $(SRC)/rtcm.c
$(CC) -c $(CFLAGS) $(SRC)/rtcm.c
rtcm2.o    : $(SRC)/rtcm2.c
$(CC) -c $(CFLAGS) $(SRC)/rtcm2.c
rtcm3.o    : $(SRC)/rtcm3.c
$(CC) -c $(CFLAGS) $(SRC)/rtcm3.c
rtcm3e.o   : $(SRC)/rtcm3e.c
$(CC) -c $(CFLAGS) $(SRC)/rtcm3e.c
preceph.o  : $(SRC)/preceph.c
$(CC) -c $(CFLAGS) $(SRC)/preceph.c
options.o  : $(SRC)/options.c
$(CC) -c $(CFLAGS) $(SRC)/options.c
pntpos.o   : $(SRC)/pntpos.c
$(CC) -c $(CFLAGS) $(SRC)/pntpos.c
ppp.o      : $(SRC)/ppp.c
$(CC) -c $(CFLAGS) $(SRC)/ppp.c
ppp_ar.o   : $(SRC)/ppp_ar.c
$(CC) -c $(CFLAGS) $(SRC)/ppp_ar.c
novatel.o  : $(SRC)/rcv/novatel.c
$(CC) -c $(CFLAGS) $(SRC)/rcv/novatel.c
ublox.o    : $(SRC)/rcv/ublox.c
$(CC) -c $(CFLAGS) $(SRC)/rcv/ublox.c
swiftnav.o : $(SRC)/rcv/swiftnav.c
$(CC) -c $(CFLAGS) $(SRC)/rcv/swiftnav.c
crescent.o : $(SRC)/rcv/crescent.c
$(CC) -c $(CFLAGS) $(SRC)/rcv/crescent.c
skytraq.o  : $(SRC)/rcv/skytraq.c
$(CC) -c $(CFLAGS) $(SRC)/rcv/skytraq.c
gw10.o     : $(SRC)/rcv/gw10.c
$(CC) -c $(CFLAGS) $(SRC)/rcv/gw10.c
javad.o    : $(SRC)/rcv/javad.c
$(CC) -c $(CFLAGS) $(SRC)/rcv/javad.c
nvs.o      : $(SRC)/rcv/nvs.c
$(CC) -c $(CFLAGS) $(SRC)/rcv/nvs.c
binex.o    : $(SRC)/rcv/binex.c
$(CC) -c $(CFLAGS) $(SRC)/rcv/binex.c
rt17.o     : $(SRC)/rcv/rt17.c
$(CC) -c $(CFLAGS) $(SRC)/rcv/rt17.c
ephemeris.o: $(SRC)/ephemeris.c
$(CC) -c $(CFLAGS) $(SRC)/ephemeris.c
rinex.o    : $(SRC)/rinex.c
$(CC) -c $(CFLAGS) $(SRC)/rinex.c
ionex.o    : $(SRC)/ionex.c
$(CC) -c $(CFLAGS) $(SRC)/ionex.c
qzslex.o   : $(SRC)/qzslex.c
$(CC) -c $(CFLAGS) $(SRC)/qzslex.c
tides.o    : $(SRC)/tides.c
$(CC) -c $(CFLAGS) $(SRC)/tides.c
ppp_corr.o : $(SRC)/ppp_corr.c
$(CC) -c $(CFLAGS) $(SRC)/ppp_corr.c
septentrio.o: $(SRC)/rcv/septentrio.c
$(CC) -c $(CFLAGS) $(SRC)/rcv/septentrio.c
cmr.o      : $(SRC)/rcv/cmr.c
$(CC) -c $(CFLAGS) $(SRC)/rcv/cmr.c
tersus.o   : $(SRC)/rcv/tersus.c
$(CC) -c $(CFLAGS) $(SRC)/rcv/tersus.c
comnav.o   : $(SRC)/rcv/comnav.c
$(CC) -c $(CFLAGS) $(SRC)/rcv/comnav.c

rtkrcv.o   : $(SRC)/rtklib.h ../vt.h
rtkcmn.o   : $(SRC)/rtklib.h
rtksvr.o   : $(SRC)/rtklib.h
rtkpos.o   : $(SRC)/rtklib.h
geoid.o    : $(SRC)/rtklib.h
solution.o : $(SRC)/rtklib.h
lambda.o   : $(SRC)/rtklib.h
sbas.o     : $(SRC)/rtklib.h
rcvraw.o   : $(SRC)/rtklib.h
rtcm.o     : $(SRC)/rtklib.h
rtcm2.o    : $(SRC)/rtklib.h
rtcm3.o    : $(SRC)/rtklib.h
rtcm3e.o   : $(SRC)/rtklib.h
preceph.o  : $(SRC)/rtklib.h
options.o  : $(SRC)/rtklib.h
pntpos.o   : $(SRC)/rtklib.h
ppp.o      : $(SRC)/rtklib.h
novatel.o  : $(SRC)/rtklib.h
ublox.o    : $(SRC)/rtklib.h
swiftnav.o : $(SRC)/rtklib.h
crescent.o : $(SRC)/rtklib.h
skytraq.o  : $(SRC)/rtklib.h
gw10.o     : $(SRC)/rtklib.h
javad.o    : $(SRC)/rtklib.h
nvs.o      : $(SRC)/rtklib.h
binex.o    : $(SRC)/rtklib.h
rt17.o     : $(SRC)/rtklib.h
septentrio.o: $(SRC)/rtklib.h
cmr.o      : $(SRC)/rtklib.h
tersus.o   : $(SRC)/rtklib.h
comnav.o   : $(SRC)/rtklib.h
ephemeris.o: $(SRC)/rtklib.h
rinex.o    : $(SRC)/rtklib.h
ionex.o    : $(SRC)/rtklib.h
qzslex.o   : $(SRC)/rtklib.h
tides.o    : $(SRC)/rtklib.h
ppp_corr.o : $(SRC)/rtklib.h

install:
cp rtkrcv $(BINDIR)

test1:
./rtkrcv -t 4 -m 52001 -t 4

test2:
./rtkrcv -p 2105 -m 52001

test3:
./rtkrcv -o ../rtk_pb.conf

clean:
rm -f rtkrcv rtkrcv.exe rtkrcv.nav *.o *.out *.trace

Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11487
    • Profiili
    • Tomin kotisivut
Vs: Makefile Raspberry Pi 3b+
« Vastaus #1 : 01.12.19 - klo:16.05 »
Suoritithan makefilen useammalla työllä, esim:
Koodia: [Valitse]
make -j4
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

juffe

  • Käyttäjä
  • Viestejä: 47
    • Profiili
Vs: Makefile Raspberry Pi 3b+
« Vastaus #2 : 01.12.19 - klo:16.15 »
No en, mutta käänsin nyt tuolla-j4 vivulla, mutta ei ollut mitään vaikutusta asiaan.

Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11487
    • Profiili
    • Tomin kotisivut
Vs: Makefile Raspberry Pi 3b+
« Vastaus #3 : 01.12.19 - klo:16.39 »
Kokeilin kääntää tuolta reposta omalla pöytäkoneellani:
Koodia: [Valitse]
qmake-qt5
make -j16
Hyvin näytti kaikkia ytimiä käyttävän, vaikka päättyikin sitten aika vikkelästi virheeseen "No rule to make target 'rcv/ss2.c', needed by 'ss2.o'." mikä on sinänsä jännää.

Makelle on kerrottava, että se käyttää useampia töitä, jotta se hyödyntäisi useampia prosessoreja (prosessoriytimiä). Mistä olet saanut tuon Makefilen? Sitä ei ainakaan tuolla repossa näytä olevan vaan se käyttää qmaken projektitiedostoja, joista qmake generoi Makefilet.
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

juffe

  • Käyttäjä
  • Viestejä: 47
    • Profiili
Vs: Makefile Raspberry Pi 3b+
« Vastaus #4 : 01.12.19 - klo:17.11 »

nm

  • Käyttäjä
  • Viestejä: 16441
    • Profiili
Vs: Makefile Raspberry Pi 3b+
« Vastaus #5 : 01.12.19 - klo:17.32 »
Osaisiko joku hieman helpata, miten saisi optimoitua Makefilen tuota Raspberryä varten optimaaliseksi. Nyt ohjelma kuormittaa yhtä corea 100%.

Taidat tarkoittaa, että kääntämäsi rtkrcv-ohjelma kuormittaa yhtä corea 100%? Sitä ei voi ratkaista pelkkiä käännösparametreja muuttamalla, vaan ohjelma pitäisi koodata osittain uudelleen niin, että se toimisi rinnakkaisissa säikeissä. Algoritmeista ja laskentaongelmasta riippuen se ei aina ole edes mahdollista.

Pikaisesti koodia silmäilemällä ohjelma näyttää olevan pelkkä monitorointikäyttöliittymä erilliselle RTKLIB-palvelinprosessille ("rtk server"), ja varsinainen kuorma aiheutuu varmaankin kyseisestä palvelinprosessista.
« Viimeksi muokattu: 01.12.19 - klo:17.48 kirjoittanut nm »

juffe

  • Käyttäjä
  • Viestejä: 47
    • Profiili
Vs: Makefile Raspberry Pi 3b+
« Vastaus #6 : 01.12.19 - klo:17.47 »
Ok.
Onko CFLAGS ja CTARGET käytännössä mitään väliä onko niihin merkattu että tälle prossulle yms.

Kun jotenkin muistelisin kun 15v sitten gentoota stage1 asentaessa kerrottiin tarkasti prosessori yms tiedot koneesta, jotta saatiin optimoitua.

Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11487
    • Profiili
    • Tomin kotisivut
Vs: Makefile Raspberry Pi 3b+
« Vastaus #7 : 01.12.19 - klo:18.06 »
Optimoinnit eivät paranna ohjelman rinnakkaistusta juurikaan. Jos ohjelmaa ei ole tehty rinnakkaiseksi, niin ei sitä yleensä kääntäjäoptimoinneilla paranneta. Toki jos ohjelma käyttäisi vaikkapa OpenMP:ä, niin se pitäisi kääntäjän optioilla ottaa käyttöön, mutta silloin kehittäjät olisivat laittaneet sen tuonne Makefileenkin.
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

nm

  • Käyttäjä
  • Viestejä: 16441
    • Profiili
Vs: Makefile Raspberry Pi 3b+
« Vastaus #8 : 01.12.19 - klo:18.13 »
Onko CFLAGS ja CTARGET käytännössä mitään väliä onko niihin merkattu että tälle prossulle yms.

Käännösparametreilla ja optimoinneilla ei tosiaan ole tässä tapauksessa vaikutusta rinnakkaisuuteen, mutta muuten ne voivat kyllä nopeuttaa laskentaa sillä yhdellä säikeellä. 64-bittisessä järjestelmässä CFLAGSiin (tai tuossa Makefilessä CTARGETiin) voi kokeilla lisätä vaikka:

Koodia: [Valitse]
-mcpu=cortex-a53 -mfloat-abi=hard -mfpu=neon-fp-armv8 -mneon-for-64bits
Lähteitä:
https://gist.github.com/fm4dd/c663217935dc17f0fc73c9c81b0aa845
https://wiki.gentoo.org/wiki/Safe_CFLAGS#Cortex-A
« Viimeksi muokattu: 01.12.19 - klo:18.15 kirjoittanut nm »