CUDA可以支持在主机端开python支持多线程吗吗

cuda线程网格_ASP.NET技巧_动态网站制作指南
cuda线程网格
来源:人气:126
本文,在此对作者表示感谢!
我们将具体点的,在主机函数中如果我们分配的是这样的一个东西:
dim3&blocks(32,32);
dim3&threads(16,16);
dim3是神马?dim3是一个内置的结构体,和下定义的线程结构体是个类似的意义的东西,dim3结构变量有x,y,z,表示3维的维度。不理解没关系,慢慢看。
kernelfun&&&&();
我们调用kernelfun这个内核函数,将blocks和threads传到&&&,&&&里去,这句话可牛逼大了——相当于发号施令,命令那些线程去干活。这里使用了32*32&*&16*16个线程来干活。你看明白了吗?blocks表示用了二维的32*32个block组,而每个block中又用了16*16的二维的thread组。好吧,我们这个施令动用了262144个线程!我们先不管GPU内部是如何调度这些线程的,反正我们这一句话就是用了这么多线程。
那我们的内核函数kernelfun()如何知道自己执行的是哪个线程?这就是线程网络的特点啦,为什么叫网络,是有讲究的,网络就可以定格到网点:
比如int&tid&=&threadId.x&+&blockId.x&*&16
这里有一个讲究,block是有维度的,一维、二维、三维。
对于一维的block,tid&=&threadId.x
对于(Dx,Dy)二维的block,tid&=&threadId.x&+&Dx*threadId.y
对于(Dx,Dy,Dz)三维的block,tid&=&threadId.x&+&Dx*threadId.y&+&Dz*Dy*threadId.z
我习惯的用这样的模式去分配,比较通用:
dim3&dimGrid();
dim3&dimBlock();
kerneladd&&&&();
这可是万金油啊,你需要做的事情是填充dimGrid和dimBlock的结构体构造函数变量,比如,dimGrid(16,&16)表示用了16*16的二维的block线程块。
(0,0)(0,1)(0,2)……(0,15)
(1,0)(1,1)(1,2)……(1,15)
(2,0)(2,1)(2,2)……(2,15)
(15,0)(15,1)(15,2)……(15,15)
(,)是(dimGrid.x,&dimGrid.y)的网格编号。
我们这么理解吧,现在又一群人,我们分成16*16个小组(block),排列好,比如第3行第4列就指的是(2,3)这个小组。
而dimBlock(16,16)表示每个小组有16*16个成员,如果你想点名第3行第4列这个小组的里面的第3行第4列那个同学,那么,你就是在(2,3)这个block中选择了(2,3)这个线程。这样应该有那么一点可以理解进去的意思了吧?不理解透彻么什么关系,这个东西本来就是cuda中最让我纠结的事情。我们且不管如何分配线程,能达到最优化,我们的目标是先让GPU正确地跑起来,计算出结果即可,管他高效不高效,管他环保不环保。
唠叨了这么多,下面我们用一个最能说明问题的例子来进一步理解线程网络分配机制来了解线程网络的使用。
一维网络线程
eg:int&arr[1000],对每个数组元素进行加1操作。
idea:我们最直接的想法,是调度1000个线程去干这件事情。
first&o:我想用一个小组的1000个人员去干活。这里会存在这样一个问题——一个小组是不是有这么多人员呢?是的,这个事情你必须了解,连自己组内多少人都不知道,你也不配作指挥官呀。对的,这个参数叫做maxThreadsPerBlock,如何取得呢?
好吧,cuda定义了一个结构体cudaDeviceProp,里面存入了一系列的结构体变量作为GPU的参数,出了maxThreadsPerBlock,还有很多信息哦,我们用到了再说。
maxThreadsPerBlock这个参数值是随着GPU级别有递增的,早起的显卡可能512个线程,我的GT520可以跑1024个线程,办公室的GTX650ti2G可以跑1536个,无可非议,当然多多益善。一开始,我在想,是不是程序将每个block开的线程开满是最好的呢?这个问题留在以后在说,一口吃不成胖子啦。
好吧,我们的数组元素1000个,是可以在一个block中干完的。
内核函数:
#define&N&1000
__gloabl__&void&kerneladd(int&*dev_arr)
int&tid&=&threadId.x;
if&(tid&&&1000)
dev_arr[tid]&++;
int&main()
int&*arr,&*dev_//&习惯的我喜欢在内核函数参数变量前加个dev_作为标示
//&开辟主机内存,arr&=&(int*)malloc(N*sizeof(int));
//&开辟设备内存
//&主机拷贝到设备
kerneladd&&&1,&N&&&(dev_arr);
//&设备拷贝到主机
//&释放设备内存
//&释放主机内存
呀,原来这么简单,个么CUDA也忒简单了哇!这中想法是好的,给自己提高信心,但是这种想法多了是不好的,因为后面的问题多了去了。
盆友说,1000个元素,还不如CPU来的快,对的,很多情况下,数据量并行度不是特别大的情况下,可能CPU来的更快一些,比较设备与主机之间互相调度操作,是会有额外开销的。有人就问了,一个10000个元素的数组是不是上面提供的idea就解决不了啦?对,一个block人都没怎么多,如何完成!这个情况下有两条路可以选择——
第一,我就用一个组的1000人来干活话,每个人让他干10个元素好了。
这个解决方案,我们需要修改的是内核函数:
__global__&void&kernelarr(int&*dev_arr)
int&tid&=&threadId.x;
if(tid&&&1000)&//&只用0~999号线程
{ //每个线程处理10个元素,比如0号线程处理0、、……9001
for(int&i&=&&i
dev_arr[tid]&++;
第二,我多用几个组来干这件事情,比如我用10个组,每个组用1000人。
这个解决方案就稍微复杂了一点,注意只是一点点哦~因为,组内部怎么干活和最原始的做法是一样的,不同之处是,我们调遣了10个组去干这件事情。
首先我们来修改我们的主机函数:
int&main()
kerneladd&&&10,&1000&&&(dev_arr);//我们调遣了10个组,每个组用了1000人
盆友要问了,10个组每个组1000人,你怎么点兵呢?很简单啊,第1组第3个线程出列,第9组第9个线程出列。每个人用组号和组内的编号定了位置。在线程网络中,blockId.x和threadId.x就是对应的组号和组内编号啦,我必须要这里开始形象点表示这个对应关系,如果这个对应关系是这样子的[blockId.x,threadId.x],那么我们的数组arr[10000]可以这样分配给这10个组去干活:
(0,0)——arr[0],(0,1)——arr[1],……(0,999)——arr[999]
(1,0)——arr[0+1*1000],(1,1)——arr[1+1*1000],……(1,999)——arr[999+1*1000]
(9,0)——arr[0+9*1000],(9,1)——arr[1+9*1000],……(9,999)——arr[999+9*1000]
是不是很有规律呢?对的,用blockId.x和threadId.x可以很好的知道哪个线程干哪个元素,这个元素的下表就是threadId.x&+&1000*blockId.x。
这里我想说的是,如果我们哪天糊涂了,画一画这个对应关系的表,也许,就更加清楚的知道我们分配的线程对应的处理那些东西啦。&
一维线程网络,就先学这么多了。
二维网络线程
eg2:int&arr[32][16]二维的数组自增1。
第一个念头,开个32*16个线程好了哇,万事大吉!好吧。但是,朕现在想用二维线程网络来解决,因为朕觉得一个二维的网络去映射一个二维的数组,朕看的更加明了,看不清楚自己的士兵,如何带兵打仗!
我还是画个映射关系:
一个block中,现在是一个二维的thread网络,如果我用了16*16个线程。
(0,0),(0,1),……(0,15)
(1,0),(1,1),……(1,15)
(15,0),(15,1),……(15,15)
呀,现在一个组内的人称呼变了嘛,一维网络中,你走到一个小组里,叫3号出列,就出来一个,你现在只是叫3号,没人会出来!这个场景是这样的,现在你班上有两个人同名的人,你只叫名,他们不知道叫谁,你必须叫完整点,把他们的姓也叫出来。所以,二维网络中的(0,3)就是原来一维网络中的3,二维中的(i,j)就是一维中的(j+i*16)。不管怎么样,一个block里面能处理的线程数量总和还是不变的。
一个grid中,block也可以是二维的,一个block中已经用了16*16的thread了,那我们一共就32*16个元素,我们用2个block就行了。
先给出一个代码清单吧,程序员都喜欢看代码,这段代码是我抄袭的。第一次这么完整的放上代码,因为我觉得这个代码可以让我说明我想说的几个问题:
第一,二维数组和二维指针的联系。
第二,二维线程网络。
第三,cuda的一些内存操作,和返回值的判断。
&#include&&
&#include&&
&#include&&&b style=&background-color: rgb(255, 255, 102);&&cuda_runtime.h&&
&#define&ROWS&32&
&#define&COLS&16&
&#define&CHECK(res)&if(res!=cudaSuccess){exit(-1);}&
&__global__&void&Kerneltest(int&**da,&unsigned&int&rows,&unsigned&int&cols)&
&unsigned&int&row&=&blockDim.y*blockIdx.y&+&threadIdx.y;&
&unsigned&int&col&=&blockDim.x*blockIdx.x&+&threadIdx.x;&
&if&(row&&&rows&&&&col&&&cols)&
&da[row][col]&=&row*cols&+&&
&int&main(int&argc,&char&**argv)&
&int&**da&=&NULL;&
&int&**ha&=&NULL;&
&int&*dc&=&NULL;&
&int&*hc&=&NULL;&
&cudaError_t&&
&int&r,&c;&
&bool&is_right=&
&res&=&cudaMalloc((void**)(&da),&ROWS*sizeof(int*));CHECK(res)&
&res&=&cudaMalloc((void**)(&dc),&ROWS*COLS*sizeof(int));CHECK(res)&
&ha&=&(int**)malloc(ROWS*sizeof(int*));&
&hc&=&(int*)malloc(ROWS*COLS*sizeof(int));&
&for&(r&=&0;&r&&&ROWS;&r++)&
&ha[r]&=&dc&+&r*COLS;&
&res&=&cudaMemcpy((void*)(da),&(void*)(ha),&ROWS*sizeof(int*),&cudaMemcpyHostToDevice);CHECK(res)&
&dim3&dimBlock(16,16);&
&dim3&dimGrid((COLS+dimBlock.x-1)/(dimBlock.x),&(ROWS+dimBlock.y-1)/(dimBlock.y));&
&Kerneltest&&&&(da,&ROWS,&COLS);&
&res&=&cudaMemcpy((void*)(hc),&(void*)(dc),&ROWS*COLS*sizeof(int),&cudaMemcpyDeviceToHost);CHECK(res)&
&for&(r&=&0;&r&&&ROWS;&r++)&
&for&(c&=&0;&c&&&COLS;&c++)&
&printf(&M&&,&hc[r*COLS+c]);&
&if&(hc[r*COLS+c]&!=&(r*COLS+c))&
&is_right&=&&
&printf(&\n&);&
&printf(&the&result&is&%s!\n&,&is_right?&&right&:&false&);&
&cudaFree((void*)da);&
&cudaFree((void*)dc);&
&free(ha);&
&free(hc);&
&getchar();&
&return&0;&
简要的来学习一下二维网络这个知识点,
dim3&dimBlock(16,16);&
//定义block内的thread二维网络为16*16
dim3&dimGrid((COLS+dimBlock.x-1)/(dimBlock.x),&(ROWS+dimBlock.y-1)/(dimBlock.y));&
//定义grid内的block二维网络为1*2
unsigned&int&row&=&blockDim.y*blockIdx.y&+&threadIdx.y;&
//二维数组中的行号
unsigned&int&col&=&blockDim.x*blockIdx.x&+&threadIdx.x;&
//二维线程中的列号
三维网络线程
dim3定义了三维的结构,但是,貌似二维之内就能处理很多事情啦,所以,我放弃学习三维。网上看到的不支持三维网络是什么意思呢?先放一放。
给自己充充电
同一块显卡,不管你是二维和三维或一维,其计算能力是固定的。比如一个block能处理1024个线程,那么,一维和二维线程网络是不是处理的线程数一样呢?
回答此问题,先给出网络配置的参数形式——&&&&,各个参数含义如下:
Dg:定义整个grid的维度,类型Dim3,但是实际上目前显卡支持两个维度,所以,dim3&&Dg.x,&Dg.y,&1&&&第z维度默认只能为1,上面显示出这个最大有*1,每行有65536个block,每列有65536个block,整个grid中一共有*1个block。
Db:定义了每个block的维度,类型Dim3,比如512*512*64,这个可以定义3维尺寸,但是,这个地方是有讲究了,三个维度的积是有上限的,对于计算能力1.0、1.1的GPU,这个值不能大于768,对于1.2、1.3的不能大于1024,对于我们试一试的这块级别高点的,不能大于1536。这个值可以获取哦——maxThreadsPerBlock
Ns:这个是可选参数,设定最多能动态分配的共享内存大小,比如16k,单不需要是,这个值可以省略或写0。
S:也是可选参数,表示流号,默认为0。流这个概念我们这里不说。
接着,我想解决几个你肯定想问的两个问题,因为我看很多人想我这样的问这个问题:
1&block内的thread我们是都饱和使用吗?
答:不要,一般来说,我们开128或256个线程,二维的话就是16*16。
2&grid内一般用几个block呢?
答:牛人告诉我,一般来说是你的流处理器的4倍以上,这样效率最高。
回答这两个问题的解释,我想抄袭牛人的一段解释,解释的好的东西就要推广呀:
GPU的计算核心是以一定数量的Streaming&Processor(SP)组成的处理器阵列,NV称之为Texture&Processing&Clusters(TPC),每个TPC中又包含一定数量的Streaming&Multi-Processor(SM),每个SM包含8个SP。SP的主要结构为一个ALU(逻辑运算单元),一个FPU(浮点运算单元)以及一个Register&File(寄存器堆)。SM内包含有一个Instruction&Unit、一个Constant&Memory、一个Texture&Memory,8192个Register、一个16KB的Share&Memory、8个Stream&Processor(SP)和两个Special&Function&Units(SFU)。(GeForce9300M&GS只拥有1个SM)&Thread是CUDA模型中最基本的运行单元,执行最基本的程序指令。Block是一组协作Thread,Block内部允许共享存储,每个Block最多包含512个Thread。Grid是一组Block,共享全局内存。Kernel是在GPU上执行的核心程序,每一个Grid对应一个Kernel任务。&在程序运行的时候,实际上每32个Thread组成一个Warp,每个&warp&块都包含连续的线程,递增线程&ID&。Warp是MP的基本调度单位,每次运行的时候,由于MP数量不同,所以一个Block内的所有Thread不一定全部同时运行,但是每个Warp内的所有Thread一定同时运行。因此,我们在定义Block&Size的时候应使其为Warp&Size的整数倍,也就是Block&Size应为32的整数倍。理论上Thread越多,就越能弥补单个Thread读取数据的latency&,但是当Thread越多,每个Thread可用的寄存器也就越少,严重的时候甚至能造成Kernel无法启动。因此每个Block最少应包含64个Thread,一般选择128或者256,具体视MP数目而定。一个MP最多可以同时运行768个Thread,但每个MP最多包含8个Block,因此要保持100%利用率,Block数目与其Size有如下几种设定方式:&?&2&blocks&x&384&threads
?&3&blocks&x&256&threads ?&4&blocks&x&192&threads ?&6&blocks&x&128&threads ?&8&blocks&x&96&threads&
优质网站模板帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
贴数:1&分页:God bless my father!发信人: machy21 (原来老天爷喜欢用热得快), 信区: Graphics
标&&题: [合集] cuda每个block不同的线程数,程序速度差距有这么大吗?
发信站: 水木社区 (Fri Jul&&4 22:24:41 2008), 站内 && ☆─────────────────────────────────────☆ &&
zrmwyh (zrmwyh) 于
(Wed May 21 17:05:49 2008)
提到: && 当每个block里的线程数16,32,128,256时,程序执行时间都是190ms左右,
当我设为512时,速度一下子提高到1.116343 (ms)。 && 有大牛能讲讲,这会是什么原因导致的吗?一下子提到了190倍呀,不敢相信 && 我的机器是NVS140m &&&& ☆─────────────────────────────────────☆ &&
Truel (七星龙渊) 于
(Wed May 21 17:52:36 2008)
提到: && 猜测是线程过多时,资源竞争占用了主要的时间
【 在 zrmwyh (zrmwyh) 的大作中提到: 】
: 当每个block里的线程数16,32,128,256时,程序执行时间都是190ms左右,
: 当我设为512时,速度一下子提高到1.116343 (ms)。
: 有大牛能讲讲,这会是什么原因导致的吗?一下子提到了190倍呀,不敢相信
: ...................
&&&&&& ☆─────────────────────────────────────☆ &&
zrmwyh (zrmwyh) 于
(Wed May 21 19:11:13 2008)
提到: && 问题是block内线程为512时,速度最快呀
【 在 Truel (七星龙渊) 的大作中提到: 】
: 猜测是线程过多时,资源竞争占用了主要的时间
&&&&&& ☆─────────────────────────────────────☆ &&
sjleeds (Pidgin) 于
(Fri May 23 10:43:50 2008)
提到: && CUDA中的每个block线程是独立的,我估计你的原因是不是在共享变量的问题上,因为访
问共享变量的内存区比较慢,而当block中的线程数增大后,自然访问获取内存区的速度
会加快。 &&&& 【 在 zrmwyh (zrmwyh) 的大作中提到: 】
: 当每个block里的线程数16,32,128,256时,程序执行时间都是190ms左右,
: 当我设为512时,速度一下子提高到1.116343 (ms)。
: 有大牛能讲讲,这会是什么原因导致的吗?一下子提到了190倍呀,不敢相信
: ...................
&&&&&& ☆─────────────────────────────────────☆ &&
zrmwyh (zrmwyh) 于
(Fri May 23 12:15:21 2008)
提到: && 找到原因了,当线程数增加512时,得到的结果好像没有进行计算,估计直接从硬件里取的, 不然不可能快到那么多倍。 && ps.共享变量的内存区比global memory要快很多倍吧。
【 在 sjleeds (Pidgin) 的大作中提到: 】
: CUDA中的每个block线程是独立的,我估计你的原因是不是在共享变量的问题上,因为访
: 问共享变量的内存区比较慢,而当block中的线程数增大后,自然访问获取内存区的速度
: 会加快。
&&&&&& 文章数:1&分页:cpu多线程调用gpu算法 并没有比单线程调用快,是因为cuda内部有锁的原因吗_百度知道
cpu多线程调用gpu算法 并没有比单线程调用快,是因为cuda内部有锁的原因吗
我有更好的答案
实现计算性能的显著提高。它利用图形处理器 (GPU) 能力CUDA® 是 NVIDIA 创造的一个并行计算平台和编程模型。借助目前已售出的数百万支持 CUDA 的 GPU,软件开发人员
英特尔公司是全球最大的个人计...
主营:半导体芯片
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。CUDA高密计算云技术发展研究_网易新闻
CUDA高密计算云技术发展研究
用微信扫码二维码
分享至好友和朋友圈
GPU计算应用日趋广泛
随着图像处理技术的发展,对图形和图像的处理要求也越来越高,特别是3D技术的兴起,使图形图像处理和3D计算技术已经应用到各种视频游戏、电影产业、医疗成像、空间探索、远程通信等方面。同时,伴随着移动互联网以及终端技术的发展和普及,云端须处理的数据量呈爆发式增长,对大数据、视频和3D计算提出了更多的需求。
在通用计算领域,凭借高密度并行计算能力,GPU现已用于解决大量的通用计算问题,形成GPGPU(General-purpose computing on graphic computing unit)研究领域,特别是在CUDA推出以后,GPU计算已被广泛应用于图像处理以外的领域,包括导航识别、数理统计分析、数值天气预报、分子力学模拟、流体力学模拟、军事模拟、地质勘探等。
统一计算架构CUDA
CUDA(Compute Unified Device Architecture)是由NVIDIA公司提出的一种GPU通用计算框架,为GPU增加一个易用的编程接口,是目前应用最广泛的编程框架。
CUDA是C语言的一种扩展,它允许使用标准C来进行GPU代码编程。这个代码既适用于主机处理器(CPU),也适用于设备处理器(GPU)。主机处理器负责派生出运行在GPU设备上的多线程任务(CUDA称其为内核程序)。GPU设有内部调度器来把这些内核程序分配到相应的GPU硬件上。一般将逻辑语句多的,并且串行执行的处理,使用主机编程,而数据处理较密集,算术运算多的,具有高度并行性的部分使用GPU处理。
CUDA架构优势。相比CPU而言,CUDA架构中的GPU具备以下特点。
从硬件架构角度,GPU的计算单元有两层结构:SM(Streming Multiprocessor)和SP(Streming Processor)。一个GPU,实际上是一个SM的阵列,每个SM包含多个SP。SM相当于CPU的核,相同的SM中的所有SP可同时处理不同的数据。例如费米架构的GPU卡包含16个SM,每个SM包含32个SP。相对于一个四核的CPU来说,一个费米架构的GPU,核数是其4倍,数据吞吐量是其32倍。在内存方面,CPU程序模型的内存层次由硬件解决,程序员无需关心。而GPU的设计则在SM层设计了程序员可见的共享内存,可供程序员根据需要灵活使用以提高数据访问速度。同时,GPU具有多个寄存器组,可快速进行线程间切换。
从编程模型的角度,CPU使用MIMD(多指令多数据) 指令模型,而GPU采用SIMT(单指令多线程)指令模型。CUDA的编程模型将线程组合在一起形成了线程束、线程块以及线程网络,这些线程组合在一起形成了并行程序。相比CPU的按时间片串行执行程序,GPU采用硬件并行的模式,需大量线程填充数据区,利用有效的工作池来保证一直有事可做,不会出现闲置。当遇到指令延迟与存储器延迟引起的阻塞时,CPU处理器会闲置等待操作完成,而GPU的线程模型会快速切换到另外的线程,以实现对这种延迟的隐藏。
综上所述,CUDA的硬件架构和编程模型,决定其性能优势集中体现在硬件的并行计算上。基于高密度并行处理的CUDA程序,可极大地提高异构系统的整体性能。
基于CUDA构建高密计算云
GPU虚拟化。构建GPU高密计算云,必须解决GPU计算能力的虚拟化问题。目前,对于GPU虚拟化方法的研究,主要集中在三个方面。
设备仿真:采用模拟出完整的硬件环境的方式,为系统提供一个伪设备。实际仿真的设备位于CPU或内存中。由于实际运行的CPU并不具备GPU的大规模并行计算能力,其执行效率太低,在实际应用环境中并不具有实用价值。
设备独占:该方式允许用户通过操作系统直接控制物理设备,本质上是直接通过原生的显卡驱使用GPU,跳过了VMM(Virtual Machine Monitor)的参与。由于缺少VMM跟踪和硬件设备的维护状态,采用该方式无法支持虚拟机的实时迁移、快照等高级特性。
API虚拟化:该方式主要是对应用程序接口API进行重定向。通过拦截所有与GPU相关的API,使用重定向或者模拟的方式,将计算任务发送至物理机,在物理机中利用相应硬件去完成相应功能,最后将计算的结果通过指定的通信方式返回给客户端应用程序。
目前,大多数虚拟化平台对CUDA虚拟化的支持,仅达到设备独占的层次,仅有Citrix XenServer可以达到Partitioning的高度,即在同一虚拟机上将一个物理GPU进行多个复用的功能,而对于更高级的功能,比如基于分时复用、热迁移等功能都没有涉及。
学术界对CUDA的虚拟化方法的研究则更加深入,主要集中在对API重定向技术上,已提出多个基于CUDA的API重定向的虚拟化可行方案,实现对上层应用的完全透明,可无缝支持热迁移、快照等功能。
基于CUDA的API重定向实现GPU虚拟化。
自CUDA架构提出以来,基于CUDA的API重定向的GPU虚拟化技术,成为国内外学者广泛关注的一个热点。由于API重定向技术的灵活性,越来越多的研究人员认定API重定向技术是GPU虚拟化技术的归宿,提出了多种不同的解决方案,如vCUDA(Virtual CUDA)、rCUDA(remote CUDA)、GVim(GPU-accelerated Virtual achines)、gVirtuS等。
vCUDA通过API重定向的方法,拦截用户层的所有CUDA的API调用,重定向到物理机器上执行,实现对程序员的全透明,使得开发难度大大降低。考虑到RPC的性能开销问题,该解决方案采用了懒惰RPC的方法,尽可能减少RPC调用的次数。具体的做法是通过累积、过滤、合并上层调用等方式,合理确定发送RPC的时机,将连续的API打包一次性发送,有效提高了系统性能。
rCUDA,通过socket的通信方式在远程执行CUDA,相对采用RPC的vCUDA来说,效率有所提高。
GVim通过建立前端、后端、拦截库、库封装器四个模块来实现API的拦截和重定向。但是该解决方案只适用于特定的Xen虚拟化平台。
gVirtuS在vCUDA和GVim的基础上,独立实现了GPU虚拟化架构,保证了平台无关性,适用于Xen、VMware、KVM等主流的虚拟化平台。
CUDA高密计算云应用现状
自2007年提出CUDA以来,NVIDIA公司一直致力于云计算平台与CUDA的技术结合。其率先于2012年5月推出利用GPU加速云计算技术,同年10月推出了首款云计算虚拟GPU加速平台—VGX K2,并于2013年GTC大会上推出了云计算产品服务器平台—NVIDIA GRID。GRID 卡采用基于 NVIDIA Kepler架构的GPU,首次实现了 GPU 的硬件虚拟化。这意味着多名用户可以共享单一GPU。随后,国外的多家云服务提供商也推出了各自的基于GPU并行计算的云服务平台,包括Amazon、Nimbix、Peer 1 Hosting等。
在国内,“云图”和“云渲染”方案的提出,也标志着云服务提供商开始在GPU高密计算方面发力。“云图”(W760-G10)由曙光公司、NVIDIA公司、思杰公司于2014年合作推出,虽然尚未有明确的云租用服务,但已具备GPU硬件虚拟化的能力。阿里云于2013年提出“云渲染”方案,在国产3D动画电影《昆塔》中首次使用了云计算进行后期渲染的新技术,通过将一个或者多个渲染任务分割成若干部分,在计算机集群中的各个节点同时进行,以此类推,大大缩短渲染时间。
可以预见,随着CUDA与云计算的紧密结合,强大的GPU计算能力将推动云服务平台在图像分时、动画渲染、视频编码、3D运算、导航识别、数理统计分析以及大数据挖掘等领域发挥重要作用。
本文来源:中国信息产业网-人民邮电报
责任编辑:王晓易_NE0011
用微信扫码二维码
分享至好友和朋友圈
加载更多新闻
热门产品:   
:        
:         
热门影院:
阅读下一篇
用微信扫描二维码
分享至好友和朋友圈}

我要回帖

更多关于 ssm框架支持多线程吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信