CUDA编程(四)并行化我们的程序

  • 时间:
  • 浏览:0

什么都有计算使用的下行速度 :

你要们 发现极限守护进程的情况汇报下下行速度 仍然过高 看,什么都有们 别忘了,你要们 并且似乎除了Thread还讲过另有另一个概念,什么都有Grid和Block,当然另外还有共享内存,有有哪些东西可不多再没办法 你要们 处在的意义,你要们 进一步并行加速就要通过你要们 。另外并且也提到了什么都有优化步骤,每个步骤中都不 血块的优化手段,什么都有你要们 仅仅用了守护进程并行这另有另一个手段,显然不什么都有一蹴而就。

运行结果:

1M 个 32 bits 数字的数据量是 4MB。

先贴一下单守护进程的守护进程代码,你要们 将继续在有些代码的基础上进行改进:

首先计算一下使用的时间:

没办法 接下来你要们 就按照有些思路来并行你要们 的守护进程~

希望我的博客能帮助到你要们 ~

还还要想看 这和一般显卡具有的几十G的内存下行速度 仍然具有很大差距,你要们 还差的远呢。

还还要想看 你要们 的下行速度 整整提升了60 倍,没办法 有些结你造的是非常优秀吗,你要们 还是从内存下行速度 的淬硬层 来进行一下评估:

还还要想看 你要们 的下行速度 相对于单守护进程提升了60 倍,什么都有相比256个守护进程只提升了2倍,你要们 再从内存下行速度 的淬硬层 来进行一下评估:

什么都有,有些守护进程实际上使用的内存下行速度 约为:

运行结果:

删改守护进程:

使用的时间:

同样不多再忘记check结果:

这篇博客主要讲解了怎样么会去使用Thread去简单的并行你要们 的守护进程,其实你要们 的守护进程运行下行速度 有了60 甚至上百倍的提升,什么都有根据内存下行速度 来评估的化你要们 的守护进程还远远过高 ,甚至离1G/S的水平都还差不少,什么都有你要们 的优化路还有很长。

最后在CPU端进行加和

别问我你要们 有无 还记得不并行时的运行结果:679660 60 另有另一个时钟周期,现在你要们 使用256个守护进程最终只使用了13377388个时钟周期

也什么都有说你要们 最多还还要去开102另有另一个守护进程,没办法 你要们 就试试极限守护进程数量下有没办法 另有另一个满意的答案:

什么都有 global memory 并没办法 cache,什么都有要避开巨大的 latency 的最好的方式,什么都有要利用血块的threads。假设现在有血块的 threads 在同去执行,没办法 当另有另一个 thread 读取内存,结束英文停留结果的并且,GPU 就还还要立刻切换到下另有另一个 thread,并读取下另有另一个内存位置。什么都有,理想上当thread 的数目够多的并且,就还还要删改把 global memory 的巨大 latency 隐藏起来了,而此时就还还要有效利用GPU很大的内存下行速度 了。

什么都有从GPU拿回结果的地方也还要改,什么都有先在不仅要拿回另有另一个sum,什么都有守护进程个sum,什么都有用CPU进行最后的加和操作

刚才你要们 使用256个守护进程使用了13377388个时钟周期,现在102另有另一个守护进程的最终使用时间又小了另有另一个数量级,达到了648960 2

另有另一个就会出現另有另一个问题图片,什么都有有 256 个计算结果,什么都有另有另一个存放 result 的内存位置也要扩大。

你要们 还还要想看 即使取得了60 倍的加速,什么都有从内存下行速度 的淬硬层 来看你要们 还什么都有仅仅迈出了第一步,没办法 是什么都有256个守护进程不多哪年?你要们 最多还还要打开哪几块个守护进程呢?你要们 还还要想看 你要们 打印出来的显卡属性含有没办法 四根:

在你要们 的例子中,有 256 个 threads,什么都有同都不 有 256 个 sumOfSquares 函数在执行,但每另有另一个的 threadIdx.x 是不一样的,分别会是 0 ~ 255。什么都有利用有些变量,你要们 就还还要让每另有另一个函数执行时,对整个数据的不同部份计算立方和。

并且也提到过了,你要们 使用

MaxThreadPerBlock : 1024

参考资料:《深入浅出谈CUDA》

首先你要们 先define一下你要们 的Thread数目

有些形式调用核函数,现在这里的守护进程数也要随之改变

最简单的最好的方式,什么都有把数字分成若干组,把各组数字分别计算立方和后,最后再把每组的和加总起来就还还要了。目前,你要们 还还要写得更简单有些,什么都有把最后加总的动作交给 CPU 来进行。

threadIdx 是 CUDA 的另有另一个内建的变量,表示目前的 thread 是第哪几块 thread(由 0 结束英文计算)。

数据量仍然没办法 变 DATA_SIZE 1048576,也什么都有1024*1024 也什么都有 1M

上一篇博客主要讲解了怎样么会去获取核函数执行的准确时间,以及怎样去根据有些时间评估CUDA守护进程的表现,也什么都有推算所谓的内存下行速度 ,博客的最后你要们 计算了在GPU上单守护进程计算立方和的守护进程的内存下行速度 ,发现其内存下行速度 的表现是十分糟糕的,其所使用的内存下行速度 离米 不都可不可以 5M/s,而像GeForce 860 0GTX另有另一个比较老的显卡,也具有超过60 GB/s 的内存下行速度 。

其实你要们 现在想到除了使用多个Thread外,你要们 还还还要去使用多个block,让每个block含有血块的守护进程,你要们 的守护进程数将成千上万,毫无问题图片这对提升下行速度 是很有用的,什么都有们 下一步先把有些事情放一放,为了帮你要们 印象深刻,你要们 插播另有另一个访存方面非常重要的优化,同样还还要大幅提高守护进程的性能。

另有另一个你要们 的守护进程就分在了256个守护进程上进行,帮你要们 看一下这次的下行速度 有无 有有些提升

接着你要们 要修改一下你要们 的kernel函数:

在 CUDA 中,一般的数据克隆qq到的显卡内存的部份,称为global memory。有有哪些内存是没办法 cache 的,什么都有,存取global memory 所还要的时间(即 latency)是非常长的,通常是数百个 cycles。什么都有们 的守护进程不都可不可以 另有另一个 thread,什么都有每次它读取 global memory 的内容,就要等到实际读取到数据、累加到 sum 并且,都可不可以 进行下一步。这什么都有为有哪些表现会没办法 的差,所使用的内存下行速度 没办法 的小。

下面你要们 要把守护进程并行化,没办法 怎样么会把计算立方和的守护进程并行化呢?

什么都有计算使用的下行速度 :

面对你要们 首先还要处里的内存下行速度 问题图片,你要们 首先来分析有些问题图片,什么都有们 将使用并行化来大大改善有些情况汇报。

另外,你要们 让时间计算只在 thread 0进行。

底下什么都有提到过了,要想隐藏IO巨大的Latency,也什么都有能充分利用GPU的优势——巨大内存下行速度 ,最有效的最好的方式什么都有去并行化你要们 的守护进程。现在你要们 还是基于上次单守护进程计算立方和的守护进程,使用多Thread完成守护进程的初步并行。

为有哪些你要们 的守护进程使用的内存下行速度 没办法 小?这里你要们 还要好好讨论一下。