Shared parallel implementation of Matrix-Vector product

Each block has a tempory variable which stores contributions of threads within the block.
Once each thread has updated this variable (atomicAdd), the block does an atomicAdd to the corresponding vector element.

Due to the fact that access to shared memory is quicker to access to global memory, this modification improve the runtime on GPU.