Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

The goal of Homework 12 is to write a parallel Java program to solve Sudoku puzzles. We have provided you are providing a complete sequential solution to Homework 11 as a starting point, but you are welcome to use your solution to Homework 11 if you prefer.

If you have not submitted Homework 11 as yet, please stop reading now. It is an honor code violation to see the materials for Homework 12 before you have submitted Homework 11.

Note that method findSolution() in PartialSolution.java has the task of enumerating different solutions starting from the square located at (initialI,initialJ). It does so by examining different values for the square and recursing binding the value of this square to
each possible value and recurring on an unexplored square until no square has more than one possible value. If the set of possible values for a square becomes empty, then it will not lead the partial solution with that square is a dead end; it cannot be
extended (by binding the unexplored squares to values) to a final solution. If When all squares in a partial solution have exactly one value, then we have it is a final solution. A recommended approach to building the parallel solution is to perform this enumeration in parallel and to combine the results return from the individual tasks. In this assignment, you will build a parallel Sudoku puzzle solver
by performing the enumeration of possible values for a square (and the return of all solutions based on this choice) in parallel and combining the results of these parallel computations to return the set of all possible solutions extending the given partial soluto

Your assignment is as follows:

Part 1: Perform a sequential task decomposition so as to create on a solution to Assignment 11, creating a separate Callable task (as discussed in Lecture 31) for each enumerated possible value for the square located at (initialI,initialJ). Test your code using by running findSolution() on the given tests, and provide devised at least 5 more tests for findSolution(). Then record the execution time output for solving puzzle1 in Sudoku.java using this sequential version.

Part 2: Convert the sequential task decomposition in from Part 1) into a parallel task decomposition. Each Callable task will now be executed in a separate thread, as discussed in Lecture 34. Test your code using the tests in 1). Then record the execution time output for solving puzzle1 in Sudoku.java using this parallel version. If you run your code on a processor with more than 1 core, you should see some improvement in execution time compared to 1. It may be as small as 10% rather than a factor of 2. Discuss the possible trade-offs as to why the parallel version may not be much faster than the sequential version, or may even be slower in some cases. Make your best effort to create a parallel version with the smallest execution time for puzzle1. (Hint: you do not necessarily need to create a parallel thread at each level of the call to findSolution().)

...