Skip to content

Latest commit

 

History

History
122 lines (65 loc) · 13.8 KB

File metadata and controls

122 lines (65 loc) · 13.8 KB

十二、从这里到哪里去

这本书是一次旅行,就像一次大胆的登山……但现在,我们终于到达了旅程的终点。现在,我们站在介绍 GPU 编程的山顶上,当我们回望我们的家乡串行编程村时,我们感到自豪,当我们想到我们古老的一维编程传统的奇异诞生时,我们微笑着,在那里我们考虑了分叉Unix 中的一个进程将成为我们对并行编程概念的完整理解。在这一点上,我们冒着许多陷阱和危险,甚至可能会犯下这样的错误,比如在 Linux 中安装损坏的 NVIDIA 驱动程序模块,或者在访问父母度假时通过慢速 100k 连接下载错误的 Visual Studio 版本。但这些挫折只是暂时的,留下的伤口会发展成老茧,让我们在对抗(GPU)自然的力量时更加坚强。

但是,在我们的眼角,我们可以看到离我们站的地方几米远的两个木制标志;我们把目光从过去的小村庄移开,现在看看它们。第一个箭头指向我们当前面对的方向,上面只有一个字。另一个指向相反的方向,也只有一个单词“未来”。我们朝着未来的方向转过身,我们看到一个巨大的、闪闪发光的大都市散落在我们面前,向我们招手。现在我们终于喘过气来了,我们可以开始走向未来…

在本章中,我们将介绍您现在拥有的一些选项,以便您可以继续在 GPU 编程相关领域的教育和职业生涯。无论你是想建立一个职业生涯,还是一个业余爱好者,一个工科学生为了一门课学习 GPU,一个程序员或工程师为了提高你的技术背景,还是一个学术科学家试图将 GPU 应用到一个研究项目中,在这一点上,你现在有很多很多选择。就像我们隐喻的大都市一样,它很容易迷路,也很难决定我们应该去哪里。我们希望在最后一章中提供类似于简短导游的内容,为您提供下一步的选择。

现在,我们将在本章中查看以下路径:

  • 高级 CUDA 和 GPGPU 编程
  • 图样
  • 机器学习与计算机视觉
  • 区块链技术

进一步了解 CUDA 和 GPGPU 编程

当然,您的第一个选择是了解更多有关 CUDA 和通用 GPUGPGPU编程的知识。在本例中,您可能已经找到了一个很好的应用程序,希望编写更高级或优化的 CUDA 代码。你可能会因为它自己的原因而感兴趣,或者你想找一个 CUDA/GPU 程序员的工作。有一个强大的 GPU 编程基础(这本书提供),我们现在来看看我们准备学习的这个领域中的一些高级主题。

多 GPU 系统

想到的第一个主要主题是学习如何为安装了多个 GPU 的系统编程。许多专业工作站和服务器包含多个 GPU,安装这些 GPU 的目的是处理更多的数据,这些数据不需要一个,而是需要几个顶级 GPU。为此,存在一个称为多 GPU 编程的子字段。大部分工作都集中在负载平衡上,这是一种在峰值容量下使用每个 GPU 的艺术,确保没有一个 GPU 因为太多的工作而饱和,而另一个 GPU 没有得到充分利用。这里的另一个主题是 GPU 间通信,它通常关注一个 GPU 使用 CUDA 的 GPUDirect对等P2P内存访问直接向另一个 GPU 复制内存阵列或从另一个 GPU 复制内存阵列的问题。

NVIDIA provides a brief introduction to Multi-GPU programming here: https://www.nvidia.com/docs/IO/116711/sc11-multi-gpu.pdf.

集群计算与 MPI

另一个主题是集群计算,即编写程序,集体使用包含 GPU 的多个服务器。这些是服务器场,它们填充了 Facebook 和谷歌等知名互联网公司的数据处理设施,以及政府和军队使用的科学超级计算设施。集群通常被编程为一个编程范例,称为“ORT T2”消息传递接口 To.T3(MultT4,MPI ORD T5),这是一个与诸如 C++或 FORTRAN 语言的接口,允许您编程连接到同一网络的许多计算机。

More information about using CUDA with MPI is available here: https://devblogs.nvidia.com/introduction-cuda-aware-mpi/.

OpenCL 和 PyOpenCL

