- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写 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)。该算法将扩展因为我将 theta
和 phi
方向上的积分节点数指定为给定 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/
我正在运行遗传算法,并且正在尝试并行化种群生成。 我的实际代码: Q = []; parfor i=1:halfPop pa = P(select(f),:); pb = P(sele
为什么即使 MATLAB 不应该转到 switch 语句的第一个 case,它也会抛出错误?下面是最小的例子: mycase = 2; non_crack_bytes = 1:6000; syn_cr
有人知道为什么这不起作用吗?我正在尝试运行 parfor 循环。我可以使用简单的 for 循环执行完全相同的代码,但我需要将其与 parfor 一起用于海量数据集。 parfor n = [1:row
在这段最小的可执行代码中: a = []; workers = parpool('local',4); someboolean = false; parfor i = 1:4 if someb
我正在使用 fminsearch 将模型拟合到多个数据集,并且我正在尝试并行执行它们。我的代码一直运行到 parfor 循环的开始,但是 parfor 循环似乎要花很长时间 才能开始! (不执行 pa
我有一组图像 (~10^7),它们包含在一个巨大的二进制文件中。我想使用我已有的功能有效地阅读和分析它们。代码中该用户函数 foo 的每次迭代大约需要 0.1 秒,因此代码使用读取数据库的简单 for
我正在运行一个带有 parfor 循环的小脚本。该脚本以以下行开头: parfor i=1:length(vX) fprintf('%d/%d\n',i,length(X)); ...
我有一个句柄类: classdef A
在 parfor 循环中,我试图调用一个访问 global 的函数但无济于事。 函数 function a = getA() global OPTIONS; a=OPTIONS.PROBL
我有一段代码可以在一系列图像中找到哈里斯角点。我需要对 92 张图像执行此操作,但速度相当慢。因此,我想并行运行代码。我下面的代码有一个与变量“corners”相关的错误 %% Harris corn
有人知道在 matlab 中使用 parfor 的这段简单代码中发生了什么吗?谢谢, 我将一个矩阵分成四个数组,并想独立更新每个数组中的元素 这是一个简单的版本: a = zeros(4,4); p
我在 parfor 循环中生成加扰的准蒙特卡罗数时遇到问题。 问题是,当我在 parfor 循环中生成多组这些数字时,每组中的数字最终都是相同的。我在下面包含一个非常简单的示例。 D = 3; M =
我正在远程的单个节点上运行并行 Matlab 作业 cluster .集群的每个节点都有 2 个处理器,每个处理器有 24 个内核,每个节点总共有 48 个内核。该作业包含一些顺序代码,后跟一个 pa
为什么我不能在这段代码中使用parfor? parfor i=1:r for j=1:N/r xr(j + (N/r) * (i-1)) = x(i + r * (j-1));
我知道一些不确定性源于 parfor 的并行性质,但我不明白为什么它应该是完全随机的。有没有办法强制 parfor 尊重(至少宽松地)循环的顺序?更具体地说,我希望在以下情况下这样做: parfor
我正在远程的单个节点上运行并行 Matlab 作业 cluster .集群的每个节点都有 2 个处理器,每个处理器有 24 个内核,每个节点总共有 48 个内核。该作业包含一些顺序代码,后跟一个 pa
我的计算基于二叉树,它采用变量 block (称为程序集)的两个先前实例并生成另一个。一个新的程序集是基于上层分支的两个程序集生成的,因此必须存储所有变量。 为此,我使用具有以下语法的元胞数组:Ass
我正在尝试在 MATLAB 的 parfor 循环中使用一个表。这给了我“透明度违规错误。请参阅有关透明度的并行计算工具箱”我正在尝试构建此表,以便我可以使用来自 MATLAB 分类学习器应用程序的训
我有一个 3 维网格,对于网格中的每个点,我想为大量时间步长计算时间相关函数 G(t),然后对每个网格点的 G 函数求和。使用 4 个 for 循环执行时间变得非常长,所以我试图使用 parfor 避
假设我有两个函数写在不同的脚本上,比如 function1.m 和 function2.m 这两个函数中的两个计算是独立的(一些输入可能是同样,例如说 function1(x,y) 和 functio
我是一名优秀的程序员,十分优秀!