University stuff.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

rapport.txt 4.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. Kompilering: `javac *.java`
  2. Kjøring: `java Main <tall>`
  3. # Eksempelutskrift
  4. I filen output.txt finner du et eksempel på å kjøre `java Main 2000000000`.
  5. # Hvordan jeg har parallellisert
  6. ## Sil
  7. Silen har jeg parallellisert ved å først generere de sqrt(n) første
  8. primtallene sekvensielt, og så lager jeg n tråder som hver får en kopi av
  9. det arrayet som har løst de sqrt(n) første tallene. Hver tråd krysser av
  10. en del av tallene som ikke primtall. Når alle trådene er ferdige, slår jeg
  11. sammen arrayene til de forskjellige trådene ved å ORe hver byte i hvert array,
  12. slik at bare de tallene som ingen har markert som ikke primtall blir igjen.
  13. Jeg bruker OR istedenfor AND fordi jeg lar 0 bety at tallet er primtall og
  14. 1 bety at det ikke er primtall, fordi det gjør at jeg slipper å gå igjennom
  15. hele arrayet og sette hver byte til 11111111 når jeg oppretter silen,
  16. siden et array av tall i Java starter som et array av 0.
  17. ## Faktorisering
  18. Hver tråd får en del av primtallene opp til sqrt(n). Tråden går igjennom disse
  19. primtallene, og når den finner et primtall som n kan deles på, gir den det
  20. tallet til en monitor, som legger det til i en liste over faktorer og deler n
  21. på primtallet. Alle trådene må deretter oppdatere hvilket tall de jobber med
  22. og begynne på nytt. Når trådene har kommet til et tall som er større enn
  23. sqrt(n) uten å finne faktorer, stopper tråden. Når alle trådene har stoppet,
  24. vet monitoren at den er ferdig. Hvis tallet monitoren har kommet frem til så
  25. langt etter å ha latt trådene faktorisere, er større enn sqrt(n), legges dette
  26. tallet til listen faktorer, siden vi da vet at det er en faktor.
  27. Måten primtallene fordeles på, er at hver tråd tar hvert n-te primtall, hvor n
  28. er antall tråder, og hver tråd gis en unik startposisjon. Hvis det for eksempel
  29. er 2 tråder, vil tråd 1 ta primtall 1(3), 3(7), 5(13), etc, og tråd 2 vil ta
  30. primtall 2(5), 4(11), 6(17), etc. (I trådene later jeg som at alle primtall er
  31. oddetall og at 3 er det første primtallet, og lar monitoren ta seg av 2, fordi
  32. det gjør ting mye lettere.)
  33. Legg også merke til at jeg gjenbruker trådene mine, fordi det hadde tatt en del
  34. tid å lage 400 tråder, 4 for hver faktorisering.
  35. Noe jeg kunne ha gjort, som ville ha gjort koden min mye raskere,
  36. er å lage et array av primtall, istedenfor å bare gå igjennom oddetall og
  37. spørre silen om det er et primtall. Dette kom jeg på for sent til å kunne
  38. prøve det ut.
  39. # Tider
  40. CPU: quad core Intel Xeon E31225 @ 3.1 GHz (ingen hyperthreading)
  41. ## Analyse:
  42. * Erastothenes' sil sekvensielt:
  43. Tidene øker tilnærmet lineært mellom 20m, 200m, og 2 milliarder;
  44. 10x større tall betyr 10x lengre tid.
  45. Mellom 2m og 20m øker tiden av en eller annen grunn bare 4.5x, men det
  46. er nærme nok 10x at jeg ikke vet om det betyr noe.
  47. * Erastothenes' sil parallelt:
  48. Igjen øker tidene tilnærmet lineært mellom 20m, 200m, og 2 milliarder,
  49. og forskjellen på 2m og 20m er igjen bare rundt 4x.
  50. Både parallelt og sekvensielt kan det se ut som at
  51. jo større tallene er, jo nærmere kommer vi lineær økning.
  52. * Faktorisering sekvensielt:
  53. Her er økningen i tid stort sett lineær mellom alle verdier.
  54. * Faktorisering parallelt:
  55. Igjen er økningen tilnærmet lineær.
  56. 2 000 000 000:
  57. * Erastothenes' Sil sekvensielt: 9.82s
  58. * Erastothenes' Sil parallelt: 6.77s (1.45x speedup)
  59. * Faktorisering sekvensielt: 1176.19s
  60. * Faktorisering parallelt: 356.50s (3.3x speedup)
  61. 200 000 000:
  62. * Erastothenes' Sil sekvensielt: 829.98ms
  63. * Erastothenes' Sil parallelt: 618.72ms (1.34x speedup)
  64. * Faktorisering sekvensielt: 115.10s
  65. * Faktorisering parallelt: 37.20s (3.09x speedup)
  66. 20 000 000:
  67. * Erastothenes' Sil sekvensielt: 68.11ms
  68. * Erastothenes' Sil parallelt: 41.41ms (1.64x speedup)
  69. * Faktorisering sekvensielt: 13.82s
  70. * Faktorisering parallelt: 4.31s (3.21x speedup)
  71. 2 000 000:
  72. * Erastothenes' Sil sekvensielt: 15.67ms
  73. * Erastothenes' Sil parallelt: 9.58ms (1.64x speedup)
  74. * Faktorisering sekvensielt: 1.17s
  75. * Faktorisering parallelt: 534.75s (2.18x speedup)