Unit 0.4.4 How we use makefiles¶
When one wants to execute an implementation of matrix-matrix multiplication in, for example, file
Gemm_IJP.c that will be discussed in Unit 1.1.1, a number of steps need to come together.
We have already discussed the driver routine in
Assignments/Week1/C/driver.c. It is compiled into an object file (an intermediate step towards creating an executable file) with
gcc <options> -c -o driver.o driver.cwhere
<options>indicates a bunch of options passed to the
The implementation of matrix-matrix multiplication is in file
Gemm_IJP.cwhich is compiled into an object file with
gcc <options> -c -o Gemm_IJP.o Gemm_IJP.c
A routine for timing the executions (borrowed from the
libflamelibrary is in file
FLA_Clock.cand is compiled into an object file with
gcc <options> -c -o FLA_Clock.o FLA_Clock.c
A routine that compares two matices so that correctness can be checked is in file
MaxAbsDiff.cand is compiled into an object file with
gcc <options> -c -o MaxAbsDiff.o MaxAbsDiff.c
A routine that creates a random matrix is in file
RandomMatrix.cand is compiled into an object file with
gcc <options> -c -o RandomMatrix.o RandomMatrix.c
Once these object files have been created, they are linked with
gcc driver.o Gemm_IJP.o FLA_Clock.o MaxAbsDiff.o RandomMatrix.o -o driver_IJP.x <libraries>where
<libraries>is a list of libraries to be linked.
Together, these then create the executable
driver_IJP.x that can be executed with
./driver_IJP.xThis should be interpreted as "executed the file
driver.xin the current directory." The driver is set up to take input:
% number of repeats:3 % 3 % enter first, last, inc:100 500 100 % 100 500 100where "3" and "100 500 100" are inputs.
Many decades ago, someone came up with the idea of creating a file in which the rules of how to, in this situation, create an executable from parts could be spelled out. Usually, these rules are entered in a Makefile. Below is a video that gives a quick peek into the Makefile for the exercises in Week 1. The bottom line is: by using that Makefile, to make the executable for the implementation of matrix-matrix multiplication in the file
Gemm_IJP.c all one has to do is type
make IJPBetter yet, this also then "pipes" input to be used by the driver, and redirects the output into a file for later use when we plot the results.
You can read up on Makefiles on, where else, Wikipedia:
Many of us have been productive software developers without ever reading a manual on how to create a Makefile. Instead, we just copy one that works, and modify it for our purposes. So, don't be too intimidated!