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 3.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. (Monitoren tar seg av de første 4
  31. primtallene, fordi det tar så kort tid å finne dem at det ikke gir mening
  32. å ha tråder som leter etter dem)
  33. # Tider
  34. CPU: quad core Intel Xeon E31225 @ 3.1 GHz (ingen hyperthreading)
  35. 2 000 000 000:
  36. * Erastothenes' Sil sekvensielt: 9.82s
  37. * Erastothenes' Sil parallelt: 6.77s (1.45x speedup)
  38. * Faktorisering sekvensielt: 19.46s (294.60ms per)
  39. * Faktorisering parallelt: 11.66s (1.67x speedup) (116.55ms per)
  40. 200 000 000:
  41. * Erastothenes' Sil sekvensielt: 829.98ms
  42. * Erastothenes' Sil parallelt: 618.72ms (1.34x speedup)
  43. * Faktorisering sekvensielt: 4.82s (48.25 per)
  44. * Faktorisering parallelt: 1.46s (3.30x speedup) (14.64ms per)
  45. 20 000 000:
  46. * Erastothenes' Sil sekvensielt: 68.11ms
  47. * Erastothenes' Sil parallelt: 41.41ms (1.64x speedup)
  48. * Faktorisering sekvensielt: 508.17ms (5.08ms per)
  49. * Faktorisering parallelt: 213.90ms (2.38x speedup) (2.14ms per)
  50. 2 000 000:
  51. * Erastothenes' Sil sekvensielt: 15.67ms
  52. * Erastothenes' Sil parallelt: 9.58ms (1.64x speedup)
  53. * Faktorisering sekvensielt: 93.61ms (936.07μs per)
  54. * Faktorisering parallelt: 73.76ms (1.27x speedup) (737.58μs per)
  55. ## Analyse:
  56. * Erastothenes' sil sekvensielt:
  57. Tidene øker tilnærmet lineært mellom 20m, 200m, og 2 milliarder;
  58. 10x større tall betyr 10x lengre tid.
  59. Mellom 2m og 20m øker tiden av en eller annen grunn bare 4.5x, men det
  60. er nærme nok 10x at jeg ikke vet om det betyr noe.
  61. * Erastothenes' sil parallelt:
  62. Igjen øker tidene tilnærmet lineært mellom 20m, 200m, og 2 milliarder,
  63. og forskjellen på 2m og 20m er igjen bare rundt 4x.
  64. Både parallelt og sekvensielt kan det se ut som at
  65. jo større tallene er, jo nærmere kommer vi lineær økning.
  66. * Faktorisering sekvensielt:
  67. Økningen her ligner mer på eksponensiell økning.
  68. * Faktorisering parallelt:
  69. Igjen ser økningen eksponensiell ut.