首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用"-singleCompThread“在现有matlabpool中并行运行matlab内部函数

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

Stack Overflow用户
提问于 2013-12-04 02:36:25
回答 2查看 305关注 0票数 0

我正在为非常大的系统(已知的稀疏结构)实现自适应(近似)矩阵-向量乘法-有关更冗长的描述,请参阅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,而无需请求新的池或向集群提交作业。

有什么想法吗?或者这是不可能的?

致以最好的问候,Axel

Ps。我完全无法理解为什么Matlab中的标准集合函数有一个'rows'- -而没有'cols'-option,特别是因为这将在每个函数中“花费”大约5行代码。这就是使用my_unique的原因

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2013-12-04 04:57:28

在不尝试上面引用的示例的情况下,您可以尝试使用blockproc进行块处理。但是,它属于图像处理工具箱。

票数 0
EN

Stack Overflow用户

发布于 2013-12-04 17:58:17

暂时抛开'rows'问题不谈,如果我没理解错的话,您想要的是一种使用开放的并行池对'unique'进行大型调用的方法。一种选择可能是使用distributed arrays。例如,您可以这样做:

代码语言:javascript
复制
spmd
    A = randi([1 100], 1e6, 2); % already transposed to Nx2
    r = unique(A, 'rows'); % operates in parallel
end

这之所以有效,是因为为codistributed阵列实现了sortrows。您会发现,如果您可以安排数据始终在集群上,并且当数据太大以至于在一台机器上处理它是不可行的时,您只会从(Co)分布式阵列获得加速。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20359010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档