一些关于并行计算的科研思路

    

    最近想要找点新的点子来优化之前看到的一些立体匹配论文,我之前一直是用图割做立体匹配,刚开始时候用图割做图像分割,后来发现这块都被人做烂了,继续往下看发现图割还能搞立体匹配,效果也挺好。但是后面发现掉大坑里面了。


1.什么是好的research

这篇文章中写到什么是好的research?这篇文章中有讲到(看到的有点晚了)

http://www.52cs.org/?p=632


    创新性高,性能差:俗称的挖坑的工作。这样的工作包括提出一个全新的问题或者对一个已有问题的全新解法。这样的工作虽然可能在文章中只提出了非常简单的baseline,或性能并不能比过最好的已有方法,但是可以启发大量后续的research

很显然用图割算法进行立体匹配就属于这种工作。


    在没有综合对比其他全局优化算法,或者办全局优化算法的时候,我就贸然继续采用图割算法进行立体匹配的工作,仅仅是因为之前看了图割算法,这不能不说是硕士阶段方向性选择的一大失误。


2.科研方向的选择(对于研究生而言尽量选择一个点)

    而我因为不懂科研方向的选择在图割算法立体匹配上下去,现在想想,什么是选择在硕士阶段科研题目的正确方法呢?我觉的对于一般院校的学生来说,应该是一些在小处上能够改进的题目,比如图像分割,人脸表情识别,深度图像增强这种有成熟框架可以替换算法实质内容,又实验方便的科目。

    比如讲图像分割,用聚类算法进行分割,模糊k均值,或者引入图论的相关算法多做些实验,国内的核心期刊还是很好水的。

而对于立体匹配这种偏系统性工程性科研题目。而且在没有师兄师姐代码或者理论基础的情况下,光是自己找代码,自己找例程就

 

 

非常耗费时间。


3.有关图形图像领域的万金油灌水(串行改并行)

    图形图像处理在国内国际有一个万金油灌水领域,其实也可以说是一个偷懒的领域,就是将传统算法并行化处理,下面说说我的思路。如何找到并识别并行的机会呢。最好的方法是用代码性能分析工具分析代码,对cpu占用率较高的部分单独拉出来来。代码分析可以在windows下面用amd的codexl,直接对应exe就能分析出来代码所在的瓶颈。或者用visual studio自带的analysis,或者linux下面免费的oprofile

 

比如下图我随便找了一个立体匹配的程序在codexl中跑过一遍后下面是分析的结果:可以看到热点函数和代码都给找出来了。这就是我们通常说的:

性能分析引导优化(profile-guided optimization)

 



看到程序27%的时间卡在了一个内联函数的直方图相加上。



    可以直接下载一个Intel parallel studio XE 2016之后在vs2010中打开tools运行优化选项,说明文档:

 

如果按照学生身份来注册的话,是免费使用一年的:点击打开链接 

  采用intel 编译器的优化,intel编译器安装好之后在windows下有两种运行方式,一种是命令行,一种是作为visual studio 2010的一个插件工具:
 
 
运行时候需要根据并行优化向导进行一步步配置优化,这基本也算是傻瓜式的优化,其实主要能用到的就是两部分,编译优化和,分析引导优化:


注意到开启不同选项,其优化时间是不同的,甚至更慢:

 



寻找并行化的机会之二:

    检查应用程序中的关键路径。关键路径是确定任务可以在最短时间内完成的一组步骤。下图中显然任务c可以和任务a和b并行。

 

要点:

      除非应用程序用于可并行化代码的时间超过其运行时间的一半,否则其可扩展性有限。我们用profile分析的时候,程序热点代码运行时间在25%-30%以上才有明显的优化效果。

真正能够缩短的运行时间,amdahl定律:



参考文献:

戈夫. 多核应用编程实战[M]. 人民邮电出版社, 2013.

原文地址:https://www.cnblogs.com/wuyida/p/6301292.html