pararrayfun中的小错误?有解决方法(线程与进程)吗?

时间:2018-05-25 22:30:45

标签: octave

我使用的是Octave版4.2.2,但我认为这个问题也适用于以前的版本。

我想知道以下行为是否众所周知并且是由于我的无知或是否是应该解决的错误,以及是否有解决方法。请注意,在无法进行矢量化的情况下,我会关注并行化,并且不能选择按值复制。

基本上,我的问题是pararrayfunparcellfun等函数似乎违反了 句柄的属性通过引用传递的原则

例如,假设我们定义

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用户希望持有的基本属性。

所以,总结一下:

  • 这是(次要的)错误吗?
  • 有没有办法使用线程而不是进程进行并行化(对于无法进行矢量化的情况,以及按值复制的情况是不可接受的)?

0 个答案:

没有答案