【发布时间】: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