Function 倍频程并行包:用户定义的函数调用问题

Function 倍频程并行包:用户定义的函数调用问题,function,parallel-processing,octave,user-defined,Function,Parallel Processing,Octave,User Defined,我无法使用pararrayfun调用用户定义的函数(对于parcellfun也是如此)。当我执行以下代码时: pkg load parallel function retval = mul(x,y) retval = x*y; endfunction vector_x = 1:2^3; vector_y = 1:2^3; vector_z = pararrayfun(nproc, @(x,y) mul(x,y), vector_x, vector_y) vector_z = parar

我无法使用pararrayfun调用用户定义的函数(对于parcellfun也是如此)。当我执行以下代码时:

pkg load parallel

function retval = mul(x,y)
  retval = x*y;
endfunction

vector_x = 1:2^3;
vector_y = 1:2^3;

vector_z = pararrayfun(nproc, @(x,y) mul(x,y), vector_x, vector_y)
vector_z = pararrayfun(nproc, @(x,y) x*y, vector_x, vector_y)
我得到以下输出:

vector_z =

  -1  -1  -1  -1  -1  -1  -1  -1

vector_z =

    1    4    9   16   25   36   49   64
也就是说,对用户定义函数的调用似乎不起作用,而对匿名函数的调用却起作用

这台机器是x86_64,带有Debian bullseye和5.10.0-1-amd64内核。倍频程的版本是6.1.1~hg.2020.12.27-1。
pkg list
命令提供:

Package Name  | Version | Installation directory
--------------+---------+-----------------------
   dataframe  |   1.2.0 | /usr/share/octave/packages/dataframe-1.2.0
    parallel *|   4.0.0 | /usr/share/octave/packages/parallel-4.0.0
      struct *|  1.0.16 | /usr/share/octave/packages/struct-1.0.16
有趣的是,同样的代码在带有Debian buster和4.14.150-odroidxu4内核的armv7l上完美地工作。即调用用户定义函数,匿名函数生成输出:

parcellfun: 8/8 jobs done
vector_z =

    1    4    9   16   25   36   49   64

parcellfun: 8/8 jobs done
vector_z =

    1    4    9   16   25   36   49   64
在该机器上,Octave的版本是4.4.1,
pkg list
给出:

Package Name  | Version | Installation directory
--------------+---------+-----------------------
   dataframe  |   1.2.0 | /usr/share/octave/packages/dataframe-1.2.0
    parallel *|   3.1.3 | /usr/share/octave/packages/parallel-3.1.3
      struct *|  1.0.15 | /usr/share/octave/packages/struct-1.0.15

有什么问题以及如何修复此行为?

这可能是一个错误,但请注意,新版本的parallel根据its(也请参阅最新版本)引入了一些限制,这些限制可能与此处发生的情况有关

话虽如此,我想澄清这句话:

对用户定义函数的调用似乎不起作用,而与匿名函数相同的调用正在起作用

事实并非如此。在这两种情况下,您都在传递匿名函数。只是第一个调用mul inside,第二个调用mtimes

至于您的错误(bug?),这可能与mul是一个“命令行”功能有关。从文档中不清楚命令行功能是否是一个限制,这只是文档中的一个疏忽,或者对命令行功能的虐待是否是一个真正的bug。我想如果你把它放在它自己的文件里,它应该可以正常工作。(同样,如果您这样做了,则值得直接将其作为句柄传递,而不是将其包装到另一个匿名函数中)

话虽如此,我认为你看到的-1基本上是pararrayfun内部的“错误返回”。原因如下:如果不将mul创建为命令行函数,而是将其设置为匿名函数:

mul = @(x,y) x * y
观察以下三个调用返回的内容:

x = pararrayfun( nproc, @(x,y) mul(x,y), vector_x, vector_y )   # now it works as expected.
x = pararrayfun( nproc, mul, vector_x, vector_y )   # same: mul is a valid handle expecting two inputs
x = pararrayfun( nproc, @mul, vector_x, vector_y )  # x=-1,-1,-1,-1,-1,-1,-1,-1
如果您使用普通数组fun尝试了最后一个命令,那么您可能会看到一个错误,即当mul是正确的句柄时,您意外地传递了@mul而不是mul。在pararrayfun中,它只是进行计算,并且假定-1是内部错误的返回值

我不知道命令行函数失败的确切原因,但大概与pararrayfun在引擎盖下创建单独的倍频程实例有关,这需要访问所有函数定义,而且命令行函数在新实例中的传输/编译可能无法像在父实例中那样容易,因为它们是在当前会话中创建/编译的

在任何情况下,我认为如果不使用命令行函数定义,而是创建一个外部函数,或者(如果处理的是足够简单的函数)一个匿名函数的句柄,就可以解决问题


但是,我仍然会向提交一个bug来帮助项目:)

感谢您澄清情况。建议通过文件
myfunction.m
定义外部函数。我已经将这个问题作为一个潜在的bug提交给了octave bug跟踪器。见: