CUDA程序优化小记(四)

本文介绍了CUDA优化技巧,通过调整内核代码,实现大规模并行计算,利用多个块进行计算,以提升GPU的计算效率。对比了不同显卡的计算数据,展示了优化后的性能提升。
摘要由CSDN通过智能技术生成

CUDA程序优化小记(四)

 

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

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

         上次的并行程序能让GPU的效率得到很大的提高,因为它使用了多线程。但是这样的“多线程”显然不符合GPU通常的计算。真正的GPU计算是使用高达百万个线程的大规模并行计算,而通过CUDA的文档得知,每一个块(BLOCK)中的线程个数是一定的,有512个也有1024个。那么简单地增加并行规模的方法就是使用多个块来进行大规模计算。

         于是在这样思路的指引下,将CUDA内核改为如下代码:

__global__ static voidKernel_SquareSum( int* pIn, size_t* pDataSize,
                                   int*pOut, clock_t* pTime )
{
    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( );// 选择任意一个线程进行计时
 
    for ( size_t i = bID * THREAD_NUM+ tID;
       i < DATA_SIZE;
       i += BLOCK_NUM * THREAD_NUM )
    {
       pOut[bID * THREAD_NUM + tID] += pIn[i] * pIn[i];
    }
 
    if ( tID == 0 ) pTime[bID +BLOCK_NUM] = clock( );// 将结束时间放至后半部分
}

我们看到,这样的内核和以前的相比有亮点不同:一是将访问的间隔由1变为BLOCK_NUM * THREAD_NUM,二是计算时间的方法和前一版程序也有所不同。因为这里使用了多个处理器,每个处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值