我在VC ++中编写了一个多进程应用程序,并尝试使用MATLAB中的system
命令使用命令行参数执行它。它运行,但只在一个核心---任何建议吗?
更新:事实上,它甚至没有看到第二个核心。我使用OpenMP并使用omp_get_max_threads()
和omp_get_thread_num()
进行检查,当我从MATLAB执行应用程序时,omp_get_max_threads()
似乎是1
,但它是2
(正如预期的那样) )如果我从命令窗口运行它。
问题:我的任务管理器报告CPU使用率接近100%---这是否意味着前面提到的API出现故障,它仍在作为多进程应用程序运行?
我使用Process Explorer来检查线程数是否有任何差异。
当我从命令窗口调用应用程序时,1
线程转到cmd.exe
并2
转到我的应用程序。
当我从MATLAB调用它时,26
线程用于MATLAB.exe
,1
用于cmd.exe
和1
用于我的应用。
有什么想法吗?
答案 0 :(得分:7)
问题是Matlab如何影响您应用的行为,因为它是一个单独的过程。我怀疑Matlab正在以影响OMP的方式修改环境变量,可能是因为它在内部使用OMP,而您从Matlab产生的进程继承了这个修改过的环境。
从命令窗口执行“set> plain.txt”,在applab中启动app plain,并在Matlab中执行“system('set> from_matlab.txt')”,并对输出进行区分。这将向您展示Matlab引入的环境变量的差异。当我这样做时,它出现在从Matlab继承的环境中,但不出现在普通命令窗口的环境中。
OMP_NUM_THREADS=1
这看起来像是与您问题中的函数调用相关的OpenMP设置。我敢打赌你的衍生应用程序正在看到并尊重它。
我不知道为什么Matlab会设置它。但作为一种解决方法,当您从Matlab启动应用程序时,不要直接调用它,而是调用一个清除OMP_NUM_THREADS环境变量的包装器.bat文件,或者将其设置为更高的数字。
答案 1 :(得分:1)
在Matlab之外运行命令,看看它使用了多少个核心。在Matlab中运行它应该没有区别,因为它只是调用操作系统。 IE浏览器。相当于在命令行上运行。
修改强>
好奇怪,你拨打feature('NumCores')
后会得到什么?您使用的是什么版本的Matlab?
启用此功能有帮助吗?
答案 2 :(得分:0)
你必须在MATLAB命令行中执行:
setenv OMP_NUM_THREADS 4
如果你想使用4个线程。