5

我在 VC++ 中编写了一个多进程应用程序,并尝试使用system来自 MATLAB 的命令使用命令行参数执行它。它运行,但只在一个核心上运行——有什么建议吗?

更新:事实上,它甚至没有看到第二个核心。当我从 MATLAB 执行应用程序时,我使用了 OpenMP 并使用omp_get_max_threads()andomp_get_thread_num()进行检查,但如果我从命令窗口运行它(如预期的那样),它似乎是omp_get_max_threads()12

问题:我的任务管理器报告 CPU 使用率接近 100% --- 这是否意味着上述 API 出现故障,它仍在作为多进程应用程序运行?

确认:

我使用Process Explorer检查线程数是否有任何差异。

当我从命令窗口调用应用程序时,线程1会转到我的应用程序。cmd.exe2

当我从 MATLAB 调用它时,26线程是 for MATLAB.exe1forcmd.exe1for 我的应用程序。

有任何想法吗?

4

3 回答 3

7

问题是 Matlab 如何影响您的应用程序的行为,因为它是一个单独的过程。我怀疑 Matlab 正在以影响 OMP 的方式修改环境变量,可能是因为它在内部使用 OMP,而您从 Matlab 产生的进程正在继承这个修改后的环境。

在启动应用程序的命令窗口中执行“set > plain.txt”,在 Matlab 中执行“system('set > from_matlab.txt')”,然后区分输出。这将向您展示 Matlab 引入的环境变量的差异。当我这样做时,它会出现在从 Matlab 继承的环境中,但不会出现在普通命令窗口的环境中。

OMP_NUM_THREADS=1 

这看起来像是与您问题中的函数调用相关的 OpenMP 设置。我敢打赌,你的衍生应用会看到并尊重它。

我不知道为什么 Matlab 设置它。但作为一种解决方法,当您从 Matlab 启动应用程序时,而不是直接调用它,而是调用一个包装器 .bat 文件来清除 OMP_NUM_THREADS 环境变量,或者将其设置为更高的数字。

于 2010-04-13T18:45:38.200 回答
1

在 Matlab 之外运行命令,看看它使用了多少个内核。在 Matlab 中运行它应该没有区别,因为它只是对操作系统的调用。IE。相当于在命令行上运行。

编辑

好吧,奇怪,当你打电话时你会得到什么feature('NumCores')?你用的是什么版本的matlab?

启用此功能是否有帮助?

由 imgur.com 主办

于 2010-04-13T00:16:55.697 回答
0

您必须在 MATLAB 命令行中执行:

setenv OMP_NUM_THREADS 4

如果你想使用 4 个线程。

于 2010-04-28T09:15:02.883 回答