erasthostenes-parallel.scala 1.4 KB

1234567891011121314151617181920212223242526272829303132333435
  1. import scala.actors.Futures._
  2. /** @author Axel Busch */
  3. object EratosthenesFutures {
  4. def parallel(end : Int, threads: Int) : Array[Boolean] = {
  5. val sieve = Array.fill[Boolean](end+1)(true)
  6. for (i <- 2 to scala.math.sqrt(end).toInt) {
  7. if (sieve(i)) {
  8. val nextComposite = i*i
  9. val compositesPerThread = (end-nextComposite+1)/(threads*i)
  10. val tasks = for (t <- 0 until threads) yield future {
  11. val begin = nextComposite + t * i *
  12. compositesPerThread
  13. val finish = if (t+1 == threads) end
  14. else nextComposite + (t+1) * i *
  15. compositesPerThread
  16. assert (begin % i == 0)
  17. for (composite <- begin to finish by i) {
  18. sieve(composite) = false
  19. }
  20. }
  21. awaitAll(20000L, tasks: _*);
  22. }
  23. }
  24. sieve
  25. }
  26. def main(args: Array[String]) = {
  27. val end = 100000000
  28. for (threads <- List(1,2,4,8)) {
  29. val startTime = System.currentTimeMillis();
  30. parallel(end,threads);
  31. val endTime = System.currentTimeMillis();
  32. println(threads + " thread: " + (endTime - startTime) + " ms");
  33. }
  34. }
  35. }