Kokeilin nyt 3.1 MHz Intelin i3-prosessorilla (4 ydintä) 8 GB muistin koneella (käyttis Kubuntu 20.10) Python-ohjelmankehitysympäristöllä pyCharm tekemään koodaamastani "pienen" python-ohjelman UML-kaavio. Kaavion teko kestää ja kestää ja levy sahaa. Mutta kuorma jakautuu hyvin eri ytimille.
Kokonaiskuorma on tuossakin silmämääräisesti katsottuna melko matala. Jokaisella ajanhetkellä vain yhden säikeen kuorma on korkeahko ja muut matalia. Kuorma näyttää siis koostuvan lyhytkestoisista säikeistämättömistä suorituksista, jotka päätyvät satunnaisesti eri ytimille. Ei siis kovin hyvä esimerkki rinnakkaisesta suorituksesta.
Tulee vielä sellainen kysymys, että miksi kone varaa vain noin 4,8 GB 8 GB muistista? Jos se varaisin esim. 7 GB, niin homma voisi nopeutua?
Kukin ohjelma varaa juuri verran muistia kuin tarvitsee. Se riippuu ohjelman toteutuksesta sekä mm. JVM:n tapauksessa myös asetuksista, joilla virtuaalikoneelle annetaan muistia. Jotkut sovellukset osaavat käyttää muistia vähemmän tai enemmän eri tilanteissa, riippuen vapaan muistin määrästä, mutta usein ylimääräisestä muistista ei olisi mitään hyötyä sovelluksen toiminnan kannalta.
Vapaaksi jäävä muisti ei kuitenkaan ole lainkaan turhaa, vaan Linux hyödyntää sitä levyvälimuistina, mikä nopeuttaa tiedostojen kirjoitamista sekä toistuvaa lukemista.
Ja kuorma jakautui aina vaihdellen yhdelle prosessorille 100 % kuormalla. Kehitysympäristö on sama, mutta kielenä Pythonin sijaan Julia (jonka pitäisi olla nopea).
Primes.totient-funktio ei ole itsessään säikeistetty, kuten ei myöskään for-silmukka. Säikeistäminen on sinun vastuullasi:
https://docs.julialang.org/en/v1/manual/multi-threading/https://docs.julialang.org/en/v1/base/multi-threading/Threads.@threads for k = 1:10000000 Primes.totient(k) end
Määritä säikeiden lukumäärä komentorivillä tai ympäristömuuttujalla, kun käynnistät skriptin:
julia --threads 4 totient.jl