2013-02-18 68 views
0

基本上,我有一個大對象,我想執行一些功能,這很適合並行處理。在這個例子中,我有一個大矩陣,我想計算列向量之間的所有成對內積。調整並行性能

請看下面的IPython Notebook

我意識到@interactive裝飾是沒有必要在這種情況下,我試圖消除@require裝飾,但其影響可以忽略不計。

我的問題是:有什麼方法可以改善並聯機器的性能嗎?

我不知道map方法的實現細節,我可以通過推動與視圖中的引擎並行執行的函數來避免開銷嗎?儘管如此,我無法想象它會隨每個參數一起發送。

將自變量列表自己分塊並編寫遠程使用的函數,該函數似乎也很愚蠢。

我試過四核心機器上的筆記本電腦,筆記本電腦的結果是兩個核心機器。

回答

1

此處的主要性能問題是,您應用的Fortran連續優化不能在網絡傳輸中存活,因此引擎上的matpush之後是C連續的,而不是F連續的。

print mat.flags 
%px print mat.flags 

添加:

你可以看到這個

%px mat = numpy.asfortranarray(mat) 

應該把你的性能恢復(在我的筆記本電腦的tweaked version所示)。

爲了診斷這個問題,我盡了最大努力來隔離瓶頸。對此有用的是和AsyncResult.wall_time。當serial_time很長時,這意味着該任務實際上在引擎上花費很長時間,而不是花費大量時間在IPython管道中。這導致我認爲任務本身在引擎上很慢,所以我在一個引擎上遠程執行任務,並且它仍然很慢(沒有任何並行參與)。這裏的a notebook追查問題。

旁註:

@interactive裝飾,只需要對那些交互方式定義(即模塊的功能,在筆記本定義不是函數)的功能,所以它是在你的筆記本是多餘的。

+0

太棒了,謝謝你的時間和精力。我甚至沒有想到內存佈局可能會改變。 – Midnighter 2013-02-19 19:19:36

+0

對於數組的零拷貝發送,IPython要求它們是連續的。爲此,IPython使用'ascontiguousarray',它實際上最終將F連續數組強制轉換爲C連續數組,儘管它可能不需要(它可能*有時*,取決於切片)。我將研究在F-contiguous數組的零拷貝發送中會涉及哪些內容以避免這種奇怪的情況。 – minrk 2013-02-19 20:43:54