#cuda #mex #matlab
#cuda #mex #matlab
Вопрос:
Эй, есть ли способ скомпилировать (или лучше сказать: «перевести») m-функцию matlab в C-функцию, чтобы я мог использовать ее в ядре CUDA моего mex-файла? большое спасибо!
Ответ №1:
MATLAB Coder сгенерирует C-код для mex-файлов. У меня пока нет копии для оценки, поэтому я не могу говорить с кем-либо авторитетно о качестве и природе сгенерированного кода.
Однако, если бы мне пришлось угадывать, я бы сказал, что сгенерированный код, вероятно, потребует много массирования, чтобы заставить его работать на вашем GPU. Возможно, вам повезет больше с таким продуктом, как Jacket, в зависимости от того, что вы делаете.
Комментарии:
1. 1 к этому. Одно дело сгенерировать код на C; и совсем другое — сгенерировать полезное ядро CUDA. Ограничения на то, что можно с пользой поместить в ядро CUDA, сильно отличаются от того, что может быть запущено на универсальном процессоре.
2. Хорошо, спасибо, но, к сожалению, я не могу получить пробную версию в качестве студента, чтобы попробовать, будет ли это хорошо работать для поддержки моего GPU-ядра : (
Ответ №2:
Вы можете вызвать функцию matlab (m или mex) из C / fortran, используя этот вызов функции. Затем вы могли бы использовать это вместе с вашим ядром CUDA.
Однако это может быть не самый эффективный способ сделать что-либо. Вы могли бы написать свой собственный C-код для m-файла, который у вас есть, или посмотреть его в matlab central, если кто-либо еще это сделал.
Комментарии:
1. Я уже знаю это, но, насколько я понимаю, функция будет выполняться на CPU вместо GPU, потому что matlab работает на CPU
2. Тогда я не понимаю, о чем вы спрашиваете. Не могли бы вы подробнее рассказать об этом?
3. Я хочу передать дескриптор функции при вызове моей mex-функции в нее. Предполагается, что дескриптор функции должен оцениваться на графическом процессоре (т. Е. в функции ядра) для тысяч различных параметров. Это то, что я хочу распараллелить! Когда я использую mexCallMATLAB для вызова matlab-функции ‘feval’ для вычисления дескриптора функции из C-кода, это будет оценивать дескриптор функции на CPU, а не на GPU, и, таким образом, распараллеливание бессмысленно.
4. Вы не сможете этого сделать, не написав свой собственный код cuda. Не только для части C, но и для части m-кода. Вы не можете передавать дескрипторы функций в cuda.
Ответ №3:
Функция C в конечном итоге вызовет переменные устройства настройки и вызовет ядро CUDA?
Изначально я хотел попробовать это для проекта, потому что думал, что этот метод будет проще, чем сначала преобразовать весь мой код MATLAB в C, но в итоге я все равно это сделал.
Для обеспечения этой функциональности существуют некоторые созданные пользователем скрипты MATLAB, но поскольку они не из Mathworks, вам придется использовать их на свой страх и риск. Я попробовал их и не нашел ничего вредоносного, но вы никогда не знаете. Я не смог заставить их работать с моим проектом из-за его специфических сложностей, но он должен работать для более простых задач.
1) NvMEX: это напрямую от Nvidia. http://developer.stage.nvidia.com/matlab-cuda
http://www.mathworks.com/discovery/matlab-gpu.html
2) CUDA MEX: Это от пользователя. http://www.mathworks.com/matlabcentral/fileexchange/25314-cuda-mex
Комментарии:
1. Хорошо, спасибо, сейчас я посмотрю на эти ссылки. Я бы предпочел не писать код на C напрямую. Не потому, что это слишком много работы для меня, а скорее для пользователя. Я хотел бы скомпилировать mex-файл ОДИН раз в удобную для пользователя функцию, чтобы пользователь мог легко вызывать функцию для любого функционального дескриптора matlab, который он хочет! Редактировать: две опубликованные вами ссылки не относятся непосредственно к проблеме. Просто укажите, как скомпилировать mex-файл, включающий CUDA (так что это основа любого приложения cuda-mex, не связанного напрямую с моей проблемой ;))
Ответ №4:
На самом деле это не прямой ответ на ваш вопрос, но если ваша цель — просто запустить ваш код MATLAB на графическом процессоре, то вы можете обнаружить, что если у вас есть доступ к Parallel Computing Toolbox, вы можете использовать графические массивы с arrayfun. Например, если функция, которую вы хотите оценить во многих точках, выглядит следующим образом:
function y = myFcn( x )
y = 1;
for ii = 1:10
y = sin(x * y);
end
Затем вы могли бы вызвать это на графическом процессоре следующим образом:
gx = gpuArray( rand(1000) );
gy = arrayfun( @myFcn, gx );