gpu编程优化

近几年比较火的一个东西就是大规模、大数据等概念了。用到的工具除了hadoop等分布式平台外,还有一种是gpu,前者更多是用来做真正大规模的数据吧,比如大规模的网络数据的,但是如果数据是图像数据的话,可以用gpu来做。


gpu卡是由很多个处理单位组成,每个处理单元就像cpu cores一样,这个单元叫SM,不同的gpu卡有不同的SM版本。每个SM均像一个多核的cpu一样,有存储和寄存器以及计算单元。每个SM内部可以同时并行多个threads,这些threads同时执行,为高速计算提供了可能。同时,在计算单位和存储单位之间的带宽也是GPU卡的一个重要指标,在写GPU代码时,要做到优化,除了并行之外,需要考虑到存储器和寄存器的使用这些信息。


简单地说,向量加法,向量程度为N。我们可以开N个线程,每个线程均完成一个元素的加操作。这样一个向量加法,实现了多线程。再复杂点,矩阵乘法,两个矩阵A,B相乘的C,A的行和B的列相乘,这样我们可以开N个线程,每次完成C矩阵一个元素的计算,这样从一定程度上降低了计算量。但是,每个元素计算,均需要同时加载A元素的一行和B元素的一列,而另外一个元素计算可能会又加载了一次A的该行或者B的该列,这样造成了资源的浪费和计算单元与存储单元的频繁通讯。为此,提出了分块矩阵乘法,将矩阵A,B分块读取,然后计算该块对应C的几个元素,分块的大小直接决定了计算量的大小。分块大了,每次同时可以计算的C元素数据就多了,但是存储量也大了。因此,在存储和寄存器等允许的情况下,可以分块越大越好。其实,此时每个线程也是一次只计算一个元素。但是,因为一次性加载一块的A,B元素到共享存储了,共享存储的访问速度比全局存储速度快多了,因此,这样计算也快多了。


同时,提高计算速度的一个方法,也可以是,一个线程同时输出多个元素。这种方式能够在很大程度上提高并行能力。


另外,还有在图像处理中常用的是卷积等操作。卷积一般是个常量,因此,一般可以将卷积放在常量存储上,提高数据访问速度。卷积的并行稍微比矩阵乘法复杂些,但是基本思路也是大概差不多的。


所以,在做GPU优化之前,一定要弄明白的概念是GPU的硬件结构,否则谈优化只会隔靴搔痒。

因此,学习GPU的顺序: 了解GPU的硬件结构,了解线程各种存储,了解block,threads之间的划分,而后思考如何利用这些硬件和软件之间的关系进行优化。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值