Java程序辅导

C C++ Java Python Processing编程在线培训 程序编写 软件开发 视频讲解

客服在线QQ:2653320439 微信:ittutor Email:itutor@qq.com
wx: cjtutor
QQ: 2653320439
COMP35112 Laboratory Exercise 2: Mergesort 
Duration: 2 weeks 
 
 
Learning outcomes 
 
On successful completion of this exercise, a student will have: (1) written a 
multithreaded mergesort program; (2) predicted the expected behaviour of the 
program when run on different numbers of active cores; (3) run the on a multicore 
machine and measured its performance when executing on different numbers of 
active cores; and (4) reflected upon the whole exercise. 
 
Introduction 
 
Sorting is a compute-intensive activity and mergesort is a sorting algorithm that can 
be fairly easily parallelised. So, this exercise aims to implement a parallel version of 
mergesort and evaluate its performance on a multicore machine. The multicore 
machine to be used is mcore48, a Dell/AMD quad 12-core system which has a total of 
48 cores, up to 32 of which can be used to obtain speedup in execution. Details 
concerning access to and use of mcore48 appear in the labsheet for Laboratory 
Exercise 1. Please take care to follow the instructions given there when running your 
programs. All development of code should be done on a normal teaching domain 
machine, so that usage of the multicore machine is minimised. 
 
Algorithm 
 
Some pseudocode for a parallel mergesort algorithm is given below: 
 
mergesort(int[] inArray, int start, int end, int numThreads) 
{ // sorting takes place in the given inArray ... 
  // ... from start to end inclusive 
if (numThreads > 1) 
   { 
   spawn a new thread to sort the first half ... 
     mergesort(inArray, start, (start+end)/2, numThreads/2); 
   meanwhile continue sorting the other half in this thread ... 
   mergesort(inArray, (start+end)/2 + 1, end, numThreads/2); 
   join with spawned thread; 
   merge first half with second half of inArray; 
   } 
else 
   { 
   use a sequential sort method between start and end (inclusive) ... 
      to sort inArray; 
   } 
} 
 
Note that the sort should be conducted in-place, that is, the parallel half sorts should 
modify the same (shared) copy of inArray. This is possible because the two half 
sorts are completely independent of one another. The recommended sequential sort 
method is that provided by Java.utils.Arrays.  It is suggested that the numbers 
to be sorted should be alternately taken from an ascending sequence starting at 1 and a 
descending sequence starting at n/2, where n is the length of inArray Use 
System.nanoTime() to record the times (in nanoseconds) before the sorting 
commences and after it has been completed, and hence print the time needed to 
perform the computation and the resulting performance. 
 
Fully develop this application on a normal teaching domain machine before running it 
on the multicore machine. A script Demo.sct for OGE that will run the main 
method in a Java class called Demo is available on the course unit materials webpage. 
If you edit this script, do not remove the apparent comments at the start; these are 
necessary OGE commands that set the job up in the proper fashion. 
 
Correctness 
 
You should take steps to convince yourself that your program is properly doing the 
job it was supposed to. But do not include the time it takes to do this in your 
execution time measurements. 
 
Speedup 
 
Before you do any experiments, think about what you are expecting to see happen to 
performance when you change the number of threads being used to execute your 
program. In other words, explain what evidence of ‘speedup’ you are expecting to see. 
Record this information at the start of your report on this lab exercise. 
 
To demonstrate speedup without interference from other students, you will need to 
use the OGE batch system, as described in the labsheet for Laboratory Exercise 1. 
You should run with a range of numbers of threads (in this case, all powers of 2) to 
observe how the performance changes. Do not use more than 32 threads in order to 
avoid having more than one thread execute on one core.  As with all experiments of 
this kind, there will be errors in your measurements, so take each measurement 
several times and show the resulting variation in your plots (or otherwise plot 
appropriate error bars). Use gnuplot or Excel (or some other means) to plot a 
‘performance curve’ showing how performance actually changes with the number of 
active threads. Remember to use good scientific practice when plotting graphs. 
 
Please do not abuse the OGE batch queue. Run only jobs that you know will take a 
short time to complete. If you see your job executing for longer than a minute or two, 
please remove the job so that you do not hold up the other students. Do not put large 
numbers of jobs into the queue at the same time. The OGE command for removing a 
job from the queue is qdel XXX, where XXX is the unique job number for the 
submitted job. Please try to avoid removing a job just before it is about to run. 
 
Record in your report how you selected an appropriate size for the array to be sorted 
and state what that size is. Explain whether-or-not the performance curve shows 
execution behaviour as you expected. 
 
Deliverables 
 
There are three deliverables for this exercise. The first deliverable is the final version 
of the program you have written. You should deploy good software engineering 
practice during code development to ensure that the marker can readily understand 
what you were trying to achieve. The second deliverable is the performance curve 
showing how the performance of your final program varies with the number of active 
threads/cores. Ideally, this should show performance increasing proportionally as the 
number of threads/cores increases. If the performance curve shows a different trend, 
you should think of reasons why this might happen. Possible reasons include 
overheads associated with making the computation parallel and effects due to the 
parallel algorithm. The third deliverable is a brief report stating what speedup you 
were expecting to see from your program, what you did in order to find a scenario that 
shows something like the expected speedup, and what, if anything, you think may be 
causing the observed speedup to be different from what you expected.  
 
Submission 
 
Write a brief report on this exercise, stating what speedup you were expecting to see 
from your program, what you did in order to find a scenario that shows something like 
the expected speedup, and what, if anything, you think maybe causing the observed 
speedup to be different from what you expected. Submit this report together with the 
performance curve and your source code in a single PDF or ZIP file via the 
assignment window on the moodle course site. The deadline for submission is one 
week after the final scheduled lab session for this exercise. 
 
Marking Scheme 
 
This exercise is marked out of 20 marks, as follows: 
Code – 10 marks 
Report – 5 marks 
Performance curve – 5 marks