CUDA程序优化小记(五)

本文介绍了CUDA程序优化的过程,作者通过学习《GPGPU编程技术》并实践,发现之前版本的CUDA程序在CPU上进行部分计算,导致效率降低。为了解决这个问题,作者利用CUDA的共享存储器特性,将求和操作移至GPU内,显著减少了CPU的负担。通过在块内进行线程同步和结果求和,提高了程序性能。
摘要由CSDN通过智能技术生成

CUDA程序优化小记(五)

 

CUDA全称Computer Unified Device Architecture(计算机同一设备架构),它的引入为计算机计算速度质的提升提供了可能,从此微型计算机也能有与大型机相当计算的能力。可是不恰当地使用CUDA技术,不仅不会让应用程序获得提升,反而会比普通CPU的计算还要慢。最近我通过学习《GPGPU编程技术》这本书,深刻地体会到了这一点,并且用CUDARuntime应用改写书上的例子程序;来体会CUDA技术给我们计算能力带来的提升。

原创文章,反对未声明的引用。原博客地址:http://blog.csdn.net/gamesdev/article/details/18140163

         上一版程序以非常惊人的速度完成了数据求和的计算,不过在GPU计算各个分组之后,CPU还要将各个处理器的和再求一遍和。也就是说,在CPU上运行了这样一段代码:

// 在CPU中将结果组合起来
int totalResult;
for ( int i = 0; i <THREAD_NUM * BLOCK_NUM; ++i )
{
    totalResult += pResult[i];
}

这样等于是将GPU的负担给了一部分给CPU做,在这里,定义BLOCK_NUM和THREAD_NUM分别为32和256,也就是说CPU要循环213次进行加的操作。更糟糕的是,这一部分工作和GPU上的求和还是串行的,无法真实反映GPU完成的任务。于是这回将主要精力放在如何将这一部分代码放在GPU上运行。

         CUDA有一大特色,那就是共享存储器。共享存储器位于每个多处理器内,是片上存储器,它的作用域在一个块(BLOCK)内。于是在块内进行各个线程的结果求和,比较符合我们的期望,也就是说,线程执行y=X2这样的操作,将结果放在共享存储器中,再选择一个线程执行z=∑y的操作,最后将w=∑z交给CPU来执行。下面是修改后的内核代码:

__global__ static voidKernel_SquareSum( int* pIn, size_t* pDataSize,
                                   int*pOut, clock_t* pTime )
{
    // 声明一个动态分配的共享存储器
    extern __shared__ int sharedData[];
   
    const size_t computeSize =*pDataSize / THREAD_NUM;
    const size_t tID = size_t(threadIdx.x );// 线程
    const size_t bID = size_t(blockIdx.x );// 块
   
    // 开始计时
    if ( tID == 0 ) pTime[bID] =clock( );// 选择任意一个线程进行计时
 
    // 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值