作者/来源: 发布时间:2019-06-13
很长时间以来,云计算成了一个热闹词汇。那么到底什么是云计算呢?它本质上是一种社会智力资源的共享,通过云端的技术封包,降低了难度门槛,使得更多用户可以采用各种原本“很难很先进”。如今,中国的移动互联新经济高度繁荣,这就需要有相应技术高度的云计算服务作为龙骨支撑。按照当今计算技术的趋向看——“视频音图+3D+规模机器学习+大数据分析=》高强度计算任务=》云GPU并行运算”,因而云GPU并行计算已逐渐成为技术潮流。
1.GPU云服务器发展的必要性
随着计算机技术的发展,人们对图形和图像的处理要求也越来越高,尤其现在兴起的3D技术,使图形图像处理和3D计算已经应用到了各种视频游戏,电影产业,医疗成像,空间探索,远程通信等各个方面。
现在风靡的大型3D游戏,诸如《使命召唤》《极品飞车》等,这些游戏画面逼真,3D特效强烈,所以要求计算机对图形图像的处理能力要求也非常高。 2010年放映的电影《阿凡达》开创了动画形象代替了演员的3D电影的先河,它完美的运用了3D立体画面的创造了逼真的效果使画面美轮美奂。在工业设计上,有很多广为人们熟知的3D处理软件,例如AutoCAD,Maya,SolidWorks等知名软件。在医疗成像方面,3D/4D立体成像技术,使医护人员可以获得从传统平面显示无法捕捉到的信息数据,能够360度全方位立体读取影像信息,为临床诊断提供了更丰富、精准的影像资料,大幅度降低了对病灶的漏诊,提高了诊疗质量,必将掀起医疗影像信息处理的一次技术革命。
伴随着IT互联网以及手持终端的发展和普及,要处理的数据量的爆发式增长,手机上也出现了3D游戏的发展趋势,这些都对数据图像和3D计算提出了更多的需求。
由此看来,目前对图形图像以及3D计算的巨大需求,已经要求计算机需要具备强大的3D建模能力,然而CPU的串行处理能力远不能满足高效的处理图像以及3D计算的能力,因此并行计算技术的使用日益广泛。
2.以美国NVIDIA的CUDA运算包为代表的GPU并行运算技术
GPU最大的特点是它拥有超多计算核心,往往成千上万核。而每个核心都可以模拟一个CPU的计算功能,虽然单个GPU核心的计算能力一般低于CPU。对于GPU并行计算,缓存对程序员不透明,程序员可根据实际情况操纵大部分缓存。采用 SIMT - 单指令多线程模型,一条指令配备一组硬件,对应32个线程 (一个线程束)。GPU 内部有很多流多处理器。每个流多处理器都相当于一个“核",而且一个流多处理器每次处理 32 个线程。
著名的显示卡公司NVIDIA为其主流显卡产品设计了专门的GPU并行计算工具包,称之为CUDA(Compute Unified Device Architecture,统一计算架构)。CUDA C/C++语言有如下特点:也是SPMD框架,兼有分布式存储和共享内存的优点,把握GPU的带宽是充分利用GPU计算资源的关键。
以GeForce8800GTX为例,其核心拥有128个内处理器。利用CUDA技术,就可以将那些内处理器串通起来,成为线程处理器去解决数据密集的计算。而各个内处理器能够交换、同步和共享数据。利用NVIDIA的C-编译器,通过驱动程序,就能利用这些功能。亦能成为流处理器,让应用程序利用进行运算。GeForce8800GTX显示卡的运算能力可达到520GFlops,如果建设SLI系统,就可以达到1TFlops。
有软件厂商利用CUDA技术,研发了一个AdobePremierePro的插件。通过插件,用户就可以利用显示核心去加速H.264/MPEG-4AVC的编码速度。速度是单纯利用CPU作软件加速的7倍左右。
NVIDIA从所有基于G80及之后架构的民用与专业显卡或运算模块皆支持CUDA技术。整体运算能力比单纯利用CPU的速度提高7倍甚至更高。TeslaGPU是针对工作站和服务器的加速器,与消费级显卡和专业图形卡相比,具有完整的双精度浮点运算性能,具备双DMA引擎可满足双向PCIe通信,板载内存达到12G(TeslaK40GPU),具有专门的Linux补丁、InfiniBand驱动程序以及CUDA驱动程序,针对Windows 操作系统的CUDA驱动程序可实现更高性能,TCC驱动程序可减少CUDA内核的系统总开销并支持远程桌面(WindowsRemoteDesktop) 以及Windows服务。
3.GPU计算的原理
那么,CPU与GPU如何协同工作?下图展示了CPU与GPU的并存体系模式。
在需要GPU进行运算时,以NVIDIA推出的CUDA(Compute Unified Device Architecture)为例,整体的原理如下:
整体分为4步:
从主机内存将需要处理的数据copy到GPU的内存 CPU发送数据处理执行给GPU GPU执行并行数据处理将结果从GPU内存copy到主机内存
CUDA提供了对于一般性通用需求的大规模并发编程模型,使用户可以对NVIDIA GPU方便的对于GPU进行并发性编程。如果进行编译优化会在特定操作系统里面把计算并行化分配到GPU的多个core里面,由于GPU有多个core(上千个),所以并发度大大提高,运算效率会比CPU高。下面用代码表明了如何通过GPU进行计算:
有三个数组int a[10], b[10], c[10];我们要计算a和b的向量之和存放到c中。
一般C语言:
for(int i=0; i<10; i++)
c[i] = a[i] + b[i];
CUDA编程做法:
GPU中的每个线程(核)有一个独立序号叫index,那么只要序号从0到9的线程执行c[index] = a[index] + b[index];就可以实现以上的for循环。以下为代码示例:
#include <stdio.h>
#include <cuda_runtime.h>
define N 10;/* 定义10个GPU运算线程 */
define SIZE N*sizeof(int);
/* 运行在GPU端的程序 */
__global__voidvectorADD(int* a,int* b,int* c)
{
intindex = threadIdx.x;//获得当前线程的序号
if(index < blockDim.x)
c[index] = a[index] + b[index];
}
intmain ()
{
/* 本地开辟三个数组存放我们要计算的内容 */
int* a = (int*) malloc (SIZE);
int* b = (int*) malloc (SIZE);
int* c = (int*) malloc (SIZE);
/* 初始化数组A, B和C */
for(inti=0; i<N; i++)
{
h_a[i] = i;
h_b[i] = i;
}
/* 在GPU上分配同样大小的三个数组 */
int* d_a;
int* d_b;
int* d_c;
cudaMalloc((void**)&d_a, SIZE);
cudaMalloc((void**)&d_b, SIZE);
cudaMalloc((void**)&d_c, SIZE);
/* 把本地的数组拷贝进GPU内存 */
cudaMemcpy(d_a, a, SIZE, cudaMemcpyHostToDevice);
cudaMemcpy(d_b, b, SIZE, cudaMemcpyHostToDevice);
/* 定义一个GPU运算块 由 10个运算线程组成 */
dim3 DimBlock = N;
/* 通知GPU用10个线程执行函数vectorADD */
vectorADD<<<1, DimBlock>>>(d_a, d_b, d_c);
/* 将GPU运算完的结果复制回本地 */
cudaMemcpy(c, d_c, SIZE, cudaMemcpyDeviceToHost);
/* 释放GPU的内存 */
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);
/* 验证计算结果 */
for(intj=0; j<N; j++)
printf("%d ", c[j]);
printf("/n");
}
4.GPU云服务器的使用性能
GPU云主机突破了传统GPU,能发挥极致性能,具有高并行、高吞吐、低时延等特点,在科学计算表现中,性能比传统架构提高几十倍。用户无需预先采购、准备硬件资源,可一次性购买,免除硬件更新带来的额外费用,能有效降低基础设施建设投入。目前新睿云现有GPU云服务器型号:xr.GPU.P1、xr.GPU.p2,其中xr.GPU.P1型号显卡型号为P40,xr.GPU.P2型号显卡型号为P100。欢迎用户前往新睿云官网购买使用。
本文发布的内容、图片如果涉及侵权请尽快告知,我们将会在第一时间删除。