2013-12-03 22 views
0

我正在爲非常大的系統(已知稀疏結構)實現自適應(近似)矩陣向量乘法 - 請參閱Predicting runtime of parallel loop using a-priori estimate of effort per iterand (for given number of workers)以獲取更長的描述。我首先確定每個塊需要計算的條目,但即使這些條目只是一個小子集,直接計算它們(使用正交)也是不可能的。然而,它們的特點是底層結構(它們各自的調製方式的差異),這意味着我只需要對每個「等價類」計算一次正交,我通過在大的2xN矩陣差異上調用unique得到(然後映射回到原來的條目)。在現有matlabpool中並行運行內部matlab函數,使用「-singleCompThread」

不幸的是,這個2xN矩陣在實踐中變得如此之大,以至於它在我的代碼中變得有些瓶頸 - 它的數量級仍然比冗餘計算正交快,但是令人討厭,因爲它可以運行得更快原理。

問題是,我計算的集羣需要-singleCompThread選項,以便Matlab不會傳播它不應該在的位置。這意味着unique被迫僅使用一個內核,即使我可以將它安排在串行調用的代碼中(因爲必須爲所有相關塊完成此過程)。

我一個解決方案搜索已經使我的功能maxNumCompThreads,但它已取消,將在未來的版本中刪除(除了每次叫時拋出警告),所以我沒有進一步的追求它。

也可以給一個函數傳遞給批處理作業,並指定一個集羣,它應該在運行poolsize(如j=batch(cluster,@my_unique,3,{D,'cols'},'matlabpool',127);這是2013a;在2013b,爲'matlabpool'關鍵改爲'Pool'),但問題該批次是否會打開一個新池。在我目前的設置中,我可以在集羣上擁有一個永久打開的池,並且需要大量的不必要的時間來總是打開和關閉池(batch)(除了我可以打開的池的最大大小會減少)。

我想要以這樣的方式調用unique,它利用當前打開的matlabpool,而不向集羣請求新的池或提交作業。

任何想法?或者這是不可能的?

最好的問候, 阿克塞爾

詩篇。對於我來說,Matlab中的標準集函數有一個'rows' - 但不是'cols'-選項,這對我來說是完全不可理解的,特別是因爲這會在每個函數中「花費」大約5行代碼。這是my_unique的原因:

function varargout=my_unique(a,elem_type,varargin) 
% Adapt unique to be able to deal with columns as well 

% Inputs: 
% a: 
%  Set of which the unique values are sought 
% elem_type (optional, default='scalar'): 
%  Parameter determining which kind of unique elements are sought. 
%  Possible arguments are 'scalar', 'rows' and 'cols'. 
% varargin (optional): 
%  Any valid combination of optional arguments that can be passed to 
%  unique (with the exception of 'rows' if elem_type is either 'rows' 
%  or 'cols') 
% 
% Outputs: 
% varargout: 
%  Same outputs as unique 

if nargin < 2; elem_type='scalar'; end 
if ~any(strcmp(elem_type,{'scalar','rows','cols'})) 
    error('Unknown Flag') 
end 

varargout=cell(1,max(nargout,1)); 

switch (elem_type) 
    case 'scalar' 
     [varargout{:}]=unique(a,varargin{:}); 
    case 'rows' 
     [varargout{:}]=unique(a,'rows',varargin{:}); 
    case 'cols' 
     [varargout{:}]=unique(transpose(a),'rows',varargin{:}); 
     varargout=cellfun(@transpose,varargout,'UniformOutput',false); 
end 

end 

回答

0

,但不嘗試你在上面舉的例子,你可以嘗試blockproc做塊處理。但是,它屬於圖像處理工具箱。

0

暫且拋開'rows'的問題,如果我已經正確理解,你所追求的是一種使用開放並行池對'unique'進行大量調用的方法。一種選擇可能是使用distributed arrays。例如,你可以這樣做:

spmd 
    A = randi([1 100], 1e6, 2); % already transposed to Nx2 
    r = unique(A, 'rows'); % operates in parallel 
end 

這工作,因爲sortrowscodistributed陣列來實現。如果您可以安排數據始終存在於羣集中,並且數據太大以至於無法在一臺機器上處理數據,那麼您會發現只能從(共)分佈式數組中獲得加速。

+0

感謝您的提示,也許這是一個可行的解決方案 - 我會盡快檢查出來。我已經瞭解了'spmd',但沒有看到它,因爲a),我誤以爲它意味着「單個處理器,多個數據」而不是「單個**程序**,多個數據」,以及b),因爲我覺得「多個數據」部分與我正在尋找的部分是相反的 - 即將許多工人設置在單個基準面上(大尺寸)。 – Axel

+0

我已經在打開的matlabpools中使用不同數量的worker(3,6,12,64,128)代碼(使用'5e7'而不是'1e6'),並且在本地池和簇中都觀察不到縮放不幸的是,無論如何。 – Axel