这让我很困惑。
我编写了一个函数parObjectiveFunction
,它使用createJob
和createTask
并行运行多个模拟。它将一个objectiveFunction
作为参数,该被更深入地传递到代码中,以计算每个模拟的目标函数值。
当我从找到objectiveFunction
的目录中运行parObjectiveFunction
时,它按预期工作,但是当我向上一级时,它再也找不到objectiveFunction
了。我得到的具体错误是
Error using parallel.Job/fetchOutputs (line 1255)
An error occurred during execution of Task with ID 1.
Error in parObjectiveFunction (line 35)
taskoutput = fetchOutputs(job);
Caused by:
Error using behaviourObjective/getPenalty (line 57)
Undefined function 'objectiveFunction' for input arguments of type 'double'.
(行为目标是一个对象(
这很奇怪,原因有几个。
objectiveFunction
肯定在path
,当我尝试which objectiveFunction
时,它指向正确的功能。 我在其他目录中有更深层次代码的其他组件,并且没有问题地找到它们(它们是对象而不是函数,但这应该没有区别(。parObjectiveFunction
中有一行代码可以运行模拟,当我直接在 matlab 命令窗口中运行它时,它会发现objectiveFunction
没有问题。 我在本地计算机和 HPC 服务器上得到相同的结果。
我的第一个想法是,单个任务可能有自己的path
不包括objectiveFunction
,但这应该会给其他组件带来问题(它没有(。这个问题很复杂,因为我无法弄清楚如何调试并行代码。
我做错了什么?产生该问题的代码如下所示。
是否存在任何已知问题,即 matlab 在以下情况下找不到函数 使用并行处理与
createJob
、createTask
、submit
和fetchOutputs
?。- 当问题出现时,如何在 matlab 中进行调试 仅在并行运行时?我的打印语句均未显示。
要使某些东西适用于外部测试需要相当多的黑客攻击,但为了这个问题,并行函数是:
function penalty = parObjectiveFunction(params, objectiveFunction, N)
% Takes a vector of input parameters, runs N instances of them in parallel
% then assesses the output through the objectiveFunction
n = params(1);
np = params(2);
ees = params(3);
ms = params(4);
cct = params(5);
wt = params(6);
vf = params(7);
dt = 0.001;
bt = 10;
t = 10;
c = parcluster;
job = createJob(c);
testFunction = @(run_number)behaviourObjective(objectiveFunction,n,np,ees,ms,cct,wt,vf,t,dt,bt,run_number);
for i = 1:N
createTask(job, testFunction, 1, {i});
end
submit(job);
wait(job);
taskoutput = fetchOutputs(job);
pensum = 0;
for i = 1:N
pensum = pensum + taskoutput{i}.penalty;
end
penalty = pensum/N;
end
听起来您需要将一些其他文件附加到您的job
。您可以通过运行listAutoAttachedFiles
来查看 MATLAB 的依赖分析选取了哪些文件,即
job.listAutoAttachedFiles()
如果这没有显示您的objectiveFunction
,那么您可以通过修改job
的AttachedFiles
属性来手动附加它。
不过,似乎objectiveFunction
是一个function_handle
,所以你可能需要这样的事情:
f = functions(objectiveFunction)
job.AttachedFiles = {f.file}