# 一、引言

CUDA 代表计算统一设备架构。它是一套用于编程 NVIDIA 显卡和计算机硬件的技术。CUDA C 是 C 或 C++ 的扩展；还有对其他语言的扩展，如 FORTRAN、Python 和 C#。CUDA 是 NVIDIA 开发的官方 GPU 架构。它是一个成熟的架构，自 2007 年以来一直在积极开发。它定期更新，有大量的文件和图书馆可供使用。

GPU 代表图形处理单元上的通用计算。通用编程是指执行计算而不是标准图形处理的任何编程任务(CUDA 在图形处理方面也很出色)。因为显卡最初是用来处理图形的，所以有很好的理由利用它们的处理能力来解决其他问题。最明显的原因是，它们是极其强大的处理单元，可以从 CPU 上卸下大量工作负载。图形处理器通常与中央处理器同时执行处理，在某些类型的计算中非常高效——比中央处理器高效得多。

近年来，并行编程变得越来越重要，并将在未来几年继续增加重要性。中央处理器的核心时钟速度不能无限提高，就目前的情况来看，我们几乎已经达到了这项技术的极限。为了将中央处理器的核心时钟速度提高到 3.5 千兆赫至 4.0 千兆赫范围之外，供电和散热的成本越来越高。提高处理器时钟速度的替代方法是在同一个系统中包含多个处理器。这种替代方案正是显卡背后的想法。它们包含数百(甚至数千)个低功耗计算内核。大多数显卡(至少是我们将要编程的那些)被称为大规模并行设备。当有数百或数千个活动线程时，它们工作得最好，而不是设计为执行大约四个或五个并发线程的中央处理器。CUDA 就是要利用成千上万个并发线程的力量，将大问题拆分开来，并彻底解决它们。它是关于有效地使用图形硬件，而不是仅仅让图形处理器闲置，而中央处理器通过它的少数线程来解决问题。

研究 CUDA 让我们对英伟达的硬件如何工作有了特别的了解。这对于使用这些设备进行图形处理的程序员来说是非常有益的。从 CUDA 的角度来看，硬件往往比程序员只使用图形处理器来生成图形的水平低得多。CUDA 让我们在现代图形 API 冗长且通常令人费解的语法之外，深入了解这些设备的结构和工作方式。

本书面向希望使用 CUDA 探索 NVIDIA 硬件的 GPU 的读者。这本书是为至少有一些 C++ 背景知识的人准备的，因为所有的代码示例都将使用这种语言。我将使用 Visual Studio Express 2012 集成开发环境(IDE)，但是示例应该很容易在 Visual Studio 的 2010 或 2013 版本中使用。[第 9 章](09.html#_Chapter_9_)重点介绍了仅适用于 Visual Studio 专业版的 Nsight，但是 Visual Studio 的 Express 版将满足所有其他章节。