赞
踩
翻译:原文链接
大多数开发人员学习的基本是 CPU 的知识,然而在当今世界,我们依赖于大量并行任务,CPU 在这些场景中无法正常工作。
开发人员面临的一些问题包括:
CPU 传统上是线性运行的,一次执行一条指令。当面对多个任务时,CPU 会分配其资源来一个接一个地处理每个任务,从而导致指令的顺序执行。在需要同时关注多个任务的情况下,这种方法变得效率低下。
虽然我们努力通过多线程等技术提高 CPU 性能,但 CPU 的基本设计理念优先考虑顺序执行。
AI 模型采用 Transformer 等高级架构,利用并行处理来提高性能。与按顺序运行的旧递归神经网络 (RNN) 不同,GPT 等现代转换器可以同时处理多个单词,从而提高训练效率和能力。因为当我们并行训练时,它会产生更大的模型,而更大的模型将产生更好的输出。
例如,AlexNet是一种图像识别架构,它通过同时处理图像的不同部分来展示并行处理的强大功能,从而实现准确的模式识别。
然而,以单线程性能为重点的 CPU 难以充分发挥并行处理潜力。他们面临着有效分发和执行复杂 AI 模型所需的大量并行计算的困难。
因此,GPU 的开发已经变得普遍,以满足 AI 应用中并行处理的特定需求,从而实现更高的效率和更快的计算。
与 CPU 内核相比,工程师设计的 GPU 具有更小、高度专业化的内核。这种架构允许 GPU 同时执行多个并行任务。
与 CPU 中更大、更强大的内核相比,工程师设计的 GPU 具有更小、高度专业化的内核。这种架构允许 GPU 同时执行多个并行任务。
我们很快将演示如何使用 GPU 并行性来减少复杂任务所需的时间。
AI 模型,尤其是那些基于 TensorFlow 等深度学习框架构建的模型,表现出高度的并行性。神经网络训练涉及大量矩阵运算,而 GPU 凭借其庞大的内核数量,擅长并行化这些运算。TensorFlow 以及其他流行的深度学习框架进行了优化,以利用 GPU 功能来加速模型训练和推理。
我们很快就会展示一个演示,如何使用 GPU 的强大功能来训练神经网络。
中央处理器 (CPU) 的设计侧重于顺序处理。它们擅长线性执行一组指令。
CPU 针对需要高单线程性能的任务进行了优化,例如
CPU 具有较少的内核数量,在消费级处理器中通常在 2-16 个内核范围内。每个内核都能够独立处理自己的一组指令。
图形处理单元 (GPU) 采用并行架构设计,使其在并行处理任务中非常高效。
与 CPU 不同,GPU 拥有更多的核心,通常有数千个。这些内核被组织成流式多处理器 (SM) 或类似结构。
丰富的内核使 GPU 能够同时处理大量数据,使其非常适合可并行任务,例如图像和视频处理、深度学习和科学模拟。
CUDA 是 NVIDIA 开发的并行计算平台和编程模型,使开发人员能够利用 GPU 加速器的强大功能来加速其应用程序。
下面用实际示例演示如何使用 CUDA。
要在计算机上设置 CUDA,您可以按照以下步骤操作。
-下载 CUDA
安装 CUDA 后,这里有一些有用的命令。
lspci | grep VGA
此命令的目的是识别和列出系统中的 GPU。
nvidia-smi
它代表“NVIDIA 系统管理界面”,它提供有关系统中 NVIDIA GPU 的详细信息,包括利用率、温度、内存使用情况等。
sudo lshw -C display
目的是提供有关系统中显示控制器(包括图形卡)的详细信息。
inxi -G
此命令提供有关图形子系统的信息,包括有关 GPU 和显示器的详细信息。
sudo hwinfo --gfxcard
其目的是获取有关系统中显卡的详细信息。
安装CUDA框架后,让我们开始执行展示其功能的操作。
用数组加法问题来演示GPU 并行计算
以下数组:
#include <stdio.h> int a[] = { 1,2,3,4,5,6}; int b[] = { 7,8,9,10,11,12}; int c[6]; int main() { int N = 6; // Number of elements for (int i = 0; i < N; i++) { c[i] = a[i] + b[i]; } for (int i = 0; i < N; i++) { printf("c[%d] = %d", i, c[i]); } return 0; }
前面的方法涉及逐个遍历数组元素并按顺序执行添加。然而,在处理大量数字时,由于其顺序性,这种方法变得迟钝。
为了解决这一限制,GPU 通过并行化加法过程提供了一种解决方案。与一个接一个地执行操作的 CPU 不同,GPU 可以同时执行多个加法。
例如,操作 1+7、2+8、3+9、4+10、5+11 和 6+12 可以在 GPU 的帮助下通过并行计算同时执行。
利用 CUDA,实现此并行加法的代码如下,我们将使用内核文件 (.cu) 进行演示。
让我们一一浏览代码:
__global__ void vectorAdd(int* a, int* b, int* c)
{
int i = threadIdx.x;
c[i] = a[i] + b[i];
return;
}
__global__ specifier
表示此函数是内核函数,将在 GPU 上调用。vectorAdd
将三个整数指针(a、b 和 c)作为参数,表示要添加的向量。threadIdx.x
检索当前线程的索引(在一维网格中)。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。