cuda 笔记 2

本文探讨了CUDA中GPU的存储优化问题,强调了存储器速度和带宽对程序性能的影响,特别是寄存器、共享内存和全局内存的层次。通过基数排序的例子,解释了如何在GPU上实现优化,包括数据分列、共享内存使用和避免多层函数调用。文章还介绍了并行合并和并行规约策略,以提高排序效率,并提出混合算法结合两者的优势。
摘要由CSDN通过智能技术生成

上一节写的简单的部分已经可以足够我们去写一些程序了,但是只有一个问题,就是效率。在书上,关于程序的书写规范似乎那一章就大部分都说了,后面的部分翻了翻全是在讲效率问题,而我之前就是在紧接的一章中没有看完就放弃了,日常半途而废。

这一章(6章)讲的主要是gpu中的各式存储问题,存储器的速度和带宽也是gpu运行程序中的瓶颈,他们的速度可以大致列为寄存器>共享内存>全局内存。甚至说,这一句话其实已经代表了这章几乎所有的内容,但是在运用策略上却略难懂,书上运用了多种排序算法作为实例,在这里就只简单讲讲第一个简单的排序:基数排序。

基数排序的基本算法就不在此展开了。而对应在GPU上,我们肯定不能向原始算法一样一个线程跑下来,这样子的速度是最慢的。如何优化呢,首先就是将数据分成多个列表。然后对于每个列表中的数据进行基数排序,然后得到一些排好序的列表。这样的话,就能大大加速计算的过程。因为每个SM中有32个共享内存存储体,因此可能的合适列表数量应该是32。但是更多的列表能够计算更快。而且可以针对一些细节进行优化,比如直接将数据在对0 1的筛选过程中直接存储到目标数组,省去一次拷贝过程,以及循环变量的位置,不变的可以提取到循环外等。这样的优化可以提升20%的速度。

至此,我们得到了一些排好序的列表,下一步就是合并,从经典的想法来看,n个列表合并应当是每次取最小的那个元素,也就是找所有列表的开头中最小的值,并取出来,然后还要跟踪列表中的位置。其中,想要加速这一过程首先就是要把数据存储到共享存储中,然后尽可能按行读取来加速。一个重要的优化是避免多层的函数调用,因为多层函数调用很可能会涉及到栈的使用,这意味会使用全局内存空间来作为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值