我正在为非常大的系统(已知的稀疏结构)实现自适应(近似)矩阵向量乘法 - 请参阅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
答案 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
。如果你可以安排数据总是存在于集群上,并且当数据太大而无法在一台机器上处理数据时,你会发现只能从(共)分布式阵列获得加速。