问题标签 [parfor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
matlab - parfor 循环有错误的切片变量
任何人都可以向我解释,为什么以下给出了一个错误,u
但也不是h
我现在可以用 替换(i,j)
,(l)
但即使我尝试计算相关变量,我们也可以p
根据 来调用它,(m,n)
并用它u(p)
代替u(m,n)
它给我一个错误消息。它只强调u(m,n)
, 和。u(p)
但不是h(m,n)
。MATLAB 说:
说明:为了让 MATLAB 高效地执行
parfor
循环,发送给 MATLAB 工作程序的数据量必须最少。MATLAB 实现这一点的方法之一是限制变量在parfor
迭代中的索引方式。指示的变量的索引方式与parfor
. 建议的操作 修复索引。有关索引限制的描述,请参阅 Parallel Computing Toolbox 文档中的“切片变量”
任何想法,这里有什么问题?
matlab - 使用每个迭代的工作量的先验估计来预测并行循环的运行时间(对于给定数量的工作人员)
我正在为来自 PDE 的特定离散化(具有已知的稀疏结构)的非常大的稀疏矩阵进行自适应矩阵向量乘法的 MATLAB 实现。
经过大量预处理后,我最终得到了许多不同的块(例如,大于 200),我想为其计算选定的条目。
预处理步骤之一是确定我要计算的每个块的(数量)条目,这使我几乎完美地衡量了每个块将花费的时间量(对于所有意图和目的,正交努力是每个条目都相同)。
感谢https://stackoverflow.com/a/9938666/2965879,我能够通过以相反的顺序对块进行排序来利用它,从而促使 MATLAB 首先从最大的块开始。
但是,每个块的条目数量差异很大,以至于直接运行 parfor 会受到条目数量最多的块的严重限制,即使它们被反向输入循环。
我的解决方案是串行执行最大的块(但在条目级别上并行化!),只要每个迭代的开销无关紧要,这很好。块不会变得太小。然后我用 parfor 完成其余的块。理想情况下,我会让 MATLAB 决定如何处理这个问题,但是由于嵌套的 parfor 循环失去了并行性,所以这不起作用。此外,将两个循环打包成一个(几乎)是不可能的。
我现在的问题是关于如何最好地确定串行和并行机制之间的截止值,同时考虑到我所拥有的关于条目数量的信息(对于不同的问题,有序条目的曲线形状可能会有所不同),如以及我可用的工人数量。
到目前为止,我一直在与标准 PCT 许可下可用的 12 名工作人员一起工作,但是自从我现在开始在集群上工作,确定这个截止值变得越来越重要(因为对于许多内核来说与并行循环相比,串行循环变得越来越昂贵,但类似地,拥有支撑其余部分的块甚至更昂贵)。
对于 12 个核心(分别是我正在使用的计算服务器的配置),我已经找到了一个合理的参数,即每个工作人员 100 个条目作为截止值,但是当核心数量不是时,这不起作用相对于块的数量(例如 64 对 200)来说已经很小了。
我试图缩小具有不同功率(例如 1/2、3/4)的核心数量,但这也不能始终如一地工作。接下来,我尝试将块分组并确定当条目大于每批平均值时的截止值,resp。他们离终点的批次数:
(注意:此代码不适用于num_entr_asc
长度不是 的倍数的向量,但为了便于阅读num_core
,我决定省略这些结构。)min(...,end)
我还省略了< max(...,...)
for 组合这两个条件(即加上每个工人的最少条目),这是必要的,这样就不会太早发现截止。我也考虑过以某种方式使用方差,但到目前为止,所有尝试都不能令人满意。
如果有人对如何解决这个问题有一个好主意,我将不胜感激。
感谢您阅读这个很长的问题,
最好的问候,
阿克塞尔
附言。由于我的“亲爱的 stackoverflow”似乎被过滤了,让我感谢我已经在这里找到了我的问题的解决方案。
matlab - 相同的变量名会导致 parfor 中的冲突
我有这样的基本代码:
y
是否会因为变量名在所有迭代中都相同而产生任何冲突?
ubuntu - 在 parfor 循环后 Matlab 变量为空
我正在尝试在具有 Matlab 2013a 和 i7 处理器的 Ubuntu 13.04 机器上并行运行我的一些 Matlab 代码:
cross_validation()
返回一个矩阵。但是,运行此代码后,变量scores
仍然是一个 2×1 元胞数组,每个元胞为空。好像cross_validation()
什么都没有返回。
如果我将 parfor 循环转换为普通的 for 循环,它在这台计算机上也可以正常工作。我还在另一台计算机(Windows 7,Matlab 2013b)上测试了这段代码(使用 parfor-loop),它在那里运行良好。
一个简短的版本cross_validation()
是:
有人可以给建议吗?
谢谢!
matlab - 如何嵌套多个 parfor 循环
parfor
是在多个“工作人员”之间分配密集计算的独立迭代的便捷方式。一个有意义的限制是parfor
-loops 不能嵌套,并且始终是对there和there等类似问题的答案。
为什么跨循环边界的并行化如此可取
考虑以下代码,其中迭代在允许 4 个工作人员的机器上花费高度可变的时间。两个循环都迭代了 6 个值,显然很难在 4 个值之间共享。
选择内部循环似乎是一个好主意,parfor
因为单个调用somefun
比外部循环的迭代更具可变性。但是,如果每次调用的运行时间somefun
都非常相似怎么办?如果运行时有趋势并且我们有三个嵌套循环怎么办?这些问题经常出现,人们走极端。
组合循环所需的模式
理想情况下,somefun
为所有对运行row
and col
,并且无论 iterand 正在变化,工作人员都应该忙起来。解决方案应该看起来像
不幸的是,即使我知道哪个内置函数创建了一个包含 和 的所有组合的矩阵row
,col
MATLAB 也会报错Parfor 语句的范围必须是行向量。然而,for
不会抱怨并很好地迭代列。一个简单的解决方法是创建该矩阵,然后使用以下命令对其进行索引parfor
:
代替allpairs
我正在寻找的内置函数是什么?有人想出了一个方便的惯用模式吗?
matlab - 是否可以使用 parfor 循环来提高在 MATLAB 中训练多个神经网络的速度?
在下面的代码中,我没有使用 parfor 循环代替我的任何一个 for 循环来获得时间改进(有时甚至需要更长的时间)。
我想要的是同时训练多个网络,这样我就可以在一个集群上运行这个代码,每个集群运行一组不同的神经网络。
如果我更改为,parfor Neurons = 1:n
我可以告诉 parfor 循环正在工作,因为“神经元”不再像并行循环所预期的那样按顺序/单调变化。但是,只有一个“神经网络训练 (nntraintool)”GUI 加载,这让我觉得只部署了一个工人?最重要的是,我没有获得任何时间改进。是否可以使用不同的 matlab 工作人员同时训练多个神经网络?如何?
非常感谢。
matlab - Matlab Parfor 变量无法分类
任何人都知道为什么这不起作用?我正在尝试运行 parfor 循环。我可以使用一个简单的 for 循环来执行完全相同的代码,但我需要将它与 parfor 一起用于海量数据集。
我收到此错误“无法对 parfor 中的变量 MeanIV 进行分类。”
matlab - 变量已编入索引但未切片
我并行化了下面的代码,但仿真时间实际上是串行代码的 400-500 倍。我能想到的唯一原因是消息'变量 x 已编入索引但未在 parfor 循环中切片,'变量 p 已编入索引但未在 parfor 循环中切片。任何人都可以验证这是否是模拟时间大幅增加的原因或我并行化代码的方式。
p=(1,i) 和 x(1,i) 是预先设置值的矩阵。
matlab - Matlab并行计算中parfor正常工作的条件是什么
我有一个关于 parfor 的问题。实现 parfor 循环的最佳性能并使其正确/正确工作的条件是什么?
matlab - parfor 问题:只有一个进程在运行
我在 matlab 中有 parfor 循环,当它运行时,只有一个进程正在使用 CPU(顶部和系统监视器显示相同的 CPU 使用率,请参见随附的屏幕截图),并且 parfor 没有运行得更快。为什么???
ubuntu 12.04 LTS,64 位 matlab 2012b
谢谢,Marcin 和 Edric,
我按照你的建议运行了一个小测试用例,然后我注意到问题是由内部循环代码访问外部循环数据引起的,在这个http://www.mathworks.com/help/distcomp/advanced-topics 中。 html,他们将其称为访问广播变量。
在 parfor 循环开始时,任何广播变量的值都会发送给所有工作人员。尽管这种类型的变量可能有用甚至必不可少,但大的广播变量会导致客户端和工作人员之间的大量通信。在某些情况下,为此目的使用临时变量可能更有效,在循环内创建和分配它们。
就我而言,广播变量包含大量数据,因此将其传递给工作人员有问题。
删除一些数据后,parfor 循环工作正常。