Ubuntu Suomen keskustelualueet

Muut alueet => Muut käyttöjärjestelmät ja Linux-jakelut => Aiheen aloitti: juffe - 01.12.19 - klo:15.49

Otsikko: Makefile Raspberry Pi 3b+
Kirjoitti: juffe - 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 (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
Otsikko: Vs: Makefile Raspberry Pi 3b+
Kirjoitti: Tomin - 01.12.19 - klo:16.05
Suoritithan makefilen useammalla työllä, esim:
Koodia: [Valitse]
make -j4
Otsikko: Vs: Makefile Raspberry Pi 3b+
Kirjoitti: juffe - 01.12.19 - klo:16.15
No en, mutta käänsin nyt tuolla-j4 vivulla, mutta ei ollut mitään vaikutusta asiaan.
Otsikko: Vs: Makefile Raspberry Pi 3b+
Kirjoitti: Tomin - 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.
Otsikko: Vs: Makefile Raspberry Pi 3b+
Kirjoitti: juffe - 01.12.19 - klo:17.11
Käytän vaan siis tuota rtkrcv ohjelmaa joka löytyy  osoitteesta https://github.com/rtklibexplorer/RTKLIB/blob/demo5/app/rtkrcv/ (https://github.com/rtklibexplorer/RTKLIB/blob/demo5/app/rtkrcv/)
Makefile on https://github.com/rtklibexplorer/RTKLIB/blob/demo5/app/rtkrcv/gcc/makefile (https://github.com/rtklibexplorer/RTKLIB/blob/demo5/app/rtkrcv/gcc/makefile)
Otsikko: Vs: Makefile Raspberry Pi 3b+
Kirjoitti: nm - 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.
Otsikko: Vs: Makefile Raspberry Pi 3b+
Kirjoitti: juffe - 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.
Otsikko: Vs: Makefile Raspberry Pi 3b+
Kirjoitti: Tomin - 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.
Otsikko: Vs: Makefile Raspberry Pi 3b+
Kirjoitti: nm - 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