Использование нескольких графических процессоров в Matlab - PullRequest
0 голосов
/ 14 апреля 2020

Я использую Matlab и хочу использовать мои 2 графических процессора. У меня большая матрица, которая не подходит для 1 графического процессора, но половина матрицы подходит для 1 графического процессора. Поэтому я хочу разделить матрицу пополам и позволить каждому из моих двух графических процессоров работать на половине матрицы. Я сделал следующее

try 
    parpool('local',gpuDeviceCount)
end
spmd
    gpuDevice
end
dp = 0.00001;
R = zeros(1,2);
parfor k=1:1:2
   if k==1
      M = gpuArray([dp:2*dp:10])
   else
      M = gpuArray([2*dp:2*dp:10])
   end
   R(k) = arrayfun(@(x) myfun,M);
end

. Мой вопрос: как я могу узнать, что я действительно создаю вектор 2 M (они разные) на каждом моем GPU? Есть ли одна встроенная функция, чтобы показать это? Зачем нам нужен spmd gpuDevice end? В настоящее время я чувствую, что с точки зрения скорости parfor кажется в 2 раза быстрее, чем обычный for. Но как я могу подтвердить, что на самом деле каждый графический процессор хранит разные M? Я не знаю, действительно ли он скопировал gpuArray([dp:2*dp:10]) дважды и gpuArray([2*dp:2*dp:10]) дважды?

И после завершения этого блока кода я обнаружил, что мой вектор M не появляются в рабочей области. Но другие переменные, определенные вне кода parfor, все еще находятся в рабочей области. Если я просто использую for вместо parfor (но с меньшим размером M, чтобы он мог уместиться в 1 GPU), после for loop вектор M находится в рабочей области, и его тип gpuArray. Почему, если я использую parfor, то после parfor loop эти переменные, определенные в parfor loop, исчезнут?

1 Ответ

0 голосов
/ 14 апреля 2020

Чтобы ответить на некоторые из ваших вопросов.

  1. M отсутствует после окончания для l oop, потому что это локальная переменная , они присутствуют только на рабочем. Чтобы убедиться, что ваш код работает должным образом, я бы предложил закрыть пул параллельных вычислений (оставив parfor в вашем коде), а затем использовать отладчик, чтобы установить точку останова и проверить M. Таким образом, вы можете проверить, все ли в порядке с вашим кодом. и затем включите параллельный пул. В случае, если вам нужен M для последующих вычислений, вы должны сделать его разрезанным по переменной. Учитывая ограничения (см. Ту же ссылку выше), вы можете использовать 2d матрицу или массив ячеек, которые вы инициализируете за пределами parfor.
  2. Об использовании gpuDevice, в соответствии с документацией это не требуется, но «Чтобы определить, какой графический процессор использует каждый работник, вызовите gpuDevice внутри блока spmd. Блок spmd запускает gpuDevice на каждом работнике». Похоже, вы не должны включать это. источник
...