最近尝试了几种并行计算的方法。
1、openMP。这应该是gnu本身自带的一个插件,编译选项只需要加上 -fomp就可以了。使用时在for循环或者需要并行的语句前加上预处理选项。#pragma omp parallel等等,有若干种,整体思路就是把一些无关的函数并行计算。注意,一定是无关的,如果有先后关系的,可能计算结果就有问题了。这个用起来很简单,尤其是for循环等,加速很明显,可以加速到cpu核数倍。
2、TBB。线程构建模块。这个是intel的库,可以让任务并行。不过需要修改代码,从task等扩展出来,以便被TBB管理调用。当然,TBB还有一些存储管理的功能,亲测也可以提速20%以上。但是需要改类的代码,改动不大。加速效果如何没有具体实验。
3、MPI。或MPICH。看官宣,这个已经被用在太湖之光的超算上了。也是个开源库,编译安装都很简单。唯一对已有代码不友好的就是需要把原线程的数据发送到另外的线程,以便加速计算。计算完之后,还要把结果拷贝回来。不过拷贝函数之类的,MPI有现成的函数可以用,用法也还算简单。不过就试用来看,线程和计算函数属于强绑定关系,如果想动态调整函数与线程的绑定关系,很难。就是说如果计算量不是很大的话很容易浪费计算资源。