CUDA 学习(十六)、优化策略1:并行/串行在GPU/ CPU 上的问题分解

来源:互联网 发布:知乎笑笑 编辑:程序博客网 时间:2024/06/10 05:47

一、问题分解

       这里的基本议题是:这个问题可以被分解成并行运行的组块吗?也就是,是否有机会发掘出问题中的并发性?假设能够把问题分为多个并发快,那接下来的问题是有多少个并发块?CPU并行化的一个主要限制因素经常是没有足够大粒度(或粗粒度)的并行工作要做。GPU运行成千上万的程序,所有问题需要被分解成上千个块,而不是像CPU那样只执行少数并发任务。问题的分解应该总是从数据开始,考虑执行的任务。


二、数据集大小

       数量集的大小使选取问题的解决方案差别巨大。GPU的主要问题不是缓存,而是你能在一张GPU卡上保存多少数据。将数据从主机系统传入或传出会耗费大量的计算时间。为了隐藏这一时间,你应该把计算与数据传输重叠起来执行。在更先进的显卡上,你可以做到同时传入数据。然而,为了实现这一点,你需要使用主机上的锁页内存。由于锁页内存不会被虚拟内存管理系统换出,所以它必须是存在于主机上的真正的DRAM内存。


三、识别瓶颈

1、 Amdahl 定律

        Amdah1 定律常常被并行架构引用。它是很重要的,因为它告诉我们,当数据流中仍然存在串行执行的元素时,将限制速度的提示。

       举个例子,我们程序中50% 的执行时间花费在可以并行化的代码上,另外50% 必须串行执行。当把程序中并行部分的执行时间减少到0,但仍然会留50%的串行代码要执行。在这种情况下,可能的最大加速比是2X,即程序的执行时间是之前的一半。

      即使我们将90%的程序并行化,但仍然存在10%的串行代码。因此,最大的加速比是9X,也就是比原来完全串行的程序快9倍。

       仔细分析代码中存在这样瓶颈的地方,并考虑如何将它们尽量消灭掉。这种瓶颈往往会限制应用程序的最大扩展程度。

2、分析

       分析是确定你当前在哪里以及应该在什么地方多花点时费的最有用的任务之一。英伟达提供了两个很好的工具,分别是CUDA Profiler 和 Parallel Nsight,以提供分析信息。






       











0 0
原创粉丝点击