Chapter 6: Q5E (page 566)
Consider the following recursive mergesort algorithm (another classic divide and conquer algorithm). Mergesort was first described by John Von Neumann in 1945. The basic idea is to divide an unsorted list x of m elements into two sublists of about half the size of the original list. Repeat this operation on each sublist, and continue until we have lists of size 1 in length. Then starting with sublists of length 1, “merge” the two sublists into a single sorted list.
Mergesort(m)
var list left, right, result
if length(m) <= 1
return m
else
var middle = length(m) / 2
for each x in m up to middle
add x to left
for each x in m after middle
add x to right
left = Mergesort(left)
2
right = Mergesort(right)
result = Merge(left, right)
return result
}
The merge step is carried out by the following pesudocode:
Merge(left, right)
var list result
while length(left) > 0 and length(right) > 0
if first(left) <= first(right)
append first(left) to result
left = rest(left)
else
append first(right) to result
right = rest(right)
if length(left) > 0
append rest(left) to result
if length(right) > 0
append rest(right) to result
return result
}
6.5.1 [10] Assume that you have Y cores on a multi-core processor to run MergeSort. Assuming that Y is much smaller than length(m), express the speedup factor you might expect to obtain for values of Y and length(m). Plot these on a graph.
6.5.2 [10] Next, assume that Y is equal to length (m). How would this affect your conclusions in your previous answer? If you were asked with obtaining the best speedup factor possible (i.e., strong scaling), explain how you might change this code to obtain it.
Short Answer
- To obtain the speedup factor, 1+2+4+8+16+......+LOG2(m) processors can be used.
- If the length(m) is equal to the Y, then the speedup can be obtained without restructuring the code. To obtain the best speed-up factors for m cores, we can use other algorithms like parallel comparison sort,odd-even sort and cocktail sort.