22
GPU 并并并并并并并并 并并并 [email protected]

GPU 并行编程技术介绍 胡光龙 huguanglong@tju

  • Upload
    meg

  • View
    275

  • Download
    0

Embed Size (px)

DESCRIPTION

GPU 并行编程技术介绍 胡光龙 [email protected]. GPU 简介 GPU , Graphics Processing Unit 的简写,是现代显卡中非常重要的一部分,其地位与 CPU 在主板上的地位一致 ,设计的初衷是用于在显示器上渲染计算机图形,加速图形处理速度(现在仍然主要用于这个目的)。 GPU 是一个高度 并行 化的 多线程 , 多核心 处理器。. GPU 简介 GPU 极大提升了计算机图形处理的速度,增强了图形的质量,并促进了与计算机图形相关的其他领域的快速发展。 - PowerPoint PPT Presentation

Citation preview

Page 2: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

I

•GPU简介

•CUDA简介

•CUDA编程模型

•简单的CUDA程序实例

Page 3: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

GPU简介• GPU , Graphics Processing Unit 的简写,是

现代显卡中非常重要的一部分,其地位与CPU 在主板上的地位一致 ,设计的初衷是用于在显示器上渲染计算机图形,加速图形处理速度(现在仍然主要用于这个目的)。

• GPU 是一个高度并行化的多线程,多核心处理器。

Page 4: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

GPU简介• GPU 极大提升了计算机图形处理的速度,增

强了图形的质量,并促进了与计算机图形相关的其他领域的快速发展。

• 与中央处理器( Central Processing Unit , CPU )的串行设计模式不同, GPU专门为图形处理设计,具有天然的并行特性。

Page 5: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

GPU简介GPU 计算特点吸引着许多研究人员来探索如何使用 GPU 在图形处理之外的领域中进行计算。早期的基于 GPU 的通用计算非常复杂。标准图形接口(如 OpenGL , DirectX ),是与 GPU 交互的唯一方式。要在 GPU 上执行计算,必然受限于图形 API 的编程模型。

Page 6: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

CUDA简介2006 年 11 月, NVIDIA 公布了业界第一个DirectX 10 GPU ,即 GeForce 8800 GTX 。这是第一个基于 CUDA 架构的 GPU 。CUDA ,可以理解为 NVIDIA 公司构建其 GPU的模式,极大地方便了我们在 GPU 中完成通用计算任务。 CUDA 的出现使用户无需了解图形编程结构也不需要将通用计算问题伪装成图形计算问题

Page 7: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

CUDA简介NVIDIA 采取了工业标准的 C 语言,并增加了一部分关键字来支持 CUDA 架构的特殊功能,这便是 CUDA C 语言。它专门用来在 GPU 上编写通用计算。CUDA 在医学图像处理,流体力学的计算以及环境科学等领域得到广泛的应用,基于 GPU 的代码甚至比之前的代码在性能上提升了多个数量级

Page 8: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

CUDA编程模型CUDA 的基本思想是支持大量的线程级并行,并在硬件中动态的调度和执行这些线程。GPU 只有在计算高度数据并行任务时才发挥作用。异构思想: Host ( CPU ) +Device ( GPU )

Page 9: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

CUDA编程模型在 CUDA 的架构下,一个程序分为两个部份: host 端和 device 端。 Host 端是指在 CPU 上执行的部份,而 device 端则是在显示芯片上执行的部份。通常 host 端程序会将数据准备好后,复制到显卡的内存中,再由显示芯片执行 device 端程序,完成后再由 host 端程序将结果从显卡的内存中取回。

Page 10: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

CUDA编程模型注意:由于 CPU 存取显卡内存时只能透过 PCI Express 接口,速度较慢( PCI Express x16 的理论带宽是双向各 4GB/s ),因此不能太频繁进行这类动作,以免降低效率。

Page 11: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

