Function 倍频程并行包:用户定义的函数调用问题
我无法使用pararrayfun调用用户定义的函数(对于parcellfun也是如此)。当我执行以下代码时: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
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跟踪器。见: