2013-04-26 25 views

回答

0

你真的應該顯示你的完整代碼。

如果要設置my $ML匿名子過程傳遞給Parallel::Loops那麼你設定只有過程中的價值和值將不會提供給家長。

目前還不清楚你在使用Matlab進程,但是他們不會在他們的父母死後繼續存在,這是你的主程序啓動的子進程之一。

你可以嘗試宣告my @matlabs外循環,然後做

push @matlabs, Win32::OLE->new('Matlab.Application') 

內環路。但是如果你的持續數Matlab進程,那麼爲什麼不只是運行一個簡單的for循環?

1

我不確定在並行循環中創建多個MATLAB COM服務器有什麼好處。

默認情況下,服務器是以共享模式創建的,即由所有實例共享。 MATLAB引擎作爲單線程向用戶公開,因此在您的情況下,所有客戶端計算都以串行方式運行,而不是並行運行。

幸運創建專用模式MATLAB COM服務器:

Win32::OLE->new('Matlab.Application.single') 

this page更多信息

PS:我知道很少的Perl :)

+0

的Win32 :: OLE- > new('Matlab.Application.single')被測試工作,我們可以啓動Matlab的幾個實例併發送命令給它們以執行UTE。將檢查它是否仍然在並行循環中工作。 – Frank 2013-04-26 23:17:00

+0

我應該指出,MATLAB有一個產品([PCT工具箱](http://www.mathworks.com/products/parallel-computing/)),它添加了一個'parfor'構造器來並行化多個後臺工作者的計算,集成進入語言本身 – Amro 2013-04-27 13:54:09

0

中並行::循環沒有測試使用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循環之前分配的任務,並在該循環之後收集/合併結果。

0

隨着進一步的實驗,發現並行::循環的錯誤和的Win32 :: OLE(0.1709)錯誤0x800706be的錯誤:「遠程過程調用失敗免費錯誤的池使用時中並行:: ForkManager可以通過兩種建議從http://www-01.ibm.com/support/docview.wss?uid=swg21261292http://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;'); 
+0

Win32 :: OLE只能從本地機器啓動Matlab,遠程調用或者不能工作,或者只能執行「退出」命令。通過像Gearman這樣的其他Perl模塊進行分佈式計算也失敗了。即使系統內部PsExec使用Matlab「-r」選項失敗。只有到目前爲止測試過的Python的RPyC可以做真正的分佈式計算。 – Frank 2013-05-02 20:32:55

+0

有趣的實驗。我沒有這方面的經驗,但根據文檔,要使用DCOM,您需要在輸入中指定遠程服務器:http://search.cpan.org/~jdb/Win32-OLE-0.1709/lib/Win32 /OLE.pm#Win32 – Amro 2013-05-10 02:47:03

相關問題