gpt4 book ai didi

performance - 为什么批处理模式比 parfor 快这么多?

转载 作者:太空宇宙 更新时间:2023-11-03 19:25:34 25 4
gpt4 key购买 nike

我正在编写 matlab 代码来执行 3 维积分:

function [ fint ] = int3d_ser(R0, Rf, N)
Nr = N;
Nt = round(pi*N);
Np = round(2*pi*N);

rs = linspace(R0, Rf, Nr);
ts = linspace(0, pi, Nt);
ps = linspace(0, 2*pi, Np);

dr = rs(2)-rs(1);
dt = ts(2)-ts(1);
dp = ps(2)-ps(1);

C = 1/((4/3)*pi);
fint = 0.0;
for ir = 2:Nr
r = rs(ir);
r2dr = r*r*dr;
for it = 1:Nt-1
t = ts(it);
sintdt = sin(t)*dt;
for ip = 1:Np-1
p = ps(ip);
fint = fint + C*r2dr*sintdt*dp;
end
end
end

end

对于关联的 int3d_par (parfor) 版本,我打开了一个 matlab 池,并将 for 替换为 parfor。我在更多内核上运行它时获得了相当不错的加速(我的测试是从 2 到 8 个内核)。

但是,当我以批处理模式运行相同的集成时:

function [fint] = int3d_batch_cluster(R0, Rf, N, cluster, ncores)

%%% note: This will not give back the same value as the serial or parpool version.
%%% If this was a legit integration, I would worry more about even dispersion
%%% of integration nodes per core, but I just want to benchmark right now so ... meh

Nr = N;
Nt = round(pi*N);
Np = round(2*pi*N);

rs = linspace(R0, Rf, Nr);
ts = linspace(0, pi, Nt);
ps = linspace(0, 2*pi, Np);

dr = rs(2)-rs(1);
dt = ts(2)-ts(1);
dp = ps(2)-ps(1);

C = 1/((4/3)*pi);

rns = floor( Nr/ncores )*ones(ncores,1);
RNS = zeros(ncores,1);
for icore = 1:ncores
if(sum(rns) ~= Nr)
rns(icore) = rns(icore)+1;
end
end
RNS(1) = rns(1);
for icore = 2:ncores
RNS(icore) = RNS(icore-1)+rns(icore);
end

rfs = rs(RNS);
r0s = zeros(ncores,1);
r0s(2:end) = rfs(1:end-1);

j = createJob(cluster);

for icore = 1:ncores
r0 = r0s(icore);
rf = rfs(icore);
rn = rns(icore);
trs = linspace(r0, rf, rn);
t{icore} = createTask(j, @int3d_ser, 1, {r0, rf, rn});
end

submit(j);
wait(j);
fints = fetchOutputs(j);

fint = 0.0;
for ifint = 1:length(fints)
fint = fint + fints{ifint};
end

end

我注意到它要快得多。为什么以批处理模式执行此集成与在 parfor 中执行此操作不同?

作为引用,我使用 N 测试代码,从 10 和 20(以获取运行时多项式近似中的常量)到更大的数字(例如 1000 和 2000)。该算法将扩展因为我将 thetaphi 方向上的积分节点数指定为给定 N 的常数倍数。

对于 2000 个节点,parfor 版本大约需要 630 秒,而批处理模式下相同数量的节点大约需要 19 秒(其中大约 12 秒只是开销通信,我们也得到 10集成节点)。

最佳答案

在与 Mathworks 支持人员交谈后,我似乎对 parfor 的工作原理存在根本性的误解。我的印象是,parfor 的行为类似于 openMP,而批处理模式在共享内存与分布式内存方面的行为类似于 mpi

事实证明,parfor 实际上也使用了分布式内存。当我创建 4 个批处理函数时,创建新进程的开销发生了 4 次。我认为使用 parfor 会导致该开销仅发生 1 次,然后 parfor 将发生在相同的内存空间中。事实并非如此。

在我的示例代码中,事实证明对于 parfor 的每次迭代,我实际上都承担了创建新线程的开销。在比较“同类”时,我实际上应该创建与 parfor 循环中的迭代相同数量的批处理调用。这就是 parfor 函数花费如此长的时间的原因 - 我为多重处理招致了更多的开销。

关于performance - 为什么批处理模式比 parfor 快这么多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29705974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com