Chapter 6: Q6E (page 568)
Question: Matrix multiplication plays an important role in a number of applications. Two matrices can only be multiplied if the number of columns of the first matrix is equal to the number of rows in the second. Let’s assume we have an m × n matrix A and we want to multiply it by an n × p matrix B. We can express their product as an m × p matrix denoted by AB (or A ⋅ B). If we assign C = AB, and ci,j denotes the entry in C at position (i, j), then for each element i and j with 1 ≤ i ≤ m and 1 ≤ j ≤ p. Now we want to see if we can parallelize the computation of C. Assume that matrices are laid out in memory sequentially as follows: a1,1, a2,1, a3,1, a4,1, …, etc
6.6.1 [10] Assume that we are going to compute C on both a single-core shared memory machine and a 4-core shared-memory machine. Compute the speedup we would expect to obtain on the 4-core machine, ignoring any memory issues.
6.6.2 [10] Repeat Exercise 6.6.1, assuming that updates to C incur a cache miss due to false sharing when consecutive elements are in a row (i.e., index i) are updated.
6.6.3 [10] How would you fix the false sharing issue that can occur?
Short Answer
As the matrix multiplication is carried on both single-core shared memory and 4-core shared memory. The speedup factor will be close to the 4-core shared memory.
Because of the cache miss, the speed-up factor will be reduced by three times the cost of serving a cache miss.
Traversing the matrix across columns instead of rows to compute the elements in C can help to fix the false sharing that can occur.