我正在爲非常大的系統(已知稀疏結構)實現自適應(近似)矩陣向量乘法 - 請參閱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
感謝您的提示,也許這是一個可行的解決方案 - 我會盡快檢查出來。我已經瞭解了'spmd',但沒有看到它,因爲a),我誤以爲它意味着「單個處理器,多個數據」而不是「單個**程序**,多個數據」,以及b),因爲我覺得「多個數據」部分與我正在尋找的部分是相反的 - 即將許多工人設置在單個基準面上(大尺寸)。 – Axel
我已經在打開的matlabpools中使用不同數量的worker(3,6,12,64,128)代碼(使用'5e7'而不是'1e6'),並且在本地池和簇中都觀察不到縮放不幸的是,無論如何。 – Axel