问题标签 [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.

0 投票
1 回答
1477 浏览

c++ - Matlab/C++:使用 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”属性以实现加载/保存操作。

希望在某人的帮助下,我希望这篇文章可以帮助某人。

问候, 加布里埃尔·瓜兰迪

0 投票
1 回答
1246 浏览

matlab - 如何调整我的循环以使其与 matlab 的 parfor 一起使用?

我对 Matlab 很陌生。我使用 parfor 循环来完成一项非常耗时的任务。请参阅下面的片段。但是,我从 Matlab 得到了错误信息。任何人都可以帮忙吗?我阅读了有关 parfor 的文档,但不知道该怎么做...

谢谢你。

0 投票
2 回答
6880 浏览

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 个循环,我该如何获得呢?

0 投票
1 回答
655 浏览

matlab - 基于外部布尔值的带有 if/else 子句的 PARFOR

我编写了一个简单的化学模拟,它可以并行计算大量网格框的属性。因此,我使用并行循环索引 Y 维度:

这工作正常。但是,我使用布尔值来控制是否执行某些操作,如下面的代码所示。for这在 Y 上使用简单循环时效果很好,但在使用 时parfor,代码失败,声明optionalArg未定义:

stackTest现在工作正常 if controlArg = true,但不是 if controlArg = false; 我发现的唯一解决方法是定义optionalArg独立于controlArg. 不用说这是问题的简化版本,但我会感谢任何可以向我解释的人;我怀疑这是parfor循环与全局变量有关的问题的一个子集,但是由于我没有定义全局变量,所以我有点困惑。

问候,

跳过

0 投票
2 回答
618 浏览

matlab - 具有用户功能的数据库上的 Matlab parfor

我有一组图像(~10^7),它们包含在一个巨大的二进制文件中。我想使用我已经拥有的功能有效地阅读和分析它们。代码中该用户函数foo的每次迭代大约需要 0.1 秒,因此代码需要数天时间才能使用读取数据库的简单 for 循环来处理整个数据库:

我已经尽可能地优化了函数foo(尽可能对代码进行矢量化,使用正确的数据类等)。我唯一还没有做的是创建一个 mex 版本。我想用parfor这个,但我无法让它工作。艰难的每个图像都是独立的,上面的代码串行读取数据,所以我不能真正并行化它。如何使该parfor选项可以访问此代码和数据库?谢谢

0 投票
1 回答
3967 浏览

matlab - Matlab“断言失败”错误作为parfor goind on?

我有代码段

当 parfor 部分完成一个时期时,在第二个时期开始时,Matlab 给出以下错误:

我找不到代码上的错误。有什么想法吗?

0 投票
3 回答
5070 浏览

matlab - Matlab parfor循环索引

有人知道在 matlab 中使用 parfor 的这个简单代码中发生了什么吗?谢谢,

我将一个矩阵切成四个数组,并希望独立更新每个数组中的元素

这是一个简单的版本:

错误:“a”的有效索引在 parfor 循环中受到限制;

然而,

这有效:

另一个具有相同错误的更简单的非工作版本:

在我的应用程序中,索引 j 是通过某种算法为每个数组独立生成的

0 投票
1 回答
601 浏览

performance - Matlab从并行函数中获取结果很慢

我需要并行执行两个 Matlab 函数。问题是从它们那里获得结果比执行要慢得多。

第一种方法:

第二种方法:

我怎样才能让结果快速返回?我发现MATLAB 上的 Parallel Programming 可以同时执行 3 个不同的函数,但速度没有任何问题。

0 投票
1 回答
315 浏览

arrays - Matlab在parfor中为数组索引乘以迭代器 - 切片

是否可以切片第 3 行 (tt)?这段代码被简化了,但问题是相似的。我在数组索引中使用了乘法迭代器 (3*i),但是它不起作用。也许有可能以某种方式改变它。

谢谢 :)

0 投票
1 回答
676 浏览

matlab - 在 matlab 中使用 parfor 生成格状 Boltzmann 代码

我正在研究 lattice boltzmann 方法,并且我已经编写了一个 matlab 代码。我想并行化代码的某些部分,但我是新手,所以我很感激你的帮助。我想知道这部分是否可以使用 parfor (碰撞运算符):

我试图用 parfor 替换最外层的 for 循环,但代码似乎更慢。

有什么建议么?

提前致谢