Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将双循环并行化为数组作业(Matlab+;bash)_Bash_Matlab - Fatal编程技术网

将双循环并行化为数组作业(Matlab+;bash)

将双循环并行化为数组作业(Matlab+;bash),bash,matlab,Bash,Matlab,我在Matlab中有一个双循环。我希望您能帮助我将其作为数组作业与bash文件在我所在大学的HPC中进行并行处理 重要1:我无法使用parfor,因为我没有Matlab并行工具箱 重要提示2:请不要太注意代码的内容。这是一个愚蠢的例子,显然不需要任何并行化。我的实际代码要复杂得多,我不能在这里报告。我可以向您保证,对于我的具体情况,将并行化作为阵列作业是最有效的解决方案 这是我想并行化的原始Matlab文件 clear rng default m=4; n=2; A=randn(m,n);

我在Matlab中有一个双循环。我希望您能帮助我将其作为数组作业bash文件在我所在大学的HPC中进行并行处理

重要1:我无法使用parfor,因为我没有Matlab并行工具箱

重要提示2:请不要太注意代码的内容。这是一个愚蠢的例子,显然不需要任何并行化。我的实际代码要复杂得多,我不能在这里报告。我可以向您保证,对于我的具体情况,将并行化作为阵列作业是最有效的解决方案


这是我想并行化的原始Matlab文件

clear
rng default

m=4;
n=2;
A=randn(m,n);
g=5;
B=randn(g,n);

result=cell(m,1);
for i=1:m %LOOP 1
    result{i}=zeros(g,n);
    for h=1:g %LOOP 2
        result{i}(h,:)=A(i,:)+B(h,:);
    end
end

我知道如何将外部循环(循环1)作为阵列作业并行化。我可以这样做

1)文件main.m

clear
rng default

m=4;
n=2;
A=randn(m,n);

g=5;
B=randn(g,n);

workers=m; %number of parallel workers
jobs=1; %number of jobs per parallel worker
%% Select local part of A
idtemp=str2double(getenv('SGE_TASK_ID'));
A_local=A(jobs*(idtemp-1)+1: idtemp*jobs,:);

%% Do the job
result=zeros(g,n);
for h=1:g
    result(h,:)=A_local+B(h,:);
end

%% Save the job                      
filename = sprintf('result.%d.mat', ID);
save(filename,'result')  
2)文件f_.s.m

clear
rng default

m=4;
n=2;
A=randn(m,n);

g=5;
B=randn(g,n);

workers=m; %number of parallel workers
jobs=1; %number of jobs per parallel worker
%% Select local part of A
idtemp=str2double(getenv('SGE_TASK_ID'));
A_local=A(jobs*(idtemp-1)+1: idtemp*jobs,:);

%% Do the job
result=zeros(g,n);
for h=1:g
    result(h,:)=A_local+B(h,:);
end

%% Save the job                      
filename = sprintf('result.%d.mat', ID);
save(filename,'result')  
2)在HPC终端中发布以下bash文件:

#$ -S /bin/bash
#$ -l h_vmem=3G
#$ -l tmem=3G
#$ -l h_rt=480:0:0
#$ -cwd
#$ -j y

#Run 4 tasks where each task has a different $SGE_TASK_ID ranging from 1 to 4
#$ -t 1-4

#$ -N example
date
hostname


#Output the Task ID
echo "Task ID is $SGE_TASK_ID"

/share/apps/matlabR2018b/bin/matlab -nodisplay -nodesktop -nojvm -nosplash -r "main; ID = $SGE_TASK_ID; f_s; exit"
问题:如何使用上述相同的数组作业技术来并行内部循环(循环2)(非PARFOR)?基本上,我想从
f_.m
打开另一棵“树”。我不确定的是如何设置新的SGE_任务ID。

你说的“不是PARFOR”,但我将忽略这一点,因为你的评论(至少对我来说)表明,
PARFOR
绝对是适合这项工作的工具(我会说,在我编写特性时,我将推荐你使用;)。但是我要保持这个简短,因为如果你没有一个MATLAB并行服务器许可证,那么下面的内容就行不通了。但如果MATLAB并行服务器可用,下面是您将要做的。(这将在后台使用SGE作业数组,并允许您使用nice
parfor
语法进行设置)

  • 将您的代码构造为一个
    parfor
    循环,并在本地进行测试,以确保它在小范围内工作
  • 按照说明设置客户端,使其能够与SGE群集通信
  • 用于放大到直接在集群上运行
    parfor
    循环,有点像这样

  • parforOptions
    对象允许您定制集群上的运行方式。

    您说过“不是PARFOR”,但我将忽略这一点,因为您的评论(至少对我来说)表明
    PARFOR
    绝对是这项工作的正确工具(我要说的是,在我写这个特性时,我将推荐您使用;))。但是我要保持这个简短,因为如果你没有一个MATLAB并行服务器许可证,那么下面的内容就行不通了。但如果MATLAB并行服务器可用,下面是您将要做的。(这将在后台使用SGE作业数组,并允许您使用nice
    parfor
    语法进行设置)

  • 将您的代码构造为一个
    parfor
    循环,并在本地进行测试,以确保它在小范围内工作
  • 按照说明设置客户端,使其能够与SGE群集通信
  • 用于放大到直接在集群上运行
    parfor
    循环,有点像这样


  • parforOptions
    对象允许您定制集群上的运行方式。

    MATLAB有非常强大的pararel工具。例如,它将在大多数内部构建中使用线程级并行化(我已经在64个内核中使用过它,它将所有内核用于基本操作,例如矩阵乘法)。最重要的是,它有
    parfor
    来并行for循环。为什么要跳过所有这些而使用bash呢?是的,启动200个MATLAB实例要比启动1200个踏板慢得多。启动MATLAB实例的价值何在?我不知道。无论如何,和往常一样,并行化的最佳方法总是受到代码本身的影响,因此我不能在本主题中提供更多建议,因为真正的代码是需要的。当然,我只是想帮你。在页面中询问问题的人中,有一半总是询问一个问题的尝试解决方案,而不是问题本身,而且这种尝试往往被误导。你似乎知道自己在做什么,只是不明显你不必要地跳过了简单的
    parfor
    ,但现在是这样了。祝你好运。你可以对两个循环使用相同的方案,但将所有数据放回一起会更复杂。简单地把这两个循环看作是一个循环,循环<代码> M*G/<代码>倍,任务ID是代码> i*g+h 。例如,它将在大多数内部构建中使用线程级并行化(我已经在64个内核中使用过它,它将所有内核用于基本操作,例如矩阵乘法)。最重要的是,它有
    parfor
    来并行for循环。为什么要跳过所有这些而使用bash呢?是的,启动200个MATLAB实例要比启动1200个踏板慢得多。启动MATLAB实例的价值何在?我不知道。无论如何,和往常一样,并行化的最佳方法总是受到代码本身的影响,因此我不能在本主题中提供更多建议,因为真正的代码是需要的。当然,我只是想帮你。在页面中询问问题的人中,有一半总是询问一个问题的尝试解决方案,而不是问题本身,而且这种尝试往往被误导。你似乎知道自己在做什么,只是不明显你不必要地跳过了简单的
    parfor
    ,但现在是这样了。祝你好运。你可以对两个循环使用相同的方案,但将所有数据放回一起会更复杂。简单地将两个循环视为一个循环,迭代<代码> M*G/<代码>时间,并且您的任务ID是