CUDA 并不是唯一可以用来编程 GPU 的语言。CUDA 最主要的竞争对手是开放计算语言(OpenCL)。CUDA 是一个封闭的专有系统,只在 NVIDIA 硬件上工作,OpenCL 是一个开放标准,由非营利组织 Khronos Group 开发和支持。OpenCL 不仅可以用于编程 NVIDIA GPU,还可以编程 AMD Radeon GPU,甚至可以编程 Intel HD GPU 大多数主要技术公司都承诺在其产品中支持 OpenCL。此外,PyCUDA 的作者、UIUC 的 Andreas Kloeckner 教授还编写了另一个优秀(免费)的 Python 库,名为 PyOpenCL,它为 OpenCL 提供了同样友好的用户界面,语法和概念与 PyCUDA 几乎相同。

Information on OpenCL is provided by NVIDIA here: https://developer.nvidia.com/opencl.

Information on the free PyOpenCL library is available from Andreas Kloeckner’s website here: https://mathema.tician.de/software/pyopencl/.

图样

显然,GPU 中的G代表图形,这在本书中我们确实没有看到太多。尽管机器学习应用程序现在是 NVIDIA 的主要业务,但它都是从绘制美观的图形开始的。我们将提供一些资源,让您从这里开始,无论您是想开发视频游戏引擎,渲染 CGI 电影,还是开发 CAD 软件。CUDA 实际上可以与图形应用程序一起使用,并实际用于专业软件,如 Adobe 的 Photoshop 和 After Effects,以及许多最近的视频游戏,如MafiaJust Cause系列。我们将简要介绍一些主要的 API,您可以从这里开始考虑。

OpenGL

