以下是@Praetorian 描述的 MEX 函数的实现(展示了如何使用该SetProcessAffinityMask
函数):
set_affinity.c
#include "mex.h"
#include <windows.h>
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
HANDLE hProc;
DWORD_PTR dwAffinityMask;
unsigned int numCores;
// check arguments
if (nlhs > 0 || nrhs != 1) {
mexErrMsgIdAndTxt("mex:error", "Wrong number of arguments.");
}
if (!mxIsDouble(prhs[0]) || mxGetNumberOfElements(prhs[0])!=1) {
mexErrMsgIdAndTxt("mex:error", "Expecting a scalar number.");
}
// number of logical processors
numCores = (unsigned int) mxGetScalar(prhs[0]);
// set affinity of current process to use all cores
hProc = GetCurrentProcess();
dwAffinityMask = (1 << numCores) - 1;
if (!SetProcessAffinityMask(hProc, dwAffinityMask)) {
mexErrMsgIdAndTxt("mex:error", "WinAPI error code: %lu", GetLastError());
}
}
例子:
在我的四核超线程机器上,我将调用 MEX 函数,以允许 MATLAB 在所有 8 个逻辑处理器上执行:
>> getenv('NUMBER_OF_PROCESSORS')
ans =
8
>> mex -largeArrayDims set_affinity.c
>> set_affinity(8)
要仅使用一半数量的处理器:
>> set_affinity(4)
请注意MSDN 文档页面中的以下注释:
进程关联由任何子进程或新实例化的本地进程继承。
不要调用SetProcessAffinityMask
可能由您自己的进程以外的进程调用的 DLL。
因此,混淆亲和力将影响 MATLAB 及其依赖库启动的所有计算。这是Raymond Chen关于该主题的帖子。