Workshop 1

Initial Profile

In this workshop, you are to analyze a serial application.

Learning Outcomes

Upon successful completion of this workshop, you will have demonstrated the abilities to

• profile a serial application
• present the results of your analysis in an interesting graphical way
• itemize and explain what you have learned in completing this workshop

Specifications

Consider the following application that adds and multiplies matrices.  The user defines the size of the matrices (n) on the command line:

 ``` // Profile a Serial Application - Workshop 1 // w1.cpp #include #include #include #include void init(float** a, int n) { float f = 1.0f / RAND_MAX; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) a[i][j] = std::rand() * f; } void add(float** a, float** b, float** c, int n) { for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) c[i][j] = a[i][j] + 3.0f * b[i][j]; } void multiply(float** a, float** b, float** c, int n) { for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { float sum = 0.0f; for (int k = 0; k < n; k++) sum += a[i][k] * b[k][j]; c[i][j] = sum; } } int main(int argc, char* argv[]) { // interpret command-line argument if (argc != 2) { std::cerr << argv << ": invalid number of arguments\n";  std::cerr << "Usage: " << argv << " size_of_matrices\n";  return 1; } int n = std::atoi(argv); // size of matrices float** a = new float*[n]; for (int i = 0; i < n; i++) a[i] = new float[n]; float** b = new float*[n]; for (int i = 0; i < n; i++) b[i] = new float[n]; float** c = new float*[n]; for (int i = 0; i < n; i++) c[i] = new float[n]; std::srand(std::time(nullptr)); init(a, n); init(b, n); add(a, b, c, n); multiply(a, b, c, n); for (int i = 0; i < n; i++) delete [] a[i]; delete [] a; for (int i = 0; i < n; i++) delete [] b[i]; delete [] b; for (int i = 0; i < n; i++) delete [] c[i]; delete [] c; }```

Profiles

g++ Version 8.2.0

Version 8.2.0 of the GNU g++ compiler is available in matrix's local system directory.  Compile your source code using the following Makefile, which accesses this version of the compiler.

 ```# Makefile for w1 # GCC_VERSION = 8.2.0 PREFIX = /usr/local/gcc/\${GCC_VERSION}/bin/ CC = \${PREFIX}gcc CPP = \${PREFIX}g++ w1: w1.o \$(CPP) -pg -ow1 w1.o w1.o: w1.cpp \$(CPP) -c -O2 -g -pg -std=c++17 w1.cpp  clean: rm *.o ```

-O2 directs the compiler (g++) to optimize the code to level 2.
-pg directs the compiler/linker to write the extra code needed for profiling to gmon.out
-g directs the compiler to produce debugging information for use with gdb
-o directs the linker to name the executable with the string immediately following -o
-std invokes the C++17 version of the compiler, which accepts the nullptr keyword.
The highlighted statements are the rules applied by the Makefile.

A single tab (not blank spaces) identifies a Makefile rule.  Make sure that after copying this file, a single tab and not a blank spaces precedes each rule.

To execute this Makefile, enter the command

 ` > make`

Test Runs

Run and profile w1 for 100 by 100 matrices using the following commands

 ``` > time w1 100 > gprof -p -b w1 > w1.100.flt```

The -p option directs the profiler (gprof) to produce a flat profile.  The -b option directs the profiler to omit detailed explanations of the column headings from the output.

Repeat these steps for the matrix sizes listed below.  The larger sizes take a bit of time, so be patient.  Record the elapsed time for each case.

 n add() multiply() Elapsed Time multiply()/total 500 1000 1500 2000

Prepare a 3D look realistic column chart showing the process times for add() and multiply() and the elapsed time with n along the horizontal axis as shown below. You can create the chart in Open Office using the following steps:

• Highlight data and labels, excluding multiply()/total column
• Select Chart in the Toolbar
• Chart Type - check 3D Look Realistic Column
• Data Range - 1st row as label, 1st column as label
• Chart Elements - add title, subtitle, axes labels

You can create the chart in Excel using the following steps:

• Select Insert Tab -> Charts -> Column -> 3D Clustered Column
• Switch Row and Column
• Select Data -> Filter Symbol -> uncheck n -> Apply
• Select Data -> Select edit on horizontal axis labels -> enter 500,1000,1500,2000 -> OK
• Select Data -> Plus Symbol -> Check Axis Titles
• Select Data -> Plus Symbol -> Chart Title - enter title and subtitle

SUBMISSION

Upload your submission files as separate files.  DO NOT ZIP your files for the submission.  If you submit a zipped file, you will be asked to resubmit your files separately and your submission will attract a 20% penalty.

• Select Workshop 1 under Assignments
• Compare the values for the add() and multiply() functions from your table
• include a conclusion about the trends as the problem size grows
• identify the Big-O class of the add() and multiply() algorithms
• describe in your own words what you have learned in completing this workshop.
• When ready to submit, press "Submit"

 Designed by Chris Szalwinski Copying From This Site  