當Parallel::Loops
與Win32::OLE
組合以創建Matlab的多個實例,如果我們在每個循環中使用可以並行使用Win32 :: OLE來啓動多個Matlab實例嗎?
my $ML = Win32::OLE->new('Matlab.Application') or die "Cannot start MATLAB"
,程序崩潰表示未處理的異常。
如果在$ML
之前刪除my
,那麼它可以工作,但是在任何時候只有一個實例正在運行。
當Parallel::Loops
與Win32::OLE
組合以創建Matlab的多個實例,如果我們在每個循環中使用可以並行使用Win32 :: OLE來啓動多個Matlab實例嗎?
my $ML = Win32::OLE->new('Matlab.Application') or die "Cannot start MATLAB"
,程序崩潰表示未處理的異常。
如果在$ML
之前刪除my
,那麼它可以工作,但是在任何時候只有一個實例正在運行。
你真的應該顯示你的完整代碼。
如果要設置my $ML
內匿名子過程傳遞給Parallel::Loops
那麼你設定只有子過程中的價值和值將不會提供給家長。
目前還不清楚你在使用Matlab
進程,但是他們不會在他們的父母死後繼續存在,這是你的主程序啓動的子進程之一。
你可以嘗試宣告my @matlabs
外循環,然後做
push @matlabs, Win32::OLE->new('Matlab.Application')
內環路。但是如果你的持續數Matlab
進程,那麼爲什麼不只是運行一個簡單的for
循環?
我不確定在並行循環中創建多個MATLAB COM服務器有什麼好處。
默認情況下,服務器是以共享模式創建的,即由所有實例共享。 MATLAB引擎作爲單線程向用戶公開,因此在您的情況下,所有客戶端計算都以串行方式運行,而不是並行運行。
幸運創建專用模式MATLAB COM服務器:
Win32::OLE->new('Matlab.Application.single')
見this page更多信息
PS:我知道很少的Perl :)
中並行::循環沒有測試使用Win32 :: OLE啓動Matlab的多個實例,但Parellel :: Forkmanager通過使用Amro的「單個」技巧並從http://www.perlmonks.org/bare/?node_id=894058得知「CoInitialize尚未被調用」的錯誤:
循環使用前:
use Win32::OLE; # qw(EVENTS); #Win32::OLE(0.1709) error 0x800401f0: "CoInitialize has not been called"
Win32::OLE->Initialize();
和循環使用中:
my $ML = Win32::OLE->new('Matlab.Application.single') or die "Cannot start MATLAB";
$ML->{'Visible'}=0;
$ML->Execute('try;cd \''.$wkdir.'\';'.$executable.' '.$file.' '.$countfile.';catch;end;quit;');
的只是使用的使用OLE instesd目的:
system('matlab -automation -wait -r "try;cd \''.$wkdir.'\';'.$executable.' '.$file.' '.$countfile.';catch;end;quit;');
是隱藏了Matlab窗口,我們只是想要它做的工作,但我們得到的榮譽。使用Perl實現並行化的matlab parfor效果,我們可以讓所有可用的CPU忙於執行parellel循環之前分配的任務,並在該循環之後收集/合併結果。
隨着進一步的實驗,發現並行::循環的錯誤和的Win32 :: OLE(0.1709)錯誤0x800706be的錯誤:「遠程過程調用失敗或免費錯誤的池使用時中並行:: ForkManager可以通過兩種建議從http://www-01.ibm.com/support/docview.wss?uid=swg21261292和http://search.cpan.org/~gsar/libwin32-0.191/OLE/lib/Win32/OLE/TPJ.pod關於沉默的警告,避免所有的代碼需要包括並行循環裏面,這是工作版本:
require Win32::OLE;
import Win32::OLE;
Win32::OLE->Initialize();
no warnings qw(once);
$Win32::OLE::Warn = 0;
my $ML = Win32::OLE->new('Matlab.Application.single') or die "Cannot start MATLAB";
$ML->{'Visible'}=0;
$ML->Execute('try;cd \''.$wkdir.'\';'.$executable.' '.$file.' '.$countfile.';catch;end;quit;');
Win32 :: OLE只能從本地機器啓動Matlab,遠程調用或者不能工作,或者只能執行「退出」命令。通過像Gearman這樣的其他Perl模塊進行分佈式計算也失敗了。即使系統內部PsExec使用Matlab「-r」選項失敗。只有到目前爲止測試過的Python的RPyC可以做真正的分佈式計算。 – Frank 2013-05-02 20:32:55
有趣的實驗。我沒有這方面的經驗,但根據文檔,要使用DCOM,您需要在輸入中指定遠程服務器:http://search.cpan.org/~jdb/Win32-OLE-0.1709/lib/Win32 /OLE.pm#Win32 – Amro 2013-05-10 02:47:03
的Win32 :: OLE- > new('Matlab.Application.single')被測試工作,我們可以啓動Matlab的幾個實例併發送命令給它們以執行UTE。將檢查它是否仍然在並行循環中工作。 – Frank 2013-04-26 23:17:00
我應該指出,MATLAB有一個產品([PCT工具箱](http://www.mathworks.com/products/parallel-computing/)),它添加了一個'parfor'構造器來並行化多個後臺工作者的計算,集成進入語言本身 – Amro 2013-04-27 13:54:09