- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 fminsearch
将模型拟合到多个数据集,并且我正在尝试并行执行它们。我的代码一直运行到 parfor
循环的开始,但是 parfor 循环似乎要花很长时间 才能开始! (不执行 parfor 中的第一行)。没有错误,matlab 只是保持“忙碌”状态。
我在具有 4 个内核的本地集群上运行,从 matlabpool 4
开始,它似乎启动正常。我在 Ubuntu 14.04.3 上运行 Matlab R2014b 64 位,八核 i7-3770K @ 3.50GHz,24GiB RAM(当然大部分未使用)。
这是重现问题的代码!
文件 matlab_parfor_test_2
function f=matlab_parfor_test_2
f={};
for i=1:400
a=@(p)i*p; % make some functions depending on i
b=@(p)a(p)+0; % a function depending on this
f=[f { @(p)b(p) }]; % create a list of i functions using this
end
文件 matlab_parfor_test_1
function matlab_parfor_test_1
f=matlab_parfor_test_2(); % create the functions
f=f(1:2); % discard all but two functions
for i=1:2 % for each function ('A')
parfor j=1 % dummy parfor
tmp=f{i}; % just read a function from the cell ('B')
end
end
在我的机器上从“A”到第一个“B”所花费的时间(即“输入”parfor
所花费的时间)是
returning 400 functions: 20 sec
500 functions: 32 sec
600 functions: 45 sec
700 functions: 64 sec
这很奇怪,因为在 test_1
中,除了其中的 2 个函数,我放弃了所有函数!为什么丢弃的函数会导致速度变慢?
我想也许 matlab 实际上并没有删除 f
中不需要的函数。所以我尝试将 f=f(1:2)
替换为
f={f{1}, f{2}};
但这也没有帮助。
如果我将 parfor
替换为 for
,那么执行时间当然不到 1 毫秒。
有什么想法吗??
function fit_all
models = createModelFunctions(); % creates cell of function handles
data = { [1 2 3], [1 2 3] }; % create 2 data sets
for i = 1:length(models)
fprintf('model %g\n',i);
parfor j = 1:length(data)
fprintf('data %g\n',j);
tmp = models{i}; % if I comment this line out, it runs fine!
% p(j) = fminsearch(@(p)models{j}(p,data{j}), [0 0]);
end
end
模型函数是在另一个文件中创建的,
function models = createModelFunctions()
models{1} = @(p,d) likelihoodfun(0,0,p,d);
models{2} = @(p,d) likelihoodfun(1,0,p,d);
function L = likelihoodfun(a,b,p,d)
L = some maths here;
运行 fit_all
,我希望看到 model 1
、data 1
、data 2
的列表, model 2
等等。我得到的输出是
model 1
然后事情就停止了:没有提示,matlab 说“忙”,UI 和操作系统像往常一样响应。系统监视器显示只有 1 个核心处于事件状态。它永远不会进入 parfor
。如果我此时按 ctrl+C
,在延迟 3 分钟后我得到
Operation terminated by user during parallel.internal.pool.serialize (line 21)
In distcomp.remoteparfor (line 69)
serializedInitData = parallel.internal.pool.serialize(varargin);
In parallel_function>iMakeRemoteParfor (line 1060)
P = distcomp.remoteparfor(pool, W, @make_channel, parfor_C);
In parallel_function (line 444)
[P, W] = iMakeRemoteParfor(pool, W, parfor_C);
如果我注释掉指示的行,它会起作用——所以问题似乎出在我访问模型函数时......同样,如果我将模型更改为
models={@sum,@sum}
即就在我使用另一个文件的函数句柄时...
最佳答案
当我在我的机器上运行您的代码时,它运行良好。在我的 Windows 和 Linux 上。但是,第一次运行总是需要更长的时间,因为您必须打开一个并行池,这是您指的吗?如果是这样,这是正常的和预期的行为。
仅供引用,您应该使用 parpool 而不是 matlabpool。也许滞后的 matlabpool 代码在创建池时遇到问题?另外,请确保它不会每次都关闭您的并行池。
如果这些都不起作用,请在其他人的计算机上尝试代码,看看是否可以重现问题。
关于Matlab Parfor 循环不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33851270/
我正在运行遗传算法,并且正在尝试并行化种群生成。 我的实际代码: 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
我是一名优秀的程序员,十分优秀!