开放图形语言,或 OpenGL,是一种自 90 年代初就存在的行业开放标准。虽然在某些方面它显示了它的时代,但它是一个稳定的 API,得到了广泛的支持。如果你编写一个利用它的程序,它几乎可以保证在现有的任何相对现代的 GPU 上工作。CUDA 示例文件夹实际上包含了 OpenGL 如何与 CUDA(特别是在 To.T0}子目录)接口的许多示例,因此感兴趣的读者可以考虑浏览这些示例。(Windows 中的默认位置为C:\ProgramData\NVIDIA Corporation\CUDA Samples,Linux 中的默认位置为/usr/local/cuda/samples

Information about OpenGL is available directly from NVIDIA here: https://developer.nvidia.com/opengl.

PyCUDA also provides an interface for the NVIDIA OpenGL driver. Information is available here: https://documen.tician.de/pycuda/gl.html.

DirectX 12

DirectX 12 是 Microsoft 著名且受良好支持的图形 API 的最新版本。虽然这是 Windows PC 和 Microsoft Xbox 游戏机的专有技术,但这些系统显然拥有数亿用户的广泛安装基础。此外,除了 NVIDIA 卡之外,Windows PC 上还支持多种 GPU,并且 Visual Studio IDE 提供了极大的易用性。DirectX 12 实际上支持低级 GPGPU 编程类型的概念,并且可以利用多个 GPU。

Microsoft's DirectX 12 Programming Guide is available here: https://docs.microsoft.com/en-us/windows/desktop/direct3d12/directx-12-programming-guide.

瓦肯

Vulkan 可以被认为是 DirectX 12 的开放等价物,由 Khronos 集团开发,作为 OpenGL 的下一代继承者。除了 Windows 之外,Vulkan 还支持 macOS 和 Linux,以及索尼 PlayStation 4、任天堂交换机和 Xbox One 游戏机。Vulkan 具有许多与 DirectX 12 相同的功能,例如准 GPGPU 编程。Vulkan 正在为 DirectX 12 提供一些激烈的竞争,比如 2016 年《末日》和《T3》翻拍的视频游戏。

The Beginner's Guide to Vulkan is available from the Khronos Group here: https://www.khronos.org/blog/beginners-guide-to-vulkan.

机器学习与计算机视觉

当然,本章讨论的对象是机器学习及其兄弟般的双机视觉。不言而喻,机器学习(特别是深层神经网络和卷积神经网络的子领域)是目前 NVIDIA 首席执行官黄延森的顶梁柱。(好的,我们承认这是十年来的轻描淡写…)如果你需要提醒一下 GPU 为什么在这个领域如此适用和有用,请再看一看第 9 章深度神经网络的实现。大量并行计算和数学运算,以及用户友好的数学库,使 NVIDIA GPU 成为机器学习行业的硬件骨干。

基础

虽然您现在了解了许多复杂的低级 GPU 编程,但您无法立即将这些知识应用到机器学习中。如果你不具备这个领域的基本技能,比如如何对数据集进行基本的统计分析,你真的应该停下来熟悉一下。斯坦福大学教授 Andrew Ng,谷歌大脑的创始人,提供了许多免费的材料,可以在网络上和 YouTube 上免费使用。吴教授的工作通常被认为是机器学习教材的黄金标准。

Professor Ng provides a free introductory machine learning class on the web here: http://www.ml-class.org.

cuDNN

NVIDIA 为名为 cuDNN 的深层神经网络原语提供了一个优化的 GPU 库。这些原语包括诸如前向传播、卷积、反向传播、激活函数(例如 sigmoid、ReLU 和 tanh)和梯度下降等操作。cuDNN 是 Tensorflow 等大多数主流深度神经网络框架用作 NVIDIA GPU 后端的工具。这是 NVIDIA 免费提供的,但必须从 CUDA 工具包中单独下载。

More information on cuDNN is available here: https://developer.nvidia.com/cudnn.

Tensorflow 和 Keras

Tensorflow 当然是谷歌著名的神经网络框架。这是一个免费的开源框架,它可以用 Python 和 C++使用,并且自从 2015 以来就可以向公众开放。

Tutorials on Tensorflow are available from Google here: https://www.tensorflow.org/tutorials/.

Keras 是一个更高级的库,它为 Tensorflow 提供了一个更用户友好的界面,Tensorflow 最初由 Google Brain 的 Francois Chollet 编写。读者可以考虑先从 Keras 开始,然后再转向 Tensorflow。

Information on Keras is available here: https://keras.io/.

链子

ChanER 是由 SEIYA TukUI 开发的另一种神经网络 API,他目前是日本东京大学的博士生。虽然它不如 Tensorflow 主流,但由于其难以置信的速度和效率,它受到了广泛的尊重。此外,读者可能会发现 Chainer 特别感兴趣,因为它最初是使用 PyCUDA 开发的。(后来切换到 CuPy,这是一个 PyCUDA 分支,其开发目的是提供一个更类似于 NumPy 的接口。)

Information on Chainer is available here: https://chainer.org/.

OpenCV

开源计算机视觉库(OpenCV)从 2001 年就开始出现了。该库提供了许多来自经典计算机视觉和图像处理的工具,这些工具在这个深度神经网络时代仍然非常有用。近年来,OpenCV 中的大多数算法都已移植到 CUDA 中,并且很容易与 PyCUDA 进行接口。

Information on OpenCV is here: https://opencv.org/.

区块链技术

最后,但并非最不重要的一点是区块链技术。这是为比特币和以太坊等加密货币提供动力的基础加密技术。当然,这是一个非常新的领域,比特币的神秘创造者中本聪(Satoshi Nakamoto)在 2008 年发表的白皮书中首次描述了这一领域。GPU 几乎是在其发明产生一种货币单位后立即应用于这一领域的,这种货币单位可以归结为暴力破解密码谜题,GPU 可以尝试暴力破解比今天普通公众可用的任何其他硬件更多的并行组合。这一过程被称为采矿

Those who are interested in blockchain technology are suggested to read Satoshi Nakamoto's original white paper on Bitcoin, which is available here: https://bitcoin.org/bitcoin.pdf.

GUIMiner, an open source, CUDA-based Bitcoin miner, is available here: https://guiminer.org/.

总结

在本章中,我们为那些有兴趣进一步了解 GPU 编程背景的人介绍了一些选项和途径,这超出了本书的范围。我们介绍的第一条道路是扩展您在纯 CUDA 和 GPGPU 编程方面的背景。本书中未介绍的一些内容包括使用多个 GPU 和联网集群的编程系统。我们还研究了 CUDA 之外的一些并行编程语言/API,如 MPI 和 OpenCL。接下来,我们讨论了一些对将 GPU 应用于图形渲染感兴趣的人可用的著名 API,如 Vulkan 和 DirectX 12。然后我们研究了机器学习,并介绍了一些基本的背景知识,以及开发深度神经网络的一些主要框架。最后,我们简要介绍了区块链技术和基于 GPU 的加密货币挖掘。

作为作者,我想对每一位在这里完成这本书的人说谢谢。GPU 编程是我所遇到的编程中最棘手的子领域之一,我希望我的文章能帮助您掌握其中的要点。作为读者,你现在应该可以尽情享受一片你能找到的最丰富、热量最高的巧克力蛋糕,只要知道你已经赚了就可以了。(但只有一片!)

问题

  1. 使用谷歌或其他搜索引擎查找至少一个本章未介绍的 GPU 编程应用程序。
  2. 尝试找到至少一种编程语言或 API,可用于编程本章未介绍的 GPU。
  3. 查找谷歌新的张量处理单元(TPU)芯片。这些与 GPU 有何不同?
  4. 您认为使用 Wi-Fi 或有线以太网电缆将计算机连接到集群中更好吗?