我正在用 C++ 开发一个应用程序。该应用程序的一个组件使用 Matlab(通过 Matlab 引擎)进行数据处理。同时,数据采集系统正在将数据流式传输到磁盘。有时,在密集的 Matlab 处理期间,采集系统会崩溃。通过将 Matlab 的处理器亲和性设置为可用处理器的子集,可以解决此问题。然而,由于应用程序每天启动几次,并且在多台机器上,每次都手动设置亲缘关系是不方便的。通过快捷方式的命令行设置处理器关联的技巧不起作用,因为引擎是从我的应用程序中启动的,而不是通过快捷方式。我一直在寻找一种以编程方式设置亲和性的方法,但收效甚微。
我考虑了以下选项(按优先顺序排列):
- 在引擎启动时,从应用程序中为 matlab 引擎指定处理器亲和性。
- 指定 matlab 引擎的默认处理器亲和性,与完整的 Matlab 应用程序本身分开。
- 作为最后的手段,为 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/