| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> CUDA加速——基于规约思想的数组元素求和 -> 正文阅读 |
|
[数据结构与算法]CUDA加速——基于规约思想的数组元素求和 |
数组元素求和,顾名思义就是求数组中所有元素的和,比如有数组X: X的所有元素和就是: 如果按串行顺序求上式还是很好理解的,就是一个逐渐累加的过程,如下图,按照step1~stepn的步骤,依次计算S0,S1,S2,...,Sn-1,最后得到的Sn-1即是所有元素的和: 01 — 规约求和思想 以上串行顺序计算的step1~stepn是按照先后顺序依次执行的,那么如果是并行顺序求和呢?也即将多个求和步骤并行执行,而不是按照先后顺序执行,这时该怎么办? 由于step1~stepn中后步骤的计算结果依赖于前步骤的结果,必须等待前步骤计算结果出来之后才能开始后步骤的计算,如果直接对step1~stepn这n个步骤并行执行,显然是不能得到正确结果的,因为前步骤的结果还没出来后步骤就开始计算了。 为解上述问题,通常采用规约思想来并行计算。下面我们举一个简单的例子来说明规约思想,假设数组X有8个元素,现要使用规约思想求其元素和: 步骤如下:
以上3个步骤可用下图表示,每个步骤都将数据两两分组,然后并行计算每组的元素和,最后得到一个结果,这就是规约的过程: 02 — CUDA实现数组元素的规约求和 CUDA是为并行计算而生的,使用CUDA可以很容实现上述的数组规约求和算法。不过有一点需要注意,就是必须确保每个步骤的所有线程是同步的,也即所有线程计算完成之后再进入下一步骤的计算,否则会导致结果错误。 比如假设上图的线程a、b、c已完成计算,但是线程d未完成计算,如果不等线程d完成计算就直接进入下一步骤计算S4和S5,由于线程d未完成计算,得到的S3是错误的值,这导致得到的S5也是错误的值,从而导致最终计算的S6也错了——这将导致错误的连锁反应。 在CUDA中,可以调用__syncthreads函数方便地同步同一个线程块中的所有线程,因此我们可以使用同一个线程块中的多个线程做规约运算。那么问题来了,如果数据量很大,一个线程块不能完成所有数据的规约运算该怎么办呢?答案是分块处理,将数据平均分成多个部分,每部分都分配给一个线程块做规约运算。因此每个线程块最后得到一个规约结果,最后再将多个规约结果求和,即得到最后结果。如下图所示: 也许这里有人会问,最后得到的多个规约结果还是得按照串行顺序求和呀,这样做有点脱裤子放屁了。我想说是这样,只不过最后得规约结果相对原始数据个数,已经少了很多很多了,因此其串行求和的耗时基本可以忽略。 CUDA核函数代码如下:
上面代码的for循环,咋一看很难理解,没有关系,我们举个简单例子来说明就好了。假设:blockDim.x=8,也即每个线程块有8个线程;N=8,也即输入数组的长度为8。那么对于第0个线程块(其它线程块也类似),其包含线程id为0~7,计算过程如下,你是否已经发现,其计算过程就是上述讲的规约过程呀~ 下面我们写代码来测试上方实现的规约算法是否正确: 首先,定义一个微秒级计时的类,用于计时:
接着是测试函数:
运行结果如下,可以看到对1536*20480长度的数组求元素和,CPU和GPU的计算结果是一致的,不过GPU CUDA计算耗时反而比CPU更多了,一方面是因为GPU计算多了host与device端内存拷贝的耗时,另一方面是因为我们实现的CUDA规约算法没有做到优化的极致,还有不小的优化空间。那么接下来让我们继续尝试优化吧~ 欢迎扫码关注本微信公众号,接下来会不定时更新更加精彩的内容,敬请期待~ |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 5:54:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |