MatLab:在并行计算中获取用户名

MatLab: get username in Parallel Computing

我在我办公室的几台计算机上使用 MatLab Parallel Computing Toolbox:我已经建立了一个由自定义调度程序(MatLab 自己的类型:MJS)管理的集群。

只要我 运行 脚本和函数在每台 PC 上具有相同的路径(例如 C:\Sample.m),一切似乎都 运行 顺利,但不幸的是我需要访问每台计算机的 Dropbox 文件夹中的功能(例如文件 C:\Users\myusername\Dropbox\Sample.m)。

为了解决这个问题,我尝试了这样的方法:

parfor j=1:100
   myusername=getenv('username');
   cd(['C:\Users\',myusername,'\Dropbox'])
   Sample(1,2,3);
end    

但是使用此代码,cd 函数将当前文件夹设置在 C:\Users\SYSTEM\Dropbox 中,显然它无法在其中找到 Sample.m。

有人能解决这个问题吗?

这里有多种选择。首先,您可以简单地在 parfor 循环

之外计算您的用户名
myusername = getenv('username');
parfor ...
    ...
    cd(['c:\Users\', myusername, '\Dropbox']);
    ...
end

如果您运行使用较新版本的 MATLAB,那么自动依赖性分析应该会在需要时将您需要的功能传输给工作人员 - 您使用的是哪个版本?您可以使用 listAutoAttachedFiles 查看哪些文件已附加到您的池中。

最后,如果您让 MJS 管理员 run at security level 3,那么工作人员将 运行 使用您的凭据,并且 getenv('username') 将按照您对工作人员的期望行事。

我通过创建一个名为 "nome":

的函数解决了这个问题
function [username]=nome()
     username='Stefano';
end

我将此函数放在集群中每台 PC 的 matlabroot 中,但我没有将 'Stefano' 放在每台 PC 中,而是放置了放置 Dropbox 函数的用户名。我必须以正确的方式使用 cd

cdorig=cd;
spmd
    cd(matlabroot);
    username=nome();
end

spmd
   mypath=strsplit(cdorig,'\');
    mypath{3}=username;
    cd(fullfile(mypath{1:end}));  
end

而且有效。