and CUDA programming generalities
----------------------------------------------------------

In 2006, NVIDIA decided to take a new route in GPU design and launched the G80 graphics processing unit, deviating from the standard pipeline design of previous generations and transforming the GPU in an almost general purpose computing unit. Although this decision could have been driven by the gaming community asking for more frames per second, NVIDIA took advantage of his General Purpose Graphics Processing Units (GPGPU), and in 2007 they launched the CUDA SDK, a software development kit tailored to program its G80 using C language plus minor extensions. The G80 hardware and the CUDA compiler quickly proved to have an extremely good relation in terms of GFLOPS per watt and GFLOPS per dollar with respect to the CPU alternatives in the application field of numerical algorithms.

The architecture has evolved two generations, GT200 in 2008 and 2009, and the GF100 in 2010, also known as the Fermi architecture. All of them share the same Single Instruction Multiple Thread (SIMT) concurrency paradigm in order to exploit the high parallelism (up to 480 computing cores) and the high memory bandwidth (up to 177GBps). The SIMT model is a convenient abstraction that lies in the middle 