【问题标题】:Calling a parallelized executable with MATLAB 'dos' command behaves differently from the standalone executable使用 MATLAB 'dos' 命令调用并行化可执行文件的行为与独立可执行文件不同
【发布时间】:2014-06-19 16:56:06
【问题描述】:

当我尝试使用 MATLAB 的 dos() 命令调用并行化的可执行文件时,它不会运行可执行文件并返回错误。

这个简单的 C++ 程序完全按照您的预期运行:

/* Serial.exe */

#include <iostream>

int main(void) {

    std::cout << "Apple!\n";
    std::cout << "Banana!\n";

    return 0;

}

结果:

Apple!
Banana!

这个也是:

/* Parallel */

#include <iostream>
#include <omp.h>

int main(void) {
    std::cout << "Apple!\n";

    #pragma omp parallel num_threads(8)
    {
        std::cout << "Banana!\n";
    }

    return 0;
}

结果:

Apple!
Banana!
Banana!
Banana!
Banana!
Banana!
Banana!
Banana!
Banana!

现在,我尝试使用以下 MATLAB 脚本调用这两个程序:

%%  MATLAB call script

exe_path_1 = 'C:\\Users\\Jim\\Documents\\MATLAB\\Serial.exe';
exe_path_2 = 'C:\\Users\\Jim\\Documents\\MATLAB\\Parallel.exe';

rtn_1 = dos(exe_path_1)
rtn_2 = dos(exe_path_2)

结果:

Apple!
Banana!
rtn_1 = 0
rtn_2 = -1.0737e+09

MATLAB 的 dos() 命令导致我的并行 C++ 代码失败的原因是什么?

【问题讨论】:

  • 它可以正常执行但只返回最终输出。如果您使用rtn_2 = dos(exe_path_2,'-echo')[rtn_2,cmdout_2] = dos(exe_path_2) 会发生什么?
  • 使用'-echo' 不会改变结果。 [rtn_2, cmdout_2] 产生与 rtn_2 相同的值和一个空字符串。
  • 哪个 Matlab 版本?一些旧版本的 IIRC 默认不开启多线程,你必须在 Preferences 中设置它。
  • 我使用的是 MATLAB R2012b 版本。
  • 令人着迷的是你甚至没有得到'Apple!'....你可以尝试以下方法:在第一个Apple之后创建一个无限的while(1)循环,看看程序是否冻结,或者退出。如果它退出,那么我们知道程序实际上在“Apple”之前崩溃了。如果它冻结了,那么我们知道它正在循环但没有生成输出。

标签: c++ matlab parallel-processing


【解决方案1】:

我修复了通过 java 调用命令的类似问题。这是一些使用 java 类的 m 代码:​​

rt = java.lang.Runtime.getRuntime();
pr = rt.exec(command);
input= java.io.BufferedReader(java.io.InputStreamReader(pr.getInputStream()));
while(1)
    f=(input.readLine());
    if isempty(f)
        break;
    end
    disp(char(f));
end

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 2021-10-04
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多