技术开发 频道

我的并行程序设计

  【IT168 技术】

  注:本文为IT168&NVIDIA联合举办的“如何并行化我的应用”方案征集活动参赛作品。本次方案征集活动详情见:http://cuda.itpub.net/thread-1299715-1-1.html。近期活动的大部分方案,将会逐步与大家分享,不可错过哦!

  CUDA ZONE专区:http://cuda.it168.com/

  CUDA技术论坛:http://cuda.itpub.net

  我是一名IT工作者,从事信号处理方面的研发工作。在我的工作中经常遇到需要对大型数据进行复杂处理的情况,比如要对某1000*1024*1024的大数据进行傅里叶变换或者对数据进行高分辨功率谱估计等问题,在遇到这些问题的时候,用串行的编程思想就会出现内存不足、程序运行时间特别长等问题,这显然是十分不合适的。为解决这些问题,我就想到了用并行程序设计方法,并行程序设计方法并不是无迹可寻的,我把设计方法分了四个步骤:

  一、 分析数据大小和计算量;

  二、 分析用并行程序设计的可行性;

  三、 分析并行模块的设计方案并编程

  四、 检查结果的是否合理。

  下面对这几个步骤做具体的说明:

  首先,在解决问题之前分析该问题中数据的大小和计算量大小,如果数据比较小且计算量比较小,那就不用并行处理;如果数据比较大,或者计算量比较大,用常规方法解决会造成程序运行时间特别长的问题,这时就需要考虑用并行程序设计方案了;其次,并不是所有的问题都适合用并行程序处理,比如走迷宫程序等每步都要全局考虑的问题就不合适。于是我们要分析用并行程序设计解决遇到问题的可行性;再次,并行模块设计一般分为数据分块处理和任务分块处理两类模式。数据分块就是指数据较大且可以分段进行处理的情况下,把数据分成几块,分别运行,每块产生的结果再综合处理。例如,解决从1加到10000这个问题时,可以把数据分成5块,每块完成2000个数的相加运算,最后再把得到的5个结果相加,这样接大大的节约了时间;任务分块处理指的是把程序中可以并行的任务分块处理。例如,要比较一个数据的傅里叶频谱与APES谱的分辨率,那就可以把任务分成并行的两块,一块得到数据的傅里叶谱,一块得到数据的APES谱,再把两块得到的结果进行综合比较;最后,用常识分析结果是否合理,要是明显不合理,就需要查找问题,改进方案后再进行处理,直到结果合理为止。

  我最近做的一项工作是用MATLAB对一个大型数据(1000*1024*1024的三维矩阵)中的一部分(A部分)做高分辨谱估计,对另外的数据(B部分)做GAPES处理然后再进行傅里叶变换,最后将两部分得到的结果进行综合分析。在这工作中遇到的主要问题是数据太大,而且两部分数据分别进行的处理都比较繁琐,计算量也特别大,如果用常规方法一步步进行处理,运行程序时要浪费将近一天时间,而且有时会出现溢出的情况,这对我的工作是十分不利的。

  为解决这个问题,我想到了应用并行程序设计。首先我对问题进行了分析,由于两部分不同的数据进行不同的处理,这两项工作之间没有互相限制的情况,所以并行处理时可行的。我对数据进行了分块同时对任务进行了分块处理,把A部分数据进行高分辨谱估计这个整体任务作为一块,B部分数据进行GAPES处理再进行傅里叶变换作为一块,用多核计算机并行处理两个任务,并把最后的到的结果进行综合分析,最后从理论上分析结果的合理性并判定结果合理。这样由于是同时进行两部分处理,这样大节约了程序运行时间,仅需要几个小时就可以得到最后的正确结果,可见我采用的并行化处理是可行的并且是有效的!

0
相关文章