您的位置:首页 > 编程语言

关于CUDA的编程模型的一些介绍

2015-05-27 10:45 239 查看
首先大概介绍下CUDA的编程模型,然后以示例程序对运行在GPU上的内核函数进行简单的介绍。

1.一个完整的CUDA程序:

主机端CPU的串行+一系列设备端kernel函数并行

2.运行在GPU上的程序统称为Kernel也就是常讲的内核函数;内核函数必须通过 _global_函数类型限定符定义,并且只能在主机端代码中调用。

3.CUDA在执行大量计算时,将计算任务映射为大量可以并行执行的线程,内核函数kernel是以block为单位执行的;各block之间是并行执行的,block之间无法进行通信,也不区分执行顺序。

4.我们在使用GPU进行大量计算任务时,为了提高执行的效率,尽量避免进行整数的除法和求模,这些操作在GPU中都是非常慢的。

5.两层并行模型是CUDA最重要的创新之一:

   两层的并行:

A.Grid中block之间的并行

B.block中thread之间的并行

其中CUDA编程模型最重要的创新:在同一个block中的线程可以进行数据之间的通信;

CUDA中实现block内通信的方法:在同一个block中的线程共享存储器实现数据的交换;通过栅栏同步保证线程间能够正确的共享数据。为了实现线程之间的同步我们在kernel函数中需要同步的位置调用_sysncthreads()函数。

示例程序:对两个尺寸为NXN的矩阵A和B进行求和运算,然后将结果存储在矩阵C中。

/*创建kernel函数实现矩阵的相加*/

_global_ void Add(float A

,float B

,float C

)

{

int i=threadIdx.x;

int j=threadIdx.y;

C[i][j]=A[i][j]+B[i][j];

}

int main(void)

{

dim3 block(N,N);   //定义了新的数据类型dim3。dim3是基于uint3定义的矢量类型

Add<<<1,block>>>(A,B,C);//kernel内核函数中Grid有1个block,每个block中则有block(N,N)个thread

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息