关于对CUDA计算块的理解

CUDA 计算块

对cuda计算的分块一直不是很理解,有时候还会报错。现在对不同的参数整理、理解一下,以加法加速为例。
首先是核函数的定义与实现:

__global__ void addKernel(int *c, const int *a, const int *b)
{
    int i = threadIdx.x;
    c[i] = a[i] + b[i];
}

再定义需要相加的两个数组以及存储结果的数组:

    const int arraySize = 5;
    const int a[arraySize] = { 1, 2, 3, 4, 5 };
    const int b[arraySize] = { 10, 20, 30, 40, 50 };
    int c[arraySize] = { 0 };

将待相加的两个数组复制到设备上(HostToDevice):

cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));
cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));
cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);

调用相加kernel:

addKernel<<<1, arraySize>>>(dev_c, dev_a, dev_b);

这样的相加当然没有问题,相当于在一个计算block里,为每个数组元素,都开了一个计算线程,所以线程索引x与线程ID相同。
在这里插入图片描述
将arraySize的维度升上去会发下,这种数据分割方式失去了优势,例如当arraySize=10000时,甚至超出了cuda所能提供的最大计算维度
在这里插入图片描述
但是10000 = 100*100,替换成

addKernel<<<100, 100>>>(dev_c, dev_a, dev_b);

相当于100个block里,每个都有100个thread计算单元,这样设置运行成功。
再提高计算维度(模拟极大数据量进行计算加速的情况),arraySize设为40000,如法炮制,将核函数调用设置为:

addKernel << <100, 100 >> > (dev_c, dev_a, dev_b);

得到的结果正确,耗时133~170ms。我的理解是,每个最小计算单元里有4个数组元素。换一种资源分配方式

addKernel << <200, 200 >> > (dev_c, dev_a, dev_b);

得到的结果也是正确的,耗时与上一个设置接近。计算分配对速度的影响还有待探究,只论语法上的正确的话,参考以下官方说明对计算量的规定:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值