Numa:
现在的机器上都是有多个CPU和多个内存块的。以前我们都是将内存块看成是一大块内存,所有CPU到这个共享内存的访问消息是一样的。这就是之前普遍使用的SMP模型。但是随着处理器的增加,共享内存可能会导致内存访问冲突越来越厉害,且如果内存访问达到瓶颈的时候,性能就不能随之增加。NUMA(Non-Uniform Memory Access)就是这样的环境下引入的一个模型。比如一台机器是有2个处理器,有4个内存块。我们将1个处理器和两个内存块合起来,称为一个NUMA node,这样这个机器就会有两个NUMA node。在物理分布上,NUMA node的处理器和内存块的物理距离更小,因此访问也更快。比如这台机器会分左右两个处理器(cpu1, cpu2),在每个处理器两边放两个内存块(memory1.1, memory1.2, memory2.1,memory2.2),这样NUMA node1的cpu1访问memory1.1和memory1.2就比访问memory2.1和memory2.2更快。所以使用NUMA的模式如果能尽量保证本node内的CPU只访问本node内的内存块,那这样的效率就是最高的。
GPU也存在于numa node中,我们现网的节点上分为两个numa node,每4个GPU分配在同一个numa node中。只有在同一个numa node下的GPU才可以使用GPU Director通信。
CUDA:
CUDA是NVIDIA公司所开发的GPU编程模型,它以c/c++为基础提供了GPU编程的简易接口,基于CUDA编程可以构建基于GPU计算的应用程序。CUDA提供了对其它编程语言的支持,如C/C++,Python,Fortran等语言。 简单地说CUDA是便于程序员利用NVidia GPU进行通用计算的开发环境及工具,目前支持C/C++语言,将来还会支持Fortran语言。
CPU主频要比GPU高2-3倍左右,但是通常情况下GPU核心的数量要比CPU多2-3个数量级以上。因此GPU的计算能力要远大于CPU,充分发挥GPU的计算能力,可以有成倍的性能提升。CUDA是针对NVidia GPU硬件设备设计的,可以直接使用C/C++语言来开发GPU程序,省去了程序员重新学一种新语言的麻烦。
cuDNN:
cuDNN(CUDA Deep Neural Network library):是NVIDIA打造的针对深度神经网络的加速库,是一个用于深层神经网络的GPU加速库。如果你要用GPU训练模型,cuDNN不是必须的,但是一般会采用这个加速库。
单机GPU通信:
NVIDIA推出的GPUDirect就是一组提升GPU通信性能的技术。但GPUDirect受限于PCI Expresss总线协议以及拓扑结构的一些限制,无法做到更高的带宽,为了解决这个问题,NVIDIA提出了NVLink总线协议。
1. GPU Director:
2. NvLink:
跨机器通信:
1. RDMA:
2. IB:
3. GPUDirector RDMA:
4. IPOIB: