Ниже приведена реализация функции MEX, которую @ Praetorian описал (показывает , как использовать функцию 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 и его зависимыми библиотеками. Вот сообщение Раймонда Чена на эту тему.