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

首先大概介绍下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[N][N],float B[N][N],float C[N][N])

{

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值