并行运行 MEX 文件时的分段错误

Posted

技术标签:

【中文标题】并行运行 MEX 文件时的分段错误【英文标题】:Segmentation Faults when Running MEX Files in Parallel 【发布时间】:2012-04-17 14:44:37 【问题描述】:

我目前正在重复使用 MATLAB 2012a 中的 MEX 文件的实验,偶尔会遇到我无法理解的分段错误。

关于故障的一些信息

它们随机出现

仅当我使用 parfor 循环在 Linux 机器上并行运行多次重复实验时才会出现这种情况。

当我使用 parfor 循环在 Mac OSX 10.7 上并行运行多次重复实验时,它们确实不会发生。

它们确实在我跑步时出现,或者它们在我按顺序运行重复时出现。

当我并行运行 2 个实验而不是 12 个并行实验时,它们的发生频率似乎要低得多。

关于我的 MEX 文件的一些信息:

它是用C编写的

它使用 IBM CPLEX 12.4 API(这是线程安全的)

使用 GCC 4.6.3 编译

我的想法是在多核中访问 MEX 文件可能存在一些问题。任何人都可以阐明可能发生的事情或提出修复建议吗?我很乐意在必要时提供更多信息。

【问题讨论】:

【参考方案1】:

我最近向 MATLAB 的人员发送了堆栈跟踪,结果发现罪魁祸首不是我的代码,而是 CPLEX 12.4 API 中的一个函数。事实证明,这个函数使用了 C 中的 putenv() 函数,它不一定是线程安全的。

不幸的是,我必须继续使用这个函数和 API,所以我发布了一个follow-up thread that focuses on finding ways to avoid this fault。

任何建议将不胜感激。

【讨论】:

【参考方案2】:

我的想法是在多核中访问 MEX 文件可能存在一些问题。

您的 MEX 文件更有可能存在错误。各种错误(在 C 中很容易产生),例如访问悬空内存、双free()ing 或写入超过分配数组的末尾,将导致间歇性SIGSEGV

最好的办法是在调试器下运行 Matlab,看看 在哪里它崩溃了。

【讨论】:

以上是关于并行运行 MEX 文件时的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Ubuntu 14.04 和 matlab 2014Ra 上使用犰狳在 mex 中出现分段错误

使用 CPU 时的 OpenCL 段错误

犰狳 + Matlab Mex 段错误

Octave:可以编译 mex,但出现错误:“无法安装 .mex 文件功能”

并行测试与地理相交时的段错误

使用 CUDA 流时的段错误