2014-02-16 126 views
0

我面臨着一個巨大的問題。我使用Matlab引擎(engOpen()等)構建了一個帶有嵌入式Matlab函數的複雜C應用程序。會發生以下情況:在同一臺機器上產生matlab的多個副本

  • 我產卵這個應用程序的多個實例一臺機器,一個對每個核心
  • 但是! ...應用程序然後減速停止。實際上,在我的16核機器上,應用程序的速度大約減慢了16倍。
  • 現在我意識到這是因爲每臺機器只有一個sngle matlab引擎,我所有的16個實例共享相同的matlab副本!
  • 我試圖複製這與MATLAB的GUI和它的同樣的問題。我在那個需要14秒GUI運行程序,然後我在兩個GUI在同一時間運行它,它需要28秒

這對我來說是一個巨大的問題,因爲我會想念我的最後期限,如果我必須在沒有matlab的情況下重新編程我的整個c應用程序。我知道matlab有並行編程命令,但我的matlab調用嵌入在C應用程序中,我想運行C應用程序的多個實例。再次,我不能重構我的整個c應用程序,因爲我會錯過最後期限。

任何人都可以請讓我知道是否有解決方案(例如真正開始在同一臺機器上的多個matlab進程)。我願意支付額外的許可證。我目前已經完全清除所有機器上安裝的matlab。

非常感謝!

編輯

謝謝奔福格特的幫助。我發現Matlab的單個實例已經在使用多個內核。實際上,運行一個實例顯示我充分利用了4個內核。如果我運行Matlab的兩個副本,則可以充分利用8個內核。因此它實際上並行運行。但是,儘管有兩個實例看起來佔用了兩倍的處理能力,但我仍然得到2 *的放緩。因此,2個實例似乎以4 *計算能力總計得到兩倍的結果。爲什麼會這樣?

+2

你確定所有16個實例共享一個單核?單個實例似乎更有可能使用全部16個內核,然後更多實例運行速度較慢,因爲它們每個都不具有16個內核。你能分別檢查一個實例和N個實例的利用率嗎? –

+0

謝謝,是的,你是對的。當我運行我的程序的單個實例時,它完全使用4個內核。所以,當我運行超過4個實例(16/4)時,我必然會遇到經濟放緩 – megavore

回答

1

您的減速並不是通過將所有N個實例填充到單個核心上的單個MatLab實例而引起的,而是由於每個實例的處置不再有16個核心。許多MATLAB矢量操作即使沒有顯式並行構造也使用並行計算,因此每個實例需要多個核心才能實現最佳效率。

0

MATLAB庫不是線程安全的。如果您創建多線程應用程序,請確保只有一個線程訪問引擎應用程序。

我認爲matlab引擎是錯誤的技術。對於Windows平臺,您可以嘗試使用com自動化服務器,該服務器具有.Single選項,該選項爲您打開的每個com客戶端啓動一個matlab實例。

替代有:

  • 生成C++的函數的代碼。
  • 創建一個.NET庫。 (NE生成器)
  • 通過命令行運行matlab。
+0

親愛的丹尼爾,非常感謝你的回答。我認爲問題在於,即使我打開多個matlab實例,它仍然會變慢。我試圖打開兩個完全獨立運行的matlab GUI(不同的工作空間等),它仍然放慢了速度。所以看起來在幕後,所有的matlab實例都以某種方式合併成一個執行線程。 – megavore

+0

是否使用了所有matlab實例?據我所知,只有使用註冊的自動化實例,這是第一次啓動。 – Daniel

相關問題