Matlab Mexfiles и Cuda: оценка дескриптора функции

Здравствуйте, у меня есть mex-файл, который я хочу распараллелить с помощью CUDA. Текущая функциональность такова: я передаю дескриптор функции и огромное количество «точек» в mex-файл, и он оценивает функцию по каждой из точек в последовательном режиме (на ЦП). Поэтому он использует что-то вроде:

mxArray* y;
const mxArray *e[2] = {functionHandle, point};
mexCallMATLAB(1, &y, 2, (mxArray **)e, "feval");

вычислить функцию Handle на точке с помощью матлаб-функции feval. Теперь интересно, что произойдет, когда я попытаюсь распараллелить вычисления через CUDA: Будет ли это работать корректно? Потому что, если оценка с помощью mexCallMATLAB выполняется на ЦП, от использования CUDA не будет никакой пользы. Но как это сделать чем? Я не могу представить себе какой-либо способ оценить дескриптор функции в определенной точке C напрямую без использования feval-функции matlab...

Спасибо! Вы мне очень поможете!


person tim    schedule 05.05.2011    source источник


Ответы (1)


Нет, mexCallMATLAB нельзя будет вызывать из графического процессора. Как правило, вызовы на стороне хоста не могут выполняться из тела ядра CUDA.

Вы можете обнаружить, что если у вас есть доступ к Parallel Computing Toolbox, вы можете использовать GPUArrays с arrayfun. Например, если функция, которую вы хотите оценить по многим точкам, выглядит так:

function y = myFcn( x )
y = 1;
for ii = 1:10
  y = sin(x * y);
end

Затем вы можете вызвать это на GPU следующим образом:

gx = gpuArray( rand(1000) );
gy = arrayfun( @myFcn, gx );
person Edric    schedule 08.05.2011
comment
Вау, спасибо, я думаю, что это тот пост, который я искал! Теперь только вопрос: как я могу получить доступ к этому из моего mex-файла, если я не могу использовать mexCallMATLAB из ядра CUDA? - person tim; 08.05.2011
comment
На самом деле, я предлагаю не использовать ядро ​​CUDA напрямую, а использовать метод arrayfun в качестве альтернативы. Если у вас есть существующий код CUDA, который вы хотите запустить из MATLAB, Parallel Computing Toolbox поддерживает объект CUDAKernel, который поможет вам в этом. - person Edric; 08.05.2011