文档库 最新最全的文档下载
当前位置:文档库 › CUDA编程探讨

CUDA编程探讨

CUDA编程探讨

CUDA编程探讨

12

王 欣,王 宁

(1、无锡职业技术学院, 江苏 无锡 214073;

2、黄河水利职业技术学院, 河南 开封 475002)

【摘要】本文简要探讨了CUDA编程,并指出了其中需要注意的地方。

【关键词】GPGPU;CUDA

过程中没有warp的概念,warp对于程序员是透明的,这一层

一、引言

目前业界对多核处理器的研究主要分为两个方面:通用次的线程调度完全由硬件实现。

多核处理器和多用众核处理器。前者以Intel和AMD公司为代线程块:线程块是可以协同工作的一批线程,它们通过表,将多个传统通用处理器核心集成在单芯片内,构成片上高速共享内存有效的共享数据,并同步其执行以协调访存。多处理器(Chip Multi-Processor, CMP);后者以NVIDIA和更准确地说,用户可以在内核中指定同步点,块中的线程在ATI公司为代表,将大量轻量级核心集成在单芯片内,构成全部到达此同步点时挂起。

支持通用计算的图形处理器(General-Purpose Compution on 每个线程由线程ID(Thread ID)标识,这是块中的线程Graphics Processing Units, GPGPU)。GPGPU将更多的晶体管号。为了帮助基于线程ID的复杂寻址,应用程序还可以将块专用于数据处理,在多个核心和高存储带宽的配合下,具备指定为任意大小的二维或三维数组,并使用2个或3个索引来了超高的计算能力,十分适于计算密集型和高度并行的计标识每个线程。对于大小为(Dx,Dy )的二维块,索引为算。(x,y)的线程ID为(x+y Dx),对于大小为(Dx,Dy,

二、GPU简介Dz)的三维块,索引(x,y,z)的线程ID为(x+y Dx +z Dx

GPU就是我们平时所说的“显卡”。众所周知,图形显Dy)。

示计算需要大量的并行运算,以显示每一个点在不同光线,2、GPU编程实例

不同角度所显示的颜色、明暗效果。因此,GPU将更多的晶__global__ void increment_gpu(float *a, float b)

体管专用于数据处理,而非数据高速缓存(cache)和流控{

制(flow),更加适于计算密集型和高度并行的计算。使用int idx=blockIdx.x*blockDim.x+threadIdx.x;

GPU作为计算部件基于以下两个原因:a[idx]=a[idx]+b;

* 高性价比:目前,GPU的计算能力远远超过了CPU,}

举例来看,NVIDIA GeForce 9800GTX+理论上拥有void main()

235.52GFlops的计算能力,而使用SSE结构的奔腾IV处理器{

仅仅为6GFlops。…

* 性能增长快:在游戏市场繁荣的今天,GPU的性能增dim3 dimThread(threadsize);

长是CPU无法比拟的,与摩尔定律不同的是,GPU自1993年dim3 dimBlock(N/ threadsize);

以来,就以每年2.8倍的速度增长。increment_gpu<<< dimBlock, dimThread >>>(a,b);

由于GPU强大的计算能力,人们已经把GPU的使用范围}

从原来单一的图形计算,扩展到科学计算与试验中,如模拟其中,__global__关键字是CUDA对C语言的扩展,表示物理实验,线形方程求解,快速傅里叶变换,复杂的几何学本函数可以被CPU函数调用,但在GPU上执行;

问题,以及非传统的图形计算问题等等。blockIdx.x, blockDim.x, threadIdx.x均是内置的变量,用于

三、GPU编程模型——CUDA表示本线程的block号,block中线程数以及在某个block中的

CUDA(Compute Unified Device Architecture,统一计算线程号;

设备架构)是NVIDIA公司开发的一种GPU计算的新架构,increment_gpu函数实现的功能是:本线程将数组a中第是一种新型的硬件和软件架构,它将GPU视为数据并行计算线程号个元素加b,这样当整个程序执行完毕后,数组a中前设备,在其上进行计算的分配和管理,而无需将其映射到图N个数字将被加上b,其中N是dim3 dimBlock(N/threadsize)中形API。它可用于NVIDIA公司的GeForce8系列、Tesla解决方出现的N;

案和一些Quadro解决方案。操作系统的多任务机制负责管理在main函数中,increment_gpu被称为“kernel函数”,多个并发运行的CUDA应用程序和图形应用程序对GPU的访而increment_gpu<<>>(a,b)也是CUDA对问。CUDA软件堆栈由几层组成:硬件驱动程序,应用编程C语言的扩展,实现GPU kernel函数的调用。

接口(API)及其运行时(runtime),以及两个更高层的通3、GPU编程特点

用数学库CUFFT和CUBLAS。其使用的编程语言是C++语言虽然CUDA使用C语言作为用户编程语言,然而为达到中C语言子集的扩展集。GPU设备最大的利用率,编程时还必须注意GPU底层的硬件

1、GPU编程的逻辑结构结构:

通过CUDA编程时,将GPU看作可以并行执行非常多个* 由于shared memory被集成在芯片上,所以访存速度线程的计算设备(compute device)。快,然而大小有限,且过多使用会影响每次kernel函数调用作为CPU(或被称为宿主,host)的协处理器运作。换时并发的线程数。

句话说,在宿主上运行的应用程序中,数据并行的、计算密* global memory容量大,一般在几百兆,然而访存速度集型的部分被装载道协处理器设备上。更准确的说,应用程很慢,所需时间是shared memory的上百倍,过多使用,可能序中要执行多次,但要在不同数据上执行的部分可以被独立会使执行每个线程所需时间变长。

安排在此设备上,使用不同线程运行。要达到这种效果,可* 相比定点计算,GPU更擅长浮点运算,但由于硬件原将该函数编译到设备的指令集中,装载到设备上。因,其计算精度与IEEE所规定的精度不同。

宿主和设备都保留自己的DRAM,分别称为宿主内存最后,由于编译器尚处于不成熟的阶段,对于过于复杂(host memory)和设备内存(device memory)。用户可以通的宏,可能会出现编译不通过的现象。

过API调用将数据从一个DRAM复制到另一个DRAM中。四、总结

GPU依靠这种方式从外设读取数据。本文简要介绍了CUDA编程,通过利用GPU为计算机加执行内核(kernel)的一批线程组成线程块(block),速,能使得计算速度有显著提升,如再辅以其他网格技术,再由线程块组成网格(grid)。这里的block与grid和硬件结则对于研究和开发实用的高性能计算系统具有重要的参考意构中的block与grid相对应,而与硬件结构不同的是,在编程义。

104

相关文档