IDL并行运算

为什么要使用并行运算?

用IDL进行数据运算,涉及到大数据的时候往往比较吃力,这时候可以考虑用IDL并行运算来解决。常用的FastDL,TaskDL,mpiDL一类的第三方软件,但这些东西用起来比较麻烦,而且似乎没有windows版,对于我这种只需要简单的并行来说没有必要。于是我发现了idl内置的IDL_IDLBridge功能,它能创建另外的idl进程,这个功能完全能满足简单并行计算的需求。下面从一个简单的实例来看看它需要注意的地方。

比如,有2个数据,分别为data_a和data_b,先把data_a和data_b做10000次乘法,得到data_c;再把data_a和data_b做10000次除法得到data_d,把data_c和data_d相加后得到最终结果。这么一个简单的流程如果一路做下来,是浪费时间的。比如得到data_c和得到data_d的过程是独立的,idl在计算data_c的时候其实就可以同时计算data_d。但你打开任务管理器就会发现idl没有这么干,于是我们得使用IDL_IDLBridge功能来实现并行。

实现方法

看了IDL_IDLBridge的帮助后你可能会这样写程序:

oBridge = OBJ_NEW('IDL_IDLBridge')
oBridge->Execute,'multiply,data_a,data_b,data_c'
oBridge->Execute,'division,data_a,data_b,data_d'
result=data_c+data_d

恭喜你,流程对了,但你的程序还是没有并行起来,因为IDL_IDLBridge::Execute默认是“Synchronous”。执行oBridge->Execute,’multiply,data_a,data_b,data_c’的时候主程序会halt,一直等到它执行完后才会执行完后才会执行oBridge->Execute,’division,data_a,data_b,data_d’。若要异步执行,则需要加入/nowait参数。但显然,事情没这么简单,你若只加入/nowait,他会提示你

IDL_IDLBRIDGE Error: The object's associated IDL process is currently busy.

要异步,上面的代码就要注意2个问题:(1)参数的传递,这可以用SetVar和GetVar来搞定;(2)并行状态控制,用IDL_IDLBridge::Status来查询。

好了,简单的代码可以这样写:

oBridge1 = OBJ_NEW('IDL_IDLBridge')
obridge1->setvar, 'data_a', findgen(10000)
;同样的data_b和data_c也要设置,这里省略
oBridge1->Execute,'multiply,data_a,data_b,data_c',/nowait
print,oBridge1->Status()
;可以看一下状态,运行的时候是1,证明返回主程序了
oBridge2 = OBJ_NEW('IDL_IDLBridge')
;新设置一个进程来并行计算
obridge2->setvar, 'data_a', findgen(10000)
;同样的data_b和data_d也要设置,这里省略
oBridge2->Execute,'division,data_a,data_b,data_d',/nowait
print,oBridge2->Status()
;看看实时状态,电脑不逆天的话也应该是1
while ((oBridge1->Status() EQ 1) or (oBridge2->Status() EQ 1)) do begin
endwhile
;后面要做加法,所以只要还在算,就必须要等
print,oBridge1->Status() & print,oBridge2->Status()
;确认一下状态为0,表示两进程都算完了
c1=oBridge1->GetVar('data_c') &c2=oBridge2->GetVar('data_d')
obj_destroy, obridge1 & obj_destroy, obridge2
;取回数据后释放掉
result=c1+c2

大体思路就是这样,代码显然可以优化。中间的SetVar和GetVar用起来很烦,可以用SHMMAP和SHMVAR来做,common也应该行吧?没试了。另外,idl自己宣称做一些计算会自动并行。好了,这就是简单的在win平台上用IDL_IDLBridge实现IDL并行计算,其他太复杂的计算,或者把idl安装到大机群的还是建议用fortran或者c。

转载自:http://www.wingwy.com/archives/2013_08_1480.html

Matlab利用cpu的多核提高运算速度 IDL创建数组函数整理

作者:,GIS爱好者。
分享本文,请您带上本文链接
分享到:

发表评论