CUDA能取代CPU吗?
CUDA技术已经日益成熟,拥有CUDA技术的GPU能处理一些CPU能做的事情,采取并行计算,而且数值计算的速度远远优于CPU,亦为C语言提供了开发环境......但GPU...
CUDA技术已经日益成熟,拥有CUDA技术的GPU能处理一些CPU能做的事情,采取并行计算,而且数值计算的速度远远优于CPU,亦为C语言提供了开发环境......但GPU有可取代CPU吗?功能上可以取代,但GPU可以离开CPU独立生存吗?亦即是说,一台机可以没有CPU吗?
展开
2013-11-07
展开全部
摩尔的预言 唯有CUDA才是终极的CPU 架构解析:从硬件角度看CUDA(上)如果你是一位小熊在线的忠实读者,那么你对NVIDIA最新的GPU架构技术一定并不陌生。如果你不经常看小熊在线的文章,那么我还是建议你多做一些功课,去了解一下NVIDIA最新的显卡特色技术。因为NVIDIA的CUDA架构与他们的GPU架构稍有不同,并且在这篇文章中,将为读者揭示一些NVIDIA从未提及的技术细节。GPU的处理核心架构从上面的这张架构图我们可以看到,NVIDIA的Shader核心是由若干个材质处理单元(TPC)的群组所构成的。例如一个8800GTX,它内部就有8个群组,而8800GTS内部就有6个群组。事实上,每一个群组都是由1个材质处理单元和2个流多重处理器构成的。而处理器又由一个前端的读取/解码单元,一个指令发送单元,一个由八个计算单元组成的组,和2个SFU超级功能单元所组成,他们在处理指令方面都属于SIMD单指令多数据流。同样这类指令也适用于所有warp中的线程。NVIDIA这种并行模式叫做SIMT单指令多线程执行单元。需要指出的是,后端的操作,比前端操作要高出2倍的时钟周期。在实际中,部分执行指令有可能有2倍长。16路的SIMD,就只能相当于8路的处理效能。流多重处理器在运作模式下,允许每个时钟周期内,在流水线的前端,让一个warp处在准备执行的状态。在一个warp中的32个线程中的应用指令,在流水线的后端,需要用4个时钟周期来处理。但是这种操作在流水线的前端,仅仅需要1/2的时钟周期就可以完成,从这一点来看,仅仅需要2个时钟周期,就可以完成操作。 因此为了保证流水线前后端的速度一致,使得硬件的利用率最大化,CUDA推出了一种交替类型的指令周期。每个典型的指令使用一个时钟周期,而SFU的指令在另一个周期。每个多重处理器也有一些确定数量的资源,以便可以更精确的榨取它们的性能。它们有一些很小的存储区域,这些区域被叫做共享内存。每一个多重处理器的共享内存仅有16KB大小。这并不是一个高速缓存,这是由程序自由管理的存储区域。这方面与Cell处理器上的SPU处理单元有些类似,可以进行本地的数据存储。这些技术细节是非常独特而有趣的,并且你可以在CUDA的文档中找到相关更详细的软件与硬件技术说明。这些存储区域并不是为了pixel shaders而设计的,他们主要针对的就是CUDA架构解析:从硬件角度看CUDA(下)这个存储区域为block块中的线程提供了一种信息沟通的途径。它最重要的作用就是强调限制级别。所有的线程都保证被封装到一个block块中,这就保证了多重处理器可以有效的处理这些任务。反过来说,指派block块到不同的多重处理器中,是非常不确定的。这就意味着,在执行的时候来自不同block块中的线程是无法进行通信的,使用这种存储区是一件非常复杂的事儿。但是设计这些复杂的存储区,对于整体架构来说也是值得的。因为某些特殊的线程,可能会贸然访问主内存,这也许会产生很多冲突,而这种共享存储区可以快速的链接寄存器。block块内部架构这些共享的存储区并不是多重处理器唯一可以访问的存储设备。很显然,他们可以使用显存,但是相对于共享存储区来说,显存的带宽和速度都不如前者。因此,这种机制可以抑制对内存过于频繁的访问。NVIDIA也提供了多重处理器的高速缓存,可以存储常量和纹理,大致相当于每个多重处理器能分配到8KB的空间。多重处理器内部架构同时,多重处理器也具备8192个寄存器。在多重处理器中所有激活的block块中所有的线程,都可以通过这些寄存器共享信息。不过激活的warps总数被限制在24个,也就是768个线程。例如8800GTX最多可在同一时间处理12288个线程。在这方面加以限制,是为了不让GPU的资源消耗的太多,可以更合理的分配计算任务。针对CUDA优化过的程序从本质上讲就是在block块的数量与他们的尺寸之间找到一种平衡。在一个block块中加入更多的线程,有利于提高内存潜伏期的效率,但是与此同时可以使用的寄存器数量就要少了。如果block块中的线程数太多了,比如达到512个线程的水平,那么整个流水线的执行效能就大大降低了。这仅仅够喂饱一个多重处理器的,浪费了256个线程的处理能力。因此NVIDIA建议每个block块使用128至256个线程,这是最为折中的办法,它会在内核的潜伏期与寄存器数量之间找到最好的平衡点架构解析:从软件角度看CUDA从软件的角度来看,CUDA是由C语言的扩展组成,这种架构当然要追溯到BrookGPU的时代,并且许多API的编写工作,都是从BrookGPU继承来的。CUDA扩展和延伸了许多BrookGPU的函数和变量。这里有一个非常典型的关键字__global__,它是一个前缀,在它后面的内容意味着是一个内核。这个功能将被CPU和执行单元所调用。__device__,标记有这个关键词的程序将会被GPU执行。但是仅仅在GPU中被调用。最后再介绍一个关键词__host__,这个前缀是可选的,它会指派CPU调用一个函数,并且由CPU执行它,换言之,它就像是一个非常传统的CPU执行函数。对于__device__ 和 __global__ 函数来说,也有一些限制条件。他们不能被递归,也就是说他们不能自己调用自己。他们不能拥有可变数目的自变量。最后,要说一下__device__关键词,它必须驻留在GPU的显存空间内。理论上来说,绝对不可能获得它的物理地址。变量在控制存储区域的时候,也会有一些限制。__shared__ 是一个变量的前缀,当程序中出现这个关键词的时候,就表明变量要保存在流多重处理器中的共享存储区中。这与通过 __global__关键词调用会有些不同。这是因为执行配置中规定,在调用时,要指明grid栅格容器的大小,并指明它在哪个内核中,并且要为每一个block块指派所包含线程的尺寸。我们可以看看下面的这个例子:其中Dg是grid栅格的尺寸,而Db是定义block块,这两个变量是CUDA的一种新的类型。CUDA API其本质上来讲是由各种操作显存的函数组成的。cudaMalloc用来分配内存,cudaFree用来释放内存,cudaMemcpy用来互相拷贝内存和显存之间的数据。在最后,我们将介绍一下CUDA程序的编译方式。这是非常有趣的,整个编译过程需要几个阶段。首先,所有的代码都要让CPU来处理,这些都会从文件中提取,并且他们都会通过标准的编译器。用于GPU处理的代码,首先要转换成中间媒介性语言——PTX。中间语言更像是一种汇编程序,并且能够中和潜在的无效代码。在最后的阶段,中间语言会转换成指令。这些指令会被GPU所认同,并且会以二进制的形式被执行。
2013-11-07
展开全部
前几年 intel 有打算CPU集成图形处理器(GPU), 去年 NVlDlA 也有过做 CPU 打算,谁能取代谁事,谁能说清楚呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-11-07
展开全部
长篇大论没意思。N说显卡能替代CPU,A和I说CPU能替代显卡,但现在的情况是谁也没替代谁,电脑世界变化快,今天说完明天就变,你觉得是这样的状况,但现实却频偏是另外一种状况,没意义。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-11-07
展开全部
不好说 ,CPU 也在说要取代 GPU呢…………
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询