вычисление Matlab GPU - PullRequest
       85

вычисление Matlab GPU

1 голос
/ 15 марта 2019

Я изучаю функции Matlab GPU.Моя функция myfun принимает 2 входных параметра delta, p.В конце концов, я буду применять myfun ко многим комбинациям delta,p.Для каждой комбинации delta,p myfun будет сколько V удовлетворяет условию delta*V-p>0, где V = [0:0.001:1].В идеале я хочу, чтобы V было global variable.Но, похоже, у Matlab GPU есть некоторые ограничения на глобальные переменные.Поэтому я использую другой способ сделать это.Код выглядит следующим образом:

 function result = gpueg2()
          dd = 0.1;
          DELTA = [dd:dd:1];
          dp = 0.001;
          P = [0:dp:1];
          [p,delta]=meshgrid(P,DELTA);
          p = gpuArray(p(:));
          delta = gpuArray(delta(:));


           V = [0:0.001:1];

           function [O] = myfun(delta,p)
                     O = sum((delta*V-p)>0);
           end
           result = arrayfun(@myfun,delta,p);
 end

Тем не менее, это сообщение об ошибке

Function passed as first input argument contains unsupported or unknown function 'sum'.

Но я считаю, sum применимо в графическом процессоре.

Любойсоветы и предложения высоко ценятся.

1 Ответ

0 голосов
/ 15 марта 2019

Проблема с sum не в графическом процессоре, а в использовании arrayfun на графическом процессоре.Список функций, которые arrayfun принимает на GPU, приведен здесь: https://www.mathworks.com/help/distcomp/run-element-wise-matlab-code-on-a-gpu.html. sum нет в списке на этой странице документации.

Ваши векторы не такие большие (хотяЯ принимаю это может быть игрушечным примером вашей настоящей проблемы).Я предлагаю следующую альтернативную реализацию:

function result = gpueg2()
dd = 0.1;
DELTA = dd:dd:1;
dp = 0.001;
P = 0:dp:1;
V = 0:0.001:1;
[p,delta,v] = meshgrid(P,DELTA,V);
p = gpuArray(p);
delta = gpuArray(delta);
v = gpuArray(v);
result = sum(delta.*v-p>0, 3);
end

Обратите внимание на следующие отличия:

  1. Я делаю 3D-массивы p,delta,v, а не 2D.Эти три составляют всего 24 МБ.
  2. Я делаю вычисления delta.*v-p>0 для всего трехмерного массива: это будет хорошо разделено на GPU.
  3. Я делаю сумму на 3-м индексет. е. более V.

Я проверил, что ваша рутина на CPU и моя на GPU дают одинаковые результаты.

...