我使用的是Octave版4.2.2
,但我认为这个问题也适用于以前的版本。
我想知道以下行为是否众所周知并且是由于我的无知或是否是应该解决的错误,以及是否有解决方法。请注意,在无法进行矢量化的情况下,我会关注并行化,并且不能选择按值复制。
基本上,我的问题是pararrayfun
或parcellfun
等函数似乎违反了 句柄的属性通过引用传递的原则 。
例如,假设我们定义
classdef data_class < handle
properties
data
end
end
并且我们想要从这个类的一个对象.data
的{{1}}属性中获取每个元素,对它们应用一些随机函数input_arr
,并将结果复制到相应的此类的另一个对象fancy_func
的{{1}}属性的索引。 .data
属性只是一个大小为arr
的矩阵,我们希望每个处理.data
元素的12*1
个进程。
4
所以,这实际上比我想的更糟糕了:
3
按值复制对象句柄属性elem_per_process=3;
num_processes=4;
start_indexes={1,4,7,10};
function []=fill_arr(start_idx,num_elems,in_arr_handle,arr_to_fill_handle)
for i=1:num_elems
arr_to_fill_handle.data(start_idx+i-1,:)=fancy_func(in_arr_handle.data(start_idx+i-1,:));
end
end
filler=@(start_idx)fill_arr(start_idx,elem_per_process,input_arr,arr);
cellfun(filler,start_indexes);%works fine
parcellfun(num_processes,filler,start_indexes);% PROBLEM! Nothing is copied
一起使用的代码!快速浏览
parcellfun
似乎表明并行化依赖于进程而不是线程(也注意cellfun
在其核心使用<octave_dir>/packages/parallel-3.1.1/parcellfun.m
),所以这是预期的。令我感到困扰的是,它没有一个警告,而是违背许多Octave用户希望持有的基本属性。
所以,总结一下: