Ubuntu Suomen keskustelualueet
Muut alueet => Muut käyttöjärjestelmät ja Linux-jakelut => Aiheen aloitti: 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
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
# 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
-
Suoritithan makefilen useammalla työllä, esim:
make -j4
-
No en, mutta käänsin nyt tuolla-j4 vivulla, mutta ei ollut mitään vaikutusta asiaan.
-
Kokeilin kääntää tuolta reposta omalla pöytäkoneellani:
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.
-
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)
-
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.
-
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.
-
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.
-
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:
-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