在 matlab 中使用 spmd(并行)将函数应用于矢量的各个部分
use spmd in matlab (parallel) to apply a function to parts of vector
我正在使用并行计算工具箱在 MatLab 中工作。
任务
我有一个 vector v。我有 4 个核心。
我想在每个核心上拆分矢量(因此每个核心处理矢量的 1/4,假设长度(v)可被 4 整除)并在每个部分上应用函数 f()。
所以对于核心 1:
f1 = f(属于第1部分的v)
对于核心 2:
f2 = f(属于第2部分的v)
等等。
然后我想收集结果,以便在这之后我有:
f = "one vector containing all elements of f1, and all elements of f2, etc."
在主要核心上(如果你愿意,可以使用 root ,也许 MatLab 称之为 "client",但我不确定)。
尝试
spmd
v_dist = codistributed( v ); %split v onto cores
lpv = getLocalPart( v_dist ); %this core's part ("my part")
f1 = f( lpv ); %apply f to my part of v
%I want to piece back together the outputs?
f_tmp = codistributed( zeros(length(f1) * 4, 1) );
%get my part of the container where I want to put the output
f_tmp_lp = getLocalPart( f_tmp );
%now actually put my part of the output here:
f_tmp_lp = f1;
%and then finally piece back together my part into
f_tmp = codistributed.build( f_tmp_lp, getCodistributor( f_tmp ) );
end
%we should gather the output on the client?
f = gather( f_tmp );
还有?
这没有按预期工作。我确实得到了 f 的正确大小,但不知何故似乎发生的是 "lpv" 只是给予每个核心的相同部分。但我不确定这是否是问题所在。
求助?
我没有做过很多MatLab并行编程。我将如何完成我的任务?
我认为您的代码非常接近,但我认为您不需要 f_tmp
。这是一个例子:
v = 1:10;
spmd
v_dist = codistributed(v);
lpv = getLocalPart(v_dist);
f1 = sqrt(lpv);
v2 = codistributed.build(f1, getCodistributor(v_dist));
end
assert(isequal(gather(v2), sqrt(v)));
我正在使用并行计算工具箱在 MatLab 中工作。
任务
我有一个 vector v。我有 4 个核心。 我想在每个核心上拆分矢量(因此每个核心处理矢量的 1/4,假设长度(v)可被 4 整除)并在每个部分上应用函数 f()。
所以对于核心 1: f1 = f(属于第1部分的v)
对于核心 2: f2 = f(属于第2部分的v)
等等。
然后我想收集结果,以便在这之后我有: f = "one vector containing all elements of f1, and all elements of f2, etc." 在主要核心上(如果你愿意,可以使用 root ,也许 MatLab 称之为 "client",但我不确定)。
尝试
spmd
v_dist = codistributed( v ); %split v onto cores
lpv = getLocalPart( v_dist ); %this core's part ("my part")
f1 = f( lpv ); %apply f to my part of v
%I want to piece back together the outputs?
f_tmp = codistributed( zeros(length(f1) * 4, 1) );
%get my part of the container where I want to put the output
f_tmp_lp = getLocalPart( f_tmp );
%now actually put my part of the output here:
f_tmp_lp = f1;
%and then finally piece back together my part into
f_tmp = codistributed.build( f_tmp_lp, getCodistributor( f_tmp ) );
end
%we should gather the output on the client?
f = gather( f_tmp );
还有?
这没有按预期工作。我确实得到了 f 的正确大小,但不知何故似乎发生的是 "lpv" 只是给予每个核心的相同部分。但我不确定这是否是问题所在。
求助?
我没有做过很多MatLab并行编程。我将如何完成我的任务?
我认为您的代码非常接近,但我认为您不需要 f_tmp
。这是一个例子:
v = 1:10;
spmd
v_dist = codistributed(v);
lpv = getLocalPart(v_dist);
f1 = sqrt(lpv);
v2 = codistributed.build(f1, getCodistributor(v_dist));
end
assert(isequal(gather(v2), sqrt(v)));