CUDA 基础算法之reduce、scan、histogram

本文介绍了CUDA中的基础算法,包括reduce(规约)、scan(扫描)和histogram(直方图)的原理及实现。通过step complexity和work complexity分析了算法效率,展示了不同扫描算法如Hillis and Steele与Blelloch的区别,并探讨了直方图统计中的并发问题和原子操作的应用。
摘要由CSDN通过智能技术生成

前言

之前对于CUDA的学习基本上就是不会就查,拿来就用的状况,对一些基础算法的了解不是特别深,之前在面试的时候还有被问到scan扫描算法计算数组的前缀和,表示还没有详细的了解以致只能尴尬地说不清楚,是真的贼尴尬啊,后来去学了些视频课,才逐渐有了一些些基础。(说起来之前还不知道有step complexity 和 work complexity这两种复杂度呢)

1、step and work complexity

step complexity 指可以将一个操作并行成为几个步骤,work complexity 指最终有多少步骤的工作要做;
如下图中所示:
在这里插入图片描述
求一数组所有元素之和(所有元素个数为8),其step complexity为3;而work complexity为7.

2、reduce(规约)

规约的大致过程同样如下图所示:
在这里插入图片描述
图中所示为规约求和,但是同样求最大最小值之类的同样可以应用规约的思想。如图中所示,如果为串行规约(数组有n个元素),那么step complexity 和work complexity的大小都是O(n-1);利用并行规约的思想,可以达到如下效果,step complexity:O(logn);work complexity:O(n-1);
下面的代码样例是reduce求和的一个基本版本:

__global__ void reduce(int* dev_i, int* dev_o)
{
   
	extern __shared__ int sdata[];
	unsigned int tid = threadIdx.x;
	unsigned int i = blockIdx.x * blockDim.x + threadIdx.x;
	sdata[tid] = dev_i[i];
	__syncthreads();
	for (unsigned int s = 1; s < blockDim.x; s *= 2)
	{
   
		int index = 2 * s * tid;
		if (index < blockDim.x)
		{
   
			sdata[index] += sdata[index + s];
		}
		__syncthreads();
	}
	
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值