使用“-singleCompThread”在现有的matlabpool中并行运行内部matlab函数

时间:2013-12-03 18:36:25

标签: matlab parallel-processing

我正在为非常大的系统(已知的稀疏结构)实现自适应(近似)矩阵向量乘法 - 请参阅Predicting runtime of parallel loop using a-priori estimate of effort per iterand (for given number of workers)以获得更长篇的描述。我首先确定每个块需要计算的条目,但即使条目只是一个小子集,直接计算它们(正交)也是不可能的。然而,它们的特征是底层结构(它们各自的调制的差异),这意味着我只需要计算每个“等价类”一次的正交,我通过在大的2xN差分矩阵上调用unique得到(然后映射回原始条目)。

不幸的是,这个2xN矩阵在实践中变得如此之大,以至于它在我的代码中变得有点瓶颈 - 这仍然比冗余计算正交的数量级更快,但令人烦恼,因为它原则上运行得更快

问题是我计算的集群需要-singleCompThread选项,因此Matlab不会传播到它不应该的地方。这意味着unique被强制只使用一个核心,即使我可以在它被串行调用的代码中进行排列(因为必须为所有相关块完成此过程)。

我对某个解决方案的搜索引导我使用函数maxNumCompThreads,但它已弃用,将在以后的版本中删除(除了每次调用时都会抛出警告),所以我没有追求它进一步

也可以将函数传递给批处理作业并指定一个集群及其应运行的池化(例如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

2 个答案:

答案 0 :(得分:0)

如果不尝试上面引用的示例,您可以尝试blockproc进行块处理。但它属于Image Processing Toolbox。

答案 1 :(得分:0)

暂时不考虑'rows'问题,如果我理解正确,那么你所使用的是一种使用开放式并行池对'unique'进行大量调用的方法。一种选择可能是使用distributed arrays。例如,你可以这样做:

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

这可行,因为sortrows数组已实现codistributed。如果你可以安排数据总是存在于集群上,并且当数据太大而无法在一台机器上处理数据时,你会发现只能从(共)分布式阵列获得加速。