CUDA编程模型CUDA C的关键字:1 函数类型限定符,用来确定函数是在CPU还是在 GPU 上执行,以及这个函数是从 CPU 调用还是从 GPU 调用。__global__ ( host 端调用, device 端执行)__device__ ( device 端调用, device 端执行)

Page 12: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

CUDA编程模型CUDA C的关键字:2 执行配置运算符 <<< x , y>>> ,用来传递内核函数 (__global__修饰的函数 ) 的执行参数。第一个参数 x 代表一个线程格( grid )中线程块( block )的个数(一维或者多维,每一维度最大65535 个)。第二个参数 y 代表每个线程块( block )中线程( thread )的个数(一维或者多维,最多 512个)。

Page 13: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

CUDA编程模型CUDA C的关键字:3 几个内建变量:gridDim.x gridDim.y 代表线程格中不同维度的线程块( block )的个数。blockDim.x blockDim.y 代表线程块中不同维度的线程( thread )的个数。

Page 14: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

CUDA编程模型CUDA C的关键字:3 几个内置变量:blockIdx.x blockIdx.y表示当前线程块所在线程格中不同方向上的索引。threadIdx.x threadIdx.y表示当前线程所在线程块中不同方向上的索引。

Page 15: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

CUDA编程模型CUDA C的关键字:4 内存操作函数:cudaMalloc () : 类似于 malloc (),作用是告诉 CUDA运行时在设备上分配内存。对应的cudaFree ()来释放内存。CudaMemcpy ():类似于 memcpy (),在设备和主机之间存取内存。

Page 16: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

简单地 CUDA程序实例我们通过一个最简单的矢量求和运算的例子来加深对 CUDA 并行计算的理解。1 基于 CPU 的矢量求和 void add(int *a, int *b, int *c)

{

for(int tid=0; tid<N; tid++)

{ C[tid]=a[tid]+b[tid]; } // 要执行 N次}

Page 17: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

简单地 CUDA程序实例2 基于 GPU 的矢量求和我们可以再 GPU 中实现相同的加法运算,这需要将 add ()编写为一个设备函数。在给出设备代码之前,首先给出 main ()。#define N 256

main (){ int a[N], b[N] ,c[N]; //CPU 上的矢量 int * dev_a , * dev_b , * dev_c ; //GPU 上的设备指针

Page 18: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

简单地 CUDA程序实例 // 在 GPU 上分配内存 cudaMalloc((void**)&dev_a, N* sizeof (int))

cudaMalloc((void**)&dev_a, N* sizeof (int))

cudaMalloc((void**)&dev_a, N* sizeof (int))

// 为数组‘ a’ 和‘ b’赋值 for(int i=0; i<N ;i++)

{a[i]= -i; b[i]=i*i; }

Page 19: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

简单地 CUDA程序实例 // 将数组‘ a’ 和‘ b’ 复制到 GPU

cudaMemcpy ( dev_a, a, N*sizeof(int), cudaMemcpyHostToDevice );

cudaMemcpy ( dev_b, b, N*sizeof(int), cudaMemcpyHostToDevice );

// 在 GPU 中使用设备函数来计算矢量和//总共启用 N 个线程块,每个线程块包含一个线程add<<<N,1>>>(dev_a, dev_b, dev_c) ;

Page 20: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

简单地 CUDA程序实例 // 将结果从 GPU 复制回 CPU

cudaMemcpy ( c, dev_c, N*sizeof(int), cudaMemcpyDeviceToHost );

//释放 GPU 上分配的内存cudaFree ( dev_a );cudaFree ( dev_b );cudaFree ( dev_c );}

Page 21: GPU 并行编程技术介绍 胡光龙 huguanglong@tju

简单地 CUDA程序实例接下来我们来看 add ()函数。__global__ void add(int *a, int *b, int *c) {

int tid = blockIdx.x;

c[tid] = a[tid] + b[tid];

}

程序运行时将创建 add ()核函数的 N 个副本。blockIdx 是一个内置变量,变量中包含的值就是当前执行设备代码的线程块的索引。所以仅需要一步即可完成矢量的相加。