c++ - 为 MATLAB 引擎设置处理器关联 (Windows 7)

标签 c++ matlab windows-7 affinity matlab-engine

我正在用 C++ 开发一个应用程序。该应用程序的一个组件使用 Matlab(通过 Matlab 引擎)进行数据处理。同时,数据采集系统正在将数据流式传输到磁盘。有时,在密集的 Matlab 处理期间,采集系统会崩溃。通过将 Matlab 的处理器亲和性设置为可用处理器的子集,可以解决此问题。然而,由于应用程序每天启动几次,并且在多台机器上,每次都手动设置亲缘关系是不方便的。通过快捷方式的命令行设置处理器关联的技巧不起作用,因为引擎是从我的应用程序中启动的,而不是通过快捷方式。我一直在寻找一种以编程方式设置亲和性的方法,但收效甚微。

我考虑了以下选项(按优先顺序排列):

  1. 在引擎启动时,从应用程序中为 matlab 引擎指定处理器亲和性。
  2. 指定 matlab 引擎的默认处理器亲和性,与完整的 Matlab 应用程序本身分开。
  3. 作为最后的手段,为 Matlab(引擎和非引擎使用)设置默认亲和性。这是最不可取的,因为 Matlab 在部署机器上用于其他目的,最好不要限制它用于其他用途。

是否可以在我的应用程序中设置处理器关联,如果可以,如何设置?如果不是,解决这个问题的正确方法是什么?欢迎就这些选项或其他建议/解决方案提出任何建议。

最佳答案

听起来您使用的是 Windows。您可以直接从 Matlab 调用 .NET 来操作处理器关联掩码,而不必构建 MEX 文件。 System.Diagnostics.Process 类具有对处理器亲和性的控制,如所述 in this solution .这是一个使用它的 Matlab 函数。启动后首先在 Matlab 引擎中运行它。

function twiddle_processor_affinity()
proc = System.Diagnostics.Process.GetCurrentProcess();
aff = proc.ProcessorAffinity.ToInt32;  % get current affinity mask
fprintf('Current affinity mask: %s\n', dec2bin(aff, 8));
proc.ProcessorAffinity = System.IntPtr(int32(2)); % set affinity mask
fprintf('Adjusted affinity to: %s\n', dec2bin(proc.ProcessorAffinity.ToInt32, 8));

由于 Matlab 在 Windows 上公开了 .NET 标准库对象,您有时可以在 C# 或 .NET 下搜索类似这样的问题,并将答案直接移植到 Matlab。

关于c++ - 为 MATLAB 引擎设置处理器关联 (Windows 7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9778287/

相关文章:

c++ - 使用Matlab连接但不接收的TCPIP服务器

c++ - 编写 C++ Dll 并将其高效地公开给 .NET(不通过 C++/CLI)

arrays - 通过不带循环的多列值过滤矩阵(Matlab)?

c - 缺少 kernel32.dll 的依赖项

android - 在Windows 7上设置Android开发环境

c++ - g++ - 无法链接到使用 VS2012 构建的静态库

c++ - 在 C++ 中调用模板

matlab - 如何在matlab中的图像上画一条线?

java - 如何为已运行的应用程序打开 Java 控制台?

c++ - 与 libstdc++-6.dll 相关的 OpenCV 应用程序崩溃