Cleanup the reduction operations
Clear the memory we will be filling with the calcs

This isn't as important here since we are just replacing the memory,
however if we were to do anything with it before that it could fail due
to the memory already being filled with some values
The matrix size is 16x16
Clear the product memory. _VERY IMPORTANT_

Since we will be adding to the product that is in global memory during
the reduction phase of the process we MUST zero out this memory before
starting. If we don't it's possible that the allocated memory may
contain some value, giving us unspecified behavior.
Load in our shared matrixes with tile offsets

Note that we use the second dimension of the grid to identify which
calculation in the tiles we are making. There are 8 total matrix
multiplications that must be done, so the y axis of the block grid will
represent which of these needs completed
Adding to the product _MUST BE ATOMIC_

Since we are adding to the product in _global memory_ it's very
important that the add operating happens atomically. If we disregard
this and attempt to do a normal `+=` operation then the behavior will be
undefined due to a race condition on accessing the memory and then
setting it.

Luckily CUDA offers a very nice attomicAdd function that we can call
passing a memory location and the value to add to that memory.
Document challenges