问题标签 [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.
c++ - Matlab/C++:使用 C++ Mex 持久对象进行并行计算时出现分段错误(无法转换句柄)
这篇文章的参考资料:
[1] http://www.mathworks.com/matlabcentral/newsreader/view_thread/278243 “使 C++ 对象在 mex 调用之间持久化,并且健壮。”
[2] MATLAB parfor 和 C++ 类 mex 包装器(需要复制构造函数?) “MATLAB parfor 和 C++ 类 mex 包装器(需要复制构造函数?)”
我成功地实现了一个 Matlab/C++ 接口,基于 [1] 中提出的方法。无论如何,我在尝试将系统与 Matlab 并行计算一起使用时遇到了麻烦。
在 MEX 接口中尝试在 matlab 句柄和 C++ 指针之间进行转换时,发生在我身上的是分段错误。
为了更清楚,我将回顾 [1] 中提出的结构。系统中有三个文件,采用这种通信方案:
[myInterface.m] <--> [myMexInterface.cpp] <--> [myClass.cpp]
在哪里
- myInterface.m 是一个 matlab 类
- myMexInterface.cpp 是一个 C++ (mex) 函数
- myClass.cpp 是一个 C++ (mex) 类
该系统的使用分为两个阶段:
- 构造:创建一个matlab对象myInterface。这会导致调用 myMexInterface.mexa64,从而调用 C++ myClass 对象的创建。myClass 的 C++ 指针通过 myMexInterface.mexa64 发送回 myInterface,存储它以供进一步使用。特别是,myMexInterface.mexa64 将myClass 的 C++ 指针转换为 matlab 句柄。
- 使用 matlab 中的 C++ 类:myInterface 向客户端提供方法,这些方法通过 myMexInterface.mexa64 传递,调用对象 myClass 上的函数。在此阶段,myMexInterface.mexa64 需要在构造阶段从 myInterface 存储的句柄才能调用正确 C++ 对象上的函数。当然,在这个阶段 myMexInterface.mexa64 会进行反向转换,从 Matlab 句柄到 C++ 指针。
在我的实现中,它在单线程中工作,在从句柄到指针的转换过程中会出现分段错误错误。特别是,我想关注 myMexInterface.cpp。要执行的命令通过字符串作为第一个参数传递,而可能(对于第二阶段操作)第二个参数是相对于与该接口关联的 C++ 对象的 matlab 句柄。
生成段错误的函数 convertMat2Pt 来自包含 class_handle.hpp,这是 [1] 中提出的解决方案的一部分。特别是那个class_handle.hpp中的函数,其中段错误是convertMat2HandlePtr:
实际上我不清楚那个演员阵容中到底发生了什么,所以我无法进行更深入的分析。我可以想象的是,由于某种原因,Matlab 并行计算与之前创建的 C++ 对象产生了不一致。
生成段错误的matlab客户端函数如下:
注意,为了简化情况,我在matlabpool中只打开了一个worker,parfor只执行了一个循环:反正我还是有错误。当然,如果没有 parfor 块,即使多次调用 aFunction(),也不会出错。
我在命令窗口中获得的是:
可以看出,接口是正确创建的,然后 aFunction 正确返回值 3 为 'out' (这甚至适用于多次调用)。然后 parfor 循环开始,众所周知 matlab 对象已保存(实际上我不清楚为什么它会保存两次,但即使在命令行窗口中,当我保存 myInterface 对象时也会发生这种情况)。最后创建一个新的 myInterface,句柄为 0,句柄恢复为正确的先前值。Altought,对 aFunctions 的调用失败。
我最后报告了 myInterface matlab 类:
请注意,正如 [2] 中所建议的,我包含了 loadobj、saveobj 函数,并且该类具有“Transient”属性以实现加载/保存操作。
希望在某人的帮助下,我希望这篇文章可以帮助某人。
问候, 加布里埃尔·瓜兰迪
matlab - 如何调整我的循环以使其与 matlab 的 parfor 一起使用?
我对 Matlab 很陌生。我使用 parfor 循环来完成一项非常耗时的任务。请参阅下面的片段。但是,我从 Matlab 得到了错误信息。任何人都可以帮忙吗?我阅读了有关 parfor 的文档,但不知道该怎么做...
谢谢你。
matlab - 如何在 Matlab 中使用带有 Core i3 的 PARFOR 并行 4
我有适用于 Ubuntu 64 位的 Matlab R2012b。我有一个 Intel Core i3 CPU M 330 @ 2.13GHz × 4。
我想使用parfor同时并行化 4 个循环。因为英特尔酷睿 i3 有 2 个内核和 4 个线程,所以我使用以下代码:
我得到以下错误:
错误:
您要求至少 4 个工作人员,但集群“本地”的 NumWorkers 属性设置为最多允许 2 个工作人员。要在比这更多的工作人员(本地集群最多 12 个)上运行通信作业,请增加集群的 NumWorkers 属性的值。本地集群的 NumWorkers 的默认值是本地机器上的核心数。
为什么?我机器中 NumWorkers 的默认值为 2,但如果我可以同时进行 4 个循环,我该如何获得呢?
matlab - 基于外部布尔值的带有 if/else 子句的 PARFOR
我编写了一个简单的化学模拟,它可以并行计算大量网格框的属性。因此,我使用并行循环索引 Y 维度:
这工作正常。但是,我使用布尔值来控制是否执行某些操作,如下面的代码所示。for
这在 Y 上使用简单循环时效果很好,但在使用 时parfor
,代码失败,声明optionalArg
未定义:
stackTest
现在工作正常 if controlArg = true
,但不是 if controlArg = false
; 我发现的唯一解决方法是定义optionalArg
独立于controlArg
. 不用说这是问题的简化版本,但我会感谢任何可以向我解释的人;我怀疑这是parfor
循环与全局变量有关的问题的一个子集,但是由于我没有定义全局变量,所以我有点困惑。
问候,
跳过
matlab - 具有用户功能的数据库上的 Matlab parfor
我有一组图像(~10^7),它们包含在一个巨大的二进制文件中。我想使用我已经拥有的功能有效地阅读和分析它们。代码中该用户函数foo
的每次迭代大约需要 0.1 秒,因此代码需要数天时间才能使用读取数据库的简单 for 循环来处理整个数据库:
我已经尽可能地优化了函数foo
(尽可能对代码进行矢量化,使用正确的数据类等)。我唯一还没有做的是创建一个 mex 版本。我想用parfor
这个,但我无法让它工作。艰难的每个图像都是独立的,上面的代码串行读取数据,所以我不能真正并行化它。如何使该parfor
选项可以访问此代码和数据库?谢谢
matlab - Matlab“断言失败”错误作为parfor goind on?
我有代码段
当 parfor 部分完成一个时期时,在第二个时期开始时,Matlab 给出以下错误:
我找不到代码上的错误。有什么想法吗?
matlab - Matlab parfor循环索引
有人知道在 matlab 中使用 parfor 的这个简单代码中发生了什么吗?谢谢,
我将一个矩阵切成四个数组,并希望独立更新每个数组中的元素
这是一个简单的版本:
错误:“a”的有效索引在 parfor 循环中受到限制;
然而,
这有效:
另一个具有相同错误的更简单的非工作版本:
在我的应用程序中,索引 j 是通过某种算法为每个数组独立生成的
performance - Matlab从并行函数中获取结果很慢
我需要并行执行两个 Matlab 函数。问题是从它们那里获得结果比执行要慢得多。
第一种方法:
第二种方法:
我怎样才能让结果快速返回?我发现MATLAB 上的 Parallel Programming 可以同时执行 3 个不同的函数,但速度没有任何问题。
arrays - Matlab在parfor中为数组索引乘以迭代器 - 切片
是否可以切片第 3 行 (tt)?这段代码被简化了,但问题是相似的。我在数组索引中使用了乘法迭代器 (3*i),但是它不起作用。也许有可能以某种方式改变它。
谢谢 :)
matlab - 在 matlab 中使用 parfor 生成格状 Boltzmann 代码
我正在研究 lattice boltzmann 方法,并且我已经编写了一个 matlab 代码。我想并行化代码的某些部分,但我是新手,所以我很感激你的帮助。我想知道这部分是否可以使用 parfor (碰撞运算符):
我试图用 parfor 替换最外层的 for 循环,但代码似乎更慢。
有什么建议么?
提前